From 6ad98ab188692387d352d20f8a875b3e23e5ecd2 Mon Sep 17 00:00:00 2001 From: Roni Ahmadi Date: Mon, 30 Sep 2024 23:39:05 +0700 Subject: [PATCH] update uv --- apidata/serializers/distric_serializer.py | 3 +- apidata/serializers/produks_serializer.py | 22 +- apidata/serializers/provinsi_serializer.py | 3 +- apidata/serializers/regency_serializer.py | 3 +- apidata/viewsets/distric_viewset.py | 2 +- apidata/viewsets/provinsi_viewset.py | 2 +- apidata/viewsets/regency_viewset.py | 2 +- frontend/serializers.py | 5 +- frontend/templates/jual/index.html | 14 +- frontend/urls.py | 12 +- frontend/views/base_view.py | 2 +- frontend/views/beli_view.py | 8 +- frontend/views/beranda/home.py | 2 +- frontend/views/cart/add_to_cart_view.py | 4 +- frontend/views/cart/toko_transaksi_view.py | 25 +- frontend/views/edit_barang_view.py | 34 +- frontend/views/keranjang_add_view.py | 8 +- frontend/views/list_produk_toko_view.py | 4 +- frontend/views/minus_plus_view.py | 4 +- frontend/views/payments_cart_view.py | 4 +- frontend/views/piverification_view.py | 2 +- frontend/views/proccess/approve_view.py | 2 - frontend/views/produk/produk_detail_view.py | 8 +- frontend/views/profile/alamat_user_view.py | 4 +- frontend/views/profile/profile_alamat_view.py | 8 +- frontend/views/profile/profile_edit_view.py | 8 +- frontend/views/profile/profile_view.py | 4 +- frontend/views/profile/register_member.py | 8 +- .../views/profile/register_member_code.py | 4 +- frontend/views/profile_detail_address_view.py | 4 +- frontend/views/service_worker.py | 4 +- frontend/views/toko/alamat_toko_view.py | 20 +- frontend/views/toko/jual.py | 126 + frontend/views/toko/jual_view.py | 121 - frontend/views/transaksi_selesai_view.py | 4 +- frontend/views/transaksi_user_view.py | 14 +- frontend/views/withdrawl_proccess_view.py | 6 +- frontend/views/withdrawl_request_json_view.py | 5 +- frontend/views/withdrawl_view.py | 14 +- frontend/viewsets/districviewset.py | 2 +- frontend/viewsets/provinsiviewset.py | 2 +- frontend/viewsets/regencyviewset.py | 2 +- frontend/viewsets/vilagerviewset.py | 2 +- master/admin.py | 157 +- master/admin_view/country.py | 32 + master/admin_view/distric.py | 23 + master/admin_view/provinsi.py | 15 + master/admin_view/regency.py | 23 + master/admin_view/region.py | 16 + master/admin_view/subregion.py | 22 + master/admin_view/village.py | 22 + master/models.py | 127 - master/models/configuration_website.py | 18 + master/models/country.py | 23 + master/models/distric.py | 12 + master/models/expedisi.py | 16 + master/models/history_tampung.py | 7 + master/models/negara.py | 6 + master/models/provinsi.py | 9 + master/models/regency.py | 12 + master/models/region.py | 6 + master/models/setting_website.py | 15 + master/models/subregion.py | 9 + master/models/village.py | 12 + master/models/voucher_config.py | 7 + produk/forms.py | 1 - produk/models.py | 53 +- profiles/admin.py | 22 +- profiles/models.py | 57 +- projekpi/celery.py | 4 +- projekpi/clearsession_admin.py | 6 +- projekpi/pi_network.py | 34 +- projekpi/settings.py | 34 +- projekpi/tasks.py | 52 +- projekpi/telegram_utils.py | 4 +- static/css/dist/styles.css | 1 - store/admin.py | 3 +- store/models.py | 13 +- templatenew/views/base_view.py | 2 +- templatenew/views/home/index.py | 2 +- theme/static/css/dist/styles.css | 3859 +---------------- theme/static_src/package-lock.json | 107 +- transaction/__init__.py | 0 transaction/admin.py | 2 + transaction/apps.py | 6 + transaction/models.py | 210 + transaction/tests.py | 2 + transaction/views.py | 2 + 88 files changed, 929 insertions(+), 4673 deletions(-) create mode 100644 frontend/views/toko/jual.py delete mode 100644 frontend/views/toko/jual_view.py create mode 100644 master/admin_view/country.py create mode 100644 master/admin_view/distric.py create mode 100644 master/admin_view/provinsi.py create mode 100644 master/admin_view/regency.py create mode 100644 master/admin_view/region.py create mode 100644 master/admin_view/subregion.py create mode 100644 master/admin_view/village.py delete mode 100644 master/models.py create mode 100644 master/models/configuration_website.py create mode 100644 master/models/country.py create mode 100644 master/models/distric.py create mode 100644 master/models/expedisi.py create mode 100644 master/models/history_tampung.py create mode 100644 master/models/negara.py create mode 100644 master/models/provinsi.py create mode 100644 master/models/regency.py create mode 100644 master/models/region.py create mode 100644 master/models/setting_website.py create mode 100644 master/models/subregion.py create mode 100644 master/models/village.py create mode 100644 master/models/voucher_config.py delete mode 100644 static/css/dist/styles.css create mode 100644 transaction/__init__.py create mode 100644 transaction/admin.py create mode 100644 transaction/apps.py create mode 100644 transaction/models.py create mode 100644 transaction/tests.py create mode 100644 transaction/views.py diff --git a/apidata/serializers/distric_serializer.py b/apidata/serializers/distric_serializer.py index 5ffbc32..8941434 100644 --- a/apidata/serializers/distric_serializer.py +++ b/apidata/serializers/distric_serializer.py @@ -1,10 +1,9 @@ from rest_framework import serializers -from master.models import Distric +from master.models.distric import Distric class DistricSerializer(serializers.HyperlinkedModelSerializer): - class Meta: model = Distric fields = ["url", "id", "code", "regency_code", "name"] diff --git a/apidata/serializers/produks_serializer.py b/apidata/serializers/produks_serializer.py index 56b4bc8..80ec7fa 100644 --- a/apidata/serializers/produks_serializer.py +++ b/apidata/serializers/produks_serializer.py @@ -35,9 +35,7 @@ def get_nama(self, obj): user = None else: languanges_code = user.languages.code if user.languages else "id" - translate_text = translater( - translate_to=languanges_code, page=obj.nama, values=obj.nama - ) + translate_text = translater(translate_to=languanges_code, page=obj.nama, values=obj.nama) return translate_text @@ -57,9 +55,7 @@ def get_nama(self, obj): user = None else: languanges_code = user.languages.code if user.languages else "id" - translate_text = translater( - translate_to=languanges_code, page=obj.nama, values=obj.nama - ) + translate_text = translater(translate_to=languanges_code, page=obj.nama, values=obj.nama) return translate_text @@ -79,14 +75,11 @@ def get_nama(self, obj): user = None else: languanges_code = user.languages.code if user.languages else "id" - translate_text = translater( - translate_to=languanges_code, page=obj.nama, values=obj.nama - ) + translate_text = translater(translate_to=languanges_code, page=obj.nama, values=obj.nama) return translate_text class GambarProdukSerializer(serializers.HyperlinkedModelSerializer): - class Meta: model = GambarProduk fields = ["gambar", "nama"] @@ -144,10 +137,7 @@ def get_nama(self, obj): def get_count_star(self, obj): countstar = ( - UlasanCart.objects.filter(produkitem_id=obj.id).aggregate(Avg("produk"))[ - "produk__avg" - ] - or 0 # noqa: W503 + UlasanCart.objects.filter(produkitem_id=obj.id).aggregate(Avg("produk"))["produk__avg"] or 0 # noqa: W503 ) return countstar @@ -156,9 +146,7 @@ def get_produk_detail_url(self, obj): return urldetail def get_gambar(self, obj): - gambars = GambarProduk.objects.filter( - produk__pk=obj.pk, gambar__isnull=False - ).order_by("-pk") + gambars = GambarProduk.objects.filter(produk__pk=obj.pk, gambar__isnull=False).order_by("-pk") return GambarProdukSerializer(gambars, many=True).data def get_store(self, obj): diff --git a/apidata/serializers/provinsi_serializer.py b/apidata/serializers/provinsi_serializer.py index 5377420..1790a7a 100644 --- a/apidata/serializers/provinsi_serializer.py +++ b/apidata/serializers/provinsi_serializer.py @@ -1,10 +1,9 @@ from rest_framework import serializers -from master.models import Provinsi +from master.models.provinsi import Provinsi class ProvinsiSerializer(serializers.HyperlinkedModelSerializer): - class Meta: model = Provinsi fields = ["url", "id", "code", "nama"] diff --git a/apidata/serializers/regency_serializer.py b/apidata/serializers/regency_serializer.py index a725eea..95dfd9c 100644 --- a/apidata/serializers/regency_serializer.py +++ b/apidata/serializers/regency_serializer.py @@ -1,10 +1,9 @@ from rest_framework import serializers -from master.models import Regency +from master.models.regency import Regency class RegencySerializer(serializers.HyperlinkedModelSerializer): - class Meta: model = Regency fields = ["url", "id", "code", "province_code", "name"] diff --git a/apidata/viewsets/distric_viewset.py b/apidata/viewsets/distric_viewset.py index cb8d96f..e06452c 100644 --- a/apidata/viewsets/distric_viewset.py +++ b/apidata/viewsets/distric_viewset.py @@ -2,7 +2,7 @@ from rest_framework import filters, viewsets from apidata.serializers.distric_serializer import DistricSerializer -from master.models import Distric +from master.models.distric import Distric class DistricViewSet(viewsets.ModelViewSet): diff --git a/apidata/viewsets/provinsi_viewset.py b/apidata/viewsets/provinsi_viewset.py index bceed6c..97868e8 100644 --- a/apidata/viewsets/provinsi_viewset.py +++ b/apidata/viewsets/provinsi_viewset.py @@ -2,7 +2,7 @@ from rest_framework import filters, viewsets from apidata.serializers.provinsi_serializer import ProvinsiSerializer -from master.models import Provinsi +from master.models.provinsi import Provinsi class ProvinsiViewSet(viewsets.ModelViewSet): diff --git a/apidata/viewsets/regency_viewset.py b/apidata/viewsets/regency_viewset.py index 7992352..0131efb 100644 --- a/apidata/viewsets/regency_viewset.py +++ b/apidata/viewsets/regency_viewset.py @@ -2,7 +2,7 @@ from rest_framework import filters, viewsets from apidata.serializers.regency_serializer import RegencySerializer -from master.models import Regency +from master.models.regency import Regency class RegencyViewSet(viewsets.ModelViewSet): diff --git a/frontend/serializers.py b/frontend/serializers.py index a192437..e4d07d5 100644 --- a/frontend/serializers.py +++ b/frontend/serializers.py @@ -1,6 +1,9 @@ from rest_framework import serializers -from master.models import Distric, Provinsi, Regency, Village +from master.models.distric import Distric +from master.models.provinsi import Provinsi +from master.models.regency import Regency +from master.models.village import Village from produk.models import GambarProduk, Kategori, Produk from profiles.models import UserProfile, UserProfileAddress diff --git a/frontend/templates/jual/index.html b/frontend/templates/jual/index.html index beb0454..0922616 100644 --- a/frontend/templates/jual/index.html +++ b/frontend/templates/jual/index.html @@ -21,9 +21,10 @@

{% translater user.languages.code "Back" "Back" %} {% endblock %} {% block content %} -
+
{% if messages %}
+ {% for message in messages %} {{ message }} {% endfor %} @@ -43,7 +44,7 @@

{% translater user.languages.code "Back" "Back" %}

- {% for k in languages %} {% endfor %} @@ -58,7 +59,7 @@

{% translater user.languages.code "Back" "Back" %}

- {% for k in country %} {% endfor %} @@ -84,12 +85,12 @@

{% translater user.languages.code "Back" "Back" %}

- +
𝛑
- +
@@ -241,5 +242,8 @@

{% translater user.languages.code "Back" "Back" %} ck.setData(vv) } }) + $(document).ready(function(){ + $(".select-adder").select2() + }) {% endblock %} diff --git a/frontend/urls.py b/frontend/urls.py index 6d4ca73..964f5d9 100644 --- a/frontend/urls.py +++ b/frontend/urls.py @@ -10,7 +10,6 @@ # Checkout from frontend.views.cart.add_to_cart_view import AddToCart -from frontend.views.proccess.approve_view import Approve from frontend.views.cart.cart_json_view import CartJson from frontend.views.cart.toko_transaksi_view import TransaksiToko from frontend.views.completepayment_view import CompletePayment @@ -32,6 +31,7 @@ from frontend.views.payments_cart_view import PaymentsCart from frontend.views.piverification_view import VerificationCode from frontend.views.privacyandpolicy_view import PrivacyAndPolicy +from frontend.views.proccess.approve_view import Approve from frontend.views.produk.produk_detail_view import ProdukDetail # produk @@ -63,7 +63,7 @@ from frontend.views.toko.archive_barang_view import ArchiveBarang # toko -from frontend.views.toko.jual_view import Jual +from frontend.views.toko.jual import Jual from frontend.views.toko.toko_view import Toko from frontend.views.toko_edit_view import TokoEdit from frontend.views.transaksi_selesai_view import TransaksiUserSelesaiJson @@ -108,9 +108,7 @@ # toko path("toko//", Toko.as_view(), name="toko"), path("toko//profile/edit", TokoEdit.as_view(), name="toko_profile_edit"), - path( - "toko//list_produk/", ListProdukToko.as_view(), name="list_produk_toko" - ), + path("toko//list_produk/", ListProdukToko.as_view(), name="list_produk_toko"), path( "toko//produk//edit", EditBarang.as_view(), @@ -208,9 +206,7 @@ ), path("translate/json", TranslatedApi.as_view(), name="translated_json"), # firebase - path( - "firebase-messaging-sw.js", ServiceWorkerView.as_view(), name="service_worker" - ), + path("firebase-messaging-sw.js", ServiceWorkerView.as_view(), name="service_worker"), path("fcm-token", FcmSaveTokenView.as_view(), name="fcm_token"), path("validation-key.txt", VerificationCode.as_view(), name="verification"), path("sess/login", LoginView.as_view(), name="log_less"), diff --git a/frontend/views/base_view.py b/frontend/views/base_view.py index 98ac5e2..3ca11df 100644 --- a/frontend/views/base_view.py +++ b/frontend/views/base_view.py @@ -4,7 +4,7 @@ from django.views import View from firebase_admin import credentials -from master.models import ConfigurationWebsite +from master.models.configuration_website import ConfigurationWebsite class FrontPage(View): diff --git a/frontend/views/beli_view.py b/frontend/views/beli_view.py index d92bdf5..e2d361e 100644 --- a/frontend/views/beli_view.py +++ b/frontend/views/beli_view.py @@ -12,9 +12,7 @@ class Beli(FrontPage): def get(self, request, id): profile = request.user - alamat = UserProfileAddress.objects.filter( - userprofile_id=profile.pk, is_primary=True - ) + alamat = UserProfileAddress.objects.filter(userprofile_id=profile.pk, is_primary=True) alamat = alamat.first() # pajak = SettingWebsite.objects.filter(nama_pengaturan=3).first() pajak = self.configuration.pajak_beli @@ -22,9 +20,7 @@ def get(self, request, id): cart_data = None try: cart = Cart.objects.get(user_id=request.user.id, status_pembayaran=1, pk=id) - cart_data = CartItem.objects.filter( - cart__user=request.user, cart__status_pembayaran=1 - ).latest("pk") + cart_data = CartItem.objects.filter(cart__user=request.user, cart__status_pembayaran=1).latest("pk") jumlah = 0 harga = cart_data.jumlah * cart_data.produk.harga jumlah = jumlah + harga diff --git a/frontend/views/beranda/home.py b/frontend/views/beranda/home.py index ee60b36..778972f 100644 --- a/frontend/views/beranda/home.py +++ b/frontend/views/beranda/home.py @@ -4,7 +4,7 @@ from frontend.models import Banner, Pengumuman from frontend.views.base_view import FrontPage -from master.models import Negara +from master.models.negara import Negara from produk.models import Kategori, Produk diff --git a/frontend/views/cart/add_to_cart_view.py b/frontend/views/cart/add_to_cart_view.py index 4a61d95..587ee43 100644 --- a/frontend/views/cart/add_to_cart_view.py +++ b/frontend/views/cart/add_to_cart_view.py @@ -81,9 +81,7 @@ def post(self, request, id): user_cart.save() user_cart = UserCartItem.objects.get(pk=user_cart.id) - addr_user = UserProfileAddress.objects.filter( - userprofile_id=request.user.pk, is_primary=True - ).first() + addr_user = UserProfileAddress.objects.filter(userprofile_id=request.user.pk, is_primary=True).first() user_cart_address = AddressUserChartItem() user_cart_address.address = addr_user.address user_cart_address.province = addr_user.province diff --git a/frontend/views/cart/toko_transaksi_view.py b/frontend/views/cart/toko_transaksi_view.py index bcca093..f4a8c8e 100644 --- a/frontend/views/cart/toko_transaksi_view.py +++ b/frontend/views/cart/toko_transaksi_view.py @@ -9,8 +9,9 @@ from firebase_admin import messaging from frontend.views.base_view import FrontPage +from master.models.expedisi import Expedisi from produk.models import Cart, CartItem -from store.models import Expedisi, UserStore +from store.models import UserStore @method_decorator(csrf_exempt, name="dispatch") @@ -42,21 +43,15 @@ def post(self, request, id): ) return redirect(f"{urls_redirect}?status={str(status)}") from apidata.resi_check import ResiCheck - from master.models import ConfigurationWebsite + from master.models.configuration_website import ConfigurationWebsite konfigurasi = ConfigurationWebsite.get_solo() - cekinit = ResiCheck( - url=konfigurasi.url_check_resi, api=konfigurasi.api_check_resi - ) - code_expedisi = Expedisi.objects.get( - id=request.POST.get("expedisi") - ) + cekinit = ResiCheck(url=konfigurasi.url_check_resi, api=konfigurasi.api_check_resi) + code_expedisi = Expedisi.objects.get(id=request.POST.get("expedisi")) status_posisi = "dikirim" if not konfigurasi.bypass_expedisi: if code_expedisi.source_request == 1: - cekresi = cekinit.check_resi( - resi=resi, courier=code_expedisi.code - ) + cekresi = cekinit.check_resi(resi=resi, courier=code_expedisi.code) if cekresi.status_code != 200: url_redirect = reverse( "transaksi_toko", @@ -73,9 +68,7 @@ def post(self, request, id): return redirect(f"{url_redirect}?status={str(status)}") elif code_expedisi.source_request == 2: cekinit.api = konfigurasi.api_biteship - cekresi = cekinit.check_resi_bitesip( - resi=resi, courier=code_expedisi.code - ) + cekresi = cekinit.check_resi_bitesip(resi=resi, courier=code_expedisi.code) if cekresi.status_code != 200: cart.save() messages.success(request, "Nomor resi valid") @@ -153,9 +146,7 @@ def send_mail(self, request): to = [ request.user.email, ] - sendd = EmailMessage( - subject, html, from_email, to, connection=connection - ) + sendd = EmailMessage(subject, html, from_email, to, connection=connection) sendd.content_subtype = "html" sendd.send() except SMTPException as e: diff --git a/frontend/views/edit_barang_view.py b/frontend/views/edit_barang_view.py index f914142..7aa9fdb 100644 --- a/frontend/views/edit_barang_view.py +++ b/frontend/views/edit_barang_view.py @@ -6,7 +6,7 @@ from django.views.decorators.csrf import csrf_exempt from frontend.views.base_view import FrontPage -from master.models import Country +from master.models.country import Country from produk.models import ( DeskripsiProduk, GambarProduk, @@ -75,9 +75,7 @@ def post(self, request, id, produk_id): produk.harga = harga produk.berat = berat produk.lebar = lebar - produk.cross_boarder = ( - True if request.POST.get("cross_boarder", None) else False - ) + produk.cross_boarder = True if request.POST.get("cross_boarder", None) else False produk.tipe_id = tipe_post produk.save() @@ -106,48 +104,34 @@ def post(self, request, id, produk_id): filess3 = request.FILES.get("gambar3") if filess1: - gproduk = GambarProduk.objects.filter( - sortings=1, produk_id=produk.pk - ).first() + gproduk = GambarProduk.objects.filter(sortings=1, produk_id=produk.pk).first() if not gproduk: - GambarProduk.objects.create( - sortings=1, produk=produk, nama=nama, gambar=filess1 - ) + GambarProduk.objects.create(sortings=1, produk=produk, nama=nama, gambar=filess1) else: gproduk.nama = nama gproduk.gambar = filess1 gproduk.save() if filess2: - gproduk = GambarProduk.objects.filter( - sortings=2, produk_id=produk.pk - ).first() + gproduk = GambarProduk.objects.filter(sortings=2, produk_id=produk.pk).first() if not gproduk: - GambarProduk.objects.create( - sortings=2, produk=produk, nama=nama, gambar=filess2 - ) + GambarProduk.objects.create(sortings=2, produk=produk, nama=nama, gambar=filess2) else: gproduk.nama = nama gproduk.gambar = filess2 gproduk.save() if filess3: - gproduk = GambarProduk.objects.filter( - sortings=3, produk_id=produk.pk - ).first() + gproduk = GambarProduk.objects.filter(sortings=3, produk_id=produk.pk).first() if not gproduk: - GambarProduk.objects.create( - sortings=3, produk=produk, nama=nama, gambar=filess3 - ) + GambarProduk.objects.create(sortings=3, produk=produk, nama=nama, gambar=filess3) else: gproduk.nama = nama gproduk.gambar = filess3 gproduk.save() lang = LangSupport.objects.get(code=request.POST.get("bahasa", "id")) input_data = request.POST.get("deskripsi|" + lang.code) - DeskripsiProduk.objects.create( - produk=produk, languange=lang, deskripsi=input_data - ) + DeskripsiProduk.objects.create(produk=produk, languange=lang, deskripsi=input_data) except Exception as e: messages.error(request, f"Produk Tidak ada : {e.getMessage()}") return redirect(reverse("list_produk_toko", kwargs={"id": str(id)})) diff --git a/frontend/views/keranjang_add_view.py b/frontend/views/keranjang_add_view.py index 1f26aeb..bdb4b4a 100644 --- a/frontend/views/keranjang_add_view.py +++ b/frontend/views/keranjang_add_view.py @@ -10,9 +10,7 @@ class KeranjangAdd(FrontPage): def post(self, request, id=0): - keranjang_item = CartItem.objects.filter( - produk__pk=id, cart__user__pk=request.user.id - ) + keranjang_item = CartItem.objects.filter(produk__pk=id, cart__user__pk=request.user.id) status = {"success": False} if keranjang_item: for k in keranjang_item: @@ -22,9 +20,7 @@ def post(self, request, id=0): else: current_GMT = time.gmtime() time_stamp = calendar.timegm(current_GMT) - keranjang = Cart.objects.create( - kode=str(time_stamp), user=request.user, status=1 - ) + keranjang = Cart.objects.create(kode=str(time_stamp), user=request.user, status=1) produk = Produk.objects.get(pk=id) keranjang_item = CartItem.objects.create(cart=keranjang, produk=produk) status = {"success": True} diff --git a/frontend/views/list_produk_toko_view.py b/frontend/views/list_produk_toko_view.py index ffd361c..6861d28 100644 --- a/frontend/views/list_produk_toko_view.py +++ b/frontend/views/list_produk_toko_view.py @@ -13,9 +13,7 @@ @method_decorator(login_required, name="dispatch") class ListProdukToko(FrontPage): def get(self, request, id): - produk = Produk.objects.filter( - store__users_id=request.user.id, is_archive=False - ) + produk = Produk.objects.filter(store__users_id=request.user.id, is_archive=False) store = UserStore.objects.filter(pk=id) data = {"produk": produk, "store": store} return render(request, "toko/listproduk.html", data) diff --git a/frontend/views/minus_plus_view.py b/frontend/views/minus_plus_view.py index ebca8f9..a1f9706 100644 --- a/frontend/views/minus_plus_view.py +++ b/frontend/views/minus_plus_view.py @@ -12,9 +12,7 @@ class MinusPluss(FrontPage): def get(self, request): data = None try: - cart_data = CartItem.objects.filter( - cart__user_id=request.user.id, cart__status=1 - ).first() + cart_data = CartItem.objects.filter(cart__user_id=request.user.id, cart__status=1).first() typerequest = request.GET.get("type_request") if typerequest == "plus": cart_data.jumlah = cart_data.jumlah + 1 diff --git a/frontend/views/payments_cart_view.py b/frontend/views/payments_cart_view.py index 1264083..19a54d7 100644 --- a/frontend/views/payments_cart_view.py +++ b/frontend/views/payments_cart_view.py @@ -51,9 +51,7 @@ def get(self, request, param): api_key = self.configuration.api_key_pi data_url = "https://api.minepi.com/v2/payments/" + param - requestdata = requests.get( - data_url, headers={"Authorization": "Key " + api_key}, timeout=500000 - ) + requestdata = requests.get(data_url, headers={"Authorization": "Key " + api_key}, timeout=500000) cart_id = request.GET.get("cart_id") requestjson = requestdata.json() diff --git a/frontend/views/piverification_view.py b/frontend/views/piverification_view.py index 1c7f392..70ccb4f 100644 --- a/frontend/views/piverification_view.py +++ b/frontend/views/piverification_view.py @@ -1,7 +1,7 @@ from django.shortcuts import HttpResponse from django.views import View -from master.models import ConfigurationWebsite +from master.models.configuration_website import ConfigurationWebsite class VerificationCode(View): diff --git a/frontend/views/proccess/approve_view.py b/frontend/views/proccess/approve_view.py index a3b5cd4..5f7390a 100644 --- a/frontend/views/proccess/approve_view.py +++ b/frontend/views/proccess/approve_view.py @@ -7,8 +7,6 @@ class Approve(FrontPage): def get(self, request, id): - # settingweb = SettingWebsite.objects.filter(nama_pengaturan=1).first() - print(self.configuration.api_key_pi) settingweb = self.configuration.api_key_pi header = {"Authorization": "Key " + settingweb} postdata = requests.post( diff --git a/frontend/views/produk/produk_detail_view.py b/frontend/views/produk/produk_detail_view.py index 92dac06..2760d3c 100644 --- a/frontend/views/produk/produk_detail_view.py +++ b/frontend/views/produk/produk_detail_view.py @@ -16,9 +16,7 @@ def get(self, request, slug): except Exception as e: print(e) - ulasan = UlasanCart.objects.filter(produkitem_id=produk.id).order_by( - "-created_at" - ) + ulasan = UlasanCart.objects.filter(produkitem_id=produk.id).order_by("-created_at") ulasan = Paginator(ulasan, 10) ulasan_page_num = request.GET.get("page", 1) ulasan = ulasan.page(ulasan_page_num) @@ -27,9 +25,7 @@ def get(self, request, slug): user_lang = DeskripsiProduk.objects.filter(produk__id=produk.id).first() user_lang = user_lang.languange.code try: - deskripsi = DeskripsiProduk.objects.get( - produk__id=produk.id, languange__code=user_lang - ) + deskripsi = DeskripsiProduk.objects.get(produk__id=produk.id, languange__code=user_lang) except Exception as e: deskripsi = {"deskripsi": f"{str(e)}"} return render( diff --git a/frontend/views/profile/alamat_user_view.py b/frontend/views/profile/alamat_user_view.py index e57f247..3ec2383 100644 --- a/frontend/views/profile/alamat_user_view.py +++ b/frontend/views/profile/alamat_user_view.py @@ -34,9 +34,7 @@ def get(self, request): if userprofile.languages.code != "id": indo = False - userprofileaddress = UserProfileAddress.objects.filter( - userprofile_id=request.user.id - ) + userprofileaddress = UserProfileAddress.objects.filter(userprofile_id=request.user.id) return render( request, "profil/profile_alamat.html", diff --git a/frontend/views/profile/profile_alamat_view.py b/frontend/views/profile/profile_alamat_view.py index b2bbbc7..1ae0a58 100644 --- a/frontend/views/profile/profile_alamat_view.py +++ b/frontend/views/profile/profile_alamat_view.py @@ -25,15 +25,11 @@ def get(self, request): def post(self, request): userss = request.user try: - usernames = UserProfileAddress.objects.filter( - userprofile_id=userss.id, pk=request.POST.get("id") - ).first() + usernames = UserProfileAddress.objects.filter(userprofile_id=userss.id, pk=request.POST.get("id")).first() usernames.is_primary = True usernames.save() - usernames = UserProfileAddress.objects.filter( - userprofile_id=userss.id - ).exclude(pk=request.POST.get("id")) + usernames = UserProfileAddress.objects.filter(userprofile_id=userss.id).exclude(pk=request.POST.get("id")) for a in usernames: a.is_primary = False a.save() diff --git a/frontend/views/profile/profile_edit_view.py b/frontend/views/profile/profile_edit_view.py index 7b9ba34..b872641 100644 --- a/frontend/views/profile/profile_edit_view.py +++ b/frontend/views/profile/profile_edit_view.py @@ -18,9 +18,7 @@ def get(self, request): data.no_telepon = data.no_telepon or "" data.email = data.email or "" languages = LangSupport.objects.filter(is_active=True) - return render( - request, "profil/profiles_edit.html", {"data": data, "languages": languages} - ) + return render(request, "profil/profiles_edit.html", {"data": data, "languages": languages}) def post(self, request): models = request.user @@ -32,8 +30,6 @@ def post(self, request): models.image_profile = request.FILES.get("gambars") models.save() languagescode = request.user.languages.code if request.user.languages else "en" - message = translater( - languagescode, "Sukses Menyimpan Profil", "Sukses Menyimpan Profil" - ) + message = translater(languagescode, "Sukses Menyimpan Profil", "Sukses Menyimpan Profil") messages.success(request, message) return redirect("/profiles/edit") diff --git a/frontend/views/profile/profile_view.py b/frontend/views/profile/profile_view.py index cb5beb4..ed787ab 100644 --- a/frontend/views/profile/profile_view.py +++ b/frontend/views/profile/profile_view.py @@ -18,9 +18,7 @@ def get(self, request): profile = None else: url_data = url_data + get_query_string(profile) - profile_setting = UserSettingsMember.objects.filter( - user_id=profile.id - ).last() + profile_setting = UserSettingsMember.objects.filter(user_id=profile.id).last() stores = UserStore.objects.filter(users_id=profile.id).first() is_registered = False if profile_setting.tier: diff --git a/frontend/views/profile/register_member.py b/frontend/views/profile/register_member.py index 05f0ce2..3813dcf 100644 --- a/frontend/views/profile/register_member.py +++ b/frontend/views/profile/register_member.py @@ -37,16 +37,12 @@ def post(self, request): return redirect(reverse("register_member")) def get(self, request): - applied = UserAppliedMember.objects.filter( - user_id=request.user.id, is_accept=False - ) + applied = UserAppliedMember.objects.filter(user_id=request.user.id, is_accept=False) accept = False if applied.exists(): applied = applied.last() accept = True - applied_true = UserAppliedMember.objects.filter( - user_id=request.user.id, is_accept=True - ) + applied_true = UserAppliedMember.objects.filter(user_id=request.user.id, is_accept=True) if applied_true.exists(): applied_true = applied_true.last() code = UserCodeGenerator.objects.filter(user_apply_id=applied_true.id) diff --git a/frontend/views/profile/register_member_code.py b/frontend/views/profile/register_member_code.py index 09d16f3..24b2d18 100644 --- a/frontend/views/profile/register_member_code.py +++ b/frontend/views/profile/register_member_code.py @@ -64,9 +64,7 @@ def post(self, request): return redirect(reverse("profile")) def get(self, request): - applied = UserAppliedMember.objects.filter( - user_id=request.user.id, is_accept=True - ) + applied = UserAppliedMember.objects.filter(user_id=request.user.id, is_accept=True) if not applied.exists(): return redirect(reverse("register_member")) return render(request, "member/register_code_input.html") diff --git a/frontend/views/profile_detail_address_view.py b/frontend/views/profile_detail_address_view.py index eee6c82..bee9801 100644 --- a/frontend/views/profile_detail_address_view.py +++ b/frontend/views/profile_detail_address_view.py @@ -16,9 +16,7 @@ def post(self, request, id): usernames = UserProfileAddress.objects.get(userprofile_id=userss.pk, pk=id) usernames.is_primary = True usernames.save() - useraddress2 = UserProfileAddress.objects.filter( - userprofile_id=userss.pk - ).exclude(id=id) + useraddress2 = UserProfileAddress.objects.filter(userprofile_id=userss.pk).exclude(id=id) for useraddresss in useraddress2: useraddresss.is_primary = False useraddresss.save() diff --git a/frontend/views/service_worker.py b/frontend/views/service_worker.py index 9f55fad..bbbdeff 100644 --- a/frontend/views/service_worker.py +++ b/frontend/views/service_worker.py @@ -4,6 +4,4 @@ class ServiceWorkerView(View): def get(self, request, *args, **kwargs): - return render( - request, "firebase-messaging-sw.js", content_type="application/x-javascript" - ) + return render(request, "firebase-messaging-sw.js", content_type="application/x-javascript") diff --git a/frontend/views/toko/alamat_toko_view.py b/frontend/views/toko/alamat_toko_view.py index d55eda0..1b15ce1 100644 --- a/frontend/views/toko/alamat_toko_view.py +++ b/frontend/views/toko/alamat_toko_view.py @@ -13,27 +13,17 @@ class AlamatToko(FrontPage): def get(self, request, id): userprofile = UserStore.objects.get(users_id=request.user.id) - userprofileaddress = UserStoreAddress.objects.filter( - userstore_id=userprofile.id - ) - return render( - request, "toko/alamat.html", {"address": userprofileaddress, "id": id} - ) + userprofileaddress = UserStoreAddress.objects.filter(userstore_id=userprofile.id) + return render(request, "toko/alamat.html", {"address": userprofileaddress, "id": id}) def post(self, request, id): userprofile = UserStore.objects.get(users_id=request.user.id) - userprofileaddress = UserStoreAddress.objects.filter( - userstore_id=userprofile.id - ) - userprofileaddress = userprofileaddress.filter( - pk=request.POST.get("id") - ).first() + userprofileaddress = UserStoreAddress.objects.filter(userstore_id=userprofile.id) + userprofileaddress = userprofileaddress.filter(pk=request.POST.get("id")).first() userprofileaddress.is_primary = True userprofileaddress.save() - userprofileaddress = UserStoreAddress.objects.filter( - userstore_id=userprofile.id - ) + userprofileaddress = UserStoreAddress.objects.filter(userstore_id=userprofile.id) userprofileaddress = userprofileaddress.exclude(pk=request.POST.get("id")) for p in userprofileaddress: p.is_primary = False diff --git a/frontend/views/toko/jual.py b/frontend/views/toko/jual.py new file mode 100644 index 0000000..e7f31d6 --- /dev/null +++ b/frontend/views/toko/jual.py @@ -0,0 +1,126 @@ +import logging + +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.shortcuts import redirect, render +from django.urls import reverse +from django.utils.decorators import method_decorator +from django.views.decorators.csrf import csrf_exempt +from firebase_admin import messaging + +from frontend.views.base_view import FrontPage +from master.models.country import Country +from master.models.expedisi import Expedisi +from produk.models import ( + DeskripsiProduk, + GambarProduk, + Kategori, + Produk, + TipeProduk, + WarnaProduk, +) +from profiles.models import LangSupport +from store.models import UserStore + +db_logger = logging.getLogger("db") + + +@method_decorator(csrf_exempt, name="dispatch") +@method_decorator(login_required(login_url="/profile"), name="dispatch") +class Jual(FrontPage): + def get(self, request): + # Get user request + user = UserStore.objects.filter(users_id=request.user.id) + if user.exists(): + user = user.first() + if user.is_active_store is False: + return redirect(reverse("profile")) + else: + return redirect(reverse("profile")) + kategori = Kategori.objects.all() + typeproduk = TipeProduk.objects.all() + warnaproduk = WarnaProduk.objects.all() + expedisi = Expedisi.objects.all() + languages = LangSupport.objects.filter(is_active=True) + country = Country.objects.filter(is_active=True) + return render( + request, + "jual/index.html", + { + "kategori": kategori, + "typeproduk": typeproduk, + "warnaproduk": warnaproduk, + "ekspedisi": expedisi, + "languages": languages, + "country": country, + }, + ) + + def post(self, request): + refinput = request.POST + reffile = request.FILES + store = None + try: + store = UserStore.objects.get(users__pk=request.user.id) + except Exception: + store = UserStore.objects.create(users=request.user, nama=request.user.username) + messages.error(request, "Belum Mempunyai Toko") + return redirect(reverse("jual")) + + produk = Produk.objects.filter(store__id=store.id, nama=refinput.get("nama", "")).first() + if produk: + messages.error(request, "Produk sudah ada") + return redirect(reverse("jual")) + + verification_input = ["nama", "harga", "deskripsi", "stok", "berat", "lebar", "lintas_negara", "negara", "tipe"] + for verif in verification_input: + if refinput.get(verif) is None or refinput.get(verif) == "": + messages.error(request, "Produk gagal disimpan") + return redirect(reverse("jual")) + try: + produk = Produk.objects.create( + store=store, + nama=refinput.get("nama", ""), + harga=refinput.get("harga", 1), + detail=refinput.get("deskripsi", "-"), + stok_produk=refinput.get("stok", 1), + berat=refinput.get("berat"), + lebar=refinput.get("lebar"), + cross_boarder=refinput.get("lintas_negara", False), + negara_id=refinput.get("negara", None), + tipe_id=refinput.get("tipe"), + ) + for k in refinput.getlist("kategori"): + kateg = Kategori.objects.filter(pk=k).first() + produk.kategori.add(kateg) + + for k in refinput.getlist("warna"): + try: + warnaa = WarnaProduk.objects.filter(pk=k).first() + except Exception as e: + db_logger.error(e) + warnaa = WarnaProduk.objects.filter(nama=k).first() + if warnaa: + produk.warna.add(warnaa) + else: + warnaa = WarnaProduk.objects.create(nama=k) + produk.warna.add(warnaa) + lang = LangSupport.objects.get(code=refinput.get("bahasa", "id")) + input_data = refinput.get("deskripsi|" + lang.code) + DeskripsiProduk.objects.create(produk=produk, languange=lang, deskripsi=input_data) + + for reffiles in reffile.getlist("gambar"): + GambarProduk.objects.create(produk=produk, nama=refinput.get("nama", "-"), gambar=reffiles) + if request.user.fcm_token: + message = messaging.Message( + notification=messaging.Notification( + title="Produk", + body="User telah menambahkan produk", + ), + token=str(request.user.fcm_token), + ) + messaging.send(message) + messages.success(request, "Produk Berhasil disimpan") + except Exception as e: + db_logger.error(e) + return redirect(reverse("jual")) diff --git a/frontend/views/toko/jual_view.py b/frontend/views/toko/jual_view.py deleted file mode 100644 index 7685f27..0000000 --- a/frontend/views/toko/jual_view.py +++ /dev/null @@ -1,121 +0,0 @@ -from django.contrib import messages -from django.contrib.auth.decorators import login_required -from django.shortcuts import redirect, render -from django.urls import reverse -from django.utils.decorators import method_decorator -from django.views.decorators.csrf import csrf_exempt -from firebase_admin import messaging - -from frontend.views.base_view import FrontPage -from master.models import Country -from produk.models import ( - DeskripsiProduk, - Expedisi, - GambarProduk, - Kategori, - Produk, - TipeProduk, - WarnaProduk, -) -from profiles.models import LangSupport -from store.models import UserStore - - -@method_decorator(csrf_exempt, name="dispatch") -@method_decorator(login_required(login_url="/profile"), name="dispatch") -class Jual(FrontPage): - def get(self, request): - user = UserStore.objects.filter(users_id=request.user.id) - if user.exists(): - user = user.first() - if user.is_active_store is False: - return redirect(reverse("profile")) - else: - return redirect(reverse("profile")) - kategori = Kategori.objects.all() - typeproduk = TipeProduk.objects.all() - warnaproduk = WarnaProduk.objects.all() - expedisi = Expedisi.objects.all() - languages = LangSupport.objects.filter(is_active=True) - country = Country.objects.filter(is_active=True) - return render( - request, - "jual/index.html", - { - "kategori": kategori, - "typeproduk": typeproduk, - "warnaproduk": warnaproduk, - "ekspedisi": expedisi, - "languages": languages, - "country": country, - }, - ) - - def post(self, request): - refinput = request.POST - reffile = request.FILES - store = None - try: - store = UserStore.objects.get(users__pk=request.user.id) - except Exception: - store = UserStore.objects.create( - users=request.user, nama=request.user.username - ) - messages.error(request, "Belum Mempunyai Toko") - return redirect(reverse("jual")) - - produk = Produk.objects.filter( - store__id=store.id, nama=refinput.get("nama", "") - ).first() - if produk: - messages.error(request, "Produk sudah ada") - return redirect(reverse("jual")) - - produk = Produk.objects.create( - store=store, - nama=refinput.get("nama", ""), - harga=refinput.get("harga", 1), - detail=refinput.get("deskripsi", "-"), - stok_produk=refinput.get("stok", 1), - berat=refinput.get("berat"), - lebar=refinput.get("lebar"), - cross_boarder=refinput.get("lintas_negara", False), - negara_id=refinput.get("negara", None), - tipe_id=refinput.get("tipe"), - ) - for k in refinput.getlist("kategori"): - kateg = Kategori.objects.filter(pk=k).first() - produk.kategori.add(kateg) - - for k in refinput.getlist("warna"): - try: - warnaa = WarnaProduk.objects.filter(pk=k).first() - except Exception as e: - print(e) - warnaa = WarnaProduk.objects.filter(nama=k).first() - if warnaa: - produk.warna.add(warnaa) - else: - warnaa = WarnaProduk.objects.create(nama=k) - produk.warna.add(warnaa) - lang = LangSupport.objects.get(code=refinput.get("bahasa", "id")) - input_data = refinput.get("deskripsi|" + lang.code) - DeskripsiProduk.objects.create( - produk=produk, languange=lang, deskripsi=input_data - ) - - for reffiles in reffile.getlist("gambar"): - GambarProduk.objects.create( - produk=produk, nama=refinput.get("nama", "-"), gambar=reffiles - ) - if request.user.fcm_token: - message = messaging.Message( - notification=messaging.Notification( - title="Produk", - body="User telah menambahkan produk", - ), - token=str(request.user.fcm_token), - ) - messaging.send(message) - messages.success(request, "Produk Berhasil disimpan") - return redirect(reverse("jual")) diff --git a/frontend/views/transaksi_selesai_view.py b/frontend/views/transaksi_selesai_view.py index 1fbd6d1..dd242d4 100644 --- a/frontend/views/transaksi_selesai_view.py +++ b/frontend/views/transaksi_selesai_view.py @@ -18,9 +18,7 @@ def get(self, request): carts.save() userprofile = UserStore.objects.get(pk=cartitem.produk.store.id) - userprofile.coin += float(cartitem.jumlah) * float( - cartitem.produk.harga - ) + userprofile.coin += float(cartitem.jumlah) * float(cartitem.produk.harga) userprofile.save() except Exception as e: print(e) diff --git a/frontend/views/transaksi_user_view.py b/frontend/views/transaksi_user_view.py index 6aba5c2..b474cac 100644 --- a/frontend/views/transaksi_user_view.py +++ b/frontend/views/transaksi_user_view.py @@ -16,9 +16,9 @@ def get(self, request): "diproses": cart.filter(status=2).count(), "dikirim": cart.filter(status=3).count(), } - transaksi_data = CartItem.objects.filter( - cart__user_id=request.user.id, cart__status_pembayaran__gte=2 - ).filter(cart__status=request.GET.get("status", 1)) + transaksi_data = CartItem.objects.filter(cart__user_id=request.user.id, cart__status_pembayaran__gte=2).filter( + cart__status=request.GET.get("status", 1) + ) data = { "transaksi": transaksi_status, "transaksi_data": transaksi_data, @@ -26,17 +26,13 @@ def get(self, request): return render(request, "profil/transaksi_user.html", data) def post(self, request): - userstore = Cart.objects.filter( - user_id=request.user.id, status_pembayaran__gte=2 - ) + userstore = Cart.objects.filter(user_id=request.user.id, status_pembayaran__gte=2) userstore = userstore.filter(pk=request.POST.get("id")).first() userstore.status = 4 userstore.status_toko = 4 userstore.save() userstore_item = CartItem.objects.filter(cart_id=userstore.id).first() userstore_store = userstore_item.produk_chart.store - userstore_store.coin = float(userstore_store.coin) + float( - userstore_item.produk.harga - ) + userstore_store.coin = float(userstore_store.coin) + float(userstore_item.produk.harga) userstore_store.save() return redirect("/transaksi/users/list?status=" + request.GET.get("status")) diff --git a/frontend/views/withdrawl_proccess_view.py b/frontend/views/withdrawl_proccess_view.py index bcc62ec..ec28146 100644 --- a/frontend/views/withdrawl_proccess_view.py +++ b/frontend/views/withdrawl_proccess_view.py @@ -1,6 +1,6 @@ from django.http import JsonResponse -from master.models import HistoriTampung +from master.models.history_tampung import HistoriTampung from profiles.models import UserWithdrawlTransaction from projekpi.pi_network import PiNetwork @@ -31,9 +31,7 @@ def get(self, request): txid = pi.submit_payment(payment_id, False) pi.complete_payment(payment_id, txid) - UserWithdrawlTransaction.objects.create( - user=request.user, jumlah=jumlah - ) + UserWithdrawlTransaction.objects.create(user=request.user, jumlah=jumlah) pajaks = HistoriTampung(jumlah=jumlah) pajaks.save() diff --git a/frontend/views/withdrawl_request_json_view.py b/frontend/views/withdrawl_request_json_view.py index 0a0ac25..e693ebd 100644 --- a/frontend/views/withdrawl_request_json_view.py +++ b/frontend/views/withdrawl_request_json_view.py @@ -13,9 +13,7 @@ class WithdrawlRequestJson(FrontPage): def post(self, request): data = {"success": False} gettype = request.POST.get("jumlah", 0) - userwd = UserwithdrawlTransactionRequest.objects.filter( - user_id=request.user.id, status=1 - ) + userwd = UserwithdrawlTransactionRequest.objects.filter(user_id=request.user.id, status=1) userwd = userwd.aggregate(total=Sum("jumlah")) userwd = userwd["total"] or 0 @@ -26,7 +24,6 @@ def post(self, request): usercoin = user.coin - userwd if usercoin > gettype: try: - UserwithdrawlTransactionRequest.objects.create( user_id=request.user.id, jumlah=gettype, status=1 ) diff --git a/frontend/views/withdrawl_view.py b/frontend/views/withdrawl_view.py index bbea31e..0954465 100644 --- a/frontend/views/withdrawl_view.py +++ b/frontend/views/withdrawl_view.py @@ -13,16 +13,12 @@ class Withdrawl(FrontPage): def get(self, request): user = request.user - history = UserWithdrawlTransaction.objects.filter( - user_id=request.user.id - ).order_by("-pk") - history_request = UserwithdrawlTransactionRequest.objects.filter( - user_id=request.user.id, status=1 - ).order_by("-pk") - - userwd = UserwithdrawlTransactionRequest.objects.filter( - user_id=request.user.id, status=1 + history = UserWithdrawlTransaction.objects.filter(user_id=request.user.id).order_by("-pk") + history_request = UserwithdrawlTransactionRequest.objects.filter(user_id=request.user.id, status=1).order_by( + "-pk" ) + + userwd = UserwithdrawlTransactionRequest.objects.filter(user_id=request.user.id, status=1) userwd = userwd.aggregate(total=Sum("jumlah")) userwd = userwd["total"] or 0 diff --git a/frontend/viewsets/districviewset.py b/frontend/viewsets/districviewset.py index 7850013..a418672 100644 --- a/frontend/viewsets/districviewset.py +++ b/frontend/viewsets/districviewset.py @@ -2,7 +2,7 @@ from rest_framework import filters, viewsets from frontend.serializers import DistricSerializer -from master.models import Distric +from master.models.distric import Distric class DistricViewset(viewsets.ModelViewSet): diff --git a/frontend/viewsets/provinsiviewset.py b/frontend/viewsets/provinsiviewset.py index 3b6b587..2363c8b 100644 --- a/frontend/viewsets/provinsiviewset.py +++ b/frontend/viewsets/provinsiviewset.py @@ -2,7 +2,7 @@ from rest_framework import filters, viewsets from frontend.serializers import ProvinsiSerializer -from master.models import Provinsi +from master.models.provinsi import Provinsi class ProvinsiViewset(viewsets.ModelViewSet): diff --git a/frontend/viewsets/regencyviewset.py b/frontend/viewsets/regencyviewset.py index fc4ffe0..fbf7c20 100644 --- a/frontend/viewsets/regencyviewset.py +++ b/frontend/viewsets/regencyviewset.py @@ -2,7 +2,7 @@ from rest_framework import filters, viewsets from frontend.serializers import RegencySerializer -from master.models import Regency +from master.models.regency import Regency class RegencyViewset(viewsets.ModelViewSet): diff --git a/frontend/viewsets/vilagerviewset.py b/frontend/viewsets/vilagerviewset.py index fe58dc8..dee0d54 100644 --- a/frontend/viewsets/vilagerviewset.py +++ b/frontend/viewsets/vilagerviewset.py @@ -1,7 +1,7 @@ from rest_framework import viewsets from frontend.serializers import VillageSerializer -from master.models import Village +from master.models.village import Village class VillagerViewset(viewsets.ModelViewSet): diff --git a/master/admin.py b/master/admin.py index 6243b09..2add5c0 100644 --- a/master/admin.py +++ b/master/admin.py @@ -1,154 +1,31 @@ from django.contrib import admin -from import_export import fields, resources -from import_export.admin import ImportExportModelAdmin -from import_export.widgets import ForeignKeyWidget from solo.admin import SingletonModelAdmin -from .models import ( - ConfigurationWebsite, - Country, - Distric, - HistoriTampung, - Provinsi, - Regency, - Region, - SettingWebsite, - SubRegion, - Village, -) +from master.admin_view.country import CountryAdmin +from master.admin_view.distric import DistricAdmin +from master.admin_view.provinsi import ProvinsiAdmin +from master.admin_view.regency import RegencyAdmin +from master.admin_view.region import RegionAdmin +from master.admin_view.subregion import SubRegionAdmin +from master.admin_view.village import VillageAdmin +from master.models.configuration_website import ConfigurationWebsite +from master.models.country import Country +from master.models.distric import Distric +from master.models.history_tampung import HistoriTampung +from master.models.provinsi import Provinsi +from master.models.regency import Regency +from master.models.region import Region +from master.models.setting_website import SettingWebsite +from master.models.subregion import SubRegion +from master.models.village import Village admin.site.register(ConfigurationWebsite, SingletonModelAdmin) admin.site.register(HistoriTampung) - - -class ProvinsiResource(resources.ModelResource): - class Meta: - model = Provinsi - import_id_fields = ["id"] - - -class ProvinsiAdmin(ImportExportModelAdmin): - resource_classes = [ProvinsiResource] - - admin.site.register(Provinsi, ProvinsiAdmin) - - -class RegencyResource(resources.ModelResource): - province_code = fields.Field( - column_name="province_code", - attribute="province_code", - widget=ForeignKeyWidget(Provinsi, field="code"), - ) - - class Meta: - model = Regency - import_id_fields = ["id"] - - -class RegencyAdmin(ImportExportModelAdmin): - resource_classes = [RegencyResource] - - admin.site.register(Regency, RegencyAdmin) - - -class DistricResource(resources.ModelResource): - regency_code = fields.Field( - column_name="regency_code", - attribute="regency_code", - widget=ForeignKeyWidget(Regency, field="code"), - ) - - class Meta: - model = Distric - import_id_fields = ["id"] - - -class DistricAdmin(ImportExportModelAdmin): - resource_classes = [DistricResource] - - admin.site.register(Distric, DistricAdmin) - - -class VillageResource(resources.ModelResource): - district_code = fields.Field( - column_name="district_code", - attribute="district_code", - widget=ForeignKeyWidget(Distric, field="code"), - ) - - class Meta: - model = Village - import_id_fields = ["id"] - - -class VillageAdmin(ImportExportModelAdmin): - resource_classes = [VillageResource] - - admin.site.register(Village, VillageAdmin) - admin.site.register(SettingWebsite) - - -class RegionResource(resources.ModelResource): - wiki_id = fields.Field(column_name="wiki_id", attribute="wiki_id") - - class Meta: - model = Region - import_id_fields = ["id"] - - -class RegionAdmin(ImportExportModelAdmin): - resource_classes = [RegionResource] - - admin.site.register(Region, RegionAdmin) - - -class SubRegionResource(resources.ModelResource): - region_id = fields.Field( - column_name="region_id", - attribute="region_id", - widget=ForeignKeyWidget(Region, field="id"), - ) - - class Meta: - model = SubRegion - import_id_fields = ["id"] - - -class SubRegionAdmin(ImportExportModelAdmin): - resource_classes = [SubRegionResource] - - admin.site.register(SubRegion, SubRegionAdmin) - - -class CountryResource(resources.ModelResource): - region_id = fields.Field( - column_name="region_id", - attribute="region_id", - widget=ForeignKeyWidget(Region, field="id"), - ) - - subregion_id = fields.Field( - column_name="subregion_id", - attribute="subregion_id", - widget=ForeignKeyWidget(SubRegion, field="id"), - ) - - class Meta: - model = Country - import_id_fields = ["id"] - - -class CountryAdmin(ImportExportModelAdmin): - resource_classes = [CountryResource] - - admin.site.register(Country, CountryAdmin) - -# Register your models here. diff --git a/master/admin_view/country.py b/master/admin_view/country.py new file mode 100644 index 0000000..dcdeb29 --- /dev/null +++ b/master/admin_view/country.py @@ -0,0 +1,32 @@ +from import_export import fields, resources +from import_export.admin import ImportExportModelAdmin +from import_export.widgets import ForeignKeyWidget + +from master.models.country import Country +from master.models.region import Region +from master.models.subregion import SubRegion + + +class CountryResource(resources.ModelResource): + region_id = fields.Field( + column_name="region_id", + attribute="region_id", + widget=ForeignKeyWidget(Region, field="id"), + ) + + subregion_id = fields.Field( + column_name="subregion_id", + attribute="subregion_id", + widget=ForeignKeyWidget(SubRegion, field="id"), + ) + + class Meta: + model = Country + import_id_fields = ["id"] + + +class CountryAdmin(ImportExportModelAdmin): + resource_classes = [CountryResource] + + +# Register your models here. diff --git a/master/admin_view/distric.py b/master/admin_view/distric.py new file mode 100644 index 0000000..f871598 --- /dev/null +++ b/master/admin_view/distric.py @@ -0,0 +1,23 @@ +from import_export import fields, resources +from import_export.admin import ImportExportModelAdmin +from import_export.widgets import ForeignKeyWidget + +from master.models.distric import Distric +from master.models.regency import Regency + + +class DistricResource(resources.ModelResource): + regency_code = fields.Field( + column_name="regency_code", + attribute="regency_code", + widget=ForeignKeyWidget(Regency, field="code"), + ) + + class Meta: + model = Distric + import_id_fields = ["id"] + + +class DistricAdmin(ImportExportModelAdmin): + resource_classes = [DistricResource] + diff --git a/master/admin_view/provinsi.py b/master/admin_view/provinsi.py new file mode 100644 index 0000000..ced2408 --- /dev/null +++ b/master/admin_view/provinsi.py @@ -0,0 +1,15 @@ +from import_export import resources +from import_export.admin import ImportExportModelAdmin + +from master.models.provinsi import Provinsi + + +class ProvinsiResource(resources.ModelResource): + class Meta: + model = Provinsi + import_id_fields = ["id"] + + +class ProvinsiAdmin(ImportExportModelAdmin): + resource_classes = [ProvinsiResource] + diff --git a/master/admin_view/regency.py b/master/admin_view/regency.py new file mode 100644 index 0000000..f4140bd --- /dev/null +++ b/master/admin_view/regency.py @@ -0,0 +1,23 @@ +from import_export import fields, resources +from import_export.admin import ImportExportModelAdmin +from import_export.widgets import ForeignKeyWidget + +from master.models.provinsi import Provinsi +from master.models.regency import Regency + + +class RegencyResource(resources.ModelResource): + province_code = fields.Field( + column_name="province_code", + attribute="province_code", + widget=ForeignKeyWidget(Provinsi, field="code"), + ) + + class Meta: + model = Regency + import_id_fields = ["id"] + + +class RegencyAdmin(ImportExportModelAdmin): + resource_classes = [RegencyResource] + diff --git a/master/admin_view/region.py b/master/admin_view/region.py new file mode 100644 index 0000000..ecc0fd2 --- /dev/null +++ b/master/admin_view/region.py @@ -0,0 +1,16 @@ +from import_export import fields, resources +from import_export.admin import ImportExportModelAdmin + +from master.models.region import Region + + +class RegionResource(resources.ModelResource): + wiki_id = fields.Field(column_name="wiki_id", attribute="wiki_id") + + class Meta: + model = Region + import_id_fields = ["id"] + + +class RegionAdmin(ImportExportModelAdmin): + resource_classes = [RegionResource] \ No newline at end of file diff --git a/master/admin_view/subregion.py b/master/admin_view/subregion.py new file mode 100644 index 0000000..86c3bef --- /dev/null +++ b/master/admin_view/subregion.py @@ -0,0 +1,22 @@ +from import_export import fields, resources +from import_export.admin import ImportExportModelAdmin +from import_export.widgets import ForeignKeyWidget + +from master.models.region import Region +from master.models.subregion import SubRegion + + +class SubRegionResource(resources.ModelResource): + region_id = fields.Field( + column_name="region_id", + attribute="region_id", + widget=ForeignKeyWidget(Region, field="id"), + ) + + class Meta: + model = SubRegion + import_id_fields = ["id"] + + +class SubRegionAdmin(ImportExportModelAdmin): + resource_classes = [SubRegionResource] \ No newline at end of file diff --git a/master/admin_view/village.py b/master/admin_view/village.py new file mode 100644 index 0000000..987a36b --- /dev/null +++ b/master/admin_view/village.py @@ -0,0 +1,22 @@ +from import_export import fields, resources +from import_export.admin import ImportExportModelAdmin +from import_export.widgets import ForeignKeyWidget + +from master.models.distric import Distric +from master.models.village import Village + + +class VillageResource(resources.ModelResource): + district_code = fields.Field( + column_name="district_code", + attribute="district_code", + widget=ForeignKeyWidget(Distric, field="code"), + ) + + class Meta: + model = Village + import_id_fields = ["id"] + + +class VillageAdmin(ImportExportModelAdmin): + resource_classes = [VillageResource] \ No newline at end of file diff --git a/master/models.py b/master/models.py deleted file mode 100644 index b25aa4e..0000000 --- a/master/models.py +++ /dev/null @@ -1,127 +0,0 @@ -from django.db import models -from solo.models import SingletonModel - - -class Region(models.Model): - name = models.CharField(max_length=100) - wiki_id = models.CharField(max_length=100) - - -class SubRegion(models.Model): - region_id = models.ForeignKey(Region, on_delete=models.CASCADE) - name = models.CharField(max_length=100) - wiki_id = models.CharField(max_length=100) - - -class Country(models.Model): - region_id = models.ForeignKey( - Region, on_delete=models.CASCADE, blank=True, null=True - ) - subregion_id = models.ForeignKey( - SubRegion, on_delete=models.CASCADE, blank=True, null=True - ) - name = models.CharField(max_length=100) - iso3 = models.CharField(max_length=50, blank=True, null=True) - iso2 = models.CharField(max_length=50, blank=True, null=True) - numeric_code = models.CharField(max_length=50, blank=True, null=True) - phone_code = models.CharField(max_length=50, blank=True, null=True) - capital = models.CharField(max_length=50, blank=True, null=True) - currency = models.CharField(max_length=50, blank=True, null=True) - currency_name = models.CharField(max_length=50, blank=True, null=True) - currency_symbol = models.CharField(max_length=50, blank=True, null=True) - tld = models.CharField(max_length=50, blank=True, null=True) - native = models.CharField(max_length=50, blank=True, null=True) - nationality = models.CharField(max_length=50, blank=True, null=True) - timezones = models.TextField(blank=True, null=True, default=[]) - is_active = models.BooleanField(default=True) - - -# Create your models here. -class Provinsi(models.Model): - code = models.CharField(max_length=255) - nama = models.CharField(max_length=255) - - def __str__(self) -> str: - return self.code - - -class Regency(models.Model): - code = models.CharField(max_length=255) - province_code = models.ForeignKey(Provinsi, on_delete=models.CASCADE) - name = models.CharField(max_length=255) - - def __str__(self) -> str: - return self.code - - -class Distric(models.Model): - code = models.CharField(max_length=255) - regency_code = models.ForeignKey(Regency, on_delete=models.CASCADE) - name = models.CharField(max_length=255) - - def __str__(self) -> str: - return self.code - - -class Village(models.Model): - code = models.CharField(max_length=255) - district_code = models.ForeignKey(Distric, on_delete=models.CASCADE) - name = models.CharField(max_length=255) - - def __str__(self) -> str: - return self.code - - -class SettingWebsite(models.Model): - SETTING_NAMA = [ - (1, "api_key"), - (2, "wallet_private"), - (3, "pajak_beli"), - (4, "pajak_withdrawl"), - ] - nama_pengaturan = models.IntegerField(choices=SETTING_NAMA) - setting_value = models.CharField(max_length=255) - - def __str__(self): - return self.setting_value - - -class ConfigurationWebsite(SingletonModel): - api_key_pi = models.CharField(blank=True, null=True, max_length=255) - wallet_private_pi = models.CharField(blank=True, null=True, max_length=255) - pajak_beli = models.FloatField(default=0) - pajak_withdrawl = models.FloatField(default=0) - koin_website = models.FloatField(default=0) - konfigurasi_firebase = models.FileField( - blank=True, null=True, upload_to="konfigurasi/" - ) - url_check_resi = models.URLField(blank=True, null=True) - api_check_resi = models.CharField(blank=True, null=True, max_length=200) - video_splash = models.FileField( - blank=True, null=True, upload_to="splash", unique=True - ) - - api_biteship = models.CharField(blank=True, null=True, max_length=255) - verification = models.CharField(blank=True, null=True, max_length=255) - bypass_expedisi = models.BooleanField(default=False) - - -class HistoriTampung(models.Model): - tanggal = models.DateTimeField(auto_now=True) - jumlah = models.FloatField(default=0) - success = models.BooleanField(default=False) - - -class Negara(models.Model): - kode = models.CharField(max_length=50) - nama = models.CharField(max_length=100) - - -class VoucherConfig(models.Model): - generate_code = models.CharField(max_length=50) - has_access_store = models.BooleanField(default=False) - is_active = models.BooleanField(default=True) - - -# class Tampung(models.Model): -# history_tampung = models.CharField(max_length=) diff --git a/master/models/configuration_website.py b/master/models/configuration_website.py new file mode 100644 index 0000000..735b905 --- /dev/null +++ b/master/models/configuration_website.py @@ -0,0 +1,18 @@ +from django.db import models +from solo.models import SingletonModel + + +class ConfigurationWebsite(SingletonModel): + api_key_pi = models.CharField(blank=True, null=True, max_length=255) + wallet_private_pi = models.CharField(blank=True, null=True, max_length=255) + pajak_beli = models.FloatField(default=0) + pajak_withdrawl = models.FloatField(default=0) + koin_website = models.FloatField(default=0) + konfigurasi_firebase = models.FileField(blank=True, null=True, upload_to="konfigurasi/") + url_check_resi = models.URLField(blank=True, null=True) + api_check_resi = models.CharField(blank=True, null=True, max_length=200) + video_splash = models.FileField(blank=True, null=True, upload_to="splash", unique=True) + + api_biteship = models.CharField(blank=True, null=True, max_length=255) + verification = models.CharField(blank=True, null=True, max_length=255) + bypass_expedisi = models.BooleanField(default=False) \ No newline at end of file diff --git a/master/models/country.py b/master/models/country.py new file mode 100644 index 0000000..cc9e8e4 --- /dev/null +++ b/master/models/country.py @@ -0,0 +1,23 @@ +from django.db import models + +from master.models.region import Region +from master.models.subregion import SubRegion + + +class Country(models.Model): + region_id = models.ForeignKey(Region, on_delete=models.CASCADE, blank=True, null=True) + subregion_id = models.ForeignKey(SubRegion, on_delete=models.CASCADE, blank=True, null=True) + name = models.CharField(max_length=100) + iso3 = models.CharField(max_length=50, blank=True, null=True) + iso2 = models.CharField(max_length=50, blank=True, null=True) + numeric_code = models.CharField(max_length=50, blank=True, null=True) + phone_code = models.CharField(max_length=50, blank=True, null=True) + capital = models.CharField(max_length=50, blank=True, null=True) + currency = models.CharField(max_length=50, blank=True, null=True) + currency_name = models.CharField(max_length=50, blank=True, null=True) + currency_symbol = models.CharField(max_length=50, blank=True, null=True) + tld = models.CharField(max_length=50, blank=True, null=True) + native = models.CharField(max_length=50, blank=True, null=True) + nationality = models.CharField(max_length=50, blank=True, null=True) + timezones = models.TextField(blank=True, null=True, default=[]) + is_active = models.BooleanField(default=True) diff --git a/master/models/distric.py b/master/models/distric.py new file mode 100644 index 0000000..2dd1975 --- /dev/null +++ b/master/models/distric.py @@ -0,0 +1,12 @@ +from django.db import models + +from master.models.regency import Regency + + +class Distric(models.Model): + code = models.CharField(max_length=255) + regency_code = models.ForeignKey(Regency, on_delete=models.CASCADE) + name = models.CharField(max_length=255) + + def __str__(self) -> str: + return self.code diff --git a/master/models/expedisi.py b/master/models/expedisi.py new file mode 100644 index 0000000..2df951a --- /dev/null +++ b/master/models/expedisi.py @@ -0,0 +1,16 @@ +from django.db import models + + +class Expedisi(models.Model): + SOURCE_REQUEST = [ + (1, "Raja Ongkir"), + (2, "Biteship"), + ] + code = models.CharField(max_length=255, null=True, blank=True) + nama = models.CharField(max_length=255) + url_request = models.URLField(null=True, blank=True) + source_request = models.IntegerField(choices=SOURCE_REQUEST, default=1) + + def __str__(self): + return self.nama + diff --git a/master/models/history_tampung.py b/master/models/history_tampung.py new file mode 100644 index 0000000..8f06e64 --- /dev/null +++ b/master/models/history_tampung.py @@ -0,0 +1,7 @@ +from django.db import models + + +class HistoriTampung(models.Model): + tanggal = models.DateTimeField(auto_now=True) + jumlah = models.FloatField(default=0) + success = models.BooleanField(default=False) diff --git a/master/models/negara.py b/master/models/negara.py new file mode 100644 index 0000000..44c92de --- /dev/null +++ b/master/models/negara.py @@ -0,0 +1,6 @@ +from django.db import models + + +class Negara(models.Model): + kode = models.CharField(max_length=50) + nama = models.CharField(max_length=100) diff --git a/master/models/provinsi.py b/master/models/provinsi.py new file mode 100644 index 0000000..71af15a --- /dev/null +++ b/master/models/provinsi.py @@ -0,0 +1,9 @@ +from django.db import models + + +class Provinsi(models.Model): + code = models.CharField(max_length=255) + nama = models.CharField(max_length=255) + + def __str__(self) -> str: + return self.code diff --git a/master/models/regency.py b/master/models/regency.py new file mode 100644 index 0000000..1e61400 --- /dev/null +++ b/master/models/regency.py @@ -0,0 +1,12 @@ +from django.db import models + +from master.models.provinsi import Provinsi + + +class Regency(models.Model): + code = models.CharField(max_length=255) + province_code = models.ForeignKey(Provinsi, on_delete=models.CASCADE) + name = models.CharField(max_length=255) + + def __str__(self) -> str: + return self.code diff --git a/master/models/region.py b/master/models/region.py new file mode 100644 index 0000000..735d319 --- /dev/null +++ b/master/models/region.py @@ -0,0 +1,6 @@ +from django.db import models + + +class Region(models.Model): + name = models.CharField(max_length=100) + wiki_id = models.CharField(max_length=100) diff --git a/master/models/setting_website.py b/master/models/setting_website.py new file mode 100644 index 0000000..fcb4523 --- /dev/null +++ b/master/models/setting_website.py @@ -0,0 +1,15 @@ +from django.db import models + + +class SettingWebsite(models.Model): + SETTING_NAMA = [ + (1, "api_key"), + (2, "wallet_private"), + (3, "pajak_beli"), + (4, "pajak_withdrawl"), + ] + nama_pengaturan = models.IntegerField(choices=SETTING_NAMA) + setting_value = models.CharField(max_length=255) + + def __str__(self): + return self.setting_value diff --git a/master/models/subregion.py b/master/models/subregion.py new file mode 100644 index 0000000..c19af99 --- /dev/null +++ b/master/models/subregion.py @@ -0,0 +1,9 @@ +from django.db import models + +from master.models.region import Region + + +class SubRegion(models.Model): + region_id = models.ForeignKey(Region, on_delete=models.CASCADE) + name = models.CharField(max_length=100) + wiki_id = models.CharField(max_length=100) diff --git a/master/models/village.py b/master/models/village.py new file mode 100644 index 0000000..3e95040 --- /dev/null +++ b/master/models/village.py @@ -0,0 +1,12 @@ +from django.db import models + +from master.models.distric import Distric + + +class Village(models.Model): + code = models.CharField(max_length=255) + district_code = models.ForeignKey(Distric, on_delete=models.CASCADE) + name = models.CharField(max_length=255) + + def __str__(self) -> str: + return self.code diff --git a/master/models/voucher_config.py b/master/models/voucher_config.py new file mode 100644 index 0000000..22f1b27 --- /dev/null +++ b/master/models/voucher_config.py @@ -0,0 +1,7 @@ +from django.db import models + + +class VoucherConfig(models.Model): + generate_code = models.CharField(max_length=50) + has_access_store = models.BooleanField(default=False) + is_active = models.BooleanField(default=True) diff --git a/produk/forms.py b/produk/forms.py index a60a6bc..1411c67 100644 --- a/produk/forms.py +++ b/produk/forms.py @@ -4,7 +4,6 @@ class CartForm(forms.ModelForm): - class Meta: model = Cart fields = "__all__" diff --git a/produk/models.py b/produk/models.py index aed6160..69a6707 100644 --- a/produk/models.py +++ b/produk/models.py @@ -5,9 +5,14 @@ from django.utils import timezone from django_resized import ResizedImageField -from master.models import Country, Distric, Provinsi, Regency, Village +from master.models.country import Country +from master.models.distric import Distric +from master.models.expedisi import Expedisi +from master.models.provinsi import Provinsi +from master.models.regency import Regency +from master.models.village import Village from profiles.models import LangSupport, UserProfile -from store.models import Expedisi, UserStore +from store.models import UserStore # Create your models here. @@ -42,9 +47,7 @@ class Produk(models.Model): kategori = models.ManyToManyField(Kategori) detail = models.TextField(null=True, blank=True) - tipe = models.ForeignKey( - TipeProduk, blank=True, null=True, on_delete=models.CASCADE - ) + tipe = models.ForeignKey(TipeProduk, blank=True, null=True, on_delete=models.CASCADE) warna = models.ManyToManyField(WarnaProduk, blank=True) stok_produk = models.IntegerField(default=0) is_active = models.BooleanField(default=True) @@ -78,9 +81,7 @@ def save(self, *args, **kwargs): class GambarProduk(models.Model): sortings = models.IntegerField(default=0) produk = models.ForeignKey(Produk, null=True, on_delete=models.CASCADE) - gambar = ResizedImageField( - force_format="WEBP", quality=75, upload_to="produk_image/" - ) + gambar = ResizedImageField(force_format="WEBP", quality=75, upload_to="produk_image/") nama = models.CharField(null=True, blank=True, max_length=255) def __str__(self): @@ -119,14 +120,10 @@ class Cart(models.Model): tanggal_dikirim = models.DateTimeField(null=True, blank=True) tanggal_selesai = models.DateTimeField(null=True, blank=True) status_pembayaran = models.IntegerField(default=1, choices=STATUS) - status_toko = models.IntegerField( - default=0, choices=STATUS_TOKO, blank=True, null=True - ) + status_toko = models.IntegerField(default=0, choices=STATUS_TOKO, blank=True, null=True) nomor_resi = models.CharField(blank=True, null=True, max_length=255) catatan = models.TextField(blank=True, null=True, max_length=255) - expedisi = models.ForeignKey( - Expedisi, blank=True, null=True, on_delete=models.CASCADE - ) + expedisi = models.ForeignKey(Expedisi, blank=True, null=True, on_delete=models.CASCADE) tanggal = models.DateTimeField(auto_created=True, blank=True, null=True) def __str__(self): @@ -145,9 +142,7 @@ def save(self, *args, **kwargs): class UlasanCart(models.Model): cart = models.ForeignKey(Cart, blank=True, on_delete=models.CASCADE) - produkitem = models.ForeignKey( - Produk, blank=True, null=True, on_delete=models.CASCADE - ) + produkitem = models.ForeignKey(Produk, blank=True, null=True, on_delete=models.CASCADE) pengiriman = models.FloatField(default=0) produk = models.FloatField(default=0) catatan = models.TextField(null=True, blank=True) @@ -163,9 +158,7 @@ class ProdukChartItem(models.Model): harga = models.FloatField(null=True, blank=True) kategori = models.ManyToManyField(Kategori) detail = models.TextField(null=True, blank=True) - tipe = models.ForeignKey( - TipeProduk, blank=True, null=True, on_delete=models.CASCADE - ) + tipe = models.ForeignKey(TipeProduk, blank=True, null=True, on_delete=models.CASCADE) warna = models.ManyToManyField(WarnaProduk, blank=True) stok_produk = models.IntegerField(default=0) is_active = models.BooleanField(default=True) @@ -195,9 +188,7 @@ class AddressUserChartItem(models.Model): (1, "Domestic"), (2, "Overseas"), ] - userprofile = models.ForeignKey( - UserCartItem, on_delete=models.CASCADE, null=True, blank=True - ) + userprofile = models.ForeignKey(UserCartItem, on_delete=models.CASCADE, null=True, blank=True) typeaddress = models.IntegerField(choices=TYPE, default=1) name = models.CharField(max_length=255) @@ -224,9 +215,7 @@ class StoreCartItem(models.Model): class StoreAddressCartItem(models.Model): - userstore = models.ForeignKey( - UserStore, blank=True, null=True, on_delete=models.CASCADE - ) + userstore = models.ForeignKey(UserStore, blank=True, null=True, on_delete=models.CASCADE) address = models.TextField(blank=True, null=True) rt = models.CharField(max_length=10, blank=True, null=True) rw = models.CharField(max_length=10, blank=True, null=True) @@ -243,15 +232,9 @@ class CartItem(models.Model): cart = models.ForeignKey(Cart, on_delete=models.CASCADE) jumlah = models.IntegerField(default=1) produk = models.ForeignKey(Produk, on_delete=models.CASCADE) - produk_chart = models.ForeignKey( - ProdukChartItem, blank=True, null=True, on_delete=models.CASCADE - ) - user_chart = models.ForeignKey( - UserCartItem, blank=True, null=True, on_delete=models.CASCADE - ) - store_chart = models.ForeignKey( - StoreCartItem, blank=True, null=True, on_delete=models.CASCADE - ) + produk_chart = models.ForeignKey(ProdukChartItem, blank=True, null=True, on_delete=models.CASCADE) + user_chart = models.ForeignKey(UserCartItem, blank=True, null=True, on_delete=models.CASCADE) + store_chart = models.ForeignKey(StoreCartItem, blank=True, null=True, on_delete=models.CASCADE) def __str__(self): return " cart " + self.unique_cart diff --git a/profiles/admin.py b/profiles/admin.py index 439cfa0..8432f45 100644 --- a/profiles/admin.py +++ b/profiles/admin.py @@ -13,7 +13,7 @@ from django.views.decorators.csrf import csrf_exempt from firebase_admin import credentials, messaging -from master.models import ConfigurationWebsite +from master.models.configuration_website import ConfigurationWebsite from profiles.models import ( LangSupport, Tier, @@ -170,13 +170,9 @@ def get_user_wallet(self, obj): def list_action(self, obj): objs = "Selesai" if obj.status == 1: - reverse_url = reverse( - "admin:user_withdrawl_request_admin_json_request_action" - ) + reverse_url = reverse("admin:user_withdrawl_request_admin_json_request_action") objs = format_html( - 'Selesai'.format( - reverse_url + "?id=" + str(obj.pk) - ) + 'Selesai'.format(reverse_url + "?id=" + str(obj.pk)) ) return objs @@ -188,17 +184,13 @@ def json_request_action(self, request): if not firebase_admin._apps: cred = credentials.Certificate(config.konfigurasi_firebase.path) firebase_admin.initialize_app(cred) - modelresponse = UserwithdrawlTransactionRequest.objects.filter( - id=request.GET.get("id") - ).first() + modelresponse = UserwithdrawlTransactionRequest.objects.filter(id=request.GET.get("id")).first() if modelresponse: modelresponse.status = 2 modelresponse.save() if modelresponse.status == 2: - UserWithdrawlTransaction.objects.create( - user=request.user, jumlah=modelresponse.jumlah - ) + UserWithdrawlTransaction.objects.create(user=request.user, jumlah=modelresponse.jumlah) userprofile = request.user float_coin = float(userprofile.coin) float_jumlah = float(modelresponse.jumlah) @@ -222,9 +214,7 @@ def json_request_action(self, request): print(e) else: print("masuk") - return redirect( - reverse("admin:profiles_userwithdrawltransactionrequest_changelist") - ) + return redirect(reverse("admin:profiles_userwithdrawltransactionrequest_changelist")) def get_urls(self) -> list[URLPattern]: super_url = super().get_urls() diff --git a/profiles/models.py b/profiles/models.py index 636e6d4..682fa97 100644 --- a/profiles/models.py +++ b/profiles/models.py @@ -3,7 +3,10 @@ from django.urls import reverse from django_resized import ResizedImageField -from master.models import Distric, Provinsi, Regency, Village +from master.models.distric import Distric +from master.models.provinsi import Provinsi +from master.models.regency import Regency +from master.models.village import Village from profiles.helper import get_random from .managers import UserManager @@ -29,16 +32,12 @@ def __str__(self): class UserProfile(AbstractUser): - image_profile = ResizedImageField( - force_format="WEBP", quality=75, upload_to="profile_img/", blank=True, null=True - ) + image_profile = ResizedImageField(force_format="WEBP", quality=75, upload_to="profile_img/", blank=True, null=True) wallet = models.CharField(max_length=255, null=True, blank=True) no_telepon = models.CharField(max_length=255, null=True, blank=True) nama = models.CharField(max_length=255, blank=True, null=True) language = models.CharField(max_length=4, blank=True, null=True, default="ID") - languages = models.ForeignKey( - LangSupport, blank=True, null=True, on_delete=models.SET_NULL - ) + languages = models.ForeignKey(LangSupport, blank=True, null=True, on_delete=models.SET_NULL) typeuser = models.IntegerField(choices=TYPE, default=1) coin = models.FloatField(default=0) fcm_token = models.TextField(null=True, blank=True) @@ -56,9 +55,7 @@ class Meta: def is_stores(self): from store.models import UserStore - user_stores = UserStore.objects.filter( - users_id=self.id, is_active_store=True - ).first() + user_stores = UserStore.objects.filter(users_id=self.id, is_active_store=True).first() return user_stores or None @property @@ -78,18 +75,10 @@ class UserProfileAddress(models.Model): zipcode = models.CharField(max_length=255, default="-") is_primary = models.BooleanField(default=False) - province = models.ForeignKey( - Provinsi, on_delete=models.CASCADE, null=True, blank=True - ) - regency = models.ForeignKey( - Regency, on_delete=models.CASCADE, null=True, blank=True - ) - distric = models.ForeignKey( - Distric, on_delete=models.CASCADE, null=True, blank=True - ) - village = models.ForeignKey( - Village, on_delete=models.CASCADE, null=True, blank=True - ) + province = models.ForeignKey(Provinsi, on_delete=models.CASCADE, null=True, blank=True) + regency = models.ForeignKey(Regency, on_delete=models.CASCADE, null=True, blank=True) + distric = models.ForeignKey(Distric, on_delete=models.CASCADE, null=True, blank=True) + village = models.ForeignKey(Village, on_delete=models.CASCADE, null=True, blank=True) rt = models.CharField(max_length=5, blank=True, null=True) rw = models.CharField(max_length=5, blank=True, null=True) @@ -105,9 +94,7 @@ def get_absolute_url(self): class UserWithdrawlTransaction(models.Model): - user = models.ForeignKey( - UserProfile, on_delete=models.SET_NULL, blank=True, null=True - ) + user = models.ForeignKey(UserProfile, on_delete=models.SET_NULL, blank=True, null=True) jumlah = models.FloatField(default=0) tanggal = models.DateTimeField(auto_now=True, auto_created=True) @@ -118,9 +105,7 @@ def __str__(self) -> str: class UserwithdrawlTransactionRequest(models.Model): REQUEST_STATUS = ((1, "Request User"), (2, "Selesai Diproses")) kode = models.CharField(max_length=255, default=get_random()) - user = models.ForeignKey( - UserProfile, on_delete=models.SET_NULL, blank=True, null=True - ) + user = models.ForeignKey(UserProfile, on_delete=models.SET_NULL, blank=True, null=True) jumlah = models.FloatField(default=0.0) tanggal = models.DateTimeField(auto_now=True, auto_created=True) status = models.IntegerField(choices=REQUEST_STATUS, blank=True, null=True) @@ -130,9 +115,7 @@ def __str__(self): class UserAppliedMember(models.Model): - user = models.ForeignKey( - UserProfile, on_delete=models.SET_NULL, blank=True, null=True - ) + user = models.ForeignKey(UserProfile, on_delete=models.SET_NULL, blank=True, null=True) name = models.CharField(blank=False, max_length=255) email = models.EmailField(blank=True, null=True) nomor = models.CharField(blank=True, null=True, max_length=255) @@ -143,9 +126,7 @@ class UserAppliedMember(models.Model): def save(self, *args, **kwargs): if self.is_accept: self.create_generator() - super(UserAppliedMember, self).save( - *args, **kwargs - ) # Call the real save() method + super(UserAppliedMember, self).save(*args, **kwargs) # Call the real save() method def create_generator(self): usergenerator = UserCodeGenerator() @@ -160,9 +141,7 @@ def create_generator(self): class UserCodeGenerator(models.Model): - user_apply = models.ForeignKey( - UserAppliedMember, on_delete=models.SET_NULL, blank=True, null=True - ) + user_apply = models.ForeignKey(UserAppliedMember, on_delete=models.SET_NULL, blank=True, null=True) code = models.CharField(max_length=50) quota_withdrawl = models.IntegerField(default=0) bypass_waiting = models.BooleanField(default=False) @@ -187,9 +166,7 @@ def __str__(self): class UserSettingsMember(models.Model): code = models.CharField(blank=True, null=True, max_length=50) - user = models.ForeignKey( - UserProfile, on_delete=models.CASCADE, blank=True, null=True - ) + user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, blank=True, null=True) kuota = models.IntegerField(default=0) is_active_store = models.BooleanField(default=False) tier = models.ForeignKey(Tier, blank=True, null=True, on_delete=models.SET_NULL) diff --git a/projekpi/celery.py b/projekpi/celery.py index 1dcbf52..df4c865 100644 --- a/projekpi/celery.py +++ b/projekpi/celery.py @@ -6,9 +6,7 @@ # Set the default Django settings module for the 'celery' program. os.environ.setdefault("DJANGO_SETTINGS_MODULE", "projekpi.settings") -app = Celery( - "projekpi", broker_url="redis://127.0.0.1:6379/0", include=["projekpi.tasks"] -) +app = Celery("projekpi", broker_url="redis://127.0.0.1:6379/0", include=["projekpi.tasks"]) # Using a string here means the worker doesn't have to serialize # the configuration object to child processes. diff --git a/projekpi/clearsession_admin.py b/projekpi/clearsession_admin.py index 9a9e3b1..fec1e21 100644 --- a/projekpi/clearsession_admin.py +++ b/projekpi/clearsession_admin.py @@ -4,8 +4,4 @@ def delete_all_unexpired_sessions_for_user(user): unexpired_sessions = Session.objects.filter(expire_date__gte=timezone.now()) - [ - session.delete() - for session in unexpired_sessions - if str(user.pk) == session.get_decoded().get("_auth_user_id") - ] + [session.delete() for session in unexpired_sessions if str(user.pk) == session.get_decoded().get("_auth_user_id")] diff --git a/projekpi/pi_network.py b/projekpi/pi_network.py index 62a6389..b23a358 100644 --- a/projekpi/pi_network.py +++ b/projekpi/pi_network.py @@ -33,11 +33,7 @@ def initialize(self, api_key, wallet_private_key, network): def get_balance(self): try: - balances = ( - self.server.accounts() - .account_id(self.keypair.public_key) - .call()["balances"] - ) + balances = self.server.accounts().account_id(self.keypair.public_key).call()["balances"] # balance_found = False for i in balances: if i["asset_type"] == "native": @@ -57,19 +53,13 @@ def create_payment(self, payment_data): if not self.validate_payment_data(payment_data): if __debug__: print("No valid payments found. Creating a new one...") - balances = ( - self.server.accounts() - .account_id(self.keypair.public_key) - .call()["balances"] - ) + balances = self.server.accounts().account_id(self.keypair.public_key).call()["balances"] balance_found = False for i in balances: if i["asset_type"] == "native": balance_found = True payment_data_float = float(payment_data["amount"]) - if (payment_data_float + (float(self.fee) / 10000000)) > float( - i["balance"] - ): + if (payment_data_float + (float(self.fee) / 10000000)) > float(i["balance"]): return "" break @@ -82,9 +72,7 @@ def create_payment(self, payment_data): obj = json.dumps(obj) url = self.base_url + "/v2/payments" - re = requests.post( - url, data=obj, json=obj, headers=self.get_http_headers(), timeout=500000 - ) + re = requests.post(url, data=obj, json=obj, headers=self.get_http_headers(), timeout=500000) parsed_response = self.handle_http_response(re) identifier = parsed_response["identifier"] @@ -102,11 +90,7 @@ def submit_payment(self, payment_id, pending_payment): else: payment = pending_payment - balances = ( - self.server.accounts() - .account_id(self.keypair.public_key) - .call()["balances"] - ) + balances = self.server.accounts().account_id(self.keypair.public_key).call()["balances"] balance_found = False for i in balances: if i["asset_type"] == "native": @@ -151,18 +135,14 @@ def complete_payment(self, identifier, txid): obj = json.dumps(obj) url = self.base_url + "/v2/payments/" + identifier + "/complete" - re = requests.post( - url, data=obj, json=obj, headers=self.get_http_headers(), timeout=500000 - ) + re = requests.post(url, data=obj, json=obj, headers=self.get_http_headers(), timeout=500000) self.handle_http_response(re) def cancel_payment(self, identifier): obj = {} obj = json.dumps(obj) url = self.base_url + "/v2/payments/" + identifier + "/cancel" - re = requests.post( - url, data=obj, json=obj, headers=self.get_http_headers(), timeout=500000 - ) + re = requests.post(url, data=obj, json=obj, headers=self.get_http_headers(), timeout=500000) self.handle_http_response(re) def cancel_payment_user(self, identifier): diff --git a/projekpi/settings.py b/projekpi/settings.py index c030965..eb7fabc 100644 --- a/projekpi/settings.py +++ b/projekpi/settings.py @@ -64,7 +64,9 @@ "apidata", "django_extensions", "sesame", - "django_vite_plugin" + "django_vite_plugin", + 'django_db_logger', + "transaction" ] MIDDLEWARE = [ @@ -292,3 +294,33 @@ def CAN_LOGIN_AS(request, target_user): "BUILD_URL_PREFIX": "/" + STATIC_URL + "buildvite", "DEV_MODE": False , } + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + 'verbose': { + 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' + }, + 'simple': { + 'format': '%(levelname)s %(asctime)s %(message)s' + }, + }, + 'handlers': { + 'db_log': { + 'level': 'DEBUG', + 'class': 'django_db_logger.db_log_handler.DatabaseLogHandler' + }, + }, + 'loggers': { + 'db': { + 'handlers': ['db_log'], + 'level': 'DEBUG' + }, + 'django.request': { # logging 500 errors to database + 'handlers': ['db_log'], + 'level': 'ERROR', + 'propagate': False, + } + } +} diff --git a/projekpi/tasks.py b/projekpi/tasks.py index bec013a..b4cf0b5 100644 --- a/projekpi/tasks.py +++ b/projekpi/tasks.py @@ -4,15 +4,13 @@ from celery import shared_task -from master.models import ( - Country, - Distric, - Provinsi, - Regency, - Region, - SubRegion, - Village, -) +from master.models.country import Country +from master.models.distric import Distric +from master.models.provinsi import Provinsi +from master.models.regency import Regency +from master.models.region import Region +from master.models.subregion import SubRegion +from master.models.village import Village @shared_task(name="api_check_availability") @@ -70,9 +68,7 @@ def import_region(): @shared_task(name="import_subregion") def import_subregion(): - with open( - "data/subregions.json", encoding="utf-8", errors="ignore" - ) as read_subregion: + with open("data/subregions.json", encoding="utf-8", errors="ignore") as read_subregion: data_subregion = json.load(read_subregion) for subregion in data_subregion: subregion_model = SubRegion.objects.filter( @@ -95,17 +91,13 @@ def import_subregion(): @shared_task(name="import_country") def import_country(): - with open( - "data/countries.json", encoding="utf-8", errors="ignore" - ) as read_countries: + with open("data/countries.json", encoding="utf-8", errors="ignore") as read_countries: data_countries = json.load(read_countries) for countries in data_countries: region = countries.get("region_id", None) subregion = countries.get("subregion_id", None) name = countries.get("name") - countries_model = Country.objects.filter( - region_id_id=region, subregion_id_id=subregion, name=name - ).first() + countries_model = Country.objects.filter(region_id_id=region, subregion_id_id=subregion, name=name).first() if countries_model: print("is exist countri") else: @@ -137,9 +129,7 @@ def import_provinsi(): for row in spamreader: code = row[0] name = row[1] - province_model = Provinsi.objects.filter( - id=code, code=code, nama=name - ).first() + province_model = Provinsi.objects.filter(id=code, code=code, nama=name).first() if province_model: print("Province exists") else: @@ -161,9 +151,7 @@ def import_regency(): if province_model: print("regency exist") else: - province_model = Regency.objects.create( - id=code, code=code, province_code_id=province_code, name=name - ) + province_model = Regency.objects.create(id=code, code=code, province_code_id=province_code, name=name) print("regency saved") @@ -175,15 +163,11 @@ def import_district(): code = row.get("code") regency_code = row.get("regency") name = row.get("name") - province_model = Distric.objects.filter( - id=code, code=code, regency_code_id=regency_code, name=name - ).first() + province_model = Distric.objects.filter(id=code, code=code, regency_code_id=regency_code, name=name).first() if province_model: print("District exist") else: - province_model = Distric.objects.create( - id=code, code=code, regency_code_id=regency_code, name=name - ) + province_model = Distric.objects.create(id=code, code=code, regency_code_id=regency_code, name=name) print("District saved") @@ -195,13 +179,9 @@ def import_village(): code = row.get("code") district_code = row.get("distric") name = row.get("name") - village_model = Village.objects.filter( - code=code, district_code_id=district_code, name=name - ).first() + village_model = Village.objects.filter(code=code, district_code_id=district_code, name=name).first() if village_model: print("Village Exists") else: - Village.objects.create( - code=code, district_code_id=district_code, name=name - ) + Village.objects.create(code=code, district_code_id=district_code, name=name) print("Village saved") diff --git a/projekpi/telegram_utils.py b/projekpi/telegram_utils.py index 66994b4..7d62d4e 100644 --- a/projekpi/telegram_utils.py +++ b/projekpi/telegram_utils.py @@ -18,9 +18,7 @@ def initial_auth(self, code) -> User: sent_code = self.app.send_code(self.nomor_telepon) - signed_in = self.app.sign_in( - self.nomor_telepon, sent_code.phone_code_hash, code - ) + signed_in = self.app.sign_in(self.nomor_telepon, sent_code.phone_code_hash, code) if isinstance(signed_in, User): return signed_in diff --git a/static/css/dist/styles.css b/static/css/dist/styles.css deleted file mode 100644 index 7fcadd5..0000000 --- a/static/css/dist/styles.css +++ /dev/null @@ -1 +0,0 @@ -/*! tailwindcss v3.4.6 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family: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,pre,samp{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:initial}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:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{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}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],input:where(:not([type])),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,input:where(:not([type])):focus,select:focus,textarea:focus{outline:2px solid #0000;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid #0000;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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)}[type=checkbox]:checked,[type=radio]:checked{border-color:#0000;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}@media (forced-colors:active) {[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}@media (forced-colors:active) {[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=checkbox]:indeterminate,[type=radio]:checked:focus,[type=radio]:checked:hover{border-color:#0000;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media (forced-colors:active) {[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{border-color:#0000;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color:oklch(0% 0 0)){:root{color-scheme:light;--fallback-p:#491eff;--fallback-pc:#d4dbff;--fallback-s:#ff41c7;--fallback-sc:#fff9fc;--fallback-a:#00cfbd;--fallback-ac:#00100d;--fallback-n:#2b3440;--fallback-nc:#d7dde4;--fallback-b1:#fff;--fallback-b2:#e5e6e6;--fallback-b3:#e5e6e6;--fallback-bc:#1f2937;--fallback-in:#00b3f0;--fallback-inc:#000;--fallback-su:#00ca92;--fallback-suc:#000;--fallback-wa:#ffc22d;--fallback-wac:#000;--fallback-er:#ff6f70;--fallback-erc:#000}@media (prefers-color-scheme:dark){:root{color-scheme:dark;--fallback-p:#7582ff;--fallback-pc:#050617;--fallback-s:#ff71cf;--fallback-sc:#190211;--fallback-a:#00c7b5;--fallback-ac:#000e0c;--fallback-n:#2a323c;--fallback-nc:#a6adbb;--fallback-b1:#1d232a;--fallback-b2:#191e24;--fallback-b3:#15191e;--fallback-bc:#a6adbb;--fallback-in:#00b3f0;--fallback-inc:#000;--fallback-su:#00ca92;--fallback-suc:#000;--fallback-wa:#ffc22d;--fallback-wac:#000;--fallback-er:#ff6f70;--fallback-erc:#000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,#0000) #0000}:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,#0000) #0000}:root{color-scheme:light;--in:72.06% 0.191 231.6;--su:64.8% 0.150 160;--wa:84.71% 0.199 83.87;--er:71.76% 0.221 22.18;--pc:89.824% 0.06192 275.75;--ac:15.352% 0.0368 183.61;--inc:0% 0 0;--suc:0% 0 0;--wac:0% 0 0;--erc:0% 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:49.12% 0.3096 275.75;--s:69.71% 0.329 342.55;--sc:98.71% 0.0106 342.55;--a:76.76% 0.184 183.61;--n:32.1785% 0.02476 255.701624;--nc:89.4994% 0.011585 252.096176;--b1:100% 0 0;--b2:96.1151% 0 0;--b3:92.4169% 0.00108 197.137559;--bc:27.8078% 0.029596 256.847952}@media (prefers-color-scheme:dark){:root{color-scheme:dark;--in:72.06% 0.191 231.6;--su:64.8% 0.150 160;--wa:84.71% 0.199 83.87;--er:71.76% 0.221 22.18;--pc:13.138% 0.0392 275.75;--sc:14.96% 0.052 342.55;--ac:14.902% 0.0334 183.61;--inc:0% 0 0;--suc:0% 0 0;--wac:0% 0 0;--erc:0% 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:65.69% 0.196 275.75;--s:74.8% 0.26 342.55;--a:74.51% 0.167 183.61;--n:31.3815% 0.021108 254.139175;--nc:74.6477% 0.0216 264.435964;--b1:25.3267% 0.015896 252.417568;--b2:23.2607% 0.013807 253.100675;--b3:21.1484% 0.01165 254.087939;--bc:74.6477% 0.0216 264.435964}}[data-theme=light]{color-scheme:light;--in:72.06% 0.191 231.6;--su:64.8% 0.150 160;--wa:84.71% 0.199 83.87;--er:71.76% 0.221 22.18;--pc:89.824% 0.06192 275.75;--ac:15.352% 0.0368 183.61;--inc:0% 0 0;--suc:0% 0 0;--wac:0% 0 0;--erc:0% 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:49.12% 0.3096 275.75;--s:69.71% 0.329 342.55;--sc:98.71% 0.0106 342.55;--a:76.76% 0.184 183.61;--n:32.1785% 0.02476 255.701624;--nc:89.4994% 0.011585 252.096176;--b1:100% 0 0;--b2:96.1151% 0 0;--b3:92.4169% 0.00108 197.137559;--bc:27.8078% 0.029596 256.847952}[data-theme=dark]{color-scheme:dark;--in:72.06% 0.191 231.6;--su:64.8% 0.150 160;--wa:84.71% 0.199 83.87;--er:71.76% 0.221 22.18;--pc:13.138% 0.0392 275.75;--sc:14.96% 0.052 342.55;--ac:14.902% 0.0334 183.61;--inc:0% 0 0;--suc:0% 0 0;--wac:0% 0 0;--erc:0% 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:65.69% 0.196 275.75;--s:74.8% 0.26 342.55;--a:74.51% 0.167 183.61;--n:31.3815% 0.021108 254.139175;--nc:74.6477% 0.0216 264.435964;--b1:25.3267% 0.015896 252.417568;--b2:23.2607% 0.013807 253.100675;--b3:21.1484% 0.01165 254.087939;--bc:74.6477% 0.0216 264.435964}*,::backdrop,:after,:before{--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:#3b82f680;--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}}.alert{display:grid;width:100%;grid-auto-flow:row;align-content:flex-start;align-items:center;justify-items:center;gap:1rem;text-align:center;border-radius:var(--rounded-box,1rem);border-width:1px;--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));padding:1rem;--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--alert-bg:var(--fallback-b2,oklch(var(--b2)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1));background-color:var(--alert-bg)}@media (min-width:640px){.alert{grid-auto-flow:column;grid-template-columns:auto minmax(auto,1fr);justify-items:start;text-align:start}}.avatar.placeholder>div{display:flex;align-items:center;justify-content:center}@media (hover:hover){.label a:hover{--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>:not(ul,.menu-title,details,.btn).active,.menu li>:not(ul,.menu-title,details,.btn):active,.menu li>details>summary:active{--tw-bg-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.table tr.hover:hover,.table tr.hover:nth-child(2n):hover{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn,.5rem);border-color:#0000;border-color:oklch(var(--btn-color,var(--b2))/var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn,1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow:0 1px 2px 0 #0000000d;--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);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color,var(--b2))/var(--tw-bg-opacity));--tw-bg-opacity:1;--tw-border-opacity:1}.btn-disabled,.btn:disabled,.btn[disabled]{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box,1rem)}.card:focus{outline:2px solid #0000;outline-offset:2px}.card-body{display:flex;flex:1 1 auto;flex-direction:column;padding:var(--padding-card,2rem);gap:.5rem}.card-body :where(p){flex-grow:1}.card figure{display:flex;align-items:center;justify-content:center}.card.image-full{display:grid}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box,1rem);--tw-bg-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;-o-object-fit:cover;object-fit:cover}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.checkbox{flex-shrink:0;--chkbg:var(--fallback-bc,oklch(var(--bc)/1));--chkfg:var(--fallback-b1,oklch(var(--b1)/1));height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-btn,.5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity:0.2}@media (hover:hover){.btm-nav>.disabled:hover,.btm-nav>[disabled]:hover{pointer-events:none;--tw-border-opacity:0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity:0.1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity:0.2}.btn:hover{--tw-border-opacity:1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity:1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color,var(--b2))/var(--tw-bg-opacity,1)) 90%,#000);border-color:color-mix(in oklab,oklch(var(--btn-color,var(--b2))/var(--tw-border-opacity,1)) 90%,#000)}}@supports not (color:oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color,var(--fallback-b2));border-color:var(--btn-color,var(--fallback-b2))}}.btn.glass:hover{--glass-opacity:25%;--glass-border-opacity:15%}.btn-outline.btn-primary:hover{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}}.btn-outline.btn-success:hover{--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-success:hover{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000)}}.btn-outline.btn-warning:hover{--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-warning:hover{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000)}}.btn-disabled:hover,.btn:disabled:hover,.btn[disabled]:hover{--tw-border-opacity:0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity:0.2}@supports (color:color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}}:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{cursor:pointer;outline:2px solid #0000;outline-offset:2px}@supports (color:oklch(0% 0 0)){:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{background-color:var(--fallback-bc,oklch(var(--bc)/.1))}}}.form-control{flex-direction:column}.form-control,.label{display:flex}.label{-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn,.5rem);border-width:1px;border-color:#0000;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input-md[type=number]::-webkit-inner-spin-button,.input[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.link{cursor:pointer;text-decoration-line:underline}.mask{-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center}.menu{display:flex;flex-direction:column;flex-wrap:wrap;font-size:.875rem;line-height:1.25rem;padding:.5rem}.menu :where(li ul){position:relative;white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){display:grid;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;grid-auto-columns:minmax(auto,max-content) auto max-content;-webkit-user-select:none;-moz-user-select:none;user-select:none}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}:where(.menu li){position:relative;display:flex;flex-shrink:0;flex-direction:column;flex-wrap:wrap;align-items:stretch}:where(.menu li) .badge{justify-self:end}.modal{pointer-events:none;position:fixed;inset:0;margin:0;display:grid;height:100%;max-height:none;width:100%;max-width:none;justify-items:center;padding:0;opacity:0;overscroll-behavior:contain;z-index:999;background-color:initial;color:inherit;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity,visibility;overflow-y:hidden}:where(.modal){align-items:center}.modal-box{max-height:calc(100vh - 5em);grid-column-start:1;grid-row-start:1;width:91.666667%;max-width:32rem;--tw-scale-x:.9;--tw-scale-y:.9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box,1rem);border-bottom-left-radius:var(--rounded-box,1rem);border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));padding:1.5rem;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-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;box-shadow:0 25px 50px -12px #00000040;overflow-y:auto;overscroll-behavior:contain}.modal-open,.modal-toggle:checked+.modal,.modal:target,.modal[open]{pointer-events:auto;visibility:visible;opacity:1}.modal-action{display:flex;margin-top:1.5rem;justify-content:flex-end}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden;scrollbar-gutter:stable}.navbar{display:flex;align-items:center;padding:var(--navbar-padding,.5rem);min-height:4rem;width:100%}:where(.navbar>:not(script,style)){display:inline-flex;align-items:center}.radio{flex-shrink:0;--chkbg:var(--bc);height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:9999px;border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity:0.2}.rating{position:relative;display:inline-flex}.rating :where(input){cursor:pointer;border-radius:0;animation:rating-pop var(--animation-input,.25s) ease-out;height:1.5rem;width:1.5rem;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-bg-opacity:1}.select{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;min-height:3rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn,.5rem);border-width:1px;border-color:#0000;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,#0000 50%,currentColor 0),linear-gradient(135deg,currentColor 50%,#0000 0);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-size:4px 4px,4px 4px;background-repeat:no-repeat}.select[multiple]{height:auto}.stat{width:100%;grid-template-columns:repeat(1,1fr);-moz-column-gap:1rem;column-gap:1rem;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity:0.1;padding:1rem 1.5rem}.stat,.swap{display:inline-grid}.swap{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;place-content:center;cursor:pointer}.swap>*{grid-column-start:1;grid-row-start:1;transition-duration:.3s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity}.swap input{-webkit-appearance:none;-moz-appearance:none;appearance:none}.swap .swap-indeterminate,.swap .swap-on,.swap input:checked~.swap-off,.swap input:indeterminate~.swap-off,.swap input:indeterminate~.swap-on,.swap-active .swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate,.swap-active .swap-on{opacity:1}.table{position:relative;width:100%;border-radius:var(--rounded-box,1rem);text-align:left;font-size:.875rem;line-height:1.25rem}.table :where(.table-pin-rows thead tr){position:sticky;top:0;z-index:1;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-rows tfoot tr){position:sticky;bottom:0;z-index:1;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-cols tr th){position:sticky;left:0;right:0;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.textarea{min-height:3rem;flex-shrink:1;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn,.5rem);border-width:1px;border-color:#0000;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.toggle{flex-shrink:0;--tglbg:var(--fallback-b1,oklch(var(--b1)/1));--handleoffset:1.5rem;--handleoffsetcalculator:calc(var(--handleoffset)*-1);--togglehandleborder:0 0;height:1.5rem;width:3rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-badge,1.9rem);border-width:1px;border-color:currentColor;background-color:currentColor;color:var(--fallback-bc,oklch(var(--bc)/.5));transition:background,box-shadow var(--animation-input,.2s) ease-out;box-shadow:var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset,var(--togglehandleborder)}.alert-success{border-color:var(--fallback-su,oklch(var(--su)/.2));--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)));--alert-bg:var(--fallback-su,oklch(var(--su)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1))}.btm-nav>.disabled,.btm-nav>[disabled]{pointer-events:none;--tw-border-opacity:0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity:0.1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity:0.2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}@media (prefers-reduced-motion:no-preference){.btn{animation:button-pop var(--animation-btn,.25s) ease-out}}.btn:active:focus,.btn:active:hover{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale,.97))}@supports not (color:oklch(0% 0 0)){.btn{background-color:var(--btn-color,var(--fallback-b2));border-color:var(--btn-color,var(--fallback-b2))}.btn-primary{--btn-color:var(--fallback-p)}.btn-neutral{--btn-color:var(--fallback-n)}.btn-success{--btn-color:var(--fallback-su)}.btn-warning{--btn-color:var(--fallback-wa)}}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}.btn-outline.btn-success.btn-active{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000)}.btn-outline.btn-warning.btn-active{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000)}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color:oklch(0% 0 0)){.btn-primary{--btn-color:var(--p)}.btn-neutral{--btn-color:var(--n)}.btn-success{--btn-color:var(--su)}.btn-warning{--btn-color:var(--wa)}}.btn-neutral{--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));outline-color:var(--fallback-n,oklch(var(--n)/1))}.btn-success{--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)));outline-color:var(--fallback-su,oklch(var(--su)/1))}.btn-warning{--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)));outline-color:var(--fallback-wa,oklch(var(--wa)/1))}.btn.glass{--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);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity:25%;--glass-border-opacity:15%}.btn-outline.btn-primary{--tw-text-opacity:1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-success{--tw-text-opacity:1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.btn-outline.btn-success.btn-active{--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.btn-outline.btn-warning{--tw-text-opacity:1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.btn-outline.btn-warning.btn-active{--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn:disabled,.btn[disabled]{--tw-border-opacity:0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity:0.2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity:1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale,.98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{border-width:1px;--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.checkbox:disabled{border-width:0;cursor:not-allowed;border-color:#0000;--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.2}.checkbox:checked,.checkbox[aria-checked=true]{background-color:var(--chkbg);background-image:linear-gradient(-45deg,#0000 65%,var(--chkbg) 65.99%),linear-gradient(45deg,#0000 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,#0000 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,#0000 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%)}.checkbox:checked,.checkbox:indeterminate,.checkbox[aria-checked=true]{background-repeat:no-repeat;animation:checkmark var(--animation-input,.2s) ease-out}.checkbox:indeterminate{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-image:linear-gradient(90deg,#0000 80%,var(--chkbg) 80%),linear-gradient(-90deg,#0000 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%)}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}.input input{--tw-bg-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:initial}.input input:focus{outline:2px solid #0000;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input-bordered,.input:focus,.input:focus-within{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:focus,.input:focus-within{box-shadow:none;outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input-primary,.input-primary:focus,.input-primary:focus-within{--tw-border-opacity:1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.input-primary:focus,.input-primary:focus-within{outline-color:var(--fallback-p,oklch(var(--p)/1))}.input-disabled,.input:disabled,.input:has(>input[disabled]),.input[disabled]{cursor:not-allowed;--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input-disabled::-moz-placeholder,.input:disabled::-moz-placeholder,.input:has(>input[disabled])::-moz-placeholder,.input[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.input-disabled::placeholder,.input:disabled::placeholder,.input:has(>input[disabled])::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn)*-1)}.link:focus{outline:2px solid #0000;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.mask-star-2{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='192' height='180'%3E%3Cpath fill-rule='evenodd' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='192' height='180'%3E%3Cpath fill-rule='evenodd' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z'/%3E%3C/svg%3E")}:where(.menu li:empty){--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.1;margin:.5rem 1rem;height:1px}.menu :where(li ul):before{position:absolute;bottom:.75rem;inset-inline-start:0;top:.75rem;width:1px;--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.1;content:""}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--rounded-btn,.5rem);padding:.5rem 1rem;text-align:start;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-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;text-wrap:balance}:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(summary,.active,.btn):focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn):focus{cursor:pointer;background-color:var(--fallback-bc,oklch(var(--bc)/.1));--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));outline:2px solid #0000;outline-offset:2px}.menu li>:not(ul,.menu-title,details,.btn).active,.menu li>:not(ul,.menu-title,details,.btn):active,.menu li>details>summary:active{--tw-bg-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.menu :where(li>details>summary)::-webkit-details-marker{display:none}.menu :where(li>.menu-dropdown-toggle):after,.menu :where(li>details>summary):after{justify-self:end;display:block;margin-top:-.5rem;height:.5rem;width:.5rem;transform:rotate(45deg);transition-property:transform,margin-top;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);content:"";transform-origin:75% 75%;box-shadow:2px 2px;pointer-events:none}.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after,.menu :where(li>details[open]>summary):after{transform:rotate(225deg);margin-top:0}.mockup-phone .display{overflow:hidden;border-radius:40px;margin-top:-25px}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{left:.5rem;aspect-ratio:1/1;height:.75rem;--tw-translate-y:-50%;border-radius:9999px;border-width:2px;border-color:currentColor}.mockup-browser .mockup-browser-toolbar .input:after,.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{left:1.25rem;height:.5rem;--tw-translate-y:25%;--tw-rotate:-45deg;border-radius:9999px;border-width:1px;border-color:currentColor}.modal::backdrop,.modal:not(dialog:not(.modal-open)){background-color:#0006;animation:modal-pop .2s ease-out}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y:0px;--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.modal-action>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}@keyframes modal-pop{0%{opacity:0}}@keyframes progress-loading{50%{background-position-x:-115%}}.radio:focus{box-shadow:none}.radio:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.radio:checked,.radio[aria-checked=true]{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-image:none;animation:radiomark var(--animation-input,.2s) ease-out;box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}.radio:disabled{cursor:not-allowed;opacity:.2}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}.rating input{-moz-appearance:none;appearance:none;-webkit-appearance:none}.rating .rating-hidden{width:.5rem;background-color:initial}.rating input[type=radio]:checked{background-image:none}.rating input:checked~input,.rating input[aria-checked=true]~input{--tw-bg-opacity:0.2}.rating input:focus-visible{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.3s;transform:translateY(-.125em)}.rating input:active:focus{animation:none;transform:translateY(-.125em)}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select-disabled,.select:disabled,.select[disabled]{cursor:not-allowed;--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.select-disabled::-moz-placeholder,.select:disabled::-moz-placeholder,.select[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}.table:where([dir=rtl],[dir=rtl] *){text-align:right}.table :where(th,td){padding:.75rem 1rem;vertical-align:middle}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table :where(thead tr,tbody tr:not(:last-child),tbody tr:first-child:last-child){border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.table :where(thead,tfoot){white-space:nowrap;font-size:.75rem;line-height:1rem;font-weight:700;color:var(--fallback-bc,oklch(var(--bc)/.6))}.table :where(tfoot){border-top-width:1px;--tw-border-opacity:1;border-top-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.textarea:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.textarea-disabled,.textarea:disabled,.textarea[disabled]{cursor:not-allowed;--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.textarea-disabled::-moz-placeholder,.textarea:disabled::-moz-placeholder,.textarea[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.textarea-disabled::placeholder,.textarea:disabled::placeholder,.textarea[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}[dir=rtl] .toggle{--handleoffsetcalculator:calc(var(--handleoffset)*1)}.toggle:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.toggle:hover{background-color:currentColor}.toggle:checked,.toggle[aria-checked=true]{background-image:none;--handleoffsetcalculator:var(--handleoffset);--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}[dir=rtl] .toggle:checked,[dir=rtl] .toggle[aria-checked=true]{--handleoffsetcalculator:calc(var(--handleoffset)*-1)}.toggle:indeterminate{--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.toggle:indeterminate,[dir=rtl] .toggle:indeterminate{box-shadow:calc(var(--handleoffset)/2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset)/-2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}.toggle:disabled{cursor:not-allowed;--tw-border-opacity:1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));background-color:initial;opacity:.3;--togglehandleborder:0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset,var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset}.btn-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem}.btn-block{width:100%}.btn-square:where(.btn-sm){height:2rem;width:2rem;padding:0}.btn-circle:where(.btn-sm){height:2rem;width:2rem;border-radius:9999px;padding:0}.modal-bottom{place-items:end}.avatar.online:before{background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)))}.avatar.offline:before,.avatar.online:before{content:"";position:absolute;z-index:10;display:block;border-radius:9999px;--tw-bg-opacity:1;outline-style:solid;outline-width:2px;outline-color:var(--fallback-b1,oklch(var(--b1)/1));width:15%;height:15%;top:7%;right:7%}.avatar.offline:before{background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}.card-compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-normal .card-body{padding:var(--padding-card,2rem);font-size:1rem;line-height:1.5rem}.join.join-vertical>:where(:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn)*-1)}.join.join-horizontal>:where(:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn)*-1)}.modal-top :where(.modal-box){width:100%;max-width:none;--tw-translate-y:-2.5rem;--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box,1rem);border-bottom-left-radius:var(--rounded-box,1rem);border-top-left-radius:0;border-top-right-radius:0}.modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y:0px;--tw-scale-x:.9;--tw-scale-y:.9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);border-bottom-right-radius:var(--rounded-box,1rem);border-bottom-left-radius:var(--rounded-box,1rem)}.modal-bottom :where(.modal-box){width:100%;max-width:none;--tw-translate-y:2.5rem;--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);border-bottom-right-radius:0;border-bottom-left-radius:0}.pointer-events-none{pointer-events:none}.static{position:static}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.top-0{top:0}.top-\[78px\]{top:78px}.z-50{z-index:50}.z-\[99999\]{z-index:99999}.float-right{float:right}.m-2{margin:.5rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-28{margin-bottom:7rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-\[100px\]{margin-bottom:100px}.mb-\[60px\]{margin-bottom:60px}.mb-auto{margin-bottom:auto}.ml-2{margin-left:.5rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-10{height:2.5rem}.h-24{height:6rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-\[100px\]{height:100px}.h-\[10px\]{height:10px}.h-\[120px\]{height:120px}.h-\[250px\]{height:250px}.h-\[2rem\]{height:2rem}.h-\[6rem\]{height:6rem}.h-\[90px\]{height:90px}.h-auto{height:auto}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:10rem}.max-h-\[2rem\]{max-height:2rem}.min-h-10{min-height:2.5rem}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-24{width:6rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-64{width:16rem}.w-80{width:20rem}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[1px\]{width:1px}.w-\[2px\]{width:2px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-\[112px\]{min-width:112px}.min-w-\[44px\]{min-width:44px}.min-w-full{min-width:100%}.max-w-\[450px\]{max-width:450px}.max-w-screen-xl{max-width:1280px}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.grow{flex-grow:1}.table-auto{table-layout:auto}.-translate-y-12{--tw-translate-y:-3rem}.-translate-y-12,.translate-x-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-2{--tw-translate-x:0.5rem}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.justify-items-center{justify-items:center}.gap-0{gap:0}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.scroll-smooth{scroll-behavior:smooth}.whitespace-nowrap{white-space:nowrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-box{border-radius:var(--rounded-box,1rem)}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-\[6px\]{border-width:6px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-none{border-style:none}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-inherit{border-color:inherit}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.bg-\[\#F19400\]{--tw-bg-opacity:1;background-color:rgb(241 148 0/var(--tw-bg-opacity))}.bg-base-100{--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.bg-base-200{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.bg-fuchsia-700{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.bg-orange-400{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.bg-orange-600{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.bg-red-400\/20{background-color:#f8717133}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.bg-violet-700{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.fill-orange-600{fill:#ea580c}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.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}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.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-8{padding-top:2rem;padding-bottom:2rem}.py-\[2px\]{padding-top:2px;padding-bottom:2px}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pl-3\.5{padding-left:.875rem}.pl-8{padding-left:2rem}.pt-4{padding-top:1rem}.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-top{vertical-align:top}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[20px\]{font-size:20px}.text-\[9px\]{font-size:9px}.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}.font-thin{font-weight:100}.uppercase{text-transform:uppercase}.tracking-tight{letter-spacing:-.025em}.text-\[\#b50795\]{--tw-text-opacity:1;color:rgb(181 7 149/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/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-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.opacity-95{opacity:.95}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{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 #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{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 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px #0000001a,0 8px 10px -6px #0000001a;--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)}.no-scrollbar::-webkit-scrollbar{display:none}.no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.hover\:bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.hover\:bg-orange-700:hover{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.hover\:bg-slate-200:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.hover\:bg-slate-200\/30:hover{background-color:#e2e8f04d}.hover\:text-fuchsia-700:hover{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.hover\:text-slate-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 #0000000d;--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)}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.focus\:ring-0: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(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-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity))}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}@media (min-width:640px){.sm\:py-16{padding-top:4rem;padding-bottom:4rem}}@media (min-width:1024px){.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}} \ No newline at end of file diff --git a/store/admin.py b/store/admin.py index e290f8f..522bc7a 100644 --- a/store/admin.py +++ b/store/admin.py @@ -1,6 +1,7 @@ from django.contrib import admin -from store.models import Expedisi, UserStore, UserStoreAddress +from master.models.expedisi import Expedisi +from store.models import UserStore, UserStoreAddress from .forms import UserStoreForm diff --git a/store/models.py b/store/models.py index d616728..69f1e31 100644 --- a/store/models.py +++ b/store/models.py @@ -1,6 +1,9 @@ from django.db import models -from master.models import Distric, Provinsi, Regency, Village +from master.models.distric import Distric +from master.models.provinsi import Provinsi +from master.models.regency import Regency +from master.models.village import Village # from django.contrib.auth.models import User from profiles.models import UserProfile @@ -23,9 +26,7 @@ def __str__(self) -> str: class UserStoreAddress(models.Model): - userstore = models.ForeignKey( - UserStore, blank=True, null=True, on_delete=models.CASCADE - ) + userstore = models.ForeignKey(UserStore, blank=True, null=True, on_delete=models.CASCADE) address = models.TextField(blank=True, null=True) rt = models.CharField(max_length=10, blank=True, null=True) rw = models.CharField(max_length=10, blank=True, null=True) @@ -50,9 +51,7 @@ def __str__(self): class UserNotification(models.Model): - notificationfor = models.ForeignKey( - UserProfile, null=True, on_delete=models.CASCADE - ) + notificationfor = models.ForeignKey(UserProfile, null=True, on_delete=models.CASCADE) notificationfrom = models.CharField(null=True, blank=True, max_length=255) def __str__(self) -> str: diff --git a/templatenew/views/base_view.py b/templatenew/views/base_view.py index 318341d..9eaa6e4 100644 --- a/templatenew/views/base_view.py +++ b/templatenew/views/base_view.py @@ -4,7 +4,7 @@ from django.views import View from firebase_admin import credentials -from master.models import ConfigurationWebsite +from master.models.configuration_website import ConfigurationWebsite class BaseView(View): diff --git a/templatenew/views/home/index.py b/templatenew/views/home/index.py index 14d829e..8cae1bc 100644 --- a/templatenew/views/home/index.py +++ b/templatenew/views/home/index.py @@ -1,7 +1,7 @@ from django.shortcuts import render from frontend.models import Banner, Pengumuman -from master.models import Negara +from master.models.negara import Negara from produk.models import Kategori from templatenew.views.base_view import BaseView diff --git a/theme/static/css/dist/styles.css b/theme/static/css/dist/styles.css index 89c619f..cefe856 100644 --- a/theme/static/css/dist/styles.css +++ b/theme/static/css/dist/styles.css @@ -1,3854 +1,5 @@ -/* -! tailwindcss v3.4.6 | MIT License | https://tailwindcss.com -*/ - -/* -1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) -2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) -*/ - -*, -::before, -::after { - box-sizing: border-box; - /* 1 */ - border-width: 0; - /* 2 */ - border-style: solid; - /* 2 */ - border-color: #e5e7eb; - /* 2 */ -} - -::before, -::after { - --tw-content: ''; -} - -/* -1. Use a consistent sensible line-height in all browsers. -2. Prevent adjustments of font size after orientation changes in iOS. -3. Use a more readable tab size. -4. Use the user's configured `sans` font-family by default. -5. Use the user's configured `sans` font-feature-settings by default. -6. Use the user's configured `sans` font-variation-settings by default. -7. Disable tap highlights on iOS -*/ - -html, -:host { - line-height: 1.5; - /* 1 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - -moz-tab-size: 4; - /* 3 */ - -o-tab-size: 4; - tab-size: 4; - /* 3 */ - font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - /* 4 */ - font-feature-settings: normal; - /* 5 */ - font-variation-settings: normal; - /* 6 */ - -webkit-tap-highlight-color: transparent; - /* 7 */ -} - -/* -1. Remove the margin in all browsers. -2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. -*/ - -body { - margin: 0; - /* 1 */ - line-height: inherit; - /* 2 */ -} - -/* -1. Add the correct height in Firefox. -2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) -3. Ensure horizontal rules are visible by default. -*/ - -hr { - height: 0; - /* 1 */ - color: inherit; - /* 2 */ - border-top-width: 1px; - /* 3 */ -} - -/* -Add the correct text decoration in Chrome, Edge, and Safari. -*/ - -abbr:where([title]) { - -webkit-text-decoration: underline dotted; - text-decoration: underline dotted; -} - -/* -Remove the default font size and weight for headings. -*/ - -h1, -h2, -h3, -h4, -h5, -h6 { - font-size: inherit; - font-weight: inherit; -} - -/* -Reset links to optimize for opt-in styling instead of opt-out. -*/ - -a { - color: inherit; - text-decoration: inherit; -} - -/* -Add the correct font weight in Edge and Safari. -*/ - -b, -strong { - font-weight: bolder; -} - -/* -1. Use the user's configured `mono` font-family by default. -2. Use the user's configured `mono` font-feature-settings by default. -3. Use the user's configured `mono` font-variation-settings by default. -4. Correct the odd `em` font sizing in all browsers. -*/ - -code, -kbd, -samp, -pre { - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - /* 1 */ - font-feature-settings: normal; - /* 2 */ - font-variation-settings: normal; - /* 3 */ - font-size: 1em; - /* 4 */ -} - -/* -Add the correct font size in all browsers. -*/ - -small { - font-size: 80%; -} - -/* -Prevent `sub` and `sup` elements from affecting the line height in all browsers. -*/ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -/* -1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) -2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) -3. Remove gaps between table borders by default. -*/ - -table { - text-indent: 0; - /* 1 */ - border-color: inherit; - /* 2 */ - border-collapse: collapse; - /* 3 */ -} - -/* -1. Change the font styles in all browsers. -2. Remove the margin in Firefox and Safari. -3. Remove default padding in all browsers. -*/ - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - /* 1 */ - font-feature-settings: inherit; - /* 1 */ - font-variation-settings: inherit; - /* 1 */ - font-size: 100%; - /* 1 */ - font-weight: inherit; - /* 1 */ - line-height: inherit; - /* 1 */ - letter-spacing: inherit; - /* 1 */ - color: inherit; - /* 1 */ - margin: 0; - /* 2 */ - padding: 0; - /* 3 */ -} - -/* -Remove the inheritance of text transform in Edge and Firefox. -*/ - -button, -select { - text-transform: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Remove default button styles. -*/ - -button, -input:where([type='button']), -input:where([type='reset']), -input:where([type='submit']) { - -webkit-appearance: button; - /* 1 */ - background-color: transparent; - /* 2 */ - background-image: none; - /* 2 */ -} - -/* -Use the modern Firefox focus style for all focusable elements. -*/ - -:-moz-focusring { - outline: auto; -} - -/* -Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) -*/ - -:-moz-ui-invalid { - box-shadow: none; -} - -/* -Add the correct vertical alignment in Chrome and Firefox. -*/ - -progress { - vertical-align: baseline; -} - -/* -Correct the cursor style of increment and decrement buttons in Safari. -*/ - -::-webkit-inner-spin-button, -::-webkit-outer-spin-button { - height: auto; -} - -/* -1. Correct the odd appearance in Chrome and Safari. -2. Correct the outline style in Safari. -*/ - -[type='search'] { - -webkit-appearance: textfield; - /* 1 */ - outline-offset: -2px; - /* 2 */ -} - -/* -Remove the inner padding in Chrome and Safari on macOS. -*/ - -::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* -1. Correct the inability to style clickable types in iOS and Safari. -2. Change font properties to `inherit` in Safari. -*/ - -::-webkit-file-upload-button { - -webkit-appearance: button; - /* 1 */ - font: inherit; - /* 2 */ -} - -/* -Add the correct display in Chrome and Safari. -*/ - -summary { - display: list-item; -} - -/* -Removes the default spacing and border for appropriate elements. -*/ - -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; -} - -/* -Reset default styling for dialogs. -*/ - -dialog { - padding: 0; -} - -/* -Prevent resizing textareas horizontally by default. -*/ - -textarea { - resize: vertical; -} - -/* -1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) -2. Set the default placeholder color to the user's configured gray 400 color. -*/ - -input::-moz-placeholder, textarea::-moz-placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -input::placeholder, -textarea::placeholder { - opacity: 1; - /* 1 */ - color: #9ca3af; - /* 2 */ -} - -/* -Set the default cursor for buttons. -*/ - -button, -[role="button"] { - cursor: pointer; -} - -/* -Make sure disabled buttons don't get the pointer cursor. -*/ - -:disabled { - cursor: default; -} - -/* -1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) -2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) - This can trigger a poorly considered lint error in some tools but is included by design. -*/ - -img, -svg, -video, -canvas, -audio, -iframe, -embed, -object { - display: block; - /* 1 */ - vertical-align: middle; - /* 2 */ -} - -/* -Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) -*/ - -img, -video { - max-width: 100%; - height: auto; -} - -/* Make elements with the HTML hidden attribute stay hidden by default */ - -[hidden] { - display: none; -} - -[type='text'],input:where(:not([type])),[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background-color: #fff; - border-color: #6b7280; - border-width: 1px; - border-radius: 0px; - padding-top: 0.5rem; - padding-right: 0.75rem; - padding-bottom: 0.5rem; - padding-left: 0.75rem; - font-size: 1rem; - line-height: 1.5rem; - --tw-shadow: 0 0 #0000; -} - -[type='text']:focus, input:where(:not([type])):focus, [type='email']:focus, [type='url']:focus, [type='password']:focus, [type='number']:focus, [type='date']:focus, [type='datetime-local']:focus, [type='month']:focus, [type='search']:focus, [type='tel']:focus, [type='time']:focus, [type='week']:focus, [multiple]:focus, textarea:focus, select:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 0px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --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(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); - border-color: #2563eb; -} - -input::-moz-placeholder, textarea::-moz-placeholder { - color: #6b7280; - opacity: 1; -} - -input::placeholder,textarea::placeholder { - color: #6b7280; - opacity: 1; -} - -::-webkit-datetime-edit-fields-wrapper { - padding: 0; -} - -::-webkit-date-and-time-value { - min-height: 1.5em; - text-align: inherit; -} - -::-webkit-datetime-edit { - display: inline-flex; -} - -::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field { - padding-top: 0; - padding-bottom: 0; -} - -select { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e"); - background-position: right 0.5rem center; - background-repeat: no-repeat; - background-size: 1.5em 1.5em; - padding-right: 2.5rem; - -webkit-print-color-adjust: exact; - print-color-adjust: exact; -} - -[multiple],[size]:where(select:not([size="1"])) { - background-image: initial; - background-position: initial; - background-repeat: unset; - background-size: initial; - padding-right: 0.75rem; - -webkit-print-color-adjust: unset; - print-color-adjust: unset; -} - -[type='checkbox'],[type='radio'] { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - padding: 0; - -webkit-print-color-adjust: exact; - print-color-adjust: exact; - display: inline-block; - vertical-align: middle; - background-origin: border-box; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - flex-shrink: 0; - height: 1rem; - width: 1rem; - color: #2563eb; - background-color: #fff; - border-color: #6b7280; - border-width: 1px; - --tw-shadow: 0 0 #0000; -} - -[type='checkbox'] { - border-radius: 0px; -} - -[type='radio'] { - border-radius: 100%; -} - -[type='checkbox']:focus,[type='radio']:focus { - outline: 2px solid transparent; - outline-offset: 2px; - --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); - --tw-ring-offset-width: 2px; - --tw-ring-offset-color: #fff; - --tw-ring-color: #2563eb; - --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); -} - -[type='checkbox']:checked,[type='radio']:checked { - border-color: transparent; - background-color: currentColor; - background-size: 100% 100%; - background-position: center; - background-repeat: no-repeat; -} - -[type='checkbox']:checked { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e"); -} - -@media (forced-colors: active) { - [type='checkbox']:checked { - -webkit-appearance: auto; - -moz-appearance: auto; - appearance: auto; - } -} - -[type='radio']:checked { - background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); -} - -@media (forced-colors: active) { - [type='radio']:checked { - -webkit-appearance: auto; - -moz-appearance: auto; - appearance: auto; - } -} - -[type='checkbox']:checked:hover,[type='checkbox']:checked:focus,[type='radio']:checked:hover,[type='radio']:checked:focus { - border-color: transparent; - background-color: currentColor; -} - -[type='checkbox']:indeterminate { - background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e"); - border-color: transparent; - background-color: currentColor; - background-size: 100% 100%; - background-position: center; - background-repeat: no-repeat; -} - -@media (forced-colors: active) { - [type='checkbox']:indeterminate { - -webkit-appearance: auto; - -moz-appearance: auto; - appearance: auto; - } -} - -[type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus { - border-color: transparent; - background-color: currentColor; -} - -[type='file'] { - background: unset; - border-color: inherit; - border-width: 0; - border-radius: 0; - padding: 0; - font-size: unset; - line-height: inherit; -} - -[type='file']:focus { - outline: 1px solid ButtonText; - outline: 1px auto -webkit-focus-ring-color; -} - -:root, -[data-theme] { - background-color: var(--fallback-b1,oklch(var(--b1)/1)); - color: var(--fallback-bc,oklch(var(--bc)/1)); -} - -@supports not (color: oklch(0% 0 0)) { - :root { - color-scheme: light; - --fallback-p: #491eff; - --fallback-pc: #d4dbff; - --fallback-s: #ff41c7; - --fallback-sc: #fff9fc; - --fallback-a: #00cfbd; - --fallback-ac: #00100d; - --fallback-n: #2b3440; - --fallback-nc: #d7dde4; - --fallback-b1: #ffffff; - --fallback-b2: #e5e6e6; - --fallback-b3: #e5e6e6; - --fallback-bc: #1f2937; - --fallback-in: #00b3f0; - --fallback-inc: #000000; - --fallback-su: #00ca92; - --fallback-suc: #000000; - --fallback-wa: #ffc22d; - --fallback-wac: #000000; - --fallback-er: #ff6f70; - --fallback-erc: #000000; - } - - @media (prefers-color-scheme: dark) { - :root { - color-scheme: dark; - --fallback-p: #7582ff; - --fallback-pc: #050617; - --fallback-s: #ff71cf; - --fallback-sc: #190211; - --fallback-a: #00c7b5; - --fallback-ac: #000e0c; - --fallback-n: #2a323c; - --fallback-nc: #a6adbb; - --fallback-b1: #1d232a; - --fallback-b2: #191e24; - --fallback-b3: #15191e; - --fallback-bc: #a6adbb; - --fallback-in: #00b3f0; - --fallback-inc: #000000; - --fallback-su: #00ca92; - --fallback-suc: #000000; - --fallback-wa: #ffc22d; - --fallback-wac: #000000; - --fallback-er: #ff6f70; - --fallback-erc: #000000; - } - } -} - -html { - -webkit-tap-highlight-color: transparent; -} - -* { - scrollbar-color: color-mix(in oklch, currentColor 35%, transparent) transparent; -} - -*:hover { - scrollbar-color: color-mix(in oklch, currentColor 60%, transparent) transparent; -} - -:root { - color-scheme: light; - --in: 72.06% 0.191 231.6; - --su: 64.8% 0.150 160; - --wa: 84.71% 0.199 83.87; - --er: 71.76% 0.221 22.18; - --pc: 89.824% 0.06192 275.75; - --ac: 15.352% 0.0368 183.61; - --inc: 0% 0 0; - --suc: 0% 0 0; - --wac: 0% 0 0; - --erc: 0% 0 0; - --rounded-box: 1rem; - --rounded-btn: 0.5rem; - --rounded-badge: 1.9rem; - --animation-btn: 0.25s; - --animation-input: .2s; - --btn-focus-scale: 0.95; - --border-btn: 1px; - --tab-border: 1px; - --tab-radius: 0.5rem; - --p: 49.12% 0.3096 275.75; - --s: 69.71% 0.329 342.55; - --sc: 98.71% 0.0106 342.55; - --a: 76.76% 0.184 183.61; - --n: 32.1785% 0.02476 255.701624; - --nc: 89.4994% 0.011585 252.096176; - --b1: 100% 0 0; - --b2: 96.1151% 0 0; - --b3: 92.4169% 0.00108 197.137559; - --bc: 27.8078% 0.029596 256.847952; -} - -@media (prefers-color-scheme: dark) { - :root { - color-scheme: dark; - --in: 72.06% 0.191 231.6; - --su: 64.8% 0.150 160; - --wa: 84.71% 0.199 83.87; - --er: 71.76% 0.221 22.18; - --pc: 13.138% 0.0392 275.75; - --sc: 14.96% 0.052 342.55; - --ac: 14.902% 0.0334 183.61; - --inc: 0% 0 0; - --suc: 0% 0 0; - --wac: 0% 0 0; - --erc: 0% 0 0; - --rounded-box: 1rem; - --rounded-btn: 0.5rem; - --rounded-badge: 1.9rem; - --animation-btn: 0.25s; - --animation-input: .2s; - --btn-focus-scale: 0.95; - --border-btn: 1px; - --tab-border: 1px; - --tab-radius: 0.5rem; - --p: 65.69% 0.196 275.75; - --s: 74.8% 0.26 342.55; - --a: 74.51% 0.167 183.61; - --n: 31.3815% 0.021108 254.139175; - --nc: 74.6477% 0.0216 264.435964; - --b1: 25.3267% 0.015896 252.417568; - --b2: 23.2607% 0.013807 253.100675; - --b3: 21.1484% 0.01165 254.087939; - --bc: 74.6477% 0.0216 264.435964; - } -} - -[data-theme=light] { - color-scheme: light; - --in: 72.06% 0.191 231.6; - --su: 64.8% 0.150 160; - --wa: 84.71% 0.199 83.87; - --er: 71.76% 0.221 22.18; - --pc: 89.824% 0.06192 275.75; - --ac: 15.352% 0.0368 183.61; - --inc: 0% 0 0; - --suc: 0% 0 0; - --wac: 0% 0 0; - --erc: 0% 0 0; - --rounded-box: 1rem; - --rounded-btn: 0.5rem; - --rounded-badge: 1.9rem; - --animation-btn: 0.25s; - --animation-input: .2s; - --btn-focus-scale: 0.95; - --border-btn: 1px; - --tab-border: 1px; - --tab-radius: 0.5rem; - --p: 49.12% 0.3096 275.75; - --s: 69.71% 0.329 342.55; - --sc: 98.71% 0.0106 342.55; - --a: 76.76% 0.184 183.61; - --n: 32.1785% 0.02476 255.701624; - --nc: 89.4994% 0.011585 252.096176; - --b1: 100% 0 0; - --b2: 96.1151% 0 0; - --b3: 92.4169% 0.00108 197.137559; - --bc: 27.8078% 0.029596 256.847952; -} - -[data-theme=dark] { - color-scheme: dark; - --in: 72.06% 0.191 231.6; - --su: 64.8% 0.150 160; - --wa: 84.71% 0.199 83.87; - --er: 71.76% 0.221 22.18; - --pc: 13.138% 0.0392 275.75; - --sc: 14.96% 0.052 342.55; - --ac: 14.902% 0.0334 183.61; - --inc: 0% 0 0; - --suc: 0% 0 0; - --wac: 0% 0 0; - --erc: 0% 0 0; - --rounded-box: 1rem; - --rounded-btn: 0.5rem; - --rounded-badge: 1.9rem; - --animation-btn: 0.25s; - --animation-input: .2s; - --btn-focus-scale: 0.95; - --border-btn: 1px; - --tab-border: 1px; - --tab-radius: 0.5rem; - --p: 65.69% 0.196 275.75; - --s: 74.8% 0.26 342.55; - --a: 74.51% 0.167 183.61; - --n: 31.3815% 0.021108 254.139175; - --nc: 74.6477% 0.0216 264.435964; - --b1: 25.3267% 0.015896 252.417568; - --b2: 23.2607% 0.013807 253.100675; - --b3: 21.1484% 0.01165 254.087939; - --bc: 74.6477% 0.0216 264.435964; -} - -*, ::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 / 0.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 / 0.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; - } -} - -.alert { - display: grid; - width: 100%; - grid-auto-flow: row; - align-content: flex-start; - align-items: center; - justify-items: center; - gap: 1rem; - text-align: center; - border-radius: var(--rounded-box, 1rem); - border-width: 1px; - --tw-border-opacity: 1; - border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); - padding: 1rem; - --tw-text-opacity: 1; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - --alert-bg: var(--fallback-b2,oklch(var(--b2)/1)); - --alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1)); - background-color: var(--alert-bg); -} - -@media (min-width: 640px) { - .alert { - grid-auto-flow: column; - grid-template-columns: auto minmax(auto,1fr); - justify-items: start; - text-align: start; - } -} - -.avatar.placeholder > div { - display: flex; - align-items: center; - justify-content: center; -} - -@media (hover:hover) { - .label a:hover { - --tw-text-opacity: 1; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - } - - .menu li > *:not(ul, .menu-title, details, .btn):active, -.menu li > *:not(ul, .menu-title, details, .btn).active, -.menu li > details > summary:active { - --tw-bg-opacity: 1; - background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); - --tw-text-opacity: 1; - color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity))); - } - - .table tr.hover:hover, - .table tr.hover:nth-child(even):hover { - --tw-bg-opacity: 1; - background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); - } -} - -.btn { - display: inline-flex; - height: 3rem; - min-height: 3rem; - flex-shrink: 0; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - flex-wrap: wrap; - align-items: center; - justify-content: center; - border-radius: var(--rounded-btn, 0.5rem); - border-color: transparent; - border-color: oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity)); - padding-left: 1rem; - padding-right: 1rem; - text-align: center; - font-size: 0.875rem; - line-height: 1em; - gap: 0.5rem; - font-weight: 600; - text-decoration-line: none; - transition-duration: 200ms; - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - border-width: var(--border-btn, 1px); - transition-property: color, background-color, border-color, opacity, box-shadow, transform; - --tw-text-opacity: 1; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - --tw-shadow: 0 1px 2px 0 rgb(0 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); - outline-color: var(--fallback-bc,oklch(var(--bc)/1)); - background-color: oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity)); - --tw-bg-opacity: 1; - --tw-border-opacity: 1; -} - -.btn-disabled, - .btn[disabled], - .btn:disabled { - pointer-events: none; -} - -:where(.btn:is(input[type="checkbox"])), -:where(.btn:is(input[type="radio"])) { - width: auto; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -.btn:is(input[type="checkbox"]):after, -.btn:is(input[type="radio"]):after { - --tw-content: attr(aria-label); - content: var(--tw-content); -} - -.card { - position: relative; - display: flex; - flex-direction: column; - border-radius: var(--rounded-box, 1rem); -} - -.card:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.card-body { - display: flex; - flex: 1 1 auto; - flex-direction: column; - padding: var(--padding-card, 2rem); - gap: 0.5rem; -} - -.card-body :where(p) { - flex-grow: 1; -} - -.card figure { - display: flex; - align-items: center; - justify-content: center; -} - -.card.image-full { - display: grid; -} - -.card.image-full:before { - position: relative; - content: ""; - z-index: 10; - border-radius: var(--rounded-box, 1rem); - --tw-bg-opacity: 1; - background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); - opacity: 0.75; -} - -.card.image-full:before, - .card.image-full > * { - grid-column-start: 1; - grid-row-start: 1; -} - -.card.image-full > figure img { - height: 100%; - -o-object-fit: cover; - object-fit: cover; -} - -.card.image-full > .card-body { - position: relative; - z-index: 20; - --tw-text-opacity: 1; - color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity))); -} - -.checkbox { - flex-shrink: 0; - --chkbg: var(--fallback-bc,oklch(var(--bc)/1)); - --chkfg: var(--fallback-b1,oklch(var(--b1)/1)); - height: 1.5rem; - width: 1.5rem; - cursor: pointer; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-radius: var(--rounded-btn, 0.5rem); - border-width: 1px; - border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); - --tw-border-opacity: 0.2; -} - -@media (hover: hover) { - .btm-nav > *.disabled:hover, - .btm-nav > *[disabled]:hover { - pointer-events: none; - --tw-border-opacity: 0; - background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); - --tw-bg-opacity: 0.1; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - --tw-text-opacity: 0.2; - } - - .btn:hover { - --tw-border-opacity: 1; - border-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity))); - --tw-bg-opacity: 1; - background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity))); - } - - @supports (color: color-mix(in oklab, black, black)) { - .btn:hover { - background-color: color-mix( - in oklab, - oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%, - black - ); - border-color: color-mix( - in oklab, - oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%, - black - ); - } - } - - @supports not (color: oklch(0% 0 0)) { - .btn:hover { - background-color: var(--btn-color, var(--fallback-b2)); - border-color: var(--btn-color, var(--fallback-b2)); - } - } - - .btn.glass:hover { - --glass-opacity: 25%; - --glass-border-opacity: 15%; - } - - .btn-outline.btn-primary:hover { - --tw-text-opacity: 1; - color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); - } - - @supports (color: color-mix(in oklab, black, black)) { - .btn-outline.btn-primary:hover { - background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); - border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); - } - } - - .btn-outline.btn-success:hover { - --tw-text-opacity: 1; - color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity))); - } - - @supports (color: color-mix(in oklab, black, black)) { - .btn-outline.btn-success:hover { - background-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); - border-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); - } - } - - .btn-outline.btn-warning:hover { - --tw-text-opacity: 1; - color: var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity))); - } - - @supports (color: color-mix(in oklab, black, black)) { - .btn-outline.btn-warning:hover { - background-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); - border-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); - } - } - - .btn-disabled:hover, - .btn[disabled]:hover, - .btn:disabled:hover { - --tw-border-opacity: 0; - background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); - --tw-bg-opacity: 0.2; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - --tw-text-opacity: 0.2; - } - - @supports (color: color-mix(in oklab, black, black)) { - .btn:is(input[type="checkbox"]:checked):hover, .btn:is(input[type="radio"]:checked):hover { - background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); - border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); - } - } - - :where(.menu li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title)):not(.active, .btn):hover, :where(.menu li:not(.menu-title, .disabled) > details > summary:not(.menu-title)):not(.active, .btn):hover { - cursor: pointer; - outline: 2px solid transparent; - outline-offset: 2px; - } - - @supports (color: oklch(0% 0 0)) { - :where(.menu li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title)):not(.active, .btn):hover, :where(.menu li:not(.menu-title, .disabled) > details > summary:not(.menu-title)):not(.active, .btn):hover { - background-color: var(--fallback-bc,oklch(var(--bc)/0.1)); - } - } -} - -.form-control { - display: flex; - flex-direction: column; -} - -.label { - display: flex; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - align-items: center; - justify-content: space-between; - padding-left: 0.25rem; - padding-right: 0.25rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.input { - flex-shrink: 1; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - height: 3rem; - padding-left: 1rem; - padding-right: 1rem; - font-size: 1rem; - line-height: 2; - line-height: 1.5rem; - border-radius: var(--rounded-btn, 0.5rem); - border-width: 1px; - border-color: transparent; - --tw-bg-opacity: 1; - background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); -} - -.input[type="number"]::-webkit-inner-spin-button, -.input-md[type="number"]::-webkit-inner-spin-button { - margin-top: -1rem; - margin-bottom: -1rem; - margin-inline-end: -1rem; -} - -.link { - cursor: pointer; - text-decoration-line: underline; -} - -.mask { - -webkit-mask-size: contain; - mask-size: contain; - -webkit-mask-repeat: no-repeat; - mask-repeat: no-repeat; - -webkit-mask-position: center; - mask-position: center; -} - -.menu { - display: flex; - flex-direction: column; - flex-wrap: wrap; - font-size: 0.875rem; - line-height: 1.25rem; - padding: 0.5rem; -} - -.menu :where(li ul) { - position: relative; - white-space: nowrap; - margin-inline-start: 1rem; - padding-inline-start: 0.5rem; -} - -.menu :where(li:not(.menu-title) > *:not(ul, details, .menu-title, .btn)), .menu :where(li:not(.menu-title) > details > summary:not(.menu-title)) { - display: grid; - grid-auto-flow: column; - align-content: flex-start; - align-items: center; - gap: 0.5rem; - grid-auto-columns: minmax(auto, max-content) auto max-content; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; -} - -.menu li.disabled { - cursor: not-allowed; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - color: var(--fallback-bc,oklch(var(--bc)/0.3)); -} - -.menu :where(li > .menu-dropdown:not(.menu-dropdown-show)) { - display: none; -} - -:where(.menu li) { - position: relative; - display: flex; - flex-shrink: 0; - flex-direction: column; - flex-wrap: wrap; - align-items: stretch; -} - -:where(.menu li) .badge { - justify-self: end; -} - -.modal { - pointer-events: none; - position: fixed; - inset: 0px; - margin: 0px; - display: grid; - height: 100%; - max-height: none; - width: 100%; - max-width: none; - justify-items: center; - padding: 0px; - opacity: 0; - overscroll-behavior: contain; - z-index: 999; - background-color: transparent; - color: inherit; - transition-duration: 200ms; - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - transition-property: transform, opacity, visibility; - overflow-y: hidden; -} - -:where(.modal) { - align-items: center; -} - -.modal-box { - max-height: calc(100vh - 5em); - grid-column-start: 1; - grid-row-start: 1; - width: 91.666667%; - max-width: 32rem; - --tw-scale-x: .9; - --tw-scale-y: .9; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - border-bottom-right-radius: var(--rounded-box, 1rem); - border-bottom-left-radius: var(--rounded-box, 1rem); - border-top-left-radius: var(--rounded-box, 1rem); - border-top-right-radius: var(--rounded-box, 1rem); - --tw-bg-opacity: 1; - background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); - padding: 1.5rem; - 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(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - transition-duration: 200ms; - box-shadow: rgba(0, 0, 0, 0.25) 0px 25px 50px -12px; - overflow-y: auto; - overscroll-behavior: contain; -} - -.modal-open, -.modal:target, -.modal-toggle:checked + .modal, -.modal[open] { - pointer-events: auto; - visibility: visible; - opacity: 1; -} - -.modal-action { - display: flex; - margin-top: 1.5rem; - justify-content: flex-end; -} - -:root:has(:is(.modal-open, .modal:target, .modal-toggle:checked + .modal, .modal[open])) { - overflow: hidden; - scrollbar-gutter: stable; -} - -.navbar { - display: flex; - align-items: center; - padding: var(--navbar-padding, 0.5rem); - min-height: 4rem; - width: 100%; -} - -:where(.navbar > *:not(script, style)) { - display: inline-flex; - align-items: center; -} - -.radio { - flex-shrink: 0; - --chkbg: var(--bc); - height: 1.5rem; - width: 1.5rem; - cursor: pointer; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-radius: 9999px; - border-width: 1px; - border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); - --tw-border-opacity: 0.2; -} - -.rating { - position: relative; - display: inline-flex; -} - -.rating :where(input) { - cursor: pointer; - border-radius: 0px; - animation: rating-pop var(--animation-input, 0.25s) ease-out; - height: 1.5rem; - width: 1.5rem; - background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); - --tw-bg-opacity: 1; -} - -.select { - display: inline-flex; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - height: 3rem; - min-height: 3rem; - padding-inline-start: 1rem; - padding-inline-end: 2.5rem; - font-size: 0.875rem; - line-height: 1.25rem; - line-height: 2; - border-radius: var(--rounded-btn, 0.5rem); - border-width: 1px; - border-color: transparent; - --tw-bg-opacity: 1; - background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); - background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), - linear-gradient(135deg, currentColor 50%, transparent 50%); - background-position: calc(100% - 20px) calc(1px + 50%), - calc(100% - 16.1px) calc(1px + 50%); - background-size: 4px 4px, - 4px 4px; - background-repeat: no-repeat; -} - -.select[multiple] { - height: auto; -} - -.stat { - display: inline-grid; - width: 100%; - grid-template-columns: repeat(1, 1fr); - -moz-column-gap: 1rem; - column-gap: 1rem; - border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); - --tw-border-opacity: 0.1; - padding-left: 1.5rem; - padding-right: 1.5rem; - padding-top: 1rem; - padding-bottom: 1rem; -} - -.swap { - position: relative; - display: inline-grid; - -webkit-user-select: none; - -moz-user-select: none; - user-select: none; - place-content: center; - cursor: pointer; -} - -.swap > * { - grid-column-start: 1; - grid-row-start: 1; - transition-duration: 300ms; - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - transition-property: transform, opacity; -} - -.swap input { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; -} - -.swap .swap-on, -.swap .swap-indeterminate, -.swap input:indeterminate ~ .swap-on { - opacity: 0; -} - -.swap input:checked ~ .swap-off, -.swap-active .swap-off, -.swap input:indeterminate ~ .swap-off { - opacity: 0; -} - -.swap input:checked ~ .swap-on, -.swap-active .swap-on, -.swap input:indeterminate ~ .swap-indeterminate { - opacity: 1; -} - -.table { - position: relative; - width: 100%; - border-radius: var(--rounded-box, 1rem); - text-align: left; - font-size: 0.875rem; - line-height: 1.25rem; -} - -.table :where(.table-pin-rows thead tr) { - position: sticky; - top: 0px; - z-index: 1; - --tw-bg-opacity: 1; - background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); -} - -.table :where(.table-pin-rows tfoot tr) { - position: sticky; - bottom: 0px; - z-index: 1; - --tw-bg-opacity: 1; - background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); -} - -.table :where(.table-pin-cols tr th) { - position: sticky; - left: 0px; - right: 0px; - --tw-bg-opacity: 1; - background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); -} - -.textarea { - min-height: 3rem; - flex-shrink: 1; - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - font-size: 0.875rem; - line-height: 1.25rem; - line-height: 2; - border-radius: var(--rounded-btn, 0.5rem); - border-width: 1px; - border-color: transparent; - --tw-bg-opacity: 1; - background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); -} - -.toggle { - flex-shrink: 0; - --tglbg: var(--fallback-b1,oklch(var(--b1)/1)); - --handleoffset: 1.5rem; - --handleoffsetcalculator: calc(var(--handleoffset) * -1); - --togglehandleborder: 0 0; - height: 1.5rem; - width: 3rem; - cursor: pointer; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - border-radius: var(--rounded-badge, 1.9rem); - border-width: 1px; - border-color: currentColor; - background-color: currentColor; - color: var(--fallback-bc,oklch(var(--bc)/0.5)); - transition: background, - box-shadow var(--animation-input, 0.2s) ease-out; - box-shadow: var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset, - 0 0 0 2px var(--tglbg) inset, - var(--togglehandleborder); -} - -.alert-success { - border-color: var(--fallback-su,oklch(var(--su)/0.2)); - --tw-text-opacity: 1; - color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity))); - --alert-bg: var(--fallback-su,oklch(var(--su)/1)); - --alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1)); -} - -.btm-nav > *.disabled, - .btm-nav > *[disabled] { - pointer-events: none; - --tw-border-opacity: 0; - background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); - --tw-bg-opacity: 0.1; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - --tw-text-opacity: 0.2; -} - -.btm-nav > * .label { - font-size: 1rem; - line-height: 1.5rem; -} - -@media (prefers-reduced-motion: no-preference) { - .btn { - animation: button-pop var(--animation-btn, 0.25s) ease-out; - } -} - -.btn:active:hover, - .btn:active:focus { - animation: button-pop 0s ease-out; - transform: scale(var(--btn-focus-scale, 0.97)); -} - -@supports not (color: oklch(0% 0 0)) { - .btn { - background-color: var(--btn-color, var(--fallback-b2)); - border-color: var(--btn-color, var(--fallback-b2)); - } - - .btn-primary { - --btn-color: var(--fallback-p); - } - - .btn-neutral { - --btn-color: var(--fallback-n); - } - - .btn-success { - --btn-color: var(--fallback-su); - } - - .btn-warning { - --btn-color: var(--fallback-wa); - } -} - -@supports (color: color-mix(in oklab, black, black)) { - .btn-outline.btn-primary.btn-active { - background-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); - border-color: color-mix(in oklab, var(--fallback-p,oklch(var(--p)/1)) 90%, black); - } - - .btn-outline.btn-success.btn-active { - background-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); - border-color: color-mix(in oklab, var(--fallback-su,oklch(var(--su)/1)) 90%, black); - } - - .btn-outline.btn-warning.btn-active { - background-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); - border-color: color-mix(in oklab, var(--fallback-wa,oklch(var(--wa)/1)) 90%, black); - } -} - -.btn:focus-visible { - outline-style: solid; - outline-width: 2px; - outline-offset: 2px; -} - -.btn-primary { - --tw-text-opacity: 1; - color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); - outline-color: var(--fallback-p,oklch(var(--p)/1)); -} - -@supports (color: oklch(0% 0 0)) { - .btn-primary { - --btn-color: var(--p); - } - - .btn-neutral { - --btn-color: var(--n); - } - - .btn-success { - --btn-color: var(--su); - } - - .btn-warning { - --btn-color: var(--wa); - } -} - -.btn-neutral { - --tw-text-opacity: 1; - color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity))); - outline-color: var(--fallback-n,oklch(var(--n)/1)); -} - -.btn-success { - --tw-text-opacity: 1; - color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity))); - outline-color: var(--fallback-su,oklch(var(--su)/1)); -} - -.btn-warning { - --tw-text-opacity: 1; - color: var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity))); - outline-color: var(--fallback-wa,oklch(var(--wa)/1)); -} - -.btn.glass { - --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); - outline-color: currentColor; -} - -.btn.glass.btn-active { - --glass-opacity: 25%; - --glass-border-opacity: 15%; -} - -.btn-outline.btn-primary { - --tw-text-opacity: 1; - color: var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity))); -} - -.btn-outline.btn-primary.btn-active { - --tw-text-opacity: 1; - color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); -} - -.btn-outline.btn-success { - --tw-text-opacity: 1; - color: var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity))); -} - -.btn-outline.btn-success.btn-active { - --tw-text-opacity: 1; - color: var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity))); -} - -.btn-outline.btn-warning { - --tw-text-opacity: 1; - color: var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity))); -} - -.btn-outline.btn-warning.btn-active { - --tw-text-opacity: 1; - color: var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity))); -} - -.btn.btn-disabled, - .btn[disabled], - .btn:disabled { - --tw-border-opacity: 0; - background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); - --tw-bg-opacity: 0.2; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - --tw-text-opacity: 0.2; -} - -.btn:is(input[type="checkbox"]:checked), -.btn:is(input[type="radio"]:checked) { - --tw-border-opacity: 1; - border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity))); - --tw-bg-opacity: 1; - background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity))); - --tw-text-opacity: 1; - color: var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity))); -} - -.btn:is(input[type="checkbox"]:checked):focus-visible, .btn:is(input[type="radio"]:checked):focus-visible { - outline-color: var(--fallback-p,oklch(var(--p)/1)); -} - -@keyframes button-pop { - 0% { - transform: scale(var(--btn-focus-scale, 0.98)); - } - - 40% { - transform: scale(1.02); - } - - 100% { - transform: scale(1); - } -} - -.card :where(figure:first-child) { - overflow: hidden; - border-start-start-radius: inherit; - border-start-end-radius: inherit; - border-end-start-radius: unset; - border-end-end-radius: unset; -} - -.card :where(figure:last-child) { - overflow: hidden; - border-start-start-radius: unset; - border-start-end-radius: unset; - border-end-start-radius: inherit; - border-end-end-radius: inherit; -} - -.card:focus-visible { - outline: 2px solid currentColor; - outline-offset: 2px; -} - -.card.bordered { - border-width: 1px; - --tw-border-opacity: 1; - border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); -} - -.card.compact .card-body { - padding: 1rem; - font-size: 0.875rem; - line-height: 1.25rem; -} - -.card.image-full :where(figure) { - overflow: hidden; - border-radius: inherit; -} - -.checkbox:focus { - box-shadow: none; -} - -.checkbox:focus-visible { - outline-style: solid; - outline-width: 2px; - outline-offset: 2px; - outline-color: var(--fallback-bc,oklch(var(--bc)/1)); -} - -.checkbox:disabled { - border-width: 0px; - cursor: not-allowed; - border-color: transparent; - --tw-bg-opacity: 1; - background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); - opacity: 0.2; -} - -.checkbox:checked, - .checkbox[aria-checked="true"] { - background-repeat: no-repeat; - animation: checkmark var(--animation-input, 0.2s) ease-out; - background-color: var(--chkbg); - background-image: linear-gradient(-45deg, transparent 65%, var(--chkbg) 65.99%), - linear-gradient(45deg, transparent 75%, var(--chkbg) 75.99%), - linear-gradient(-45deg, var(--chkbg) 40%, transparent 40.99%), - linear-gradient( - 45deg, - var(--chkbg) 30%, - var(--chkfg) 30.99%, - var(--chkfg) 40%, - transparent 40.99% - ), - linear-gradient(-45deg, var(--chkfg) 50%, var(--chkbg) 50.99%); -} - -.checkbox:indeterminate { - --tw-bg-opacity: 1; - background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); - background-repeat: no-repeat; - animation: checkmark var(--animation-input, 0.2s) ease-out; - background-image: linear-gradient(90deg, transparent 80%, var(--chkbg) 80%), - linear-gradient(-90deg, transparent 80%, var(--chkbg) 80%), - linear-gradient(0deg, var(--chkbg) 43%, var(--chkfg) 43%, var(--chkfg) 57%, var(--chkbg) 57%); -} - -@keyframes checkmark { - 0% { - background-position-y: 5px; - } - - 50% { - background-position-y: -2px; - } - - 100% { - background-position-y: 0; - } -} - -.input input { - --tw-bg-opacity: 1; - background-color: var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity))); - background-color: transparent; -} - -.input input:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.input[list]::-webkit-calendar-picker-indicator { - line-height: 1em; -} - -.input-bordered { - border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); -} - -.input:focus, - .input:focus-within { - box-shadow: none; - border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); - outline-style: solid; - outline-width: 2px; - outline-offset: 2px; - outline-color: var(--fallback-bc,oklch(var(--bc)/0.2)); -} - -.input-primary { - --tw-border-opacity: 1; - border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity))); -} - -.input-primary:focus, - .input-primary:focus-within { - --tw-border-opacity: 1; - border-color: var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity))); - outline-color: var(--fallback-p,oklch(var(--p)/1)); -} - -.input:has(> input[disabled]), - .input-disabled, - .input:disabled, - .input[disabled] { - cursor: not-allowed; - --tw-border-opacity: 1; - border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); - --tw-bg-opacity: 1; - background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); - color: var(--fallback-bc,oklch(var(--bc)/0.4)); -} - -.input:has(> input[disabled])::-moz-placeholder, .input-disabled::-moz-placeholder, .input:disabled::-moz-placeholder, .input[disabled]::-moz-placeholder { - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); - --tw-placeholder-opacity: 0.2; -} - -.input:has(> input[disabled])::placeholder, - .input-disabled::placeholder, - .input:disabled::placeholder, - .input[disabled]::placeholder { - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); - --tw-placeholder-opacity: 0.2; -} - -.input:has(> input[disabled]) > input[disabled] { - cursor: not-allowed; -} - -.input::-webkit-date-and-time-value { - text-align: inherit; -} - -.join > :where(*:not(:first-child)):is(.btn) { - margin-inline-start: calc(var(--border-btn) * -1); -} - -.link:focus { - outline: 2px solid transparent; - outline-offset: 2px; -} - -.link:focus-visible { - outline: 2px solid currentColor; - outline-offset: 2px; -} - -.mask-star-2 { - -webkit-mask-image: url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z' fill-rule='evenodd'/%3e%3c/svg%3e"); - mask-image: url("data:image/svg+xml,%3csvg width='192' height='180' xmlns='http://www.w3.org/2000/svg'%3e%3cpath fill='black' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z' fill-rule='evenodd'/%3e%3c/svg%3e"); -} - -:where(.menu li:empty) { - --tw-bg-opacity: 1; - background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); - opacity: 0.1; - margin: 0.5rem 1rem; - height: 1px; -} - -.menu :where(li ul):before { - position: absolute; - bottom: 0.75rem; - inset-inline-start: 0px; - top: 0.75rem; - width: 1px; - --tw-bg-opacity: 1; - background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); - opacity: 0.1; - content: ""; -} - -.menu :where(li:not(.menu-title) > *:not(ul, details, .menu-title, .btn)), -.menu :where(li:not(.menu-title) > details > summary:not(.menu-title)) { - border-radius: var(--rounded-btn, 0.5rem); - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; - text-align: start; - 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(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - transition-duration: 200ms; - text-wrap: balance; -} - -:where(.menu li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title)):not(summary, .active, .btn).focus, :where(.menu li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title)):not(summary, .active, .btn):focus, :where(.menu li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title)):is(summary):not(.active, .btn):focus-visible, :where(.menu li:not(.menu-title, .disabled) > details > summary:not(.menu-title)):not(summary, .active, .btn).focus, :where(.menu li:not(.menu-title, .disabled) > details > summary:not(.menu-title)):not(summary, .active, .btn):focus, :where(.menu li:not(.menu-title, .disabled) > details > summary:not(.menu-title)):is(summary):not(.active, .btn):focus-visible { - cursor: pointer; - background-color: var(--fallback-bc,oklch(var(--bc)/0.1)); - --tw-text-opacity: 1; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - outline: 2px solid transparent; - outline-offset: 2px; -} - -.menu li > *:not(ul, .menu-title, details, .btn):active, -.menu li > *:not(ul, .menu-title, details, .btn).active, -.menu li > details > summary:active { - --tw-bg-opacity: 1; - background-color: var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity))); - --tw-text-opacity: 1; - color: var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity))); -} - -.menu :where(li > details > summary)::-webkit-details-marker { - display: none; -} - -.menu :where(li > details > summary):after, -.menu :where(li > .menu-dropdown-toggle):after { - justify-self: end; - display: block; - margin-top: -0.5rem; - height: 0.5rem; - width: 0.5rem; - transform: rotate(45deg); - transition-property: transform, margin-top; - transition-duration: 0.3s; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - content: ""; - transform-origin: 75% 75%; - box-shadow: 2px 2px; - pointer-events: none; -} - -.menu :where(li > details[open] > summary):after, -.menu :where(li > .menu-dropdown-toggle.menu-dropdown-show):after { - transform: rotate(225deg); - margin-top: 0; -} - -.mockup-phone .display { - overflow: hidden; - border-radius: 40px; - margin-top: -25px; -} - -.mockup-browser .mockup-browser-toolbar .input { - position: relative; - margin-left: auto; - margin-right: auto; - display: block; - height: 1.75rem; - width: 24rem; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - --tw-bg-opacity: 1; - background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); - padding-left: 2rem; - direction: ltr; -} - -.mockup-browser .mockup-browser-toolbar .input:before { - content: ""; - position: absolute; - left: 0.5rem; - top: 50%; - aspect-ratio: 1 / 1; - height: 0.75rem; - --tw-translate-y: -50%; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - border-radius: 9999px; - border-width: 2px; - border-color: currentColor; - opacity: 0.6; -} - -.mockup-browser .mockup-browser-toolbar .input:after { - content: ""; - position: absolute; - left: 1.25rem; - top: 50%; - height: 0.5rem; - --tw-translate-y: 25%; - --tw-rotate: -45deg; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - border-radius: 9999px; - border-width: 1px; - border-color: currentColor; - opacity: 0.6; -} - -.modal:not(dialog:not(.modal-open)), - .modal::backdrop { - background-color: #0006; - animation: modal-pop 0.2s ease-out; -} - -.modal-open .modal-box, -.modal-toggle:checked + .modal .modal-box, -.modal:target .modal-box, -.modal[open] .modal-box { - --tw-translate-y: 0px; - --tw-scale-x: 1; - --tw-scale-y: 1; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.modal-action > :not([hidden]) ~ :not([hidden]) { - --tw-space-x-reverse: 0; - margin-right: calc(0.5rem * var(--tw-space-x-reverse)); - margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); -} - -@keyframes modal-pop { - 0% { - opacity: 0; - } -} - -@keyframes progress-loading { - 50% { - background-position-x: -115%; - } -} - -.radio:focus { - box-shadow: none; -} - -.radio:focus-visible { - outline-style: solid; - outline-width: 2px; - outline-offset: 2px; - outline-color: var(--fallback-bc,oklch(var(--bc)/1)); -} - -.radio:checked, - .radio[aria-checked="true"] { - --tw-bg-opacity: 1; - background-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity))); - background-image: none; - animation: radiomark var(--animation-input, 0.2s) ease-out; - box-shadow: 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset, - 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset; -} - -.radio:disabled { - cursor: not-allowed; - opacity: 0.2; -} - -@keyframes radiomark { - 0% { - box-shadow: 0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset, - 0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset; - } - - 50% { - box-shadow: 0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset, - 0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset; - } - - 100% { - box-shadow: 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset, - 0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset; - } -} - -.rating input { - -moz-appearance: none; - appearance: none; - -webkit-appearance: none; -} - -.rating .rating-hidden { - width: 0.5rem; - background-color: transparent; -} - -.rating input[type="radio"]:checked { - background-image: none; -} - -.rating input:checked ~ input, - .rating input[aria-checked="true"] ~ input { - --tw-bg-opacity: 0.2; -} - -.rating input:focus-visible { - transition-property: transform; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-timing-function: cubic-bezier(0, 0, 0.2, 1); - transition-duration: 300ms; - transform: translateY(-0.125em); -} - -.rating input:active:focus { - animation: none; - transform: translateY(-0.125em); -} - -@keyframes rating-pop { - 0% { - transform: translateY(-0.125em); - } - - 40% { - transform: translateY(-0.125em); - } - - 100% { - transform: translateY(0); - } -} - -.select:focus { - box-shadow: none; - border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); - outline-style: solid; - outline-width: 2px; - outline-offset: 2px; - outline-color: var(--fallback-bc,oklch(var(--bc)/0.2)); -} - -.select-disabled, - .select:disabled, - .select[disabled] { - cursor: not-allowed; - --tw-border-opacity: 1; - border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); - --tw-bg-opacity: 1; - background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); - color: var(--fallback-bc,oklch(var(--bc)/0.4)); -} - -.select-disabled::-moz-placeholder, .select:disabled::-moz-placeholder, .select[disabled]::-moz-placeholder { - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); - --tw-placeholder-opacity: 0.2; -} - -.select-disabled::placeholder, - .select:disabled::placeholder, - .select[disabled]::placeholder { - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); - --tw-placeholder-opacity: 0.2; -} - -.select-multiple, - .select[multiple], - .select[size].select:not([size="1"]) { - background-image: none; - padding-right: 1rem; -} - -[dir="rtl"] .select { - background-position: calc(0% + 12px) calc(1px + 50%), - calc(0% + 16px) calc(1px + 50%); -} - -@keyframes skeleton { - from { - background-position: 150%; - } - - to { - background-position: -50%; - } -} - -.table:where([dir="rtl"], [dir="rtl"] *) { - text-align: right; -} - -.table :where(th, td) { - padding-left: 1rem; - padding-right: 1rem; - padding-top: 0.75rem; - padding-bottom: 0.75rem; - vertical-align: middle; -} - -.table tr.active, - .table tr.active:nth-child(even), - .table-zebra tbody tr:nth-child(even) { - --tw-bg-opacity: 1; - background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); -} - -.table :where(thead tr, tbody tr:not(:last-child), tbody tr:first-child:last-child) { - border-bottom-width: 1px; - --tw-border-opacity: 1; - border-bottom-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); -} - -.table :where(thead, tfoot) { - white-space: nowrap; - font-size: 0.75rem; - line-height: 1rem; - font-weight: 700; - color: var(--fallback-bc,oklch(var(--bc)/0.6)); -} - -.table :where(tfoot) { - border-top-width: 1px; - --tw-border-opacity: 1; - border-top-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); -} - -.textarea:focus { - box-shadow: none; - border-color: var(--fallback-bc,oklch(var(--bc)/0.2)); - outline-style: solid; - outline-width: 2px; - outline-offset: 2px; - outline-color: var(--fallback-bc,oklch(var(--bc)/0.2)); -} - -.textarea-disabled, - .textarea:disabled, - .textarea[disabled] { - cursor: not-allowed; - --tw-border-opacity: 1; - border-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity))); - --tw-bg-opacity: 1; - background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); - color: var(--fallback-bc,oklch(var(--bc)/0.4)); -} - -.textarea-disabled::-moz-placeholder, .textarea:disabled::-moz-placeholder, .textarea[disabled]::-moz-placeholder { - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); - --tw-placeholder-opacity: 0.2; -} - -.textarea-disabled::placeholder, - .textarea:disabled::placeholder, - .textarea[disabled]::placeholder { - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity))); - --tw-placeholder-opacity: 0.2; -} - -@keyframes toast-pop { - 0% { - transform: scale(0.9); - opacity: 0; - } - - 100% { - transform: scale(1); - opacity: 1; - } -} - -[dir="rtl"] .toggle { - --handleoffsetcalculator: calc(var(--handleoffset) * 1); -} - -.toggle:focus-visible { - outline-style: solid; - outline-width: 2px; - outline-offset: 2px; - outline-color: var(--fallback-bc,oklch(var(--bc)/0.2)); -} - -.toggle:hover { - background-color: currentColor; -} - -.toggle:checked, - .toggle[aria-checked="true"] { - background-image: none; - --handleoffsetcalculator: var(--handleoffset); - --tw-text-opacity: 1; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); -} - -[dir="rtl"] .toggle:checked, [dir="rtl"] .toggle[aria-checked="true"] { - --handleoffsetcalculator: calc(var(--handleoffset) * -1); -} - -.toggle:indeterminate { - --tw-text-opacity: 1; - color: var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity))); - box-shadow: calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset, - calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset, - 0 0 0 2px var(--tglbg) inset; -} - -[dir="rtl"] .toggle:indeterminate { - box-shadow: calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset, - calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset, - 0 0 0 2px var(--tglbg) inset; -} - -.toggle:disabled { - cursor: not-allowed; - --tw-border-opacity: 1; - border-color: var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity))); - background-color: transparent; - opacity: 0.3; - --togglehandleborder: 0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset, - var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset; -} - -.btn-sm { - height: 2rem; - min-height: 2rem; - padding-left: 0.75rem; - padding-right: 0.75rem; - font-size: 0.875rem; -} - -.btn-block { - width: 100%; -} - -.btn-square:where(.btn-sm) { - height: 2rem; - width: 2rem; - padding: 0px; -} - -.btn-circle:where(.btn-sm) { - height: 2rem; - width: 2rem; - border-radius: 9999px; - padding: 0px; -} - -.modal-bottom { - place-items: end; -} - -.avatar.online:before { - content: ""; - position: absolute; - z-index: 10; - display: block; - border-radius: 9999px; - --tw-bg-opacity: 1; - background-color: var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity))); - outline-style: solid; - outline-width: 2px; - outline-color: var(--fallback-b1,oklch(var(--b1)/1)); - width: 15%; - height: 15%; - top: 7%; - right: 7%; -} - -.avatar.offline:before { - content: ""; - position: absolute; - z-index: 10; - display: block; - border-radius: 9999px; - --tw-bg-opacity: 1; - background-color: var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity))); - outline-style: solid; - outline-width: 2px; - outline-color: var(--fallback-b1,oklch(var(--b1)/1)); - width: 15%; - height: 15%; - top: 7%; - right: 7%; -} - -.card-compact .card-body { - padding: 1rem; - font-size: 0.875rem; - line-height: 1.25rem; -} - -.card-normal .card-body { - padding: var(--padding-card, 2rem); - font-size: 1rem; - line-height: 1.5rem; -} - -.join.join-vertical > :where(*:not(:first-child)):is(.btn) { - margin-top: calc(var(--border-btn) * -1); -} - -.join.join-horizontal > :where(*:not(:first-child)):is(.btn) { - margin-inline-start: calc(var(--border-btn) * -1); -} - -.modal-top :where(.modal-box) { - width: 100%; - max-width: none; - --tw-translate-y: -2.5rem; - --tw-scale-x: 1; - --tw-scale-y: 1; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - border-bottom-right-radius: var(--rounded-box, 1rem); - border-bottom-left-radius: var(--rounded-box, 1rem); - border-top-left-radius: 0px; - border-top-right-radius: 0px; -} - -.modal-middle :where(.modal-box) { - width: 91.666667%; - max-width: 32rem; - --tw-translate-y: 0px; - --tw-scale-x: .9; - --tw-scale-y: .9; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - border-top-left-radius: var(--rounded-box, 1rem); - border-top-right-radius: var(--rounded-box, 1rem); - border-bottom-right-radius: var(--rounded-box, 1rem); - border-bottom-left-radius: var(--rounded-box, 1rem); -} - -.modal-bottom :where(.modal-box) { - width: 100%; - max-width: none; - --tw-translate-y: 2.5rem; - --tw-scale-x: 1; - --tw-scale-y: 1; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); - border-top-left-radius: var(--rounded-box, 1rem); - border-top-right-radius: var(--rounded-box, 1rem); - border-bottom-right-radius: 0px; - border-bottom-left-radius: 0px; -} - -.pointer-events-none { - pointer-events: none; -} - -.static { - position: static; -} - -.absolute { - position: absolute; -} - -.relative { - position: relative; -} - -.sticky { - position: sticky; -} - -.inset-y-0 { - top: 0px; - bottom: 0px; -} - -.bottom-0 { - bottom: 0px; -} - -.left-0 { - left: 0px; -} - -.right-0 { - right: 0px; -} - -.top-0 { - top: 0px; -} - -.top-\[78px\] { - top: 78px; -} - -.z-50 { - z-index: 50; -} - -.z-\[99999\] { - z-index: 99999; -} - -.float-right { - float: right; -} - -.m-2 { - margin: 0.5rem; -} - -.mx-1 { - margin-left: 0.25rem; - margin-right: 0.25rem; -} - -.mx-3 { - margin-left: 0.75rem; - margin-right: 0.75rem; -} - -.mx-5 { - margin-left: 1.25rem; - margin-right: 1.25rem; -} - -.mx-auto { - margin-left: auto; - margin-right: auto; -} - -.my-10 { - margin-top: 2.5rem; - margin-bottom: 2.5rem; -} - -.my-2 { - margin-top: 0.5rem; - margin-bottom: 0.5rem; -} - -.my-3 { - margin-top: 0.75rem; - margin-bottom: 0.75rem; -} - -.my-4 { - margin-top: 1rem; - margin-bottom: 1rem; -} - -.my-5 { - margin-top: 1.25rem; - margin-bottom: 1.25rem; -} - -.mb-10 { - margin-bottom: 2.5rem; -} - -.mb-2 { - margin-bottom: 0.5rem; -} - -.mb-28 { - margin-bottom: 7rem; -} - -.mb-4 { - margin-bottom: 1rem; -} - -.mb-5 { - margin-bottom: 1.25rem; -} - -.mb-6 { - margin-bottom: 1.5rem; -} - -.mb-8 { - margin-bottom: 2rem; -} - -.mb-\[100px\] { - margin-bottom: 100px; -} - -.mb-\[60px\] { - margin-bottom: 60px; -} - -.mb-auto { - margin-bottom: auto; -} - -.ml-2 { - margin-left: 0.5rem; -} - -.mr-2 { - margin-right: 0.5rem; -} - -.mt-1 { - margin-top: 0.25rem; -} - -.mt-3 { - margin-top: 0.75rem; -} - -.mt-4 { - margin-top: 1rem; -} - -.mt-5 { - margin-top: 1.25rem; -} - -.mt-8 { - margin-top: 2rem; -} - -.mt-auto { - margin-top: auto; -} - -.block { - display: block; -} - -.flex { - display: flex; -} - -.table { - display: table; -} - -.grid { - display: grid; -} - -.contents { - display: contents; -} - -.hidden { - display: none; -} - -.h-10 { - height: 2.5rem; -} - -.h-24 { - height: 6rem; -} - -.h-4 { - height: 1rem; -} - -.h-40 { - height: 10rem; -} - -.h-5 { - height: 1.25rem; -} - -.h-8 { - height: 2rem; -} - -.h-\[100px\] { - height: 100px; -} - -.h-\[10px\] { - height: 10px; -} - -.h-\[120px\] { - height: 120px; -} - -.h-\[250px\] { - height: 250px; -} - -.h-\[2rem\] { - height: 2rem; -} - -.h-\[6rem\] { - height: 6rem; -} - -.h-\[90px\] { - height: 90px; -} - -.h-auto { - height: auto; -} - -.h-fit { - height: -moz-fit-content; - height: fit-content; -} - -.h-full { - height: 100%; -} - -.h-screen { - height: 100vh; -} - -.max-h-40 { - max-height: 10rem; -} - -.max-h-\[2rem\] { - max-height: 2rem; -} - -.min-h-10 { - min-height: 2.5rem; -} - -.min-h-screen { - min-height: 100vh; -} - -.w-1\/2 { - width: 50%; -} - -.w-10 { - width: 2.5rem; -} - -.w-24 { - width: 6rem; -} - -.w-4 { - width: 1rem; -} - -.w-40 { - width: 10rem; -} - -.w-48 { - width: 12rem; -} - -.w-5 { - width: 1.25rem; -} - -.w-64 { - width: 16rem; -} - -.w-80 { - width: 20rem; -} - -.w-\[100px\] { - width: 100px; -} - -.w-\[110px\] { - width: 110px; -} - -.w-\[120px\] { - width: 120px; -} - -.w-\[1px\] { - width: 1px; -} - -.w-\[2px\] { - width: 2px; -} - -.w-fit { - width: -moz-fit-content; - width: fit-content; -} - -.w-full { - width: 100%; -} - -.min-w-\[112px\] { - min-width: 112px; -} - -.min-w-\[44px\] { - min-width: 44px; -} - -.min-w-full { - min-width: 100%; -} - -.max-w-\[450px\] { - max-width: 450px; -} - -.max-w-screen-xl { - max-width: 1280px; -} - -.max-w-xs { - max-width: 20rem; -} - -.flex-1 { - flex: 1 1 0%; -} - -.flex-shrink-0 { - flex-shrink: 0; -} - -.grow { - flex-grow: 1; -} - -.table-auto { - table-layout: auto; -} - -.-translate-y-12 { - --tw-translate-y: -3rem; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.translate-x-2 { - --tw-translate-x: 0.5rem; - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.transform { - transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); -} - -.cursor-pointer { - cursor: pointer; -} - -.grid-cols-1 { - grid-template-columns: repeat(1, minmax(0, 1fr)); -} - -.grid-cols-2 { - grid-template-columns: repeat(2, minmax(0, 1fr)); -} - -.grid-cols-3 { - grid-template-columns: repeat(3, minmax(0, 1fr)); -} - -.grid-cols-4 { - grid-template-columns: repeat(4, minmax(0, 1fr)); -} - -.flex-row { - flex-direction: row; -} - -.flex-col { - flex-direction: column; -} - -.flex-wrap { - flex-wrap: wrap; -} - -.items-start { - align-items: flex-start; -} - -.items-center { - align-items: center; -} - -.items-baseline { - align-items: baseline; -} - -.justify-center { - justify-content: center; -} - -.justify-between { - justify-content: space-between; -} - -.justify-around { - justify-content: space-around; -} - -.justify-evenly { - justify-content: space-evenly; -} - -.justify-items-center { - justify-items: center; -} - -.gap-0 { - gap: 0px; -} - -.gap-1 { - gap: 0.25rem; -} - -.gap-2 { - gap: 0.5rem; -} - -.gap-3 { - gap: 0.75rem; -} - -.gap-5 { - gap: 1.25rem; -} - -.gap-6 { - gap: 1.5rem; -} - -.overflow-auto { - overflow: auto; -} - -.overflow-hidden { - overflow: hidden; -} - -.overflow-y-hidden { - overflow-y: hidden; -} - -.overflow-x-scroll { - overflow-x: scroll; -} - -.overflow-y-scroll { - overflow-y: scroll; -} - -.scroll-smooth { - scroll-behavior: smooth; -} - -.whitespace-nowrap { - white-space: nowrap; -} - -.text-wrap { - text-wrap: wrap; -} - -.break-words { - overflow-wrap: break-word; -} - -.break-all { - word-break: break-all; -} - -.rounded { - border-radius: 0.25rem; -} - -.rounded-box { - border-radius: var(--rounded-box, 1rem); -} - -.rounded-full { - border-radius: 9999px; -} - -.rounded-lg { - border-radius: 0.5rem; -} - -.rounded-sm { - border-radius: 0.125rem; -} - -.rounded-xl { - border-radius: 0.75rem; -} - -.rounded-l-full { - border-top-left-radius: 9999px; - border-bottom-left-radius: 9999px; -} - -.rounded-l-lg { - border-top-left-radius: 0.5rem; - border-bottom-left-radius: 0.5rem; -} - -.rounded-r-full { - border-top-right-radius: 9999px; - border-bottom-right-radius: 9999px; -} - -.rounded-r-lg { - border-top-right-radius: 0.5rem; - border-bottom-right-radius: 0.5rem; -} - -.border { - border-width: 1px; -} - -.border-0 { - border-width: 0px; -} - -.border-2 { - border-width: 2px; -} - -.border-\[6px\] { - border-width: 6px; -} - -.border-t { - border-top-width: 1px; -} - -.border-solid { - border-style: solid; -} - -.border-none { - border-style: none; -} - -.border-black { - --tw-border-opacity: 1; - border-color: rgb(0 0 0 / var(--tw-border-opacity)); -} - -.border-gray-200 { - --tw-border-opacity: 1; - border-color: rgb(229 231 235 / var(--tw-border-opacity)); -} - -.border-inherit { - border-color: inherit; -} - -.border-slate-200 { - --tw-border-opacity: 1; - border-color: rgb(226 232 240 / var(--tw-border-opacity)); -} - -.border-slate-300 { - --tw-border-opacity: 1; - border-color: rgb(203 213 225 / var(--tw-border-opacity)); -} - -.bg-\[\#F19400\] { - --tw-bg-opacity: 1; - background-color: rgb(241 148 0 / var(--tw-bg-opacity)); -} - -.bg-base-100 { - --tw-bg-opacity: 1; - background-color: var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity))); -} - -.bg-base-200 { - --tw-bg-opacity: 1; - background-color: var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity))); -} - -.bg-black { - --tw-bg-opacity: 1; - background-color: rgb(0 0 0 / var(--tw-bg-opacity)); -} - -.bg-fuchsia-700 { - --tw-bg-opacity: 1; - background-color: rgb(162 28 175 / var(--tw-bg-opacity)); -} - -.bg-gray-100 { - --tw-bg-opacity: 1; - background-color: rgb(243 244 246 / var(--tw-bg-opacity)); -} - -.bg-gray-50 { - --tw-bg-opacity: 1; - background-color: rgb(249 250 251 / var(--tw-bg-opacity)); -} - -.bg-green-400 { - --tw-bg-opacity: 1; - background-color: rgb(74 222 128 / var(--tw-bg-opacity)); -} - -.bg-green-500 { - --tw-bg-opacity: 1; - background-color: rgb(34 197 94 / var(--tw-bg-opacity)); -} - -.bg-green-600 { - --tw-bg-opacity: 1; - background-color: rgb(22 163 74 / var(--tw-bg-opacity)); -} - -.bg-orange-400 { - --tw-bg-opacity: 1; - background-color: rgb(251 146 60 / var(--tw-bg-opacity)); -} - -.bg-orange-500 { - --tw-bg-opacity: 1; - background-color: rgb(249 115 22 / var(--tw-bg-opacity)); -} - -.bg-orange-600 { - --tw-bg-opacity: 1; - background-color: rgb(234 88 12 / var(--tw-bg-opacity)); -} - -.bg-red-300 { - --tw-bg-opacity: 1; - background-color: rgb(252 165 165 / var(--tw-bg-opacity)); -} - -.bg-red-400\/20 { - background-color: rgb(248 113 113 / 0.2); -} - -.bg-red-600 { - --tw-bg-opacity: 1; - background-color: rgb(220 38 38 / var(--tw-bg-opacity)); -} - -.bg-slate-100 { - --tw-bg-opacity: 1; - background-color: rgb(241 245 249 / var(--tw-bg-opacity)); -} - -.bg-slate-200 { - --tw-bg-opacity: 1; - background-color: rgb(226 232 240 / var(--tw-bg-opacity)); -} - -.bg-slate-300 { - --tw-bg-opacity: 1; - background-color: rgb(203 213 225 / var(--tw-bg-opacity)); -} - -.bg-slate-400 { - --tw-bg-opacity: 1; - background-color: rgb(148 163 184 / var(--tw-bg-opacity)); -} - -.bg-slate-50 { - --tw-bg-opacity: 1; - background-color: rgb(248 250 252 / var(--tw-bg-opacity)); -} - -.bg-slate-500 { - --tw-bg-opacity: 1; - background-color: rgb(100 116 139 / var(--tw-bg-opacity)); -} - -.bg-slate-600 { - --tw-bg-opacity: 1; - background-color: rgb(71 85 105 / var(--tw-bg-opacity)); -} - -.bg-violet-700 { - --tw-bg-opacity: 1; - background-color: rgb(109 40 217 / var(--tw-bg-opacity)); -} - -.bg-white { - --tw-bg-opacity: 1; - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); -} - -.bg-yellow-500 { - --tw-bg-opacity: 1; - background-color: rgb(234 179 8 / var(--tw-bg-opacity)); -} - -.fill-orange-600 { - fill: #ea580c; -} - -.object-cover { - -o-object-fit: cover; - object-fit: cover; -} - -.p-0 { - padding: 0px; -} - -.p-1 { - padding: 0.25rem; -} - -.p-2 { - padding: 0.5rem; -} - -.p-2\.5 { - padding: 0.625rem; -} - -.p-3 { - padding: 0.75rem; -} - -.p-4 { - padding: 1rem; -} - -.p-5 { - padding: 1.25rem; -} - -.px-1 { - padding-left: 0.25rem; - padding-right: 0.25rem; -} - -.px-2 { - padding-left: 0.5rem; - padding-right: 0.5rem; -} - -.px-3 { - padding-left: 0.75rem; - padding-right: 0.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; -} - -.px-8 { - padding-left: 2rem; - padding-right: 2rem; -} - -.py-1 { - padding-top: 0.25rem; - padding-bottom: 0.25rem; -} - -.py-2 { - padding-top: 0.5rem; - padding-bottom: 0.5rem; -} - -.py-3 { - padding-top: 0.75rem; - padding-bottom: 0.75rem; -} - -.py-4 { - padding-top: 1rem; - padding-bottom: 1rem; -} - -.py-8 { - padding-top: 2rem; - padding-bottom: 2rem; -} - -.py-\[2px\] { - padding-top: 2px; - padding-bottom: 2px; -} - -.pb-1 { - padding-bottom: 0.25rem; -} - -.pb-2 { - padding-bottom: 0.5rem; -} - -.pb-4 { - padding-bottom: 1rem; -} - -.pl-10 { - padding-left: 2.5rem; -} - -.pl-3 { - padding-left: 0.75rem; -} - -.pl-3\.5 { - padding-left: 0.875rem; -} - -.pl-8 { - padding-left: 2rem; -} - -.pt-4 { - padding-top: 1rem; -} - -.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-top { - vertical-align: top; -} - -.text-2xl { - font-size: 1.5rem; - line-height: 2rem; -} - -.text-4xl { - font-size: 2.25rem; - line-height: 2.5rem; -} - -.text-\[10px\] { - font-size: 10px; -} - -.text-\[12px\] { - font-size: 12px; -} - -.text-\[13px\] { - font-size: 13px; -} - -.text-\[20px\] { - font-size: 20px; -} - -.text-\[9px\] { - font-size: 9px; -} - -.text-lg { - font-size: 1.125rem; - line-height: 1.75rem; -} - -.text-sm { - font-size: 0.875rem; - line-height: 1.25rem; -} - -.text-xl { - font-size: 1.25rem; - line-height: 1.75rem; -} - -.text-xs { - font-size: 0.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; -} - -.font-thin { - font-weight: 100; -} - -.uppercase { - text-transform: uppercase; -} - -.tracking-tight { - letter-spacing: -0.025em; -} - -.text-\[\#b50795\] { - --tw-text-opacity: 1; - color: rgb(181 7 149 / var(--tw-text-opacity)); -} - -.text-gray-700 { - --tw-text-opacity: 1; - color: rgb(55 65 81 / var(--tw-text-opacity)); -} - -.text-gray-900 { - --tw-text-opacity: 1; - color: rgb(17 24 39 / var(--tw-text-opacity)); -} - -.text-green-600 { - --tw-text-opacity: 1; - color: rgb(22 163 74 / var(--tw-text-opacity)); -} - -.text-green-700 { - --tw-text-opacity: 1; - color: rgb(21 128 61 / var(--tw-text-opacity)); -} - -.text-orange-400 { - --tw-text-opacity: 1; - color: rgb(251 146 60 / var(--tw-text-opacity)); -} - -.text-orange-600 { - --tw-text-opacity: 1; - color: rgb(234 88 12 / var(--tw-text-opacity)); -} - -.text-red-600 { - --tw-text-opacity: 1; - color: rgb(220 38 38 / var(--tw-text-opacity)); -} - -.text-red-700 { - --tw-text-opacity: 1; - color: rgb(185 28 28 / var(--tw-text-opacity)); -} - -.text-red-800 { - --tw-text-opacity: 1; - color: rgb(153 27 27 / 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-slate-600 { - --tw-text-opacity: 1; - color: rgb(71 85 105 / var(--tw-text-opacity)); -} - -.text-slate-900 { - --tw-text-opacity: 1; - color: rgb(15 23 42 / var(--tw-text-opacity)); -} - -.text-white { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - -.underline { - text-decoration-line: underline; -} - -.no-underline { - text-decoration-line: none; -} - -.opacity-95 { - opacity: 0.95; -} - -.shadow { - --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 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-lg { - --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 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-md { - --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); - --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px 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-sm { - --tw-shadow: 0 1px 2px 0 rgb(0 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 / 0.1), 0 8px 10px -6px rgb(0 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); -} - -/* Hide scrollbar for Chrome, Safari and Opera */ - -.no-scrollbar::-webkit-scrollbar { - display: none; -} - -/* Hide scrollbar for IE, Edge and Firefox */ - -.no-scrollbar { - -ms-overflow-style: none; - /* IE and Edge */ - scrollbar-width: none; - /* Firefox */ -} - -.hover\:bg-orange-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(234 88 12 / var(--tw-bg-opacity)); -} - -.hover\:bg-orange-700:hover { - --tw-bg-opacity: 1; - background-color: rgb(194 65 12 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-200:hover { - --tw-bg-opacity: 1; - background-color: rgb(226 232 240 / var(--tw-bg-opacity)); -} - -.hover\:bg-slate-200\/30:hover { - background-color: rgb(226 232 240 / 0.3); -} - -.hover\:text-fuchsia-700:hover { - --tw-text-opacity: 1; - color: rgb(162 28 175 / var(--tw-text-opacity)); -} - -.hover\:text-slate-900:hover { - --tw-text-opacity: 1; - color: rgb(15 23 42 / var(--tw-text-opacity)); -} - -.hover\:shadow-sm:hover { - --tw-shadow: 0 1px 2px 0 rgb(0 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); -} - -.focus\:border-blue-500:focus { - --tw-border-opacity: 1; - border-color: rgb(59 130 246 / var(--tw-border-opacity)); -} - -.focus\:ring-0: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(0px + 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-blue-300:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(147 197 253 / var(--tw-ring-opacity)); -} - -.focus\:ring-blue-500:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); -} - -@media (min-width: 640px) { - .sm\:py-16 { - padding-top: 4rem; - padding-bottom: 4rem; - } -} - -@media (min-width: 1024px) { - .lg\:px-6 { - padding-left: 1.5rem; - padding-right: 1.5rem; - } -} +*,:after,:before{--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:rgba(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:rgba(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: }/*! tailwindcss v3.4.13 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family: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,pre,samp{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,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{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}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],input:where(:not([type])),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,input:where(:not([type])):focus,select:focus,textarea:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0'/%3E%3C/svg%3E")}@media (forced-colors:active) {[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}@media (forced-colors:active) {[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=radio]:checked:focus,[type=radio]:checked:hover{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media (forced-colors:active) {[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color:oklch(0% 0 0)){:root{color-scheme:light;--fallback-p:#491eff;--fallback-pc:#d4dbff;--fallback-s:#ff41c7;--fallback-sc:#fff9fc;--fallback-a:#00cfbd;--fallback-ac:#00100d;--fallback-n:#2b3440;--fallback-nc:#d7dde4;--fallback-b1:#fff;--fallback-b2:#e5e6e6;--fallback-b3:#e5e6e6;--fallback-bc:#1f2937;--fallback-in:#00b3f0;--fallback-inc:#000;--fallback-su:#00ca92;--fallback-suc:#000;--fallback-wa:#ffc22d;--fallback-wac:#000;--fallback-er:#ff6f70;--fallback-erc:#000}@media (prefers-color-scheme:dark){:root{color-scheme:dark;--fallback-p:#7582ff;--fallback-pc:#050617;--fallback-s:#ff71cf;--fallback-sc:#190211;--fallback-a:#00c7b5;--fallback-ac:#000e0c;--fallback-n:#2a323c;--fallback-nc:#a6adbb;--fallback-b1:#1d232a;--fallback-b2:#191e24;--fallback-b3:#15191e;--fallback-bc:#a6adbb;--fallback-in:#00b3f0;--fallback-inc:#000;--fallback-su:#00ca92;--fallback-suc:#000;--fallback-wa:#ffc22d;--fallback-wac:#000;--fallback-er:#ff6f70;--fallback-erc:#000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,transparent) transparent}:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,transparent) transparent}:root{color-scheme:light;--in:72.06% 0.191 231.6;--su:64.8% 0.150 160;--wa:84.71% 0.199 83.87;--er:71.76% 0.221 22.18;--pc:89.824% 0.06192 275.75;--ac:15.352% 0.0368 183.61;--inc:0% 0 0;--suc:0% 0 0;--wac:0% 0 0;--erc:0% 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:49.12% 0.3096 275.75;--s:69.71% 0.329 342.55;--sc:98.71% 0.0106 342.55;--a:76.76% 0.184 183.61;--n:32.1785% 0.02476 255.701624;--nc:89.4994% 0.011585 252.096176;--b1:100% 0 0;--b2:96.1151% 0 0;--b3:92.4169% 0.00108 197.137559;--bc:27.8078% 0.029596 256.847952}@media (prefers-color-scheme:dark){:root{color-scheme:dark;--in:72.06% 0.191 231.6;--su:64.8% 0.150 160;--wa:84.71% 0.199 83.87;--er:71.76% 0.221 22.18;--pc:13.138% 0.0392 275.75;--sc:14.96% 0.052 342.55;--ac:14.902% 0.0334 183.61;--inc:0% 0 0;--suc:0% 0 0;--wac:0% 0 0;--erc:0% 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:65.69% 0.196 275.75;--s:74.8% 0.26 342.55;--a:74.51% 0.167 183.61;--n:31.3815% 0.021108 254.139175;--nc:74.6477% 0.0216 264.435964;--b1:25.3267% 0.015896 252.417568;--b2:23.2607% 0.013807 253.100675;--b3:21.1484% 0.01165 254.087939;--bc:74.6477% 0.0216 264.435964}}[data-theme=light]{color-scheme:light;--in:72.06% 0.191 231.6;--su:64.8% 0.150 160;--wa:84.71% 0.199 83.87;--er:71.76% 0.221 22.18;--pc:89.824% 0.06192 275.75;--ac:15.352% 0.0368 183.61;--inc:0% 0 0;--suc:0% 0 0;--wac:0% 0 0;--erc:0% 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:49.12% 0.3096 275.75;--s:69.71% 0.329 342.55;--sc:98.71% 0.0106 342.55;--a:76.76% 0.184 183.61;--n:32.1785% 0.02476 255.701624;--nc:89.4994% 0.011585 252.096176;--b1:100% 0 0;--b2:96.1151% 0 0;--b3:92.4169% 0.00108 197.137559;--bc:27.8078% 0.029596 256.847952}[data-theme=dark]{color-scheme:dark;--in:72.06% 0.191 231.6;--su:64.8% 0.150 160;--wa:84.71% 0.199 83.87;--er:71.76% 0.221 22.18;--pc:13.138% 0.0392 275.75;--sc:14.96% 0.052 342.55;--ac:14.902% 0.0334 183.61;--inc:0% 0 0;--suc:0% 0 0;--wac:0% 0 0;--erc:0% 0 0;--rounded-box:1rem;--rounded-btn:0.5rem;--rounded-badge:1.9rem;--animation-btn:0.25s;--animation-input:.2s;--btn-focus-scale:0.95;--border-btn:1px;--tab-border:1px;--tab-radius:0.5rem;--p:65.69% 0.196 275.75;--s:74.8% 0.26 342.55;--a:74.51% 0.167 183.61;--n:31.3815% 0.021108 254.139175;--nc:74.6477% 0.0216 264.435964;--b1:25.3267% 0.015896 252.417568;--b2:23.2607% 0.013807 253.100675;--b3:21.1484% 0.01165 254.087939;--bc:74.6477% 0.0216 264.435964}.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}}.alert{display:grid;width:100%;grid-auto-flow:row;align-content:flex-start;align-items:center;justify-items:center;gap:1rem;text-align:center;border-radius:var(--rounded-box,1rem);border-width:1px;--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));padding:1rem;--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--alert-bg:var(--fallback-b2,oklch(var(--b2)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1));background-color:var(--alert-bg)}@media (min-width:640px){.alert{grid-auto-flow:column;grid-template-columns:auto minmax(auto,1fr);justify-items:start;text-align:start}}.avatar.placeholder>div{display:flex;align-items:center;justify-content:center}.breadcrumbs{max-width:100%;overflow-x:auto;padding-top:.5rem;padding-bottom:.5rem}.breadcrumbs>ol,.breadcrumbs>ul{display:flex;align-items:center;white-space:nowrap;min-height:-moz-min-content;min-height:min-content}.breadcrumbs>ol>li,.breadcrumbs>ul>li{display:flex;align-items:center}.breadcrumbs>ol>li>a,.breadcrumbs>ul>li>a{display:flex;cursor:pointer;align-items:center}@media (hover:hover){.breadcrumbs>ol>li>a:hover,.breadcrumbs>ul>li>a:hover{text-decoration-line:underline}.label a:hover{--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>:not(ul,.menu-title,details,.btn).active,.menu li>:not(ul,.menu-title,details,.btn):active,.menu li>details>summary:active{--tw-bg-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.table tr.hover:hover,.table tr.hover:nth-child(2n):hover{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn,.5rem);border-color:transparent;border-color:oklch(var(--btn-color,var(--b2))/var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn,1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow:0 1px 2px 0 rgba(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);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color,var(--b2))/var(--tw-bg-opacity));--tw-bg-opacity:1;--tw-border-opacity:1}.btn-disabled,.btn:disabled,.btn[disabled]{pointer-events:none}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content:attr(aria-label);content:var(--tw-content)}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box,1rem)}.card:focus{outline:2px solid transparent;outline-offset:2px}.card-body{display:flex;flex:1 1 auto;flex-direction:column;padding:var(--padding-card,2rem);gap:.5rem}.card-body :where(p){flex-grow:1}.card figure{display:flex;align-items:center;justify-content:center}.card.image-full{display:grid}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box,1rem);--tw-bg-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;-o-object-fit:cover;object-fit:cover}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.checkbox{flex-shrink:0;--chkbg:var(--fallback-bc,oklch(var(--bc)/1));--chkfg:var(--fallback-b1,oklch(var(--b1)/1));height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-btn,.5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity:0.2}.collapse:not(td):not(tr):not(colgroup){visibility:visible}.collapse{position:relative;display:grid;overflow:hidden;grid-template-rows:auto 0fr;transition:grid-template-rows .2s;width:100%;border-radius:var(--rounded-box,1rem)}.collapse-content,.collapse-title,.collapse>input[type=checkbox],.collapse>input[type=radio]{grid-column-start:1;grid-row-start:1}.collapse>input[type=checkbox],.collapse>input[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}.collapse-open,.collapse:focus:not(.collapse-close),.collapse[open]{grid-template-rows:auto 1fr}.collapse:not(.collapse-close):has(>input[type=checkbox]:checked),.collapse:not(.collapse-close):has(>input[type=radio]:checked){grid-template-rows:auto 1fr}.collapse-open>.collapse-content,.collapse:focus:not(.collapse-close)>.collapse-content,.collapse:not(.collapse-close)>input[type=checkbox]:checked~.collapse-content,.collapse:not(.collapse-close)>input[type=radio]:checked~.collapse-content,.collapse[open]>.collapse-content{visibility:visible;min-height:-moz-fit-content;min-height:fit-content}.diff{position:relative;display:grid;width:100%;overflow:hidden;container-type:inline-size;grid-template-columns:auto 1fr}.dropdown{position:relative;display:inline-block}.dropdown>:not(summary):focus{outline:2px solid transparent;outline-offset:2px}.dropdown .dropdown-content{position:absolute}.dropdown:is(:not(details)) .dropdown-content{visibility:hidden;opacity:0;transform-origin:top;--tw-scale-x:.95;--tw-scale-y:.95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));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-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s}.dropdown.dropdown-open .dropdown-content,.dropdown:focus-within .dropdown-content,.dropdown:not(.dropdown-hover):focus .dropdown-content{visibility:visible;opacity:1}@media (hover:hover){.dropdown.dropdown-hover:hover .dropdown-content{visibility:visible;opacity:1}.btm-nav>.disabled:hover,.btm-nav>[disabled]:hover{pointer-events:none;--tw-border-opacity:0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity:0.1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity:0.2}.btn:hover{--tw-border-opacity:1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity:1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color,var(--b2))/var(--tw-bg-opacity,1)) 90%,#000);border-color:color-mix(in oklab,oklch(var(--btn-color,var(--b2))/var(--tw-border-opacity,1)) 90%,#000)}}@supports not (color:oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color,var(--fallback-b2));border-color:var(--btn-color,var(--fallback-b2))}}.btn.glass:hover{--glass-opacity:25%;--glass-border-opacity:15%}.btn-outline.btn-primary:hover{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}}.btn-outline.btn-success:hover{--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-success:hover{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000)}}.btn-outline.btn-warning:hover{--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-warning:hover{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000)}}.btn-disabled:hover,.btn:disabled:hover,.btn[disabled]:hover{--tw-border-opacity:0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity:0.2}@supports (color:color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}}.dropdown.dropdown-hover:hover .dropdown-content{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{cursor:pointer;outline:2px solid transparent;outline-offset:2px}@supports (color:oklch(0% 0 0)){:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(.active,.btn):hover,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(.active,.btn):hover{background-color:var(--fallback-bc,oklch(var(--bc)/.1))}}}.dropdown:is(details) summary::-webkit-details-marker{display:none}.footer{width:100%;grid-auto-flow:row;-moz-column-gap:1rem;column-gap:1rem;row-gap:2.5rem;font-size:.875rem;line-height:1.25rem}.footer,.footer>*{display:grid;place-items:start}.footer>*{gap:.5rem}@media (min-width:48rem){.footer{grid-auto-flow:column}.footer-center{grid-auto-flow:row dense}}.form-control{flex-direction:column}.form-control,.label{display:flex}.label{-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn,.5rem);border-width:1px;border-color:transparent;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input-md[type=number]::-webkit-inner-spin-button,.input[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.join{display:inline-flex;align-items:stretch;border-radius:var(--rounded-btn,.5rem)}.join :where(.join-item){border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:not(:first-child):not(:last-child),.join :not(:first-child):not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:first-child:not(:last-child),.join :first-child:not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0}.join .dropdown .join-item:first-child:not(:last-child),.join :first-child:not(:last-child) .dropdown .join-item{border-start-end-radius:inherit;border-end-end-radius:inherit}.join :where(.join-item:first-child:not(:last-child)),.join :where(:first-child:not(:last-child) .join-item){border-end-start-radius:inherit;border-start-start-radius:inherit}.join .join-item:last-child:not(:first-child),.join :last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0}.join :where(.join-item:last-child:not(:first-child)),.join :where(:last-child:not(:first-child) .join-item){border-start-end-radius:inherit;border-end-end-radius:inherit}@supports not selector(:has(*)){:where(.join *){border-radius:inherit}}@supports selector(:has(*)){:where(.join :has(.join-item)){border-radius:inherit}}.link{cursor:pointer;text-decoration-line:underline}.mask{-webkit-mask-size:contain;mask-size:contain;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center}.menu{display:flex;flex-direction:column;flex-wrap:wrap;font-size:.875rem;line-height:1.25rem;padding:.5rem}.menu :where(li ul){position:relative;white-space:nowrap;margin-inline-start:1rem;padding-inline-start:.5rem}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){display:grid;grid-auto-flow:column;align-content:flex-start;align-items:center;gap:.5rem;grid-auto-columns:minmax(auto,max-content) auto max-content;-webkit-user-select:none;-moz-user-select:none;user-select:none}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}.menu :where(li>.menu-dropdown:not(.menu-dropdown-show)){display:none}:where(.menu li){position:relative;display:flex;flex-shrink:0;flex-direction:column;flex-wrap:wrap;align-items:stretch}:where(.menu li) .badge{justify-self:end}.modal{pointer-events:none;position:fixed;inset:0;margin:0;display:grid;height:100%;max-height:none;width:100%;max-width:none;justify-items:center;padding:0;opacity:0;overscroll-behavior:contain;z-index:999;background-color:transparent;color:inherit;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity,visibility;overflow-y:hidden}:where(.modal){align-items:center}.modal-box{max-height:calc(100vh - 5em);grid-column-start:1;grid-row-start:1;width:91.666667%;max-width:32rem;--tw-scale-x:.9;--tw-scale-y:.9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box,1rem);border-bottom-left-radius:var(--rounded-box,1rem);border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));padding:1.5rem;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-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;box-shadow:0 25px 50px -12px rgba(0,0,0,.25);overflow-y:auto;overscroll-behavior:contain}.modal-open,.modal-toggle:checked+.modal,.modal:target,.modal[open]{pointer-events:auto;visibility:visible;opacity:1}.modal-action{display:flex;margin-top:1.5rem;justify-content:flex-end}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden;scrollbar-gutter:stable}.navbar{display:flex;align-items:center;padding:var(--navbar-padding,.5rem);min-height:4rem;width:100%}:where(.navbar>:not(script,style)){display:inline-flex;align-items:center}.radio{flex-shrink:0;--chkbg:var(--bc);height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:9999px;border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity:0.2}.rating{position:relative;display:inline-flex}.rating :where(input){cursor:pointer;border-radius:0;animation:rating-pop var(--animation-input,.25s) ease-out;height:1.5rem;width:1.5rem;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-bg-opacity:1}.select{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;min-height:3rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn,.5rem);border-width:1px;border-color:transparent;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,transparent 50%,currentColor 0),linear-gradient(135deg,currentColor 50%,transparent 0);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-size:4px 4px,4px 4px;background-repeat:no-repeat}.select[multiple]{height:auto}.stat{width:100%;grid-template-columns:repeat(1,1fr);-moz-column-gap:1rem;column-gap:1rem;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity:0.1;padding:1rem 1.5rem}.stat,.swap{display:inline-grid}.swap{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;place-content:center;cursor:pointer}.swap>*{grid-column-start:1;grid-row-start:1;transition-duration:.3s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity}.swap input{-webkit-appearance:none;-moz-appearance:none;appearance:none}.swap .swap-indeterminate,.swap .swap-on,.swap input:indeterminate~.swap-on{opacity:0}.swap input:checked~.swap-off,.swap input:indeterminate~.swap-off,.swap-active .swap-off{opacity:0}.swap input:checked~.swap-on,.swap input:indeterminate~.swap-indeterminate,.swap-active .swap-on{opacity:1}.table{position:relative;width:100%;border-radius:var(--rounded-box,1rem);text-align:left;font-size:.875rem;line-height:1.25rem}.table :where(.table-pin-rows thead tr){position:sticky;top:0;z-index:1;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-rows tfoot tr){position:sticky;bottom:0;z-index:1;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.table :where(.table-pin-cols tr th){position:sticky;left:0;right:0;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.textarea{min-height:3rem;flex-shrink:1;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn,.5rem);border-width:1px;border-color:transparent;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.timeline{position:relative;display:flex}:where(.timeline>li){position:relative;display:grid;flex-shrink:0;align-items:center;grid-template-rows:var(--timeline-row-start,minmax(0,1fr)) auto var( + --timeline-row-end,minmax(0,1fr) + );grid-template-columns:var(--timeline-col-start,minmax(0,1fr)) auto var( + --timeline-col-end,minmax(0,1fr) + )}.timeline>li>hr{width:100%;border-width:0}:where(.timeline>li>hr):first-child{grid-column-start:1;grid-row-start:2}:where(.timeline>li>hr):last-child{grid-column-start:3;grid-column-end:none;grid-row-start:2;grid-row-end:auto}.toggle{flex-shrink:0;--tglbg:var(--fallback-b1,oklch(var(--b1)/1));--handleoffset:1.5rem;--handleoffsetcalculator:calc(var(--handleoffset)*-1);--togglehandleborder:0 0;height:1.5rem;width:3rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-badge,1.9rem);border-width:1px;border-color:currentColor;background-color:currentColor;color:var(--fallback-bc,oklch(var(--bc)/.5));transition:background,box-shadow var(--animation-input,.2s) ease-out;box-shadow:var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset,var(--togglehandleborder)}.alert-info{border-color:var(--fallback-in,oklch(var(--in)/.2));--tw-text-opacity:1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)));--alert-bg:var(--fallback-in,oklch(var(--in)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1))}.alert-success{border-color:var(--fallback-su,oklch(var(--su)/.2));--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)));--alert-bg:var(--fallback-su,oklch(var(--su)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1))}.alert-warning{border-color:var(--fallback-wa,oklch(var(--wa)/.2));--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)));--alert-bg:var(--fallback-wa,oklch(var(--wa)/1));--alert-bg-mix:var(--fallback-b1,oklch(var(--b1)/1))}.btm-nav>:where(.active){border-top-width:2px;--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.btm-nav>.disabled,.btm-nav>[disabled]{pointer-events:none;--tw-border-opacity:0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity:0.1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity:0.2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}.breadcrumbs>ol>li>a:focus,.breadcrumbs>ul>li>a:focus{outline:2px solid transparent;outline-offset:2px}.breadcrumbs>ol>li>a:focus-visible,.breadcrumbs>ul>li>a:focus-visible{outline:2px solid currentColor;outline-offset:2px}.breadcrumbs>ol>li+:before,.breadcrumbs>ul>li+:before{content:"";margin-left:.5rem;margin-right:.75rem;display:block;height:.375rem;width:.375rem;--tw-rotate:45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));opacity:.4;border-top:1px solid;border-right:1px solid;background-color:transparent}[dir=rtl] .breadcrumbs>ol>li+:before,[dir=rtl] .breadcrumbs>ul>li+:before{--tw-rotate:-135deg}@media (prefers-reduced-motion:no-preference){.btn{animation:button-pop var(--animation-btn,.25s) ease-out}}.btn:active:focus,.btn:active:hover{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale,.97))}@supports not (color:oklch(0% 0 0)){.btn{background-color:var(--btn-color,var(--fallback-b2));border-color:var(--btn-color,var(--fallback-b2))}.btn-primary{--btn-color:var(--fallback-p)}.btn-neutral{--btn-color:var(--fallback-n)}.btn-success{--btn-color:var(--fallback-su)}.btn-warning{--btn-color:var(--fallback-wa)}}@supports (color:color-mix(in oklab,black,black)){.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,#000)}.btn-outline.btn-success.btn-active{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,#000)}.btn-outline.btn-warning.btn-active{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,#000)}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color:oklch(0% 0 0)){.btn-primary{--btn-color:var(--p)}.btn-neutral{--btn-color:var(--n)}.btn-success{--btn-color:var(--su)}.btn-warning{--btn-color:var(--wa)}}.btn-neutral{--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));outline-color:var(--fallback-n,oklch(var(--n)/1))}.btn-success{--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)));outline-color:var(--fallback-su,oklch(var(--su)/1))}.btn-warning{--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)));outline-color:var(--fallback-wa,oklch(var(--wa)/1))}.btn.glass{--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);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity:25%;--glass-border-opacity:15%}.btn-outline.btn-primary{--tw-text-opacity:1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-success{--tw-text-opacity:1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.btn-outline.btn-success.btn-active{--tw-text-opacity:1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.btn-outline.btn-warning{--tw-text-opacity:1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.btn-outline.btn-warning.btn-active{--tw-text-opacity:1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn:disabled,.btn[disabled]{--tw-border-opacity:0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity:0.2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity:0.2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity:1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity:1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale,.98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{border-width:1px;--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-title{display:flex;align-items:center;gap:.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:600}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.checkbox:disabled{border-width:0;cursor:not-allowed;border-color:transparent;--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.2}.checkbox:checked,.checkbox[aria-checked=true]{background-repeat:no-repeat;animation:checkmark var(--animation-input,.2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,transparent 65%,var(--chkbg) 65.99%),linear-gradient(45deg,transparent 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,transparent 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,transparent 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%)}.checkbox:indeterminate{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-repeat:no-repeat;animation:checkmark var(--animation-input,.2s) ease-out;background-image:linear-gradient(90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(-90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%)}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}details.collapse{width:100%}details.collapse summary{position:relative;display:block;outline:2px solid transparent;outline-offset:2px}details.collapse summary::-webkit-details-marker{display:none}.collapse:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.collapse:has(.collapse-title:focus-visible),.collapse:has(>input[type=checkbox]:focus-visible),.collapse:has(>input[type=radio]:focus-visible){outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.collapse:not(.collapse-open):not(.collapse-close)>.collapse-title,.collapse:not(.collapse-open):not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-open):not(.collapse-close)>input[type=radio]:not(:checked){cursor:pointer}.collapse:focus:not(.collapse-open):not(.collapse-close):not(.collapse[open])>.collapse-title{cursor:unset}:where(.collapse>input[type=checkbox]),:where(.collapse>input[type=radio]){z-index:1}.collapse-title,:where(.collapse>input[type=checkbox]),:where(.collapse>input[type=radio]){width:100%;padding:1rem;padding-inline-end:3rem;min-height:3.75rem;transition:background-color .2s ease-out}.collapse-open>:where(.collapse-content),.collapse:focus:not(.collapse-close)>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input[type=checkbox]:checked~.collapse-content),.collapse:not(.collapse-close)>:where(input[type=radio]:checked~.collapse-content),.collapse[open]>:where(.collapse-content){padding-bottom:1rem;transition:padding .2s ease-out,background-color .2s ease-out}.collapse-arrow:focus:not(.collapse-close)>.collapse-title:after,.collapse-arrow:not(.collapse-close)>input[type=checkbox]:checked~.collapse-title:after,.collapse-arrow:not(.collapse-close)>input[type=radio]:checked~.collapse-title:after,.collapse-open.collapse-arrow>.collapse-title:after,.collapse[open].collapse-arrow>.collapse-title:after{--tw-translate-y:-50%;--tw-rotate:225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.collapse-open.collapse-plus>.collapse-title:after,.collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse-plus:not(.collapse-close)>input[type=checkbox]:checked~.collapse-title:after,.collapse-plus:not(.collapse-close)>input[type=radio]:checked~.collapse-title:after,.collapse[open].collapse-plus>.collapse-title:after{content:"−"}.dropdown.dropdown-open .dropdown-content,.dropdown:focus .dropdown-content,.dropdown:focus-within .dropdown-content{--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.input input{--tw-bg-opacity:1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:transparent}.input input:focus{outline:2px solid transparent;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:focus,.input:focus-within{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input-primary{--tw-border-opacity:1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)))}.input-primary:focus,.input-primary:focus-within{--tw-border-opacity:1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}.input-disabled,.input:disabled,.input:has(>input[disabled]),.input[disabled]{cursor:not-allowed;--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input-disabled::-moz-placeholder,.input:disabled::-moz-placeholder,.input:has(>input[disabled])::-moz-placeholder,.input[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.input-disabled::placeholder,.input:disabled::placeholder,.input:has(>input[disabled])::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join>:where(:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn)*-1)}.link:focus{outline:2px solid transparent;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.mask-star-2{-webkit-mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='192' height='180'%3E%3Cpath fill-rule='evenodd' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z'/%3E%3C/svg%3E");mask-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='192' height='180'%3E%3Cpath fill-rule='evenodd' d='m96 153.044-58.779 26.243 7.02-63.513L.894 68.481l63.117-13.01L96 0l31.989 55.472 63.117 13.01-43.347 47.292 7.02 63.513z'/%3E%3C/svg%3E")}:where(.menu li:empty){--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.1;margin:.5rem 1rem;height:1px}.menu :where(li ul):before{position:absolute;bottom:.75rem;inset-inline-start:0;top:.75rem;width:1px;--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.1;content:""}.menu :where(li:not(.menu-title)>:not(ul,details,.menu-title,.btn)),.menu :where(li:not(.menu-title)>details>summary:not(.menu-title)){border-radius:var(--rounded-btn,.5rem);padding:.5rem 1rem;text-align:start;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-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;text-wrap:balance}:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>:not(ul,details,.menu-title)):not(summary,.active,.btn):focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):is(summary):not(.active,.btn):focus-visible,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn).focus,:where(.menu li:not(.menu-title,.disabled)>details>summary:not(.menu-title)):not(summary,.active,.btn):focus{cursor:pointer;background-color:var(--fallback-bc,oklch(var(--bc)/.1));--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));outline:2px solid transparent;outline-offset:2px}.menu li>:not(ul,.menu-title,details,.btn).active,.menu li>:not(ul,.menu-title,details,.btn):active,.menu li>details>summary:active{--tw-bg-opacity:1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity:1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.menu :where(li>details>summary)::-webkit-details-marker{display:none}.menu :where(li>.menu-dropdown-toggle):after,.menu :where(li>details>summary):after{justify-self:end;display:block;margin-top:-.5rem;height:.5rem;width:.5rem;transform:rotate(45deg);transition-property:transform,margin-top;transition-duration:.3s;transition-timing-function:cubic-bezier(.4,0,.2,1);content:"";transform-origin:75% 75%;box-shadow:2px 2px;pointer-events:none}.menu :where(li>.menu-dropdown-toggle.menu-dropdown-show):after,.menu :where(li>details[open]>summary):after{transform:rotate(225deg);margin-top:0}.mockup-phone .display{overflow:hidden;border-radius:40px;margin-top:-25px}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{left:.5rem;aspect-ratio:1/1;height:.75rem;--tw-translate-y:-50%;border-radius:9999px;border-width:2px;border-color:currentColor}.mockup-browser .mockup-browser-toolbar .input:after,.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;top:50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{left:1.25rem;height:.5rem;--tw-translate-y:25%;--tw-rotate:-45deg;border-radius:9999px;border-width:1px;border-color:currentColor}.modal::backdrop,.modal:not(dialog:not(.modal-open)){background-color:#0006;animation:modal-pop .2s ease-out}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y:0px;--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.modal-action>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem*var(--tw-space-x-reverse));margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)))}@keyframes modal-pop{0%{opacity:0}}@keyframes progress-loading{50%{background-position-x:-115%}}.radio:focus{box-shadow:none}.radio:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.radio:checked,.radio[aria-checked=true]{--tw-bg-opacity:1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-image:none;animation:radiomark var(--animation-input,.2s) ease-out;box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}.radio:disabled{cursor:not-allowed;opacity:.2}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}.rating input{-moz-appearance:none;appearance:none;-webkit-appearance:none}.rating .rating-hidden{width:.5rem;background-color:transparent}.rating input[type=radio]:checked{background-image:none}.rating input:checked~input,.rating input[aria-checked=true]~input{--tw-bg-opacity:0.2}.rating input:focus-visible{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.3s;transform:translateY(-.125em)}.rating input:active:focus{animation:none;transform:translateY(-.125em)}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select-disabled,.select:disabled,.select[disabled]{cursor:not-allowed;--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.select-disabled::-moz-placeholder,.select:disabled::-moz-placeholder,.select[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:12px calc(1px + 50%),16px calc(1px + 50%)}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}.table:where([dir=rtl],[dir=rtl] *){text-align:right}.table :where(th,td){padding:.75rem 1rem;vertical-align:middle}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.active,.table-zebra tr.active:nth-child(2n),.table-zebra-zebra tbody tr:nth-child(2n){--tw-bg-opacity:1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}.table :where(thead tr,tbody tr:not(:last-child),tbody tr:first-child:last-child){border-bottom-width:1px;--tw-border-opacity:1;border-bottom-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.table :where(thead,tfoot){white-space:nowrap;font-size:.75rem;line-height:1rem;font-weight:700;color:var(--fallback-bc,oklch(var(--bc)/.6))}.table :where(tfoot){border-top-width:1px;--tw-border-opacity:1;border-top-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.textarea:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.textarea-disabled,.textarea:disabled,.textarea[disabled]{cursor:not-allowed;--tw-border-opacity:1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.textarea-disabled::-moz-placeholder,.textarea:disabled::-moz-placeholder,.textarea[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.textarea-disabled::placeholder,.textarea:disabled::placeholder,.textarea[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity:0.2}.timeline hr{height:.25rem}:where(.timeline hr){--tw-bg-opacity:1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}:where(.timeline:has(.timeline-middle) hr):first-child{border-start-end-radius:var(--rounded-badge,1.9rem);border-end-end-radius:var(--rounded-badge,1.9rem);border-start-start-radius:0;border-end-start-radius:0}:where(.timeline:has(.timeline-middle) hr):last-child{border-start-start-radius:var(--rounded-badge,1.9rem);border-end-start-radius:var(--rounded-badge,1.9rem);border-start-end-radius:0;border-end-end-radius:0}:where(.timeline:not(:has(.timeline-middle)) :first-child hr:last-child){border-start-start-radius:var(--rounded-badge,1.9rem);border-end-start-radius:var(--rounded-badge,1.9rem);border-start-end-radius:0;border-end-end-radius:0}:where(.timeline:not(:has(.timeline-middle)) :last-child hr:first-child){border-start-end-radius:var(--rounded-badge,1.9rem);border-end-end-radius:var(--rounded-badge,1.9rem);border-start-start-radius:0;border-end-start-radius:0}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}[dir=rtl] .toggle{--handleoffsetcalculator:calc(var(--handleoffset)*1)}.toggle:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.toggle:hover{background-color:currentColor}.toggle:checked,.toggle[aria-checked=true]{background-image:none;--handleoffsetcalculator:var(--handleoffset);--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}[dir=rtl] .toggle:checked,[dir=rtl] .toggle[aria-checked=true]{--handleoffsetcalculator:calc(var(--handleoffset)*-1)}.toggle:indeterminate{--tw-text-opacity:1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));box-shadow:calc(var(--handleoffset)/2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset)/-2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}[dir=rtl] .toggle:indeterminate{box-shadow:calc(var(--handleoffset)/2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset)/-2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}.toggle:disabled{cursor:not-allowed;--tw-border-opacity:1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));background-color:transparent;opacity:.3;--togglehandleborder:0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset,var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset}.btm-nav-xs>:where(.active){border-top-width:1px}.btm-nav-sm>:where(.active){border-top-width:2px}.btm-nav-md>:where(.active){border-top-width:2px}.btm-nav-lg>:where(.active){border-top-width:4px}.btn-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:.5rem;font-size:.75rem}.btn-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem}.btn-block{width:100%}.btn-square:where(.btn-xs){height:1.5rem;width:1.5rem;padding:0}.btn-square:where(.btn-sm){height:2rem;width:2rem;padding:0}.btn-circle:where(.btn-xs){height:1.5rem;width:1.5rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-sm){height:2rem;width:2rem;border-radius:9999px;padding:0}.join.join-vertical{flex-direction:column}.join.join-vertical .join-item:first-child:not(:last-child),.join.join-vertical :first-child:not(:last-child) .join-item{border-end-start-radius:0;border-end-end-radius:0;border-start-start-radius:inherit;border-start-end-radius:inherit}.join.join-vertical .join-item:last-child:not(:first-child),.join.join-vertical :last-child:not(:first-child) .join-item{border-start-start-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-end-end-radius:inherit}.join.join-horizontal{flex-direction:row}.join.join-horizontal .join-item:first-child:not(:last-child),.join.join-horizontal :first-child:not(:last-child) .join-item{border-end-end-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-start-start-radius:inherit}.join.join-horizontal .join-item:last-child:not(:first-child),.join.join-horizontal :last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0;border-end-end-radius:inherit;border-start-end-radius:inherit}.modal-bottom{place-items:end}.avatar.online:before{background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)))}.avatar.offline:before,.avatar.online:before{content:"";position:absolute;z-index:10;display:block;border-radius:9999px;--tw-bg-opacity:1;outline-style:solid;outline-width:2px;outline-color:var(--fallback-b1,oklch(var(--b1)/1));width:15%;height:15%;top:7%;right:7%}.avatar.offline:before{background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}.card-compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-compact .card-title{margin-bottom:.25rem}.card-normal .card-body{padding:var(--padding-card,2rem);font-size:1rem;line-height:1.5rem}.card-normal .card-title{margin-bottom:.75rem}.join.join-vertical>:where(:not(:first-child)){margin-left:0;margin-right:0;margin-top:-1px}.join.join-vertical>:where(:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn)*-1)}.join.join-horizontal>:where(:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join.join-horizontal>:where(:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn)*-1)}.modal-top :where(.modal-box){width:100%;max-width:none;--tw-translate-y:-2.5rem;--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box,1rem);border-bottom-left-radius:var(--rounded-box,1rem);border-top-left-radius:0;border-top-right-radius:0}.modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y:0px;--tw-scale-x:.9;--tw-scale-y:.9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);border-bottom-right-radius:var(--rounded-box,1rem);border-bottom-left-radius:var(--rounded-box,1rem)}.modal-bottom :where(.modal-box){width:100%;max-width:none;--tw-translate-y:2.5rem;--tw-scale-x:1;--tw-scale-y:1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box,1rem);border-top-right-radius:var(--rounded-box,1rem);border-bottom-right-radius:0;border-bottom-left-radius:0}.table-sm :not(thead):not(tfoot) tr{font-size:.875rem;line-height:1.25rem}.table-sm :where(th,td){padding:.5rem .75rem}.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}.collapse{visibility:collapse}.static{position:static}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.top-0{top:0}.top-\[78px\]{top:78px}.z-50{z-index:50}.z-\[99999\]{z-index:99999}.col-auto{grid-column:auto}.float-right{float:right}.m-0{margin:0}.m-2{margin:.5rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-28{margin-bottom:7rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-\[100px\]{margin-bottom:100px}.mb-\[60px\]{margin-bottom:60px}.mb-auto{margin-bottom:auto}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-auto{margin-left:auto}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-10{height:2.5rem}.h-24{height:6rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-\[100px\]{height:100px}.h-\[10px\]{height:10px}.h-\[120px\]{height:120px}.h-\[250px\]{height:250px}.h-\[2rem\]{height:2rem}.h-\[6rem\]{height:6rem}.h-\[90px\]{height:90px}.h-auto{height:auto}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:10rem}.max-h-\[2rem\]{max-height:2rem}.min-h-10{min-height:2.5rem}.min-h-screen{min-height:100vh}.w-1\/2{width:50%}.w-10{width:2.5rem}.w-24{width:6rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-64{width:16rem}.w-80{width:20rem}.w-\[100px\]{width:100px}.w-\[110px\]{width:110px}.w-\[120px\]{width:120px}.w-\[1px\]{width:1px}.w-\[2px\]{width:2px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.min-w-\[112px\]{min-width:112px}.min-w-\[44px\]{min-width:44px}.min-w-full{min-width:100%}.max-w-\[450px\]{max-width:450px}.max-w-screen-xl{max-width:1280px}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.grow{flex-grow:1}.table-auto{table-layout:auto}.-translate-y-12{--tw-translate-y:-3rem}.-translate-y-12,.translate-x-2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-2{--tw-translate-x:0.5rem}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.justify-items-center{justify-items:center}.gap-0{gap:0}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.scroll-smooth{scroll-behavior:smooth}.whitespace-nowrap{white-space:nowrap}.text-wrap{text-wrap:wrap}.text-nowrap{text-wrap:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-box{border-radius:var(--rounded-box,1rem)}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-\[6px\]{border-width:6px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-none{border-style:none}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgb(229 231 235/var(--tw-border-opacity))}.border-inherit{border-color:inherit}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.bg-\[\#F19400\]{--tw-bg-opacity:1;background-color:rgb(241 148 0/var(--tw-bg-opacity))}.bg-base-100{--tw-bg-opacity:1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.bg-base-200{--tw-bg-opacity:1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.bg-fuchsia-700{--tw-bg-opacity:1;background-color:rgb(162 28 175/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity))}.bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.bg-green-600{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity))}.bg-info{--tw-bg-opacity:1;background-color:var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity)))}.bg-orange-400{--tw-bg-opacity:1;background-color:rgb(251 146 60/var(--tw-bg-opacity))}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity))}.bg-orange-600{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity))}.bg-red-400\/20{background-color:hsla(0,91%,71%,.2)}.bg-red-600{--tw-bg-opacity:1;background-color:rgb(220 38 38/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-300{--tw-bg-opacity:1;background-color:rgb(203 213 225/var(--tw-bg-opacity))}.bg-slate-400{--tw-bg-opacity:1;background-color:rgb(148 163 184/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-slate-500{--tw-bg-opacity:1;background-color:rgb(100 116 139/var(--tw-bg-opacity))}.bg-slate-600{--tw-bg-opacity:1;background-color:rgb(71 85 105/var(--tw-bg-opacity))}.bg-success{--tw-bg-opacity:1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)))}.bg-violet-700{--tw-bg-opacity:1;background-color:rgb(109 40 217/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.fill-orange-600{fill:#ea580c}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.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}.px-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.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-8{padding-top:2rem;padding-bottom:2rem}.py-\[2px\]{padding-top:2px;padding-bottom:2px}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-8{padding-bottom:2rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pl-3\.5{padding-left:.875rem}.pl-8{padding-left:2rem}.pr-3{padding-right:.75rem}.pt-4{padding-top:1rem}.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-top{vertical-align:top}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[20px\]{font-size:20px}.text-\[9px\]{font-size:9px}.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}.font-thin{font-weight:100}.uppercase{text-transform:uppercase}.tracking-tight{letter-spacing:-.025em}.text-\[\#b50795\]{--tw-text-opacity:1;color:rgb(181 7 149/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity))}.text-orange-400{--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity))}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/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-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-success{--tw-text-opacity:1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.opacity-95{opacity:.95}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{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 rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.shadow-md,.shadow-sm{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 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(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)}.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)}.no-scrollbar::-webkit-scrollbar{display:none}.no-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.hover\:bg-orange-600:hover{--tw-bg-opacity:1;background-color:rgb(234 88 12/var(--tw-bg-opacity))}.hover\:bg-orange-700:hover{--tw-bg-opacity:1;background-color:rgb(194 65 12/var(--tw-bg-opacity))}.hover\:bg-slate-200:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.hover\:bg-slate-200\/30:hover{background-color:rgba(226,232,240,.3)}.hover\:text-fuchsia-700:hover{--tw-text-opacity:1;color:rgb(162 28 175/var(--tw-text-opacity))}.hover\:text-slate-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.hover\:shadow-sm:hover{--tw-shadow:0 1px 2px 0 rgba(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)}.focus\:border-blue-500:focus{--tw-border-opacity:1;border-color:rgb(59 130 246/var(--tw-border-opacity))}.focus\:ring-0: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(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-blue-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(147 197 253/var(--tw-ring-opacity))}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}@media (min-width:640px){.sm\:py-16{padding-top:4rem;padding-bottom:4rem}}@media (min-width:1024px){.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}} \ No newline at end of file diff --git a/theme/static_src/package-lock.json b/theme/static_src/package-lock.json index 224fbe5..1186377 100644 --- a/theme/static_src/package-lock.json +++ b/theme/static_src/package-lock.json @@ -38,9 +38,9 @@ } }, "node_modules/@iconify/tailwind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@iconify/tailwind/-/tailwind-1.1.2.tgz", - "integrity": "sha512-ZgToKxxd7zF5T9NXPnY9APRF06ZjFF21H/bINzcbKTdeJzLrNLIoVaoePIUbWVQ2HAac5cAYEHPZO8ILSUe3bQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@iconify/tailwind/-/tailwind-1.1.3.tgz", + "integrity": "sha512-SfyeT+2b/aKWA6DjwdevXdLUqaEqJ5xWTegD92KItaWc47IYsGuqrt/GOz4dJCPcTVCrsUjlvMpy8cNd+uV5nQ==", "dev": true, "license": "MIT", "dependencies": { @@ -188,16 +188,16 @@ } }, "node_modules/@tailwindcss/forms": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.7.tgz", - "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.9.tgz", + "integrity": "sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==", "dev": true, "license": "MIT", "dependencies": { "mini-svg-data-uri": "^1.2.3" }, "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20" } }, "node_modules/@tailwindcss/line-clamp": { @@ -211,9 +211,9 @@ } }, "node_modules/@tailwindcss/typography": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.13.tgz", - "integrity": "sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==", + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.15.tgz", + "integrity": "sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==", "dev": true, "license": "MIT", "dependencies": { @@ -223,13 +223,13 @@ "postcss-selector-parser": "6.0.10" }, "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders" + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20" } }, "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -578,9 +578,9 @@ } }, "node_modules/foreground-child": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", - "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "license": "ISC", "dependencies": { @@ -680,9 +680,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -827,9 +827,9 @@ } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -938,9 +938,9 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, "license": "BlueOak-1.0.0" }, @@ -979,9 +979,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true, "license": "ISC" }, @@ -1019,9 +1019,9 @@ } }, "node_modules/postcss": { - "version": "8.4.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", - "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", "dev": true, "funding": [ { @@ -1040,8 +1040,8 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -1161,9 +1161,9 @@ } }, "node_modules/postcss-nested/node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", "dependencies": { @@ -1286,9 +1286,9 @@ } }, "node_modules/rimraf": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.9.tgz", - "integrity": "sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", "dev": true, "license": "ISC", "dependencies": { @@ -1297,9 +1297,6 @@ "bin": { "rimraf": "dist/esm/bin.mjs" }, - "engines": { - "node": "14 >=14.20 || 16 >=16.20 || >=18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -1365,9 +1362,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -1515,9 +1512,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.6.tgz", - "integrity": "sha512-1uRHzPB+Vzu57ocybfZ4jh5Q3SdlH7XW23J5sQoM9LhE9eIOlzxer/3XPSsycvih3rboRsvt0QCmzSrqyOYUIA==", + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.13.tgz", + "integrity": "sha512-KqjHOJKogOUt5Bs752ykCeiwvi0fKVkr5oqsFNt/8px/tA8scFPIlkygsf6jXrfCqGHz7VflA6+yytWuM+XhFw==", "dev": true, "license": "MIT", "dependencies": { @@ -1553,9 +1550,9 @@ } }, "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", - "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dev": true, "license": "MIT", "dependencies": { @@ -1731,9 +1728,9 @@ } }, "node_modules/yaml": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", - "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", "dev": true, "license": "ISC", "bin": { diff --git a/transaction/__init__.py b/transaction/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/transaction/admin.py b/transaction/admin.py new file mode 100644 index 0000000..b97a94f --- /dev/null +++ b/transaction/admin.py @@ -0,0 +1,2 @@ + +# Register your models here. diff --git a/transaction/apps.py b/transaction/apps.py new file mode 100644 index 0000000..55b277b --- /dev/null +++ b/transaction/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class TransactionConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "transaction" diff --git a/transaction/models.py b/transaction/models.py new file mode 100644 index 0000000..3086e06 --- /dev/null +++ b/transaction/models.py @@ -0,0 +1,210 @@ +import uuid + +from django.db import models +from django.utils import timezone + +from master.models.country import Country +from master.models.distric import Distric +from master.models.expedisi import Expedisi +from master.models.provinsi import Provinsi +from master.models.regency import Regency +from master.models.village import Village +from produk.models import Produk +from profiles.models import LangSupport, UserProfile +from store.models import UserStore + +TYPE = [ + (1, "Domestic"), + (2, "Overseas"), +] + + +class TransactionUser(models.Model): + user = models.ForeignKey(UserProfile, null=True, on_delete=models.SET_NULL) + first_name = models.CharField(max_length=255, blank=True, null=True) + last_name = models.CharField(max_length=255, blank=True, null=True) + image_profile = models.ImageField(upload_to="transaction_profile_img/", blank=True, null=True) + email = models.EmailField(blank=True, null=True) + wallet = models.CharField(max_length=255, null=True, blank=True) + no_telepon = models.CharField(max_length=255, null=True, blank=True) + nama = models.CharField(max_length=255, blank=True, null=True) + language = models.CharField(max_length=4, blank=True, null=True, default="ID") + languages = models.ForeignKey(LangSupport, blank=True, null=True, on_delete=models.SET_NULL) + typeuser = models.IntegerField(choices=TYPE, default=1) + coin = models.FloatField(default=0) + fcm_token = models.TextField(null=True, blank=True) + + +class Cart(models.Model): + STATUS = [(1, "Pending"), (2, "Diproses"), (3, "Selesai"), (4, "Confirm")] + STATUS_TOKO = [(1, "Pending"), (2, "Diproses"), (3, "Dikirim"), (4, "Confirm")] + + kode = models.CharField(max_length=50, null=True, blank=True) + user = models.ForeignKey(TransactionUser, on_delete=models.CASCADE, related_name="cart_user") + status = models.IntegerField(default=1, choices=STATUS) + tanggal_dikirim = models.DateTimeField(null=True, blank=True) + tanggal_selesai = models.DateTimeField(null=True, blank=True) + status_pembayaran = models.IntegerField(default=1, choices=STATUS) + status_toko = models.IntegerField(default=0, choices=STATUS_TOKO, blank=True, null=True) + nomor_resi = models.CharField(blank=True, null=True, max_length=255) + catatan = models.TextField(blank=True, null=True, max_length=255) + expedisi = models.ForeignKey( + Expedisi, blank=True, null=True, on_delete=models.CASCADE, related_name="cart_expedisi" + ) + tanggal = models.DateTimeField(auto_created=True, blank=True, null=True) + + def __str__(self): + return self.kode + + @property + def ulasans(self): + ulasan = UlasanCart.objects.filter(cart_id=self.id).first() + return ulasan + + def save(self, *args, **kwargs): + if not self.kode: + self.kode = uuid.uuid4().hex.upper()[0:6] + return super().save(*args, **kwargs) + + +class CartProdukKategori(models.Model): + kode = models.CharField(unique=True, max_length=255) + icon = models.FileField(upload_to="icon_kategori") + nama = models.CharField(blank=False, null=False, max_length=255) + + def __str__(self) -> str: + return self.kode + + +class CartProdukTipe(models.Model): + nama = models.CharField(blank=True, null=True, max_length=255) + + def __str__(self) -> str: + return self.nama + + +class CartProdukWarna(models.Model): + nama = models.CharField(blank=True, null=True, max_length=255) + + def __str__(self): + return self.nama + + +class TransactionUserStore(models.Model): + users = models.ForeignKey(TransactionUser, on_delete=models.CASCADE, related_name="transaction_user_store") + nama = models.TextField(null=False, blank=False) + coin = models.FloatField(default=0) + deskripsi = models.TextField(null=True, blank=True) + alamat = models.TextField(null=True, blank=True) + email = models.EmailField(blank=True, null=True) + telpon = models.CharField(max_length=40, blank=True, null=True) + is_active_store = models.BooleanField(default=False) + aggrement = models.BooleanField(default=False) + + def __str__(self) -> str: + return self.nama or "-" + + +class CartProduk(models.Model): + store = models.ForeignKey(TransactionUserStore, on_delete=models.CASCADE) + + nama = models.TextField(null=True, blank=True) + harga = models.FloatField(null=True, blank=True) + kategori = models.ManyToManyField(CartProdukKategori) + detail = models.TextField(null=True, blank=True) + + tipe = models.ForeignKey(CartProdukTipe, blank=True, null=True, on_delete=models.CASCADE) + warna = models.ManyToManyField(CartProdukWarna, blank=True, related_name="cart_produk_warna") + stok_produk = models.IntegerField(default=0) + is_active = models.BooleanField(default=True) + stok = models.IntegerField(default=0) + is_promo = models.IntegerField(default=False) + + negara = models.ForeignKey( + Country, blank=True, null=True, on_delete=models.CASCADE, related_name="cart_produk_negara" + ) + descriptis_langs = models.JSONField(null=True) + + is_archive = models.BooleanField(default=False) + + berat = models.FloatField(default=0) + lebar = models.FloatField(default=0) + + slug = models.TextField(blank=True, null=True) + created_at = models.DateTimeField(auto_now=True) + cross_boarder = models.BooleanField(default=False) + + def __str__(self) -> str: + return self.nama + + +class CartItem(models.Model): + TYPE = [ + (1, "Domestic"), + (2, "Overseas"), + ] + wallet = models.CharField(max_length=255, null=True, blank=True) + no_telepon = models.CharField(max_length=255, null=True, blank=True) + nama = models.CharField(max_length=255, blank=True, null=True) + language = models.CharField(max_length=4, blank=True, null=True, default="ID") + typeuser = models.IntegerField(choices=TYPE, default=1) + token = models.TextField(blank=True, null=True) + + def __str__(self): + return str(self.id) + + +class UlasanCart(models.Model): + cart = models.ForeignKey(Cart, blank=True, on_delete=models.CASCADE) + produkitem = models.ForeignKey( + Produk, blank=True, null=True, on_delete=models.CASCADE, related_name="ulasan_produk" + ) + pengiriman = models.FloatField(default=0) + produk = models.FloatField(default=0) + catatan = models.TextField(null=True, blank=True) + created_at = models.DateTimeField(default=timezone.now) + + def __str__(self): + return self.catatan + + +class AddressUserChart(models.Model): + TYPE = [ + (1, "Domestic"), + (2, "Overseas"), + ] + userprofile = models.ForeignKey(CartItem, on_delete=models.CASCADE, null=True, blank=True) + typeaddress = models.IntegerField(choices=TYPE, default=1) + + name = models.CharField(max_length=255) + address = models.TextField() + zipcode = models.CharField(max_length=255, default="-") + is_primary = models.BooleanField(default=False) + + province = models.ForeignKey(Provinsi, on_delete=models.CASCADE, null=True) + regency = models.ForeignKey(Regency, on_delete=models.CASCADE, null=True) + distric = models.ForeignKey(Distric, on_delete=models.CASCADE, null=True) + village = models.ForeignKey(Village, on_delete=models.CASCADE, null=True) + rt = models.CharField(max_length=5, blank=True, null=True) + rw = models.CharField(max_length=5, blank=True, null=True) + + def __str__(self): + return self.address + + +class ReportImage(models.Model): + image = models.ImageField(blank=False, null=False) + + def __str__(self): + return str(self.id) + + +class Report(models.Model): + user = models.ForeignKey(UserProfile, on_delete=models.CASCADE) + vendor = models.ForeignKey(UserStore, on_delete=models.CASCADE) + cart_item = models.ForeignKey(CartItem, on_delete=models.CASCADE) + # image = models.ManyToManyField(ReportImage) + catatan = models.TextField(blank=False, null=False) + + def __str__(self): + return self.user diff --git a/transaction/tests.py b/transaction/tests.py new file mode 100644 index 0000000..4929020 --- /dev/null +++ b/transaction/tests.py @@ -0,0 +1,2 @@ + +# Create your tests here. diff --git a/transaction/views.py b/transaction/views.py new file mode 100644 index 0000000..b8e4ee0 --- /dev/null +++ b/transaction/views.py @@ -0,0 +1,2 @@ + +# Create your views here.