From 78f03e139f913640e13d061d6662495e0a45340f Mon Sep 17 00:00:00 2001 From: Pablo Moreno Date: Fri, 20 Mar 2026 10:26:24 +0100 Subject: [PATCH] fix: cleanup --- .github/workflows/runtests.yml | 2 +- Dockerfile | 1 - config/settings/base.py | 43 - config/urls.py | 14 +- locale/es/LC_MESSAGES/django.po | 1261 +++++----- pyproject.toml | 3 - scripts/build_static.sh | 3 - .../0003_alter_productimage_options.py | 17 + users/urls.py | 2 +- uv.lock | 215 -- web/apps.py | 3 - web/context_processors.py | 1 + web/management/__init__.py | 0 web/management/commands/__init__.py | 0 .../commands/build_tailwind_theme.py | 42 - ...tings_favicon_16_websettings_favicon_32.py | 23 + web/models.py | 13 +- web/signals.py | 8 - web/static/css/styles.css | 2157 ++++++++++++++++- web/templates/components/generic/navbar.html | 2 +- web/templates/components/product_card.html | 2 +- web/templates/theme/base.html | 2 +- web/templates/theme/main.css.template | 1 - web/templates/web/list_products.html | 2 +- 24 files changed, 2917 insertions(+), 900 deletions(-) delete mode 100644 scripts/build_static.sh create mode 100644 shop/migrations/0003_alter_productimage_options.py delete mode 100644 web/management/__init__.py delete mode 100644 web/management/commands/__init__.py delete mode 100644 web/management/commands/build_tailwind_theme.py create mode 100644 web/migrations/0005_websettings_favicon_16_websettings_favicon_32.py diff --git a/.github/workflows/runtests.yml b/.github/workflows/runtests.yml index 7ed119b..6052aab 100644 --- a/.github/workflows/runtests.yml +++ b/.github/workflows/runtests.yml @@ -20,7 +20,7 @@ jobs: env: DJANGO_SETTINGS_MODULE: config.settings DEBUG: True - run: uv venv && uv run manage.py collectstatic && uv run pytest --cov --junitxml=junit.xml -o junit_family=legacy && coverage xml + run: uv venv && uv run manage.py collectstatic && uv run pytest --cov --junitxml=junit.xml -o junit_family=legacy && uv run coverage xml - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v4.0.1 with: diff --git a/Dockerfile b/Dockerfile index a6b9653..9ba5acd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,5 +17,4 @@ RUN apt-get update && \ COPY . /code -RUN ["sh", "scripts/build_static.sh"] CMD ["sh", "./scripts/run.sh"] diff --git a/config/settings/base.py b/config/settings/base.py index 77a5112..146b455 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -161,52 +161,9 @@ if S3_ENABLED: WATCHMAN_STORAGE_PATH = 'tmp' -SPECTACULAR_SETTINGS = { - 'TITLE': APP_NAME, - 'DESCRIPTION': DESCRIPTION, - 'VERSION': VERSION, - 'SERVE_INCLUDE_SCHEMA': False, -} - - EMAIL_USE_TLS = True EMAIL_USE_SSL = False - CELERY_BROKER_URL = env.str('CELERY_BROKER_URL', default='memory://localhost:8000//') CELERY_TIME_ZONE = TIME_ZONE CELERY_ALWAYS_EAGER = DEBUG - -SIMPLE_JWT = { - 'ACCESS_TOKEN_LIFETIME': datetime.timedelta(hours=12), - 'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=1), - 'ROTATE_REFRESH_TOKENS': False, - 'BLACKLIST_AFTER_ROTATION': False, - 'UPDATE_LAST_LOGIN': False, - 'ALGORITHM': 'HS256', - 'SIGNING_KEY': SECRET_KEY, - 'VERIFYING_KEY': '', - 'AUDIENCE': None, - 'ISSUER': None, - 'JSON_ENCODER': None, - 'JWK_URL': None, - 'LEEWAY': 0, - 'AUTH_HEADER_TYPES': ('Bearer',), - 'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', - 'USER_ID_FIELD': 'id', - 'USER_ID_CLAIM': 'user_id', - 'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule', - 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), - 'TOKEN_TYPE_CLAIM': 'token_type', - 'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser', - 'JTI_CLAIM': 'jti', - 'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp', - 'SLIDING_TOKEN_LIFETIME': datetime.timedelta(minutes=5), - 'SLIDING_TOKEN_REFRESH_LIFETIME': datetime.timedelta(days=1), - 'TOKEN_OBTAIN_SERIALIZER': 'rest_framework_simplejwt.serializers.TokenObtainPairSerializer', - 'TOKEN_REFRESH_SERIALIZER': 'rest_framework_simplejwt.serializers.TokenRefreshSerializer', - 'TOKEN_VERIFY_SERIALIZER': 'rest_framework_simplejwt.serializers.TokenVerifySerializer', - 'TOKEN_BLACKLIST_SERIALIZER': 'rest_framework_simplejwt.serializers.TokenBlacklistSerializer', - 'SLIDING_TOKEN_OBTAIN_SERIALIZER': 'rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer', - 'SLIDING_TOKEN_REFRESH_SERIALIZER': 'rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer', -} diff --git a/config/urls.py b/config/urls.py index ecb9ea0..85447c5 100644 --- a/config/urls.py +++ b/config/urls.py @@ -1,19 +1,29 @@ import debug_toolbar from django.conf import settings +from django.conf.urls.i18n import i18n_patterns from django.conf.urls.static import static from django.contrib import admin from django.urls import include, path +from django.utils.text import gettext_lazy as _ + + +i18n_resolvers = i18n_patterns( + path(_('users/'), include('users.urls', namespace='users')), +) + urlpatterns = [ path('', include('web.urls', namespace='web')), - path('users/', include('users.urls', namespace='users')), path('admin/', admin.site.urls), path('watchman/', include('watchman.urls')), - path('auth/', include('users.urls', namespace='users')), path('tpv/', include('shop.urls', namespace='shop')), ] +for resolver in i18n_resolvers: + urlpatterns += resolver.url_patterns + + if settings.DEBUG: urlpatterns.append(path('__debug__/', include(debug_toolbar.urls))) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index 7da0a9d..2008910 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-18 13:27+0100\n" +"POT-Creation-Date: 2026-03-20 09:58+0100\n" "PO-Revision-Date: 2025-01-18 13:28+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -19,575 +19,637 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.5\n" -#: .\config\settings\base.py:129 +#: config/settings/base.py:110 msgid "Inglés" msgstr "Inglés" -#: .\config\settings\base.py:130 +#: config/settings/base.py:110 msgid "Castellano" msgstr "Castellano" -#: .\shop\api\v1\viewsets.py:70 -msgid "No se puede borrar el producto" -msgstr "No se puede borrar el producto" +#: config/urls.py:11 +#, fuzzy +#| msgid "orders/" +msgid "users/" +msgstr "usuarios/" -#: .\shop\filters.py:10 +#: shop/apps.py:8 +msgid "Tienda" +msgstr "" + +#: shop/filters.py:9 msgid "Nombre" msgstr "Nombre" -#: .\shop\filters.py:12 +#: shop/filters.py:10 msgid "Etiquetas" msgstr "Etiquetas" -#: .\shop\filters.py:14 +#: shop/filters.py:11 msgid "Categorías" msgstr "Categorías" -#: .\shop\models.py:19 .\shop\models.py:481 +#: shop/models.py:22 shop/models.py:386 msgid "fecha de creación" msgstr "fecha de creación" -#: .\shop\models.py:22 +#: shop/models.py:23 msgid "fecha de última modificación" msgstr "fecha de última modificación" -#: .\shop\models.py:36 +#: shop/models.py:36 msgid "etiqueta" msgstr "etiqueta" -#: .\shop\models.py:37 .\shop\models.py:109 +#: shop/models.py:37 shop/models.py:71 msgid "etiquetas" msgstr "etiquetas" -#: .\shop\models.py:48 +#: shop/models.py:44 msgid "categoría padre" msgstr "categoría padre" -#: .\shop\models.py:50 +#: shop/models.py:46 msgid "promocionada" msgstr "promocionada" -#: .\shop\models.py:51 +#: shop/models.py:47 msgid "oculta" msgstr "oculta" -#: .\shop\models.py:53 +#: shop/models.py:48 msgid "mostrar en cabecera" msgstr "mostrar en cabecera" -#: .\shop\models.py:59 +#: shop/models.py:49 msgid "slug" msgstr "slug" -#: .\shop\models.py:72 +#: shop/models.py:59 msgid "categoría" msgstr "categoría" -#: .\shop\models.py:73 .\shop\models.py:111 +#: shop/models.py:60 shop/models.py:72 msgid "categorías" msgstr "categorías" -#: .\shop\models.py:83 +#: shop/models.py:65 msgid "código de referencia" msgstr "código de referencia" -#: .\shop\models.py:89 .\shop\models.py:241 .\shop\models.py:268 -#: .\shop\models.py:566 +#: shop/models.py:66 shop/models.py:238 shop/models.py:258 shop/models.py:438 msgid "nombre" msgstr "nombre" -#: .\shop\models.py:94 +#: shop/models.py:67 msgid "descripción" msgstr "descripción" -#: .\shop\models.py:100 +#: shop/models.py:68 msgid "stock" msgstr "stock" -#: .\shop\models.py:103 +#: shop/models.py:69 msgid "es un activo digital" msgstr "es un activo digital" -#: .\shop\models.py:105 +#: shop/models.py:70 msgid "URL de descarga" msgstr "URL de descarga" -#: .\shop\models.py:107 -msgid "imágenes" -msgstr "imágenes" - -#: .\shop\models.py:118 .\shop\models.py:272 +#: shop/models.py:73 shop/models.py:261 msgid "marca" msgstr "marca" -#: .\shop\models.py:121 +#: shop/models.py:74 msgid "Slug" msgstr "Slug" -#: .\shop\models.py:123 .\shop\models.py:555 +#: shop/models.py:75 shop/models.py:427 msgid "oculto" msgstr "oculto" -#: .\shop\models.py:125 +#: shop/models.py:76 msgid "es forma de envío" msgstr "es forma de envío" -#: .\shop\models.py:141 .\shop\models.py:154 .\shop\models.py:190 -#: .\shop\models.py:288 .\shop\models.py:497 .\shop\models.py:584 +#: shop/models.py:91 shop/models.py:100 shop/models.py:206 shop/models.py:268 +#: shop/models.py:395 shop/models.py:451 msgid "producto" msgstr "producto" -#: .\shop\models.py:142 +#: shop/models.py:92 msgid "productos" msgstr "productos" -#: .\shop\models.py:148 .\shop\models.py:301 +#: shop/models.py:97 shop/models.py:275 msgid "precio" msgstr "precio" -#: .\shop\models.py:150 +#: shop/models.py:98 msgid "fecha" msgstr "fecha" -#: .\shop\models.py:160 +#: shop/models.py:102 msgid "impuesto aplicable" msgstr "impuesto aplicable" -#: .\shop\models.py:167 +#: shop/models.py:104 msgid "precio con impuestos" msgstr "precio con impuestos" -#: .\shop\models.py:169 +#: shop/models.py:106 msgid "es el precio actual" msgstr "es el precio actual" -#: .\shop\models.py:180 .\shop\models.py:181 +#: shop/models.py:117 shop/models.py:118 msgid "precio de producto" msgstr "precio de producto" -#: .\shop\models.py:187 +#: shop/models.py:128 +#, fuzzy +#| msgid "producto" +msgid "Producto" +msgstr "producto" + +#: shop/models.py:131 +msgid "Imagen original" +msgstr "" + +#: shop/models.py:133 +msgid "XL" +msgstr "" + +#: shop/models.py:134 +msgid "XL (fondo oscuro)" +msgstr "" + +#: shop/models.py:136 +msgid "L" +msgstr "" + +#: shop/models.py:137 +msgid "L (fondo oscuro)" +msgstr "" + +#: shop/models.py:139 +msgid "M" +msgstr "" + +#: shop/models.py:140 +msgid "M (fondo oscuro)" +msgstr "" + +#: shop/models.py:142 +msgid "S" +msgstr "" + +#: shop/models.py:143 +msgid "S (fondo oscuro)" +msgstr "" + +#: shop/models.py:145 +msgid "XS" +msgstr "" + +#: shop/models.py:146 +msgid "XS (fondo oscuro)" +msgstr "" + +#: shop/models.py:200 shop/models.py:201 +#, fuzzy +#| msgid "remesa de producto" +msgid "imágenes de producto" +msgstr "remesa de producto" + +#: shop/models.py:205 msgid "código" msgstr "código" -#: .\shop\models.py:196 .\shop\models.py:296 .\shop\models.py:499 +#: shop/models.py:207 shop/models.py:271 shop/models.py:396 msgid "cantidad" msgstr "cantidad" -#: .\shop\models.py:199 +#: shop/models.py:209 msgid "fecha de caducidad / consumo preferente" msgstr "fecha de caducidad / consumo preferente" -#: .\shop\models.py:206 .\shop\models.py:262 +#: shop/models.py:212 shop/models.py:253 msgid "proveedor" msgstr "proveedor" -#: .\shop\models.py:213 +#: shop/models.py:219 msgid "remesa de producto" msgstr "remesa de producto" -#: .\shop\models.py:214 +#: shop/models.py:220 msgid "remesas de productos" msgstr "remesas de productos" -#: .\shop\models.py:219 +#: shop/models.py:224 msgid "código de impuesto" msgstr "código de impuesto" -#: .\shop\models.py:222 +#: shop/models.py:225 msgid "valor entero (porcentaje)" msgstr "valor entero (porcentaje)" -#: .\shop\models.py:229 +#: shop/models.py:231 msgid "impuesto" msgstr "impuesto" -#: .\shop\models.py:230 .\shop\models.py:321 +#: shop/models.py:232 shop/models.py:291 msgid "impuestos" msgstr "impuestos" -#: .\shop\models.py:239 +#: shop/models.py:237 msgid "documento de identidad" msgstr "documento de identidad" -#: .\shop\models.py:243 .\web\models.py:59 +#: shop/models.py:240 web/models.py:41 msgid "e-mail de contacto" msgstr "e-mail de contacto" -#: .\shop\models.py:249 +#: shop/models.py:241 msgid "Teléfono de contacto" msgstr "Teléfono de contacto" -#: .\shop\models.py:252 .\shop\models.py:414 .\shop\models.py:522 -#: .\shop\models.py:525 +#: shop/models.py:243 shop/models.py:352 shop/models.py:412 shop/models.py:413 msgid "dirección" msgstr "dirección" -#: .\shop\models.py:253 .\shop\models.py:417 +#: shop/models.py:244 shop/models.py:353 msgid "ciudad" msgstr "ciudad" -#: .\shop\models.py:254 .\shop\models.py:420 +#: shop/models.py:245 shop/models.py:354 msgid "región" msgstr "región" -#: .\shop\models.py:255 .\shop\models.py:423 .\shop\models.py:541 +#: shop/models.py:246 shop/models.py:355 shop/models.py:418 msgid "país" msgstr "país" -#: .\shop\models.py:256 .\shop\models.py:426 .\shop\models.py:531 +#: shop/models.py:247 shop/models.py:356 shop/models.py:415 msgid "código postal" msgstr "código postal" -#: .\shop\models.py:263 +#: shop/models.py:254 msgid "proveedores" msgstr "proveedores" -#: .\shop\models.py:273 +#: shop/models.py:262 msgid "marcas" msgstr "marcas" -#: .\shop\models.py:281 .\shop\models.py:466 .\shop\models.py:610 +#: shop/models.py:266 shop/models.py:378 shop/models.py:466 msgid "pedido" msgstr "pedido" -#: .\shop\models.py:311 +#: shop/models.py:284 msgid "total sin impuestos" msgstr "total sin impuestos" -#: .\shop\models.py:316 +#: shop/models.py:288 msgid "valor de impuestos" msgstr "valor de impuestos" -#: .\shop\models.py:326 .\shop\models.py:387 +#: shop/models.py:294 shop/models.py:339 msgid "total" msgstr "total" -#: .\shop\models.py:333 +#: shop/models.py:300 msgid "línea de pedido" msgstr "línea de pedido" -#: .\shop\models.py:334 +#: shop/models.py:301 msgid "líneas de pedido" msgstr "líneas de pedido" -#: .\shop\models.py:350 +#: shop/models.py:310 msgid "pendiente de pago" msgstr "pendiente de pago" -#: .\shop\models.py:351 +#: shop/models.py:311 msgid "pagado" msgstr "pagado" -#: .\shop\models.py:352 .\shop\models.py:364 +#: shop/models.py:312 shop/models.py:324 msgid "devuelto" msgstr "devuelto" -#: .\shop\models.py:353 .\web\templates\web\orders.html:78 +#: shop/models.py:313 web/templates/web/orders.html:78 msgid "Error" msgstr "Error" -#: .\shop\models.py:356 +#: shop/models.py:316 msgid "no preparado" msgstr "no preparado" -#: .\shop\models.py:357 +#: shop/models.py:317 msgid "preparado" msgstr "preparado" -#: .\shop\models.py:358 +#: shop/models.py:318 msgid "listo para ser enviado" msgstr "listo para ser enviado" -#: .\shop\models.py:359 +#: shop/models.py:319 msgid "enviado" msgstr "enviado" -#: .\shop\models.py:360 +#: shop/models.py:320 msgid "entregado" msgstr "entregado" -#: .\shop\models.py:361 +#: shop/models.py:321 msgid "finalizado" msgstr "finalizado" -#: .\shop\models.py:362 +#: shop/models.py:322 msgid "cancelado" msgstr "cancelado" -#: .\shop\models.py:363 +#: shop/models.py:323 msgid "devolución solicitada" msgstr "devolución solicitada" -#: .\shop\models.py:366 +#: shop/models.py:326 msgid "UUID" msgstr "UUID" -#: .\shop\models.py:370 +#: shop/models.py:329 msgid "estado" msgstr "estado" -#: .\shop\models.py:376 +#: shop/models.py:332 msgid "estado de envío" msgstr "estado de envío" -#: .\shop\models.py:383 +#: shop/models.py:336 msgid "base imponible" msgstr "base imponible" -#: .\shop\models.py:391 .\shop\models.py:614 +#: shop/models.py:341 shop/models.py:468 msgid "cliente" msgstr "cliente" -#: .\shop\models.py:393 .\shop\models.py:553 +#: shop/models.py:342 shop/models.py:425 msgid "e-mail" msgstr "e-mail" -#: .\shop\models.py:397 +#: shop/models.py:345 msgid "dirección de facturación" msgstr "dirección de facturación" -#: .\shop\models.py:400 +#: shop/models.py:346 msgid "ciudad de facturación" msgstr "ciudad de facturación" -#: .\shop\models.py:403 +#: shop/models.py:347 msgid "región de facturación" msgstr "región de facturación" -#: .\shop\models.py:406 +#: shop/models.py:348 msgid "país de facturación" msgstr "país de facturación" -#: .\shop\models.py:409 +#: shop/models.py:349 msgid "código postal de facturación" msgstr "código postal de facturación" -#: .\shop\models.py:429 +#: shop/models.py:357 msgid "teléfono de contacto" msgstr "teléfono de contacto" -#: .\shop\models.py:436 +#: shop/models.py:360 msgid "cantidad pagada" msgstr "cantidad pagada" -#: .\shop\models.py:444 .\shop\models.py:577 +#: shop/models.py:364 shop/models.py:445 msgid "método de envío" msgstr "método de envío" -#: .\shop\models.py:452 +#: shop/models.py:368 msgid "carrito de origen de pedido" msgstr "carrito de origen de pedido" -#: .\shop\models.py:467 +#: shop/models.py:379 msgid "pedidos" msgstr "pedidos" -#: .\shop\models.py:472 +#: shop/models.py:384 msgid "uuid" msgstr "uuid" -#: .\shop\models.py:476 .\shop\models.py:512 .\shop\models.py:582 +#: shop/models.py:385 shop/models.py:408 shop/models.py:450 msgid "usuario" msgstr "usuario" -#: .\shop\models.py:485 .\shop\models.py:494 +#: shop/models.py:389 shop/models.py:394 msgid "carrito" msgstr "carrito" -#: .\shop\models.py:486 +#: shop/models.py:390 msgid "carritos" msgstr "carritos" -#: .\shop\models.py:502 +#: shop/models.py:399 msgid "línea de carrito" msgstr "línea de carrito" -#: .\shop\models.py:503 +#: shop/models.py:400 msgid "líneas de carrito" msgstr "líneas de carrito" -#: .\shop\models.py:508 +#: shop/models.py:405 msgid "facturación" msgstr "facturación" -#: .\shop\models.py:509 +#: shop/models.py:406 msgid "envío" msgstr "envío" -#: .\shop\models.py:519 +#: shop/models.py:410 msgid "número de identificación fiscal" msgstr "número de identificación fiscal" -#: .\shop\models.py:528 +#: shop/models.py:414 msgid "localidad" msgstr "localidad" -#: .\shop\models.py:534 +#: shop/models.py:416 msgid "provincia" msgstr "provincia" -#: .\shop\models.py:544 +#: shop/models.py:420 msgid "teléfono" msgstr "teléfono" -#: .\shop\models.py:551 +#: shop/models.py:423 msgid "tipo de dirección" msgstr "tipo de dirección" -#: .\shop\models.py:554 +#: shop/models.py:426 msgid "por defecto" msgstr "por defecto" -#: .\shop\models.py:561 +#: shop/models.py:433 msgid "dirección de cliente" msgstr "dirección de cliente" -#: .\shop\models.py:562 +#: shop/models.py:434 msgid "direcciones de cliente" msgstr "direcciones de cliente" -#: .\shop\models.py:568 +#: shop/models.py:439 msgid "description" msgstr "description" -#: .\shop\models.py:570 +#: shop/models.py:440 msgid "url" msgstr "url" -#: .\shop\models.py:572 +#: shop/models.py:441 msgid "producto de envío" msgstr "producto de envío" -#: .\shop\models.py:574 +#: shop/models.py:442 msgid "habilitado" msgstr "habilitado" -#: .\shop\models.py:578 +#: shop/models.py:446 msgid "métodos de envío" msgstr "métodos de envío" -#: .\shop\models.py:588 .\shop\models.py:589 +#: shop/models.py:454 shop/models.py:455 msgid "productos deseados" msgstr "productos deseados" -#: .\shop\models.py:600 +#: shop/models.py:463 msgid "Hash" msgstr "Hash" -#: .\shop\models.py:605 .\web\templates\components\cart\cart.html:46 -#: .\web\templates\components\cart\cart_navbar.html:38 +#: shop/models.py:464 web/templates/components/cart/cart.html:44 +#: web/templates/components/cart/cart_navbar.html:38 msgid "Cantidad" msgstr "Cantidad" -#: .\shop\models.py:618 +#: shop/models.py:469 msgid "Fecha de creación" msgstr "Fecha de creación" -#: .\shop\models.py:621 +#: shop/models.py:470 msgid "Metadata" msgstr "Metadata" -#: .\shop\models.py:627 +#: shop/models.py:472 msgid "método de pago" msgstr "método de pago" -#: .\shop\models.py:631 +#: shop/models.py:476 msgid "Pago" msgstr "Pago" -#: .\shop\models.py:632 +#: shop/models.py:477 msgid "Pagos" msgstr "Pagos" -#: .\shop\models.py:640 +#: shop/models.py:481 +#, fuzzy +#| msgid "ciudad de facturación" +msgid "Modo depuración" +msgstr "ciudad de facturación" + +#: shop/models.py:483 msgid "Identificación de comercio" msgstr "Identificación de comercio" -#: .\shop\models.py:646 +#: shop/models.py:486 msgid "Código de moneda" msgstr "Código de moneda" -#: .\shop\models.py:648 +#: shop/models.py:488 msgid "Terminal" msgstr "Terminal" -#: .\shop\models.py:649 +#: shop/models.py:489 msgid "Clave de Redsys" msgstr "Clave de Redsys" -#: .\shop\models.py:651 +#: shop/models.py:490 msgid "dominio del tpv" msgstr "dominio del tpv" -#: .\shop\models.py:655 .\shop\models.py:656 +#: shop/models.py:493 shop/models.py:494 msgid "ajustes de la tienda" msgstr "ajustes de la tienda" -#: .\shop\settings.py:230 .\shop\utils.py:230 +#: shop/settings.py:230 shop/utils.py:216 msgid "Error no tipificado" msgstr "Error no tipificado" -#: .\shop\settings.py:231 +#: shop/settings.py:231 msgid "Transacción autorizada para devoluciones y confirmaciones" msgstr "Transacción autorizada para devoluciones y confirmaciones" -#: .\shop\settings.py:232 +#: shop/settings.py:232 msgid "Transacción autorizada para anulaciones" msgstr "Transacción autorizada para anulaciones" -#: .\shop\settings.py:233 +#: shop/settings.py:233 msgid "Tarjeta caducada" msgstr "Tarjeta caducada" -#: .\shop\settings.py:234 +#: shop/settings.py:234 msgid "Tarjeta en excepción transitoria o bajo sospecha de fraude" msgstr "Tarjeta en excepción transitoria o bajo sospecha de fraude" -#: .\shop\settings.py:235 +#: shop/settings.py:235 msgid "Intentos de PIN excedidos" msgstr "Intentos de PIN excedidos" -#: .\shop\settings.py:236 +#: shop/settings.py:236 msgid "Tarjeta no efectiva" msgstr "Tarjeta no efectiva" -#: .\shop\settings.py:237 +#: shop/settings.py:237 msgid "Código de seguridad (CVV2/CVC2) incorrecto" msgstr "Código de seguridad (CVV2/CVC2) incorrecto" -#: .\shop\settings.py:238 +#: shop/settings.py:238 msgid "Denegada, no repetir." msgstr "Denegada, no repetir." -#: .\shop\settings.py:239 +#: shop/settings.py:239 msgid "Denegada, no repetir sin actualizar datos de tarjeta." msgstr "Denegada, no repetir sin actualizar datos de tarjeta." -#: .\shop\settings.py:240 +#: shop/settings.py:240 msgid "Denegada, no repetir antes de 72 horas." msgstr "Denegada, no repetir antes de 72 horas." -#: .\shop\settings.py:241 +#: shop/settings.py:241 msgid "Tarjeta ajena al servicio" msgstr "Tarjeta ajena al servicio" -#: .\shop\settings.py:242 +#: shop/settings.py:242 msgid "Error en la autenticación del titular" msgstr "Error en la autenticación del titular" -#: .\shop\settings.py:243 +#: shop/settings.py:243 msgid "Denegación del emisor sin especificar motivo" msgstr "Denegación del emisor sin especificar motivo" -#: .\shop\settings.py:244 +#: shop/settings.py:244 msgid "Fecha de caducidad errónea" msgstr "Fecha de caducidad errónea" -#: .\shop\settings.py:245 +#: shop/settings.py:245 msgid "Requiere autenticación SCA" msgstr "Requiere autenticación SCA" -#: .\shop\settings.py:247 +#: shop/settings.py:246 msgid "" "Tarjeta en excepción transitoria o bajo sospecha de fraude con retirada de " "tarjeta" @@ -595,67 +657,67 @@ msgstr "" "Tarjeta en excepción transitoria o bajo sospecha de fraude con retirada de " "tarjeta" -#: .\shop\settings.py:249 +#: shop/settings.py:247 msgid "Comercio no registrado en FUC" msgstr "Comercio no registrado en FUC" -#: .\shop\settings.py:250 +#: shop/settings.py:248 msgid "Error de sistema" msgstr "Error de sistema" -#: .\shop\settings.py:251 +#: shop/settings.py:249 msgid "Pedido repetido" msgstr "Pedido repetido" -#: .\shop\settings.py:252 +#: shop/settings.py:250 msgid "Sesión Incorrecta" msgstr "Sesión Incorrecta" -#: .\shop\settings.py:253 +#: shop/settings.py:251 msgid "Operación de devolución no permitida" msgstr "Operación de devolución no permitida" -#: .\shop\settings.py:254 .\shop\settings.py:255 +#: shop/settings.py:252 shop/settings.py:253 msgid "Emisor no disponible" msgstr "Emisor no disponible" -#: .\shop\settings.py:256 +#: shop/settings.py:254 msgid "Número de posiciones de la tarjeta incorrecto" msgstr "Número de posiciones de la tarjeta incorrecto" -#: .\shop\settings.py:257 +#: shop/settings.py:255 msgid "Tipo de operación no permitida para esa tarjeta" msgstr "Tipo de operación no permitida para esa tarjeta" -#: .\shop\settings.py:258 +#: shop/settings.py:256 msgid "Tarjeta no existente" msgstr "Tarjeta no existente" -#: .\shop\settings.py:259 +#: shop/settings.py:257 msgid "Rechazo servidores internacionales" msgstr "Rechazo servidores internacionales" -#: .\shop\settings.py:260 +#: shop/settings.py:258 msgid "Comercio con titular seguro y titular sin clave de compra segura" msgstr "Comercio con titular seguro y titular sin clave de compra segura" -#: .\shop\settings.py:261 +#: shop/settings.py:259 msgid "El comercio no permite op. seguras por entrada /operaciones" msgstr "El comercio no permite op. seguras por entrada /operaciones" -#: .\shop\settings.py:262 +#: shop/settings.py:260 msgid "Tarjeta no cumple el check-digit" msgstr "Tarjeta no cumple el check-digit" -#: .\shop\settings.py:263 +#: shop/settings.py:261 msgid "El comercio no puede realizar preautorizaciones" msgstr "El comercio no puede realizar preautorizaciones" -#: .\shop\settings.py:264 +#: shop/settings.py:262 msgid "Esta tarjeta no permite operativa de preautorizaciones" msgstr "Esta tarjeta no permite operativa de preautorizaciones" -#: .\shop\settings.py:266 +#: shop/settings.py:263 msgid "" "Operación detenida por superar el control de restricciones en la entrada al " "SIS" @@ -663,318 +725,469 @@ msgstr "" "Operación detenida por superar el control de restricciones en la entrada al " "SIS" -#: .\shop\settings.py:268 +#: shop/settings.py:264 msgid "A petición del usuario se ha cancelado el pago" msgstr "A petición del usuario se ha cancelado el pago" -#: .\shop\settings.py:269 +#: shop/settings.py:265 msgid "Se está procesando otra transacción en SIS con la misma tarjeta" msgstr "Se está procesando otra transacción en SIS con la misma tarjeta" -#: .\shop\settings.py:270 +#: shop/settings.py:266 msgid "Operación en proceso de solicitud de datos de tarjeta" msgstr "Operación en proceso de solicitud de datos de tarjeta" -#: .\shop\settings.py:271 +#: shop/settings.py:267 msgid "Operación que ha sido redirigida al emisor a autenticar" msgstr "Operación que ha sido redirigida al emisor a autenticar" -#: .\shop\utils.py:218 +#: shop/utils.py:205 msgid "No se ha recibido ningún valor para Ds_MerchantParameters" msgstr "No se ha recibido ningún valor para Ds_MerchantParameters" -#: .\shop\utils.py:232 +#: shop/utils.py:218 #, python-brace-format msgid "No se ha realizado el pago. Motivo: {reason}" msgstr "No se ha realizado el pago. Motivo: {reason}" -#: .\users\forms\info.py:13 .\users\forms\login.py:13 -#: .\users\forms\register.py:14 .\users\forms\reset_password.py:16 +#: users/forms/change_password.py:13 users/forms/change_password.py:14 +#: users/forms/change_password.py:15 +msgid "********" +msgstr "" + +#: users/forms/info.py:12 users/forms/login.py:10 users/forms/register.py:14 +#: users/forms/reset_password.py:13 msgid "pablo@shoppy.com" msgstr "pablo@shoppy.com" -#: .\users\forms\info.py:14 .\users\forms\register.py:15 +#: users/forms/info.py:12 users/forms/register.py:15 msgid "Pablo" msgstr "Pablo" -#: .\users\forms\info.py:15 .\users\forms\register.py:16 +#: users/forms/info.py:12 users/forms/register.py:16 msgid "Moreno" msgstr "Moreno" -#: .\users\forms\login.py:26 +#: users/forms/login.py:14 users/templates/users/user_details.html:28 msgid "Contraseña" msgstr "Contraseña" -#: .\users\forms\login.py:39 +#: users/forms/login.py:19 msgid "Mantener sesión iniciada" msgstr "Mantener sesión iniciada" -#: .\users\forms\reset_password.py:42 +#: users/forms/reset_password.py:26 msgid "El token no es válido o ha expirado" msgstr "El token no es válido o ha expirado" -#: .\web\models.py:9 -msgid "título de la web" -msgstr "título de la web" +#: users/templates/users/login.html:18 +msgid "Inicia sesión en tu cuenta" +msgstr "Inicia sesión en tu cuenta" -#: .\web\models.py:12 -msgid "descripción de la web" -msgstr "descripción de la web" +#: users/templates/users/login.html:42 +#: users/templates/users/reset_password.html:34 +#: users/templates/users/reset_password_confirm.html:38 +#: users/templates/users/reset_password_email_sent.html:22 +msgid "¿Aún no tienes cuenta?" +msgstr "¿Aún no tienes cuenta?" -#: .\web\models.py:15 -msgid "logo de la web" -msgstr "logo de la web" +#: users/templates/users/login.html:44 +#: users/templates/users/reset_password.html:36 +#: users/templates/users/reset_password_confirm.html:39 +#: users/templates/users/reset_password_email_sent.html:24 +msgid "Regístrate aquí" +msgstr "Regístrate aquí" -#: .\web\models.py:22 -msgid "nombre de negocio" -msgstr "nombre de negocio" +#: users/templates/users/login.html:55 +msgid "Iniciar sesión" +msgstr "Iniciar sesión" -#: .\web\models.py:23 -msgid "nombre fiscal del comercio" -msgstr "nombre fiscal del comercio" +#: users/templates/users/login.html:61 +msgid "¿Has olvidado tu contraseña?" +msgstr "¿Has olvidado tu contraseña?" -#: .\web\models.py:26 -msgid "CIF del negocio" -msgstr "CIF del negocio" +#: users/templates/users/register.html:17 +msgid "Crea tu cuenta" +msgstr "Crea tu cuenta" -#: .\web\models.py:32 -msgid "marca de negocio" -msgstr "marca de negocio" +#: users/templates/users/register.html:40 users/views.py:106 +#: web/views/users.py:106 +msgid "Crear cuenta" +msgstr "Crear cuenta" -#: .\web\models.py:33 -msgid "marca o nombre comercial que se va a mostrar en la web" -msgstr "marca o nombre comercial que se va a mostrar en la web" +#: users/templates/users/register.html:43 +msgid "¿Ya tienes cuenta?" +msgstr "¿Ya tienes cuenta?" -#: .\web\models.py:37 -msgid "dirección de negocio" -msgstr "dirección de negocio" +#: users/templates/users/register.html:44 +msgid "Inicia sesión aquí" +msgstr "Inicia sesión aquí" -#: .\web\models.py:43 -msgid "unidad territorial del negocio" -msgstr "unidad territorial del negocio" +#: users/templates/users/reset_password.html:14 +#: users/templates/users/reset_password.html:31 +#: users/templates/users/reset_password_confirm.html:17 +#: users/templates/users/reset_password_confirm.html:35 users/views.py:141 +#: web/views/users.py:141 +msgid "Restablecer contraseña" +msgstr "Restablecer contraseña" -#: .\web\models.py:49 -msgid "código postal del negocio" -msgstr "código postal del negocio" +#: users/templates/users/reset_password_email_sent.html:18 +msgid "Se te ha enviado un correo electrónico para restablecer tu contraseña" +msgstr "Se te ha enviado un correo electrónico para restablecer tu contraseña" -#: .\web\models.py:56 -msgid "número de teléfono de contacto" -msgstr "número de teléfono de contacto" - -#: .\web\models.py:65 -msgid "e-mail secundario de contacto" -msgstr "e-mail secundario de contacto" - -#: .\web\models.py:73 -msgid "color de fondo" -msgstr "color de fondo" - -#: .\web\models.py:76 -msgid "color de tema" -msgstr "color de tema" - -#: .\web\models.py:79 -msgid "logo 240x240" -msgstr "logo 240x240" - -#: .\web\models.py:82 -msgid "logo 128x128" -msgstr "logo 128x128" - -#: .\web\models.py:86 .\web\models.py:87 -msgid "ajustes de la web" -msgstr "ajustes de la web" - -#: .\web\templates\components\cart\add_to_cart.html:17 -msgid "Añadir al carrito" -msgstr "Añadir al carrito" - -#: .\web\templates\components\cart\cart.html:6 -#: .\web\templates\components\cart\cart_navbar.html:9 -msgid "Carrito" -msgstr "Carrito" - -#: .\web\templates\components\cart\cart.html:41 -#: .\web\templates\components\cart\cart_navbar.html:45 -msgid "Quitar" -msgstr "Quitar" - -#: .\web\templates\components\cart\cart.html:69 -#: .\web\templates\web\order.html:62 -msgid "No hay nada en el carrito..." -msgstr "No hay nada en el carrito..." - -#: .\web\templates\components\cart\cart.html:74 -#: .\web\templates\web\order.html:67 -msgid "Volver a inicio" -msgstr "Volver a inicio" - -#: .\web\templates\components\cart\cart.html:80 -#: .\web\templates\web\order.html:74 -msgid "Dirección de envío" -msgstr "Dirección de envío" - -#: .\web\templates\components\cart\cart.html:90 -#: .\web\templates\components\cart\cart.html:95 -msgid "E-Mail" -msgstr "E-Mail" - -#: .\web\templates\components\cart\cart.html:106 -#: .\web\templates\components\cart\cart.html:111 -#: .\web\templates\components\cart\cart.html:199 -#: .\web\templates\components\cart\cart.html:204 -#: .\web\templates\users\user_details.html:39 -msgid "Nombre completo" -msgstr "Nombre completo" - -#: .\web\templates\components\cart\cart.html:117 -#: .\web\templates\components\cart\cart.html:122 -#: .\web\templates\components\cart\cart.html:210 -#: .\web\templates\components\cart\cart.html:216 -#: .\web\templates\users\user_details.html:45 -msgid "Dirección" -msgstr "Dirección" - -#: .\web\templates\components\cart\cart.html:130 -#: .\web\templates\components\cart\cart.html:136 -#: .\web\templates\components\cart\cart.html:224 -#: .\web\templates\components\cart\cart.html:230 -#: .\web\templates\users\user_details.html:61 -msgid "Localidad" -msgstr "Localidad" - -#: .\web\templates\components\cart\cart.html:144 -#: .\web\templates\components\cart\cart.html:150 -#: .\web\templates\components\cart\cart.html:238 -#: .\web\templates\components\cart\cart.html:244 -#: .\web\templates\users\user_details.html:51 -msgid "Código postal" -msgstr "Código postal" - -#: .\web\templates\components\cart\cart.html:159 -#: .\web\templates\components\cart\cart.html:165 -#: .\web\templates\components\cart\cart.html:253 -#: .\web\templates\components\cart\cart.html:259 -#: .\web\templates\users\user_details.html:65 -msgid "Provincia" -msgstr "Provincia" - -#: .\web\templates\components\cart\cart.html:174 -#: .\web\templates\components\cart\cart.html:180 -#: .\web\templates\components\cart\cart.html:268 -#: .\web\templates\components\cart\cart.html:274 -msgid "País" -msgstr "País" - -#: .\web\templates\components\cart\cart.html:190 -#: .\web\templates\web\order.html:89 -msgid "Dirección de facturación" -msgstr "Dirección de facturación" - -#: .\web\templates\components\cart\cart.html:285 -msgid "Opciones de envío" -msgstr "Opciones de envío" - -#: .\web\templates\components\cart\cart.html:316 -#: .\web\templates\web\order.html:10 .\web\templates\web\order.html:119 -msgid "Resumen del pedido" -msgstr "Resumen del pedido" - -#: .\web\templates\components\cart\cart.html:324 -#: .\web\templates\web\order.html:126 -msgid "Base imponible" -msgstr "Base imponible" - -#: .\web\templates\components\cart\cart.html:332 -#: .\web\templates\web\order.html:134 -msgid "Descuentos" -msgstr "Descuentos" - -#: .\web\templates\components\cart\cart.html:340 -#: .\web\templates\web\order.html:142 -msgid "Gastos de envío" -msgstr "Gastos de envío" - -#: .\web\templates\components\cart\cart.html:349 -#: .\web\templates\web\order.html:151 -msgid "Impuestos" -msgstr "Impuestos" - -#: .\web\templates\components\cart\cart.html:357 -#: .\web\templates\web\order.html:159 .\web\templates\web\orders.html:40 -msgid "Total" -msgstr "Total" - -#: .\web\templates\components\cart\cart.html:364 -msgid "Terminar pedido" -msgstr "Terminar pedido" - -#: .\web\templates\components\cart\cart.html:368 -#: .\web\templates\web\order.html:177 -msgid "o" -msgstr "o" - -#: .\web\templates\components\cart\cart.html:371 -#: .\web\templates\web\order.html:180 -msgid "Seguir comprando" -msgstr "Seguir comprando" - -#: .\web\templates\components\cart\cart_navbar.html:54 -msgid "Quitar del carrito" -msgstr "Quitar del carrito" - -#: .\web\templates\components\cart\cart_navbar.html:68 -msgid "Ver carrito" -msgstr "Ver carrito" - -#: .\web\templates\components\generic\navbar.html:22 -#: .\web\templates\components\generic\navbar.html:90 -msgid "Inicio" -msgstr "Inicio" - -#: .\web\templates\components\generic\navbar.html:54 -#: .\web\templates\components\users\user_dropdown.html:6 -#: .\web\templates\users\user_details.html:10 +#: users/templates/users/user_details.html:10 +#: web/templates/components/generic/user_dropdown.html:13 +#: web/templates/components/users/user_dropdown.html:6 msgid "Mi cuenta" msgstr "Mi cuenta" -#: .\web\templates\components\generic\navbar.html:78 -msgid "Abrir menú" -msgstr "Abrir menú" +#: users/templates/users/user_details.html:15 +#, fuzzy +#| msgid "usuario" +msgid "Datos de usuario" +msgstr "usuario" -#: .\web\templates\components\generic\spinner.html:12 +#: users/templates/users/user_details.html:42 +msgid "Mis direcciones" +msgstr "Mis direcciones" + +#: users/templates/users/user_details.html:50 +msgid "No hay ninguna dirección" +msgstr "No hay ninguna dirección" + +#: users/urls.py:20 +msgid "login/" +msgstr "iniciar-sesion/" + +#: users/urls.py:21 +msgid "logout/" +msgstr "cerrar-sesion/" + +#: users/urls.py:22 +msgid "register/" +msgstr "crear-cuenta/" + +#: users/urls.py:23 +msgid "reset-password/" +msgstr "restablecer-contraseña/" + +#: users/urls.py:24 +msgid "reset-password///" +msgstr "restablecer-contrasena///" + +#: users/urls.py:25 +msgid "reset-password/email-sent/" +msgstr "restablecer-contrasena/email-enviado/" + +#: users/urls.py:26 +msgid "my-account/" +msgstr "mi-cuenta/" + +#: users/urls.py:26 web/urls.py:36 web/urls.py:40 web/urls.py:54 web/urls.py:59 +msgid "/login/" +msgstr "/iniciar-sesion/" + +#: users/views.py:53 web/views/users.py:53 +msgid "inicio de sesión" +msgstr "inicio de sesión" + +#: users/views.py:80 web/views/users.py:80 +msgid "crear cuenta" +msgstr "crear cuenta" + +#: users/views.py:101 web/views/users.py:101 +msgid "Ya existe un usuario con ese correo electrónico" +msgstr "Ya existe un usuario con ese correo electrónico" + +#: users/views.py:202 web/views/users.py:202 +msgid "Establecer nueva contraseña" +msgstr "Establecer nueva contraseña" + +#: web/models.py:12 +msgid "título de la web" +msgstr "título de la web" + +#: web/models.py:13 +msgid "descripción de la web" +msgstr "descripción de la web" + +#: web/models.py:14 +msgid "logo de la web" +msgstr "logo de la web" + +#: web/models.py:20 +msgid "nombre de negocio" +msgstr "nombre de negocio" + +#: web/models.py:21 +msgid "nombre fiscal del comercio" +msgstr "nombre fiscal del comercio" + +#: web/models.py:23 +msgid "CIF del negocio" +msgstr "CIF del negocio" + +#: web/models.py:28 +msgid "marca de negocio" +msgstr "marca de negocio" + +#: web/models.py:29 +msgid "marca o nombre comercial que se va a mostrar en la web" +msgstr "marca o nombre comercial que se va a mostrar en la web" + +#: web/models.py:32 +msgid "dirección de negocio" +msgstr "dirección de negocio" + +#: web/models.py:34 +msgid "unidad territorial del negocio" +msgstr "unidad territorial del negocio" + +#: web/models.py:36 +msgid "código postal del negocio" +msgstr "código postal del negocio" + +#: web/models.py:39 +msgid "número de teléfono de contacto" +msgstr "número de teléfono de contacto" + +#: web/models.py:43 +msgid "e-mail secundario de contacto" +msgstr "e-mail secundario de contacto" + +#: web/models.py:46 +msgid "color de fondo" +msgstr "color de fondo" + +#: web/models.py:47 +msgid "color de tema" +msgstr "color de tema" + +#: web/models.py:49 +#, fuzzy +#| msgid "logo 240x240" +msgid "logo 256x256" +msgstr "logo 240x240" + +#: web/models.py:50 +msgid "logo 128x128" +msgstr "logo 128x128" + +#: web/models.py:51 +#, fuzzy +#| msgid "logo 240x240" +msgid "logo 64x64" +msgstr "logo 240x240" + +#: web/models.py:52 +#, fuzzy +#| msgid "logo 240x240" +msgid "logo 32x32" +msgstr "logo 240x240" + +#: web/models.py:54 +msgid "favicon 32x32" +msgstr "" + +#: web/models.py:55 +msgid "favicon 16x16" +msgstr "" + +#: web/models.py:57 +#, fuzzy +#| msgid "color de tema" +msgid "colores del tema" +msgstr "color de tema" + +#: web/models.py:81 web/models.py:82 +msgid "ajustes de la web" +msgstr "ajustes de la web" + +#: web/templates/components/cart/add_to_cart.html:10 +msgid "Añadir al carrito" +msgstr "Añadir al carrito" + +#: web/templates/components/cart/cart.html:6 +#: web/templates/components/cart/cart_navbar.html:9 +msgid "Carrito" +msgstr "Carrito" + +#: web/templates/components/cart/cart.html:39 +#: web/templates/components/cart/cart_navbar.html:45 +msgid "Quitar" +msgstr "Quitar" + +#: web/templates/components/cart/cart.html:63 web/templates/web/order.html:62 +msgid "No hay nada en el carrito..." +msgstr "No hay nada en el carrito..." + +#: web/templates/components/cart/cart.html:68 web/templates/web/order.html:67 +msgid "Volver a inicio" +msgstr "Volver a inicio" + +#: web/templates/components/cart/cart.html:74 web/templates/web/order.html:74 +msgid "Dirección de envío" +msgstr "Dirección de envío" + +#: web/templates/components/cart/cart.html:84 +#: web/templates/components/cart/cart.html:87 +msgid "E-Mail" +msgstr "E-Mail" + +#: web/templates/components/cart/cart.html:98 +#: web/templates/components/cart/cart.html:101 +#: web/templates/components/cart/cart.html:178 +#: web/templates/components/cart/cart.html:181 +#: web/templates/components/users/retrieve_update_address.html:17 +#: web/templates/components/users/retrieve_update_address.html:95 +msgid "Nombre completo" +msgstr "Nombre completo" + +#: web/templates/components/cart/cart.html:107 +#: web/templates/components/cart/cart.html:110 +#: web/templates/components/cart/cart.html:187 +#: web/templates/components/cart/cart.html:191 +#: web/templates/components/users/retrieve_update_address.html:27 +#: web/templates/components/users/retrieve_update_address.html:101 +msgid "Dirección" +msgstr "Dirección" + +#: web/templates/components/cart/cart.html:118 +#: web/templates/components/cart/cart.html:122 +#: web/templates/components/cart/cart.html:199 +#: web/templates/components/cart/cart.html:203 +#: web/templates/components/users/retrieve_update_address.html:59 +#: web/templates/components/users/retrieve_update_address.html:117 +msgid "Localidad" +msgstr "Localidad" + +#: web/templates/components/cart/cart.html:130 +#: web/templates/components/cart/cart.html:134 +#: web/templates/components/cart/cart.html:211 +#: web/templates/components/cart/cart.html:215 +#: web/templates/components/users/retrieve_update_address.html:37 +#: web/templates/components/users/retrieve_update_address.html:107 +msgid "Código postal" +msgstr "Código postal" + +#: web/templates/components/cart/cart.html:143 +#: web/templates/components/cart/cart.html:147 +#: web/templates/components/cart/cart.html:224 +#: web/templates/components/cart/cart.html:228 +#: web/templates/components/users/retrieve_update_address.html:69 +#: web/templates/components/users/retrieve_update_address.html:121 +msgid "Provincia" +msgstr "Provincia" + +#: web/templates/components/cart/cart.html:155 +#: web/templates/components/cart/cart.html:159 +#: web/templates/components/cart/cart.html:237 +#: web/templates/components/cart/cart.html:241 +msgid "País" +msgstr "País" + +#: web/templates/components/cart/cart.html:169 web/templates/web/order.html:89 +msgid "Dirección de facturación" +msgstr "Dirección de facturación" + +#: web/templates/components/cart/cart.html:252 +msgid "Opciones de envío" +msgstr "Opciones de envío" + +#: web/templates/components/cart/cart.html:281 web/templates/web/order.html:10 +#: web/templates/web/order.html:119 +msgid "Resumen del pedido" +msgstr "Resumen del pedido" + +#: web/templates/components/cart/cart.html:289 web/templates/web/order.html:126 +msgid "Base imponible" +msgstr "Base imponible" + +#: web/templates/components/cart/cart.html:297 web/templates/web/order.html:134 +msgid "Descuentos" +msgstr "Descuentos" + +#: web/templates/components/cart/cart.html:304 web/templates/web/order.html:142 +msgid "Gastos de envío" +msgstr "Gastos de envío" + +#: web/templates/components/cart/cart.html:313 web/templates/web/order.html:151 +msgid "Impuestos" +msgstr "Impuestos" + +#: web/templates/components/cart/cart.html:321 web/templates/web/order.html:159 +#: web/templates/web/orders.html:40 +msgid "Total" +msgstr "Total" + +#: web/templates/components/cart/cart.html:330 +msgid "Terminar pedido" +msgstr "Terminar pedido" + +#: web/templates/components/cart/cart.html:336 web/templates/web/order.html:177 +msgid "o" +msgstr "o" + +#: web/templates/components/cart/cart.html:339 web/templates/web/order.html:180 +msgid "Seguir comprando" +msgstr "Seguir comprando" + +#: web/templates/components/cart/cart_navbar.html:54 +msgid "Quitar del carrito" +msgstr "Quitar del carrito" + +#: web/templates/components/cart/cart_navbar.html:66 +msgid "Ver carrito" +msgstr "Ver carrito" + +#: web/templates/components/generic/navbar.html:17 +#, fuzzy +#| msgid "Iniciar sesión" +msgid "Inicia sesión" +msgstr "Iniciar sesión" + +#: web/templates/components/generic/spinner.html:12 msgid "Cargando..." msgstr "Cargando..." -#: .\web\templates\components\generic\toast.html:20 -msgid "Cerrar" -msgstr "Cerrar" +#: web/templates/components/generic/user_dropdown.html:16 +msgid "Ajustes" +msgstr "" -#: .\web\templates\components\products\list_filters.html:14 -#: .\web\templates\components\products\list_filters.html:24 -msgid "Buscar" -msgstr "Buscar" - -#: .\web\templates\components\users\info.html:24 -#| msgid "Editar datos" -msgid "Actualizar datos" -msgstr "Actualizar datos" - -#: .\web\templates\components\users\user_dropdown.html:12 -#: .\web\templates\web\orders.html:10 -msgid "Mis pedidos" -msgstr "Mis pedidos" - -#: .\web\templates\components\users\user_dropdown.html:18 -#: .\web\templates\web\wishlist.html:17 -msgid "Lista de deseados" -msgstr "Lista de deseados" - -#: .\web\templates\components\users\user_dropdown.html:26 +#: web/templates/components/generic/user_dropdown.html:17 +#: web/templates/components/users/user_dropdown.html:26 msgid "Cerrar sesión" msgstr "Cerrar sesión" -#: .\web\templates\mails\reset_password.html:2 +#: web/templates/components/products/list_filters.html:31 +msgid "Buscar" +msgstr "Buscar" + +#: web/templates/components/users/info.html:23 +#: web/templates/components/users/retrieve_update_address.html:85 +msgid "Guardar" +msgstr "" + +#: web/templates/components/users/retrieve_update_address.html:47 +#: web/templates/components/users/retrieve_update_address.html:111 +msgid "Teléfono" +msgstr "Teléfono" + +#: web/templates/components/users/retrieve_update_address.html:135 +msgid "Editar datos" +msgstr "Editar datos" + +#: web/templates/components/users/user_dropdown.html:12 +#: web/templates/web/orders.html:10 +msgid "Mis pedidos" +msgstr "Mis pedidos" + +#: web/templates/components/users/user_dropdown.html:18 +#: web/templates/web/wishlist.html:17 +msgid "Lista de deseados" +msgstr "Lista de deseados" + +#: web/templates/mails/reset_password.html:2 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " @@ -983,251 +1196,163 @@ msgstr "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." -#: .\web\templates\mails\reset_password.html:4 +#: web/templates/mails/reset_password.html:4 msgid "Please go to the following page and choose a new password:" msgstr "Please go to the following page and choose a new password:" -#: .\web\templates\mails\reset_password.html:8 +#: web/templates/mails/reset_password.html:8 msgid "Your username, in case you’ve forgotten:" msgstr "Your username, in case you’ve forgotten:" -#: .\web\templates\mails\reset_password.html:10 +#: web/templates/mails/reset_password.html:10 msgid "Thanks for using our site!" msgstr "Thanks for using our site!" -#: .\web\templates\mails\reset_password.html:12 +#: web/templates/mails/reset_password.html:12 #, python-format msgid "The %(site_name)s team" msgstr "The %(site_name)s team" -#: .\web\templates\mails\subject_reset_password.txt:2 +#: web/templates/mails/subject_reset_password.txt:2 #, python-format msgid "Password reset on %(site_name)s" msgstr "Password reset on %(site_name)s" -#: .\web\templates\users\login.html:18 -msgid "Inicia sesión en tu cuenta" -msgstr "Inicia sesión en tu cuenta" - -#: .\web\templates\users\login.html:42 -#: .\web\templates\users\reset_password.html:37 -#: .\web\templates\users\reset_password_confirm.html:38 -#: .\web\templates\users\reset_password_email_sent.html:22 -msgid "¿Aún no tienes cuenta?" -msgstr "¿Aún no tienes cuenta?" - -#: .\web\templates\users\login.html:44 -#: .\web\templates\users\reset_password.html:38 -#: .\web\templates\users\reset_password_confirm.html:39 -#: .\web\templates\users\reset_password_email_sent.html:24 -msgid "Regístrate aquí" -msgstr "Regístrate aquí" - -#: .\web\templates\users\login.html:55 -msgid "Iniciar sesión" -msgstr "Iniciar sesión" - -#: .\web\templates\users\login.html:61 -msgid "¿Has olvidado tu contraseña?" -msgstr "¿Has olvidado tu contraseña?" - -#: .\web\templates\users\register.html:17 -msgid "Crea tu cuenta" -msgstr "Crea tu cuenta" - -#: .\web\templates\users\register.html:42 .\web\views\users.py:117 -msgid "Crear cuenta" -msgstr "Crear cuenta" - -#: .\web\templates\users\register.html:45 -msgid "¿Ya tienes cuenta?" -msgstr "¿Ya tienes cuenta?" - -#: .\web\templates\users\register.html:46 -msgid "Inicia sesión aquí" -msgstr "Inicia sesión aquí" - -#: .\web\templates\users\reset_password.html:17 -#: .\web\templates\users\reset_password.html:34 -#: .\web\templates\users\reset_password_confirm.html:17 -#: .\web\templates\users\reset_password_confirm.html:35 -#: .\web\views\users.py:156 -msgid "Restablecer contraseña" -msgstr "Restablecer contraseña" - -#: .\web\templates\users\reset_password_email_sent.html:18 -msgid "Se te ha enviado un correo electrónico para restablecer tu contraseña" -msgstr "Se te ha enviado un correo electrónico para restablecer tu contraseña" - -#: .\web\templates\users\user_details.html:23 -msgid "Mis direcciones" -msgstr "Mis direcciones" - -#: .\web\templates\users\user_details.html:31 -msgid "No hay ninguna dirección" -msgstr "No hay ninguna dirección" - -#: .\web\templates\users\user_details.html:55 -msgid "Teléfono" -msgstr "Teléfono" - -#: .\web\templates\users\user_details.html:79 -msgid "Editar datos" -msgstr "Editar datos" - -#: .\web\templates\web\list_products.html:24 +#: web/templates/web/list_products.html:20 msgid "Anterior" msgstr "Anterior" -#: .\web\templates\web\list_products.html:38 +#: web/templates/web/list_products.html:30 msgid "Siguiente" msgstr "Siguiente" -#: .\web\templates\web\order.html:13 .\web\templates\web\orders.html:51 +#: web/templates/web/list_products.html:36 +#, python-format +msgid "Página %(current_page)s de %(num_pages)s" +msgstr "" + +#: web/templates/web/order.html:13 web/templates/web/orders.html:51 msgid "Pagado" msgstr "Pagado" -#: .\web\templates\web\order.html:104 +#: web/templates/web/order.html:104 msgid "Método de envío" msgstr "Método de envío" -#: .\web\templates\web\order.html:173 +#: web/templates/web/order.html:173 msgid "Pagar" msgstr "Pagar" -#: .\web\templates\web\orders.html:20 +#: web/templates/web/orders.html:20 msgid "Número de pedido" msgstr "Número de pedido" -#: .\web\templates\web\orders.html:31 +#: web/templates/web/orders.html:31 msgid "Fecha" msgstr "Fecha" -#: .\web\templates\web\orders.html:56 +#: web/templates/web/orders.html:56 msgid "Tramitado" msgstr "Tramitado" -#: .\web\templates\web\orders.html:60 +#: web/templates/web/orders.html:60 msgid "Preparado" msgstr "Preparado" -#: .\web\templates\web\orders.html:64 +#: web/templates/web/orders.html:64 msgid "Listo" msgstr "Listo" -#: .\web\templates\web\orders.html:68 +#: web/templates/web/orders.html:68 msgid "Enviado" msgstr "Enviado" -#: .\web\templates\web\orders.html:72 +#: web/templates/web/orders.html:72 msgid "Entregado" msgstr "Entregado" -#: .\web\templates\web\orders.html:82 +#: web/templates/web/orders.html:82 msgid "Devuelto" msgstr "Devuelto" -#: .\web\templates\web\orders.html:89 +#: web/templates/web/orders.html:89 msgid "Ver pedido" msgstr "Ver pedido" -#: .\web\urls.py:42 +#: web/urls.py:36 msgid "wishlist" msgstr "lista-deseados" -#: .\web\urls.py:42 .\web\urls.py:46 .\web\urls.py:65 .\web\urls.py:87 -msgid "/login/" -msgstr "/iniciar-sesion/" - -#: .\web\urls.py:43 +#: web/urls.py:37 msgid "categories//" msgstr "categorias//" -#: .\web\urls.py:44 +#: web/urls.py:38 msgid "products///" msgstr "productos///" -#: .\web\urls.py:45 +#: web/urls.py:39 msgid "cart/" msgstr "carrito/" -#: .\web\urls.py:46 +#: web/urls.py:40 msgid "orders/" msgstr "pedidos/" -#: .\web\urls.py:47 +#: web/urls.py:41 msgid "order//" msgstr "pedidos//" -#: .\web\urls.py:49 -msgid "login/" -msgstr "iniciar-sesion/" +#: web/views/components.py:134 +msgid "Actualizar datos" +msgstr "Actualizar datos" -#: .\web\urls.py:50 -msgid "logout/" -msgstr "cerrar-sesion/" +#: web/views/components.py:149 +#, fuzzy +#| msgid "Contraseña" +msgid "Cambiar contraseña" +msgstr "Contraseña" -#: .\web\urls.py:51 -msgid "register/" -msgstr "crear-cuenta/" - -#: .\web\urls.py:52 -msgid "reset-password/" -msgstr "restablecer-contraseña/" - -#: .\web\urls.py:54 -msgid "reset-password///" -msgstr "restablecer-contrasena///" - -#: .\web\urls.py:59 -msgid "reset-password/email-sent/" -msgstr "restablecer-contrasena/email-enviado/" - -#: .\web\urls.py:64 -msgid "my-account/" -msgstr "mi-cuenta/" - -#: .\web\views\users.py:48 -msgid "inicio de sesión" -msgstr "inicio de sesión" - -#: .\web\views\users.py:85 -msgid "crear cuenta" -msgstr "crear cuenta" - -#: .\web\views\users.py:108 -msgid "Ya existe un usuario con ese correo electrónico" -msgstr "Ya existe un usuario con ese correo electrónico" - -#: .\web\views\users.py:227 -msgid "Establecer nueva contraseña" -msgstr "Establecer nueva contraseña" - -#: .\web\views\web.py:48 +#: web/views/web.py:43 #, python-brace-format msgid "{settings.web_title} - {category.name}" msgstr "{settings.web_title} - {category.name}" -#: .\web\views\web.py:80 +#: web/views/web.py:75 #, python-brace-format msgid "{web_settings.web_title} - Carrito" msgstr "{web_settings.web_title} - Carrito" -#: .\web\views\web.py:83 +#: web/views/web.py:78 msgid "resumen del carrito" msgstr "resumen del carrito" -#: .\web\views\web.py:169 .\web\views\web.py:170 +#: web/views/web.py:159 web/views/web.py:160 #, python-brace-format msgid "{settings.web_title} - Comprar" msgstr "{settings.web_title} - Comprar" -#: .\web\views\web.py:190 +#: web/views/web.py:179 #, python-brace-format msgid "{settings.web_title} - Lista de deseados" msgstr "{settings.web_title} - Lista de deseados" -#: .\web\views\web.py:209 +#: web/views/web.py:194 #, python-brace-format msgid "{settings.web_title} - Mis pedidos" msgstr "{settings.web_title} - Mis pedidos" + +#~ msgid "No se puede borrar el producto" +#~ msgstr "No se puede borrar el producto" + +#~ msgid "imágenes" +#~ msgstr "imágenes" + +#~ msgid "Inicio" +#~ msgstr "Inicio" + +#~ msgid "Abrir menú" +#~ msgstr "Abrir menú" + +#~ msgid "Cerrar" +#~ msgstr "Cerrar" diff --git a/pyproject.toml b/pyproject.toml index 43288d1..5c71424 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,14 +17,11 @@ dependencies = [ "django-filter==24.3", "django-environ==0.10.0", "django-watchman==1.3.0", - "django-silk==5.1.0", "django-storages==1.13.2", "django-unfold==0.42.0", "django-watchman==1.3.0", "djangorestframework==3.15.2", "dj-database-url==1.0.0", - "djangorestframework-simplejwt==5.4.0", - "drf-spectacular==0.26.1", "gonk==0.6.1", "ipython==8.16.1", "Pillow==11.0.0", diff --git a/scripts/build_static.sh b/scripts/build_static.sh deleted file mode 100644 index 5735087..0000000 --- a/scripts/build_static.sh +++ /dev/null @@ -1,3 +0,0 @@ -tailwindcss -i web/static/css/main.css -o web/static/css/styles.css --minify - -python manage.py collectstatic --noinput diff --git a/shop/migrations/0003_alter_productimage_options.py b/shop/migrations/0003_alter_productimage_options.py new file mode 100644 index 0000000..1ff0ec1 --- /dev/null +++ b/shop/migrations/0003_alter_productimage_options.py @@ -0,0 +1,17 @@ +# Generated by Django 6.0.2 on 2026-03-20 08:37 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('shop', '0002_shopsettings_debug'), + ] + + operations = [ + migrations.AlterModelOptions( + name='productimage', + options={'verbose_name': 'imágenes de producto', 'verbose_name_plural': 'imágenes de producto'}, + ), + ] diff --git a/users/urls.py b/users/urls.py index 5a7a58f..c11e266 100644 --- a/users/urls.py +++ b/users/urls.py @@ -12,7 +12,7 @@ from web.views.users import ( reset_password_email_sent, ) -app_name = 'users' +app_name = 'webusers' urlpatterns = [ diff --git a/uv.lock b/uv.lock index 03bffe7..7687968 100644 --- a/uv.lock +++ b/uv.lock @@ -40,15 +40,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047 }, ] -[[package]] -name = "attrs" -version = "25.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615 }, -] - [[package]] name = "autopep8" version = "2.3.2" @@ -571,37 +562,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/b6/fa99d8f05eff3a9310286ae84c4059b08c301ae4ab33ae32e46e8ef76491/djangorestframework-3.15.2-py3-none-any.whl", hash = "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20", size = 1071235 }, ] -[[package]] -name = "djangorestframework-simplejwt" -version = "5.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "django" }, - { name = "djangorestframework" }, - { name = "pyjwt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8d/5f/1c130e823f734ba776c3925ad8e7c28ca1a59feb22d039b3810d1f8c0b34/djangorestframework_simplejwt-5.4.0.tar.gz", hash = "sha256:cccecce1a0e1a4a240fae80da73e5fc23055bababb8b67de88fa47cd36822320", size = 96648 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/41/d6f67d24f46c7d8ee6dcb85c9abb94bad23140210bfb8c454641d278dfd2/djangorestframework_simplejwt-5.4.0-py3-none-any.whl", hash = "sha256:7aec953db9ed4163430c16d086eecb0f028f814ce6bba62b06c25919261e9077", size = 102316 }, -] - -[[package]] -name = "drf-spectacular" -version = "0.26.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "django" }, - { name = "djangorestframework" }, - { name = "inflection" }, - { name = "jsonschema" }, - { name = "pyyaml" }, - { name = "uritemplate" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/cd/3d/111a66b02b1caae3a907a61993ec339f1fce56eef028cb4b0fb39fab4e65/drf-spectacular-0.26.1.tar.gz", hash = "sha256:1599a204bf9cc6be7ef3e509859885a38d4f871fe287a1f191479868afd9e234", size = 215500 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/a8/fb05e48812bd841119ae69f30fbf7f25da42a07d41bbb937b1e0d57f9aa9/drf_spectacular-0.26.1-py3-none-any.whl", hash = "sha256:6df86ff6c2dc663792e5ff618643bf41d2ac9dc6fb5d1b0f273e2778bab951e5", size = 92550 }, -] - [[package]] name = "executing" version = "2.2.1" @@ -652,15 +612,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008 }, ] -[[package]] -name = "inflection" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e1/7e/691d061b7329bc8d54edbf0ec22fbfb2afe61facb681f9aaa9bff7a27d04/inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417", size = 15091 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/59/91/aa6bde563e0085a02a435aa99b49ef75b0a4b062635e606dab23ce18d720/inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2", size = 9454 }, -] - [[package]] name = "iniconfig" version = "2.3.0" @@ -714,33 +665,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64", size = 20419 }, ] -[[package]] -name = "jsonschema" -version = "4.26.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing" }, - { name = "rpds-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630 }, -] - -[[package]] -name = "jsonschema-specifications" -version = "2025.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437 }, -] - [[package]] name = "kombu" version = "5.6.2" @@ -925,15 +849,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, ] -[[package]] -name = "pyjwt" -version = "2.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/5a/b46fa56bf322901eee5b0454a34343cdbdae202cd421775a8ee4e42fd519/pyjwt-2.11.0.tar.gz", hash = "sha256:35f95c1f0fbe5d5ba6e43f00271c275f7a1a4db1dab27bf708073b75318ea623", size = 98019 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/01/c26ce75ba460d5cd503da9e13b21a33804d38c2165dec7b716d06b13010c/pyjwt-2.11.0-py3-none-any.whl", hash = "sha256:94a6bde30eb5c8e04fee991062b534071fd1439ef58d2adc9ccb823e7bcd0469", size = 28224 }, -] - [[package]] name = "pytailwindcss" version = "0.2.0" @@ -1005,42 +920,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, ] -[[package]] -name = "pyyaml" -version = "6.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669 }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252 }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081 }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159 }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626 }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613 }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115 }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427 }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090 }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246 }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814 }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809 }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454 }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355 }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175 }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228 }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194 }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429 }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912 }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108 }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641 }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901 }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132 }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261 }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272 }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923 }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062 }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341 }, -] - [[package]] name = "redis" version = "4.5.4" @@ -1050,19 +929,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/d4/ef474a49ec5821f3155c5de2d37ddcc4a497e2500cd16d4a9e51ce02030d/redis-4.5.4-py3-none-any.whl", hash = "sha256:2c19e6767c474f2e85167909061d525ed65bea9301c0770bb151e041b7ac89a2", size = 238873 }, ] -[[package]] -name = "referencing" -version = "0.37.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766 }, -] - [[package]] name = "requests" version = "2.32.4" @@ -1078,72 +944,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847 }, ] -[[package]] -name = "rpds-py" -version = "0.30.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887 }, - { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904 }, - { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945 }, - { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783 }, - { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021 }, - { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589 }, - { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025 }, - { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895 }, - { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799 }, - { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731 }, - { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027 }, - { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020 }, - { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139 }, - { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224 }, - { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645 }, - { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443 }, - { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375 }, - { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850 }, - { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812 }, - { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841 }, - { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149 }, - { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843 }, - { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507 }, - { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949 }, - { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790 }, - { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217 }, - { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806 }, - { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341 }, - { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768 }, - { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099 }, - { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192 }, - { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080 }, - { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841 }, - { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670 }, - { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005 }, - { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112 }, - { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049 }, - { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661 }, - { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606 }, - { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126 }, - { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371 }, - { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298 }, - { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604 }, - { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391 }, - { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868 }, - { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747 }, - { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795 }, - { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330 }, - { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194 }, - { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340 }, - { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765 }, - { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834 }, - { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470 }, - { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630 }, - { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148 }, - { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030 }, - { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570 }, - { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532 }, -] - [[package]] name = "s3transfer" version = "0.10.4" @@ -1172,13 +972,10 @@ dependencies = [ { name = "django-environ" }, { name = "django-extensions" }, { name = "django-filter" }, - { name = "django-silk" }, { name = "django-storages" }, { name = "django-unfold" }, { name = "django-watchman" }, { name = "djangorestframework" }, - { name = "djangorestframework-simplejwt" }, - { name = "drf-spectacular" }, { name = "gonk" }, { name = "ipython" }, { name = "pillow" }, @@ -1216,13 +1013,10 @@ requires-dist = [ { name = "django-environ", specifier = "==0.10.0" }, { name = "django-extensions", specifier = "==3.2.0" }, { name = "django-filter", specifier = "==24.3" }, - { name = "django-silk", specifier = "==5.1.0" }, { name = "django-storages", specifier = "==1.13.2" }, { name = "django-unfold", specifier = "==0.42.0" }, { name = "django-watchman", specifier = "==1.3.0" }, { name = "djangorestframework", specifier = "==3.15.2" }, - { name = "djangorestframework-simplejwt", specifier = "==5.4.0" }, - { name = "drf-spectacular", specifier = "==0.26.1" }, { name = "gonk", specifier = "==0.6.1" }, { name = "ipython", specifier = "==8.16.1" }, { name = "pillow", specifier = "==11.0.0" }, @@ -1297,15 +1091,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521 }, ] -[[package]] -name = "uritemplate" -version = "4.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/60/f174043244c5306c9988380d2cb10009f91563fc4b31293d27e17201af56/uritemplate-4.2.0.tar.gz", hash = "sha256:480c2ed180878955863323eea31b0ede668795de182617fef9c6ca09e6ec9d0e", size = 33267 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/99/3ae339466c9183ea5b8ae87b34c0b897eda475d2aec2307cae60e5cd4f29/uritemplate-4.2.0-py3-none-any.whl", hash = "sha256:962201ba1c4edcab02e60f9a0d3821e82dfc5d2d6662a21abd533879bdb8a686", size = 11488 }, -] - [[package]] name = "urllib3" version = "2.6.3" diff --git a/web/apps.py b/web/apps.py index 6a969af..682e923 100644 --- a/web/apps.py +++ b/web/apps.py @@ -4,6 +4,3 @@ from django.apps import AppConfig class WebConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'web' - - def ready(self): - from .signals import rebuild_theme diff --git a/web/context_processors.py b/web/context_processors.py index a368df1..54f6965 100644 --- a/web/context_processors.py +++ b/web/context_processors.py @@ -10,4 +10,5 @@ def web_settings(request): 'web_title': settings.web_title, 'logo': settings.logo_32.url if settings.logo_32 else '', 'navbar_categories': navbar_categories, + 'favicon': settings.favicon_16.url if settings.favicon_16 else '', } diff --git a/web/management/__init__.py b/web/management/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/web/management/commands/__init__.py b/web/management/commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/web/management/commands/build_tailwind_theme.py b/web/management/commands/build_tailwind_theme.py deleted file mode 100644 index 2af0bfe..0000000 --- a/web/management/commands/build_tailwind_theme.py +++ /dev/null @@ -1,42 +0,0 @@ -import os -import subprocess - -from dataclasses import dataclass - -from django.conf import settings -from django.core.management.base import BaseCommand -from django.template.loader import render_to_string -from django.core.management import call_command -from web.models import WebSettings - - -@dataclass -class Color: - name: str - index: int - value: str - - -class Command(BaseCommand): - """ - Usage: - - python manage.py build_tailwind_theme - """ - - def handle(self, *args, **options): - web_settings = WebSettings.load() - path = os.path.join(settings.BASE_DIR, 'web', 'static', 'css', 'main.css') - - colors = [] - for color_name, data in web_settings.theme_colors.items(): - for index, value in data.items(): - color = Color(color_name, index, value) - colors.append(color) - - result = str(render_to_string('theme/main.css.template', context={'colors': colors})) - with open(path, 'w') as f: - f.write(result) - - subprocess.run(['tailwindcss', '-i', 'web/static/css/main.css', '-o', 'web/static/css/styles.css', '--minify']) - call_command('collectstatic', '--no-input') diff --git a/web/migrations/0005_websettings_favicon_16_websettings_favicon_32.py b/web/migrations/0005_websettings_favicon_16_websettings_favicon_32.py new file mode 100644 index 0000000..0b9bc59 --- /dev/null +++ b/web/migrations/0005_websettings_favicon_16_websettings_favicon_32.py @@ -0,0 +1,23 @@ +# Generated by Django 6.0.2 on 2026-03-20 08:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('web', '0004_websettings_logo_32_websettings_logo_64'), + ] + + operations = [ + migrations.AddField( + model_name='websettings', + name='favicon_16', + field=models.ImageField(blank=True, null=True, upload_to='assets', verbose_name='favicon 16x16'), + ), + migrations.AddField( + model_name='websettings', + name='favicon_32', + field=models.ImageField(blank=True, null=True, upload_to='assets', verbose_name='favicon 32x32'), + ), + ] diff --git a/web/models.py b/web/models.py index a842f04..f2aba83 100644 --- a/web/models.py +++ b/web/models.py @@ -50,16 +50,20 @@ class WebSettings(SingletonModel): logo_128 = models.ImageField(upload_to='assets', blank=True, null=True, verbose_name=_('logo 128x128')) logo_64 = models.ImageField(upload_to='assets', blank=True, null=True, verbose_name=_('logo 64x64')) logo_32 = models.ImageField(upload_to='assets', blank=True, null=True, verbose_name=_('logo 32x32')) + + favicon_32 = models.ImageField(upload_to='assets', blank=True, null=True, verbose_name=_('favicon 32x32')) + favicon_16 = models.ImageField(upload_to='assets', blank=True, null=True, verbose_name=_('favicon 16x16')) + theme_colors = models.JSONField(default=dict, verbose_name=_('colores del tema'), blank=True) - def get_resized_logo(self, size): + def get_resized_logo(self, size, extension: str = 'png'): width, height = size image = Image.open(self.logo) image = image.resize(size, Image.Resampling.LANCZOS) buffer = BytesIO() - image.save(fp=buffer, format='PNG') + image.save(fp=buffer, format=extension.upper()) - return ContentFile(buffer.getvalue(), name=f'logo_{width}.png') + return ContentFile(buffer.getvalue(), name=f'logo_{width}.{extension}') def save(self, *args, **kwargs): if self.logo: @@ -68,6 +72,9 @@ class WebSettings(SingletonModel): self.logo_128 = self.get_resized_logo((128, 128)) self.logo_256 = self.get_resized_logo((256, 256)) + self.favicon_16 = self.get_resized_logo((16, 16), extension='ico') + self.favicon_32 = self.get_resized_logo((32, 32), extension='ico') + super().save(*args, **kwargs) class Meta: diff --git a/web/signals.py b/web/signals.py index c0c3214..c40518e 100644 --- a/web/signals.py +++ b/web/signals.py @@ -15,11 +15,3 @@ def clear_cart(sender, **kwargs): @receiver(send_order_email, dispatch_uid='send_order_email') def create_payment_from_redsys(sender, **kwargs): pass - - -@receiver(post_save, sender=WebSettings) -def rebuild_theme(sender, instance: WebSettings, **kwargs): - try: - call_command('build_tailwind_theme') - except Exception: - pass diff --git a/web/static/css/styles.css b/web/static/css/styles.css index 11650c8..97a4a5f 100644 --- a/web/static/css/styles.css +++ b/web/static/css/styles.css @@ -1,4 +1,5 @@ -/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */ +/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */ +@layer properties; @layer theme, base, components, utilities; @layer theme { :root, :host { @@ -6,6 +7,56 @@ 'Noto Color Emoji'; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; + --color-red-600: oklch(57.7% 0.245 27.325); + --color-red-700: oklch(50.5% 0.213 27.518); + --color-red-800: oklch(44.4% 0.177 26.899); + --color-red-900: oklch(39.6% 0.141 25.723); + --color-yellow-800: oklch(47.6% 0.114 61.907); + --color-green-600: oklch(62.7% 0.194 149.214); + --color-green-800: oklch(44.8% 0.119 151.328); + --color-blue-800: oklch(42.4% 0.199 265.638); + --color-gray-100: oklch(96.7% 0.003 264.542); + --color-gray-200: oklch(92.8% 0.006 264.531); + --color-gray-400: oklch(70.7% 0.022 261.325); + --color-gray-500: oklch(55.1% 0.027 264.364); + --color-gray-900: oklch(21% 0.034 264.665); + --color-black: #000; + --color-white: #fff; + --spacing: 0.25rem; + --breakpoint-lg: 64rem; + --breakpoint-xl: 80rem; + --container-md: 28rem; + --container-lg: 32rem; + --container-2xl: 42rem; + --container-4xl: 56rem; + --container-5xl: 64rem; + --text-xs: 0.75rem; + --text-xs--line-height: calc(1 / 0.75); + --text-sm: 0.875rem; + --text-sm--line-height: calc(1.25 / 0.875); + --text-base: 1rem; + --text-base--line-height: calc(1.5 / 1); + --text-xl: 1.25rem; + --text-xl--line-height: calc(1.75 / 1.25); + --text-2xl: 1.5rem; + --text-2xl--line-height: calc(2 / 1.5); + --text-3xl: 1.875rem; + --text-3xl--line-height: calc(2.25 / 1.875); + --font-weight-light: 300; + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + --font-weight-extrabold: 800; + --tracking-tight: -0.025em; + --leading-tight: 1.25; + --radius-md: 0.375rem; + --radius-lg: 0.5rem; + --ease-out: cubic-bezier(0, 0, 0.2, 1); + --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1); + --animate-spin: spin 1s linear infinite; + --default-transition-duration: 150ms; + --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); --default-font-family: var(--font-sans); --default-mono-font-family: var(--font-mono); } @@ -158,7 +209,1975 @@ display: none !important; } } -@layer utilities; +@layer utilities { + .tooltip { + @layer daisyui.l1.l2.l3 { + position: relative; + display: inline-block; + --tt-bg: var(--color-neutral); + --tt-off: calc(100% + 0.5rem); + --tt-tail: calc(100% + 1px + 0.25rem); + & > .tooltip-content, &[data-tip]:before { + position: absolute; + max-width: 20rem; + border-radius: var(--radius-field); + padding-inline: calc(0.25rem * 2); + padding-block: calc(0.25rem * 1); + text-align: center; + white-space: normal; + color: var(--color-neutral-content); + opacity: 0%; + font-size: 0.875rem; + line-height: 1.25; + background-color: var(--tt-bg); + width: max-content; + pointer-events: none; + z-index: 2; + --tw-content: attr(data-tip); + content: var(--tw-content); + } + &:after { + opacity: 0%; + background-color: var(--tt-bg); + content: ""; + pointer-events: none; + width: 0.625rem; + height: 0.25rem; + display: block; + position: absolute; + mask-repeat: no-repeat; + mask-position: -1px 0; + --mask-tooltip: url("data:image/svg+xml,%3Csvg width='10' height='4' viewBox='0 0 8 4' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0.500009 1C3.5 1 3.00001 4 5.00001 4C7 4 6.5 1 9.5 1C10 1 10 0.499897 10 0H0C-1.99338e-08 0.5 0 1 0.500009 1Z' fill='black'/%3E%3C/svg%3E%0A"); + mask-image: var(--mask-tooltip); + } + @media (prefers-reduced-motion: no-preference) { + & > .tooltip-content, &[data-tip]:before, &:after { + transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 75ms; + } + } + &:is([data-tip]:not([data-tip=""]), :has(.tooltip-content:not(:empty))) { + &.tooltip-open, &:hover, &:has(:focus-visible) { + & > .tooltip-content, &[data-tip]:before, &:after { + opacity: 100%; + --tt-pos: 0rem; + @media (prefers-reduced-motion: no-preference) { + transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0s, transform 0.2s cubic-bezier(0.4, 0, 0.2, 1) 0s; + } + } + } + } + } + @layer daisyui.l1.l2 { + > .tooltip-content, &[data-tip]:before { + transform: translateX(-50%) translateY(var(--tt-pos, 0.25rem)); + inset: auto auto var(--tt-off) 50%; + } + &:after { + transform: translateX(-50%) translateY(var(--tt-pos, 0.25rem)); + inset: auto auto var(--tt-tail) 50%; + } + } + } + .menu { + @layer daisyui.l1.l2.l3 { + display: flex; + width: fit-content; + flex-direction: column; + flex-wrap: wrap; + padding: calc(0.25rem * 2); + --menu-active-fg: var(--color-neutral-content); + --menu-active-bg: var(--color-neutral); + font-size: 0.875rem; + :where(li ul) { + position: relative; + margin-inline-start: calc(0.25rem * 4); + padding-inline-start: calc(0.25rem * 2); + white-space: nowrap; + &:before { + position: absolute; + inset-inline-start: calc(0.25rem * 0); + top: calc(0.25rem * 3); + bottom: calc(0.25rem * 3); + background-color: var(--color-base-content); + opacity: 10%; + width: var(--border); + content: ""; + } + } + :where(li > .menu-dropdown:not(.menu-dropdown-show)) { + display: none; + } + :where(li:not(.menu-title) > *:not(ul, details, .menu-title, .btn)), :where(li:not(.menu-title) > details > summary:not(.menu-title)) { + display: grid; + grid-auto-flow: column; + align-content: flex-start; + align-items: center; + gap: calc(0.25rem * 2); + border-radius: var(--radius-field); + padding-inline: calc(0.25rem * 3); + padding-block: calc(0.25rem * 1.5); + text-align: start; + transition-property: color, background-color, box-shadow; + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + grid-auto-columns: minmax(auto, max-content) auto max-content; + text-wrap: balance; + user-select: none; + } + :where(li > details > summary) { + --tw-outline-style: none; + outline-style: none; + @media (forced-colors: active) { + outline: 2px solid transparent; + outline-offset: 2px; + } + &::-webkit-details-marker { + display: none; + } + } + :where(li > details > summary), :where(li > .menu-dropdown-toggle) { + &:after { + justify-self: flex-end; + display: block; + height: 0.375rem; + width: 0.375rem; + rotate: -135deg; + translate: 0 -1px; + transition-property: rotate, translate; + transition-duration: 0.2s; + content: ""; + transform-origin: 50% 50%; + box-shadow: 2px 2px inset; + pointer-events: none; + } + } + details { + overflow: hidden; + interpolate-size: allow-keywords; + } + details::details-content { + block-size: 0; + @media (prefers-reduced-motion: no-preference) { + transition-behavior: allow-discrete; + transition-property: block-size, content-visibility; + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + } + } + details[open]::details-content { + block-size: auto; + } + :where(li > details[open] > summary):after, :where(li > .menu-dropdown-toggle.menu-dropdown-show):after { + rotate: 45deg; + translate: 0 1px; + } + :where( li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title), li:not(.menu-title, .disabled) > details > summary:not(.menu-title) ):not(.menu-active, :active, .btn) { + &.menu-focus, &:focus-visible { + cursor: pointer; + background-color: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent); + } + color: var(--color-base-content); + --tw-outline-style: none; + outline-style: none; + @media (forced-colors: active) { + outline: 2px solid transparent; + outline-offset: 2px; + } + } + } + :where( li:not(.menu-title, .disabled) > *:not(ul, details, .menu-title):not(.menu-active, :active, .btn):hover, li:not(.menu-title, .disabled) > details > summary:not(.menu-title):not(.menu-active, :active, .btn):hover ) { + cursor: pointer; + background-color: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent); + } + --tw-outline-style: none; + outline-style: none; + @media (forced-colors: active) { + outline: 2px solid transparent; + outline-offset: 2px; + } + box-shadow: 0 1px oklch(0% 0 0 / 0.01) inset, 0 -1px oklch(100% 0 0 / 0.01) inset; + } + :where(li:empty) { + background-color: var(--color-base-content); + opacity: 10%; + margin: 0.5rem 1rem; + height: 1px; + } + :where(li) { + position: relative; + display: flex; + flex-shrink: 0; + flex-direction: column; + flex-wrap: wrap; + align-items: stretch; + .badge { + justify-self: flex-end; + } + & > *:not(ul, .menu-title, details, .btn):active, & > *:not(ul, .menu-title, details, .btn).menu-active, & > details > summary:active { + --tw-outline-style: none; + outline-style: none; + @media (forced-colors: active) { + outline: 2px solid transparent; + outline-offset: 2px; + } + color: var(--menu-active-fg); + background-color: var(--menu-active-bg); + background-size: auto, calc(var(--noise) * 100%); + background-image: none, var(--fx-noise); + &:not(&:active) { + box-shadow: 0 2px calc(var(--depth) * 3px) -2px var(--menu-active-bg); + } + } + &.menu-disabled { + pointer-events: none; + color: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, var(--color-base-content) 20%, transparent); + } + } + } + .dropdown:focus-within { + .menu-dropdown-toggle:after { + rotate: 45deg; + translate: 0 1px; + } + } + .dropdown-content { + margin-top: calc(0.25rem * 2); + padding: calc(0.25rem * 2); + &:before { + display: none; + } + } + } + } + .dropdown { + @layer daisyui.l1.l2.l3 { + position: relative; + display: inline-block; + position-area: var(--anchor-v, bottom) var(--anchor-h, span-right); + & > *:not(:has(~ [class*="dropdown-content"])):focus { + --tw-outline-style: none; + outline-style: none; + @media (forced-colors: active) { + outline: 2px solid transparent; + outline-offset: 2px; + } + } + .dropdown-content { + position: absolute; + } + &.dropdown-close .dropdown-content, &:not(details, .dropdown-open, .dropdown-hover:hover, :focus-within) .dropdown-content, &.dropdown-hover:not(:hover) [tabindex]:first-child:focus:not(:focus-visible) ~ .dropdown-content { + display: none; + transform-origin: top; + opacity: 0%; + scale: 95%; + } + &[popover], .dropdown-content { + z-index: 999; + @media (prefers-reduced-motion: no-preference) { + animation: dropdown 0.2s; + transition-property: opacity, scale, display; + transition-behavior: allow-discrete; + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + } + } + @starting-style { + &[popover], .dropdown-content { + scale: 95%; + opacity: 0; + } + } + &:not(.dropdown-close) { + &.dropdown-open, &:not(.dropdown-hover):focus, &:focus-within { + > [tabindex]:first-child { + pointer-events: none; + } + .dropdown-content { + opacity: 100%; + scale: 100%; + } + } + &.dropdown-hover:hover { + .dropdown-content { + opacity: 100%; + scale: 100%; + } + } + } + &:is(details) { + summary { + &::-webkit-details-marker { + display: none; + } + } + } + &:where([popover]) { + background: #0000; + } + &[popover] { + position: fixed; + color: inherit; + @supports not (position-area: bottom) { + margin: auto; + &.dropdown-close, &.dropdown-open:not(:popover-open) { + display: none; + transform-origin: top; + opacity: 0%; + scale: 95%; + } + &::backdrop { + background-color: color-mix(in oklab, #000 30%, #0000); + } + } + &.dropdown-close, &:not(.dropdown-open, :popover-open) { + display: none; + transform-origin: top; + opacity: 0%; + scale: 95%; + } + } + } + } + .btn { + :where(&) { + @layer daisyui.l1.l2.l3 { + width: unset; + } + } + .prose :where(a&:not(.btn-link)):not(:where([class~="not-prose"], [class~="not-prose"] *)) { + text-decoration-line: none; + } + @layer daisyui.l1.l2.l3 { + display: inline-flex; + flex-shrink: 0; + cursor: pointer; + flex-wrap: nowrap; + align-items: center; + justify-content: center; + gap: calc(0.25rem * 1.5); + text-align: center; + vertical-align: middle; + outline-offset: 2px; + webkit-user-select: none; + user-select: none; + padding-inline: var(--btn-p); + color: var(--btn-fg); + --tw-prose-links: var(--btn-fg); + height: var(--size); + font-size: var(--fontsize, 0.875rem); + font-weight: 600; + outline-color: var(--btn-color, var(--color-base-content)); + transition-property: color, background-color, border-color, box-shadow; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + transition-duration: 0.2s; + border-start-start-radius: var(--join-ss, var(--radius-field)); + border-start-end-radius: var(--join-se, var(--radius-field)); + border-end-start-radius: var(--join-es, var(--radius-field)); + border-end-end-radius: var(--join-ee, var(--radius-field)); + background-color: var(--btn-bg); + background-size: auto, calc(var(--noise) * 100%); + background-image: none, var(--btn-noise); + border-width: var(--border); + border-style: solid; + border-color: var(--btn-border); + text-shadow: 0 0.5px oklch(100% 0 0 / calc(var(--depth) * 0.15)); + touch-action: manipulation; + box-shadow: 0 0.5px 0 0.5px oklch(100% 0 0 / calc(var(--depth) * 6%)) inset, var(--btn-shadow); + --size: calc(var(--size-field, 0.25rem) * 10); + --btn-bg: var(--btn-color, var(--color-base-200)); + --btn-fg: var(--color-base-content); + --btn-p: 1rem; + --btn-border: var(--btn-bg); + @supports (color: color-mix(in lab, red, red)) { + --btn-border: color-mix(in oklab, var(--btn-bg), #000 calc(var(--depth) * 5%)); + } + --btn-shadow: 0 3px 2px -2px var(--btn-bg), + 0 4px 3px -2px var(--btn-bg); + @supports (color: color-mix(in lab, red, red)) { + --btn-shadow: 0 3px 2px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000), + 0 4px 3px -2px color-mix(in oklab, var(--btn-bg) calc(var(--depth) * 30%), #0000); + } + --btn-noise: var(--fx-noise); + @media (hover: hover) { + &:hover { + --btn-bg: var(--btn-color, var(--color-base-200)); + @supports (color: color-mix(in lab, red, red)) { + --btn-bg: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%); + } + } + } + &:focus-visible, &:has(:focus-visible) { + outline-width: 2px; + outline-style: solid; + isolation: isolate; + } + &:active:not(.btn-active) { + translate: 0 0.5px; + --btn-bg: var(--btn-color, var(--color-base-200)); + @supports (color: color-mix(in lab, red, red)) { + --btn-bg: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 5%); + } + --btn-border: var(--btn-color, var(--color-base-200)); + @supports (color: color-mix(in lab, red, red)) { + --btn-border: color-mix(in oklab, var(--btn-color, var(--color-base-200)), #000 7%); + } + --btn-shadow: 0 0 0 0 oklch(0% 0 0/0), 0 0 0 0 oklch(0% 0 0/0); + } + &:is(input[type="checkbox"], input[type="radio"]) { + appearance: none; + &[aria-label]::after { + --tw-content: attr(aria-label); + content: var(--tw-content); + } + } + &:where(input:checked:not(.filter .btn)) { + --btn-color: var(--color-primary); + --btn-fg: var(--color-primary-content); + isolation: isolate; + } + } + &:disabled { + @layer daisyui.l1.l2 { + &:not(.btn-link, .btn-ghost) { + background-color: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent); + } + box-shadow: none; + } + pointer-events: none; + --btn-border: #0000; + --btn-noise: none; + --btn-fg: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + --btn-fg: color-mix(in oklch, var(--color-base-content) 20%, #0000); + } + } + } + &[disabled] { + @layer daisyui.l1.l2 { + &:not(.btn-link, .btn-ghost) { + background-color: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-base-content) 10%, transparent); + } + box-shadow: none; + } + pointer-events: none; + --btn-border: #0000; + --btn-noise: none; + --btn-fg: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + --btn-fg: color-mix(in oklch, var(--color-base-content) 20%, #0000); + } + } + } + } + .invisible { + visibility: hidden; + } + .input { + @layer daisyui.l1.l2.l3 { + cursor: text; + border: var(--border) solid #0000; + position: relative; + display: inline-flex; + flex-shrink: 1; + appearance: none; + align-items: center; + gap: calc(0.25rem * 2); + background-color: var(--color-base-100); + padding-inline: calc(0.25rem * 3); + vertical-align: middle; + white-space: nowrap; + width: clamp(3rem, 20rem, 100%); + height: var(--size); + font-size: max(var(--font-size, 0.875rem), 0.875rem); + touch-action: manipulation; + border-start-start-radius: var(--join-ss, var(--radius-field)); + border-start-end-radius: var(--join-se, var(--radius-field)); + border-end-start-radius: var(--join-es, var(--radius-field)); + border-end-end-radius: var(--join-ee, var(--radius-field)); + border-color: var(--input-color); + box-shadow: 0 1px var(--input-color) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset; + @supports (color: color-mix(in lab, red, red)) { + box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000) inset, 0 -1px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset; + } + --size: calc(var(--size-field, 0.25rem) * 10); + --input-color: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + --input-color: color-mix(in oklab, var(--color-base-content) 20%, #0000); + } + &:where(input) { + display: inline-flex; + } + :where(input) { + display: inline-flex; + height: 100%; + width: 100%; + appearance: none; + background-color: transparent; + border: none; + &:focus, &:focus-within { + --tw-outline-style: none; + outline-style: none; + @media (forced-colors: active) { + outline: 2px solid transparent; + outline-offset: 2px; + } + } + } + :where(input[type="url"]), :where(input[type="email"]) { + direction: ltr; + } + :where(input[type="date"]) { + display: inline-flex; + } + &:focus, &:focus-within { + --input-color: var(--color-base-content); + box-shadow: 0 1px var(--input-color); + @supports (color: color-mix(in lab, red, red)) { + box-shadow: 0 1px color-mix(in oklab, var(--input-color) calc(var(--depth) * 10%), #0000); + } + outline: 2px solid var(--input-color); + outline-offset: 2px; + isolation: isolate; + } + @media (pointer: coarse) { + @supports (-webkit-touch-callout: none) { + &:focus, &:focus-within { + --font-size: 1rem; + } + } + } + &:has(> input[disabled]), &:is(:disabled, [disabled]), fieldset:disabled & { + cursor: not-allowed; + border-color: var(--color-base-200); + background-color: var(--color-base-200); + color: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, var(--color-base-content) 40%, transparent); + } + &::placeholder { + color: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, var(--color-base-content) 20%, transparent); + } + } + box-shadow: none; + } + &:has(> input[disabled]) > input[disabled] { + cursor: not-allowed; + } + &::-webkit-date-and-time-value { + text-align: inherit; + } + &[type="number"] { + &::-webkit-inner-spin-button { + margin-block: calc(0.25rem * -3); + margin-inline-end: calc(0.25rem * -3); + } + } + &::-webkit-calendar-picker-indicator { + position: absolute; + inset-inline-end: 0.75em; + } + &:has(> input[type="date"]) { + :where(input[type="date"]) { + display: inline-flex; + webkit-appearance: none; + appearance: none; + } + input[type="date"]::-webkit-calendar-picker-indicator { + position: absolute; + inset-inline-end: 0.75em; + width: 1em; + height: 1em; + cursor: pointer; + } + } + } + } + .navbar { + position: fixed; + top: calc(var(--spacing) * 0); + left: calc(var(--spacing) * 0); + z-index: 10; + display: flex; + width: 100%; + justify-content: space-between; + background-color: var(--color-base-300); + padding-inline: calc(var(--spacing) * 4); + --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .steps { + @layer daisyui.l1.l2.l3 { + display: inline-grid; + grid-auto-flow: column; + overflow: hidden; + overflow-x: auto; + counter-reset: step; + grid-auto-columns: 1fr; + .step { + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + grid-template-columns: auto; + grid-template-rows: repeat(2, minmax(0, 1fr)); + grid-template-rows: 40px 1fr; + place-items: center; + text-align: center; + min-width: 4rem; + --step-bg: var(--color-base-300); + --step-fg: var(--color-base-content); + &:before { + top: calc(0.25rem * 0); + grid-column-start: 1; + grid-row-start: 1; + height: calc(0.25rem * 2); + width: 100%; + border: 1px solid; + color: var(--step-bg); + background-color: var(--step-bg); + content: ""; + margin-inline-start: -100%; + } + > .step-icon, &:not(:has(.step-icon)):after { + --tw-content: counter(step); + content: var(--tw-content); + counter-increment: step; + z-index: 1; + color: var(--step-fg); + background-color: var(--step-bg); + border: 1px solid var(--step-bg); + position: relative; + grid-column-start: 1; + grid-row-start: 1; + display: grid; + height: calc(0.25rem * 8); + width: calc(0.25rem * 8); + place-items: center; + place-self: center; + border-radius: calc(infinity * 1px); + } + &:first-child:before { + --tw-content: none; + content: var(--tw-content); + } + &[data-content]:after { + --tw-content: attr(data-content); + content: var(--tw-content); + } + } + } + @layer daisyui.l1.l2 { + .step-neutral { + + .step-neutral:before, &:after, > .step-icon { + --step-bg: var(--color-neutral); + --step-fg: var(--color-neutral-content); + } + } + .step-primary { + + .step-primary:before, &:after, > .step-icon { + --step-bg: var(--color-primary); + --step-fg: var(--color-primary-content); + } + } + .step-secondary { + + .step-secondary:before, &:after, > .step-icon { + --step-bg: var(--color-secondary); + --step-fg: var(--color-secondary-content); + } + } + .step-accent { + + .step-accent:before, &:after, > .step-icon { + --step-bg: var(--color-accent); + --step-fg: var(--color-accent-content); + } + } + .step-info { + + .step-info:before, &:after, > .step-icon { + --step-bg: var(--color-info); + --step-fg: var(--color-info-content); + } + } + .step-success { + + .step-success:before, &:after, > .step-icon { + --step-bg: var(--color-success); + --step-fg: var(--color-success-content); + } + } + .step-warning { + + .step-warning:before, &:after, > .step-icon { + --step-bg: var(--color-warning); + --step-fg: var(--color-warning-content); + } + } + .step-error { + + .step-error:before, &:after, > .step-icon { + --step-bg: var(--color-error); + --step-fg: var(--color-error-content); + } + } + } + } + .sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; + border-width: 0; + } + .avatar { + @layer daisyui.l1.l2.l3 { + position: relative; + display: inline-flex; + vertical-align: middle; + & > div { + display: block; + aspect-ratio: 1 / 1; + overflow: hidden; + } + img { + height: 100%; + width: 100%; + object-fit: cover; + } + } + } + .radio { + @layer daisyui.l1.l2.l3 { + position: relative; + display: inline-block; + flex-shrink: 0; + cursor: pointer; + appearance: none; + border-radius: calc(infinity * 1px); + padding: calc(0.25rem * 1); + vertical-align: middle; + border: var(--border) solid var(--input-color, currentColor); + @supports (color: color-mix(in lab, red, red)) { + border: var(--border) solid var(--input-color, color-mix(in srgb, currentColor 20%, #0000)); + } + box-shadow: 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset; + --size: calc(var(--size-selector, 0.25rem) * 6); + width: var(--size); + height: var(--size); + color: var(--input-color, currentColor); + &:before { + display: block; + width: 100%; + height: 100%; + border-radius: calc(infinity * 1px); + --tw-content: ""; + content: var(--tw-content); + background-size: auto, calc(var(--noise) * 100%); + background-image: none, var(--fx-noise); + } + &:focus-visible { + outline: 2px solid currentColor; + } + &:checked, &[aria-checked="true"] { + border-color: currentcolor; + background-color: var(--color-base-100); + @media (prefers-reduced-motion: no-preference) { + animation: radio 0.2s ease-out; + } + &:before { + background-color: currentcolor; + box-shadow: 0 -1px oklch(0% 0 0 / calc(var(--depth) * 0.1)) inset, 0 8px 0 -4px oklch(100% 0 0 / calc(var(--depth) * 0.1)) inset, 0 1px oklch(0% 0 0 / calc(var(--depth) * 0.1)); + } + @media (forced-colors: active) { + &:before { + outline-style: var(--tw-outline-style); + outline-width: 1px; + outline-offset: calc(1px * -1); + } + } + @media print { + &:before { + outline: 0.25rem solid; + outline-offset: -1rem; + } + } + } + } + &:disabled { + @layer daisyui.l1.l2 { + cursor: not-allowed; + opacity: 20%; + } + } + } + .navbar { + @layer daisyui.l1.l2.l3 { + display: flex; + width: 100%; + align-items: center; + padding: 0.5rem; + min-height: 4rem; + } + :where(&) { + @layer daisyui.l1.l2 { + position: relative; + } + } + } + .card { + @layer daisyui.l1.l2.l3 { + position: relative; + display: flex; + flex-direction: column; + border-radius: var(--radius-box); + outline-width: 2px; + transition: outline 0.2s ease-in-out; + outline: 0 solid #0000; + outline-offset: 2px; + &:focus { + --tw-outline-style: none; + outline-style: none; + @media (forced-colors: active) { + outline: 2px solid transparent; + outline-offset: 2px; + } + } + &:focus-visible { + outline-color: currentColor; + } + :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; + } + :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; + } + figure { + display: flex; + align-items: center; + justify-content: center; + } + &:has(> input:is(input[type="checkbox"], input[type="radio"])) { + cursor: pointer; + user-select: none; + } + &:has(> :checked) { + outline: 2px solid currentColor; + } + } + } + .absolute { + position: absolute; + } + .relative { + position: relative; + } + .static { + position: static; + } + .dropdown-end { + @layer daisyui.l1.l2 { + --anchor-h: span-left; + :where(.dropdown-content) { + inset-inline-end: calc(0.25rem * 0); + translate: 0 0; + [dir="rtl"] & { + translate: 0 0; + } + } + &.dropdown-left { + --anchor-h: left; + --anchor-v: span-top; + .dropdown-content { + top: auto; + bottom: calc(0.25rem * 0); + } + } + &.dropdown-right { + --anchor-h: right; + --anchor-v: span-top; + .dropdown-content { + top: auto; + bottom: calc(0.25rem * 0); + } + } + } + } + .z-1 { + z-index: 1; + } + .z-10 { + z-index: 10; + } + .mx-4 { + margin-inline: calc(var(--spacing) * 4); + } + .mx-auto { + margin-inline: auto; + } + .my-2 { + margin-block: calc(var(--spacing) * 2); + } + .my-4 { + margin-block: calc(var(--spacing) * 4); + } + .my-6 { + margin-block: calc(var(--spacing) * 6); + } + .label { + @layer daisyui.l1.l2.l3 { + display: inline-flex; + align-items: center; + gap: calc(0.25rem * 1.5); + white-space: nowrap; + color: currentcolor; + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, currentcolor 60%, transparent); + } + &:has(input) { + cursor: pointer; + } + &:is(.input > *, .select > *) { + display: flex; + height: calc(100% - 0.5rem); + align-items: center; + padding-inline: calc(0.25rem * 3); + white-space: nowrap; + font-size: inherit; + &:first-child { + margin-inline-start: calc(0.25rem * -3); + margin-inline-end: calc(0.25rem * 3); + border-inline-end: var(--border) solid currentColor; + @supports (color: color-mix(in lab, red, red)) { + border-inline-end: var(--border) solid color-mix(in oklab, currentColor 10%, #0000); + } + } + &:last-child { + margin-inline-start: calc(0.25rem * 3); + margin-inline-end: calc(0.25rem * -3); + border-inline-start: var(--border) solid currentColor; + @supports (color: color-mix(in lab, red, red)) { + border-inline-start: var(--border) solid color-mix(in oklab, currentColor 10%, #0000); + } + } + } + } + } + .-ms-0\.5 { + margin-inline-start: calc(var(--spacing) * -0.5); + } + .-ms-2 { + margin-inline-start: calc(var(--spacing) * -2); + } + .ms-1 { + margin-inline-start: calc(var(--spacing) * 1); + } + .me-1 { + margin-inline-end: calc(var(--spacing) * 1); + } + .me-1\.5 { + margin-inline-end: calc(var(--spacing) * 1.5); + } + .me-2 { + margin-inline-end: calc(var(--spacing) * 2); + } + .mt-0\.5 { + margin-top: calc(var(--spacing) * 0.5); + } + .mt-1\.5 { + margin-top: calc(var(--spacing) * 1.5); + } + .mt-3 { + margin-top: calc(var(--spacing) * 3); + } + .mt-4 { + margin-top: calc(var(--spacing) * 4); + } + .mt-6 { + margin-top: calc(var(--spacing) * 6); + } + .mt-24 { + margin-top: calc(var(--spacing) * 24); + } + .mr-2 { + margin-right: calc(var(--spacing) * 2); + } + .mr-4 { + margin-right: calc(var(--spacing) * 4); + } + .product-grid { + margin-bottom: calc(var(--spacing) * 4); + display: grid; + gap: calc(var(--spacing) * 4); + @media (width >= 40rem) { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + @media (width >= 48rem) { + margin-bottom: calc(var(--spacing) * 8); + } + @media (width >= 64rem) { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + @media (width >= 80rem) { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + } + .mb-2 { + margin-bottom: calc(var(--spacing) * 2); + } + .mb-4 { + margin-bottom: calc(var(--spacing) * 4); + } + .mb-6 { + margin-bottom: calc(var(--spacing) * 6); + } + .ml-1 { + margin-left: calc(var(--spacing) * 1); + } + .ml-2 { + margin-left: calc(var(--spacing) * 2); + } + .ml-3 { + margin-left: calc(var(--spacing) * 3); + } + .carousel-item { + @layer daisyui.l1.l2.l3 { + box-sizing: content-box; + display: flex; + flex: none; + scroll-snap-align: start; + } + } + .status { + @layer daisyui.l1.l2.l3 { + display: inline-block; + aspect-ratio: 1 / 1; + width: calc(0.25rem * 2); + height: calc(0.25rem * 2); + border-radius: var(--radius-selector); + background-color: var(--color-base-content); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-base-content) 20%, transparent); + } + background-position: center; + background-repeat: no-repeat; + vertical-align: middle; + color: color-mix(in srgb, #000 30%, transparent); + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, var(--color-black) 30%, transparent); + } + background-image: radial-gradient( circle at 35% 30%, oklch(1 0 0 / calc(var(--depth) * 0.5)), #0000 ); + box-shadow: 0 2px 3px -1px currentColor; + @supports (color: color-mix(in lab, red, red)) { + box-shadow: 0 2px 3px -1px color-mix(in oklab, currentColor calc(var(--depth) * 100%), #0000); + } + } + } + .carousel { + @layer daisyui.l1.l2.l3 { + display: inline-flex; + overflow-x: scroll; + scroll-snap-type: x mandatory; + scrollbar-width: none; + @media (prefers-reduced-motion: no-preference) { + scroll-behavior: smooth; + } + &::-webkit-scrollbar { + display: none; + } + } + } + .block { + display: block; + } + .contents { + display: contents; + } + .flex { + display: flex; + } + .flow-root { + display: flow-root; + } + .grid { + display: grid; + } + .hidden { + display: none; + } + .inline-block { + display: inline-block; + } + .inline-flex { + display: inline-flex; + } + .btn-circle { + @layer daisyui.l1.l2 { + border-radius: calc(infinity * 1px); + padding-inline: calc(0.25rem * 0); + width: var(--size); + height: var(--size); + } + } + .h-4 { + height: calc(var(--spacing) * 4); + } + .h-5 { + height: calc(var(--spacing) * 5); + } + .h-8 { + height: calc(var(--spacing) * 8); + } + .h-20 { + height: calc(var(--spacing) * 20); + } + .h-56 { + height: calc(var(--spacing) * 56); + } + .h-\[1em\] { + height: 1em; + } + .h-full { + height: 100%; + } + .h-px { + height: 1px; + } + .w-1\/2 { + width: calc(1 / 2 * 100%); + } + .w-4 { + width: calc(var(--spacing) * 4); + } + .w-5 { + width: calc(var(--spacing) * 5); + } + .w-8 { + width: calc(var(--spacing) * 8); + } + .w-10 { + width: calc(var(--spacing) * 10); + } + .w-20 { + width: calc(var(--spacing) * 20); + } + .w-52 { + width: calc(var(--spacing) * 52); + } + .w-full { + width: 100%; + } + .max-w-4xl { + max-width: var(--container-4xl); + } + .max-w-5xl { + max-width: var(--container-5xl); + } + .max-w-md { + max-width: var(--container-md); + } + .max-w-screen-lg { + max-width: var(--breakpoint-lg); + } + .max-w-screen-xl { + max-width: var(--breakpoint-xl); + } + .min-w-0 { + min-width: calc(var(--spacing) * 0); + } + .min-w-full { + min-width: 100%; + } + .flex-1 { + flex: 1; + } + .flex-none { + flex: none; + } + .shrink-0 { + flex-shrink: 0; + } + .animate-spin { + animation: var(--animate-spin); + } + .link { + @layer daisyui.l1.l2.l3 { + cursor: pointer; + text-decoration-line: underline; + &:focus { + --tw-outline-style: none; + outline-style: none; + @media (forced-colors: active) { + outline: 2px solid transparent; + outline-offset: 2px; + } + } + &:focus-visible { + outline: 2px solid currentColor; + outline-offset: 2px; + } + } + } + .cursor-pointer { + cursor: pointer; + } + .flex-col { + flex-direction: column; + } + .flex-wrap { + flex-wrap: wrap; + } + .items-center { + align-items: center; + } + .justify-between { + justify-content: space-between; + } + .justify-center { + justify-content: center; + } + .justify-end { + justify-content: flex-end; + } + .gap-1 { + gap: calc(var(--spacing) * 1); + } + .gap-2 { + gap: calc(var(--spacing) * 2); + } + .gap-4 { + gap: calc(var(--spacing) * 4); + } + .gap-6 { + gap: calc(var(--spacing) * 6); + } + .space-y-0 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse))); + } + } + .space-y-2 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); + } + } + .space-y-3 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse))); + } + } + .space-y-4 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse))); + } + } + .space-y-6 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))); + } + } + .space-x-4 { + :where(& > :not(:last-child)) { + --tw-space-x-reverse: 0; + margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse)); + margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse))); + } + } + .gap-y-4 { + row-gap: calc(var(--spacing) * 4); + } + .divide-y { + :where(& > :not(:last-child)) { + --tw-divide-y-reverse: 0; + border-bottom-style: var(--tw-border-style); + border-top-style: var(--tw-border-style); + border-top-width: calc(1px * var(--tw-divide-y-reverse)); + border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + } + } + .divide-gray-200 { + :where(& > :not(:last-child)) { + border-color: var(--color-gray-200); + } + } + .truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .card { + border-radius: var(--radius-lg); + border-color: var(--color-primary); + padding: calc(var(--spacing) * 6); + --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .menu-sm { + @layer daisyui.l1.l2 { + :where(li:not(.menu-title) > *:not(ul, details, .menu-title)), :where(li:not(.menu-title) > details > summary:not(.menu-title)) { + border-radius: var(--radius-field); + padding-inline: calc(0.25rem * 2.5); + padding-block: calc(0.25rem * 1); + font-size: 0.75rem; + } + .menu-title { + padding-inline: calc(0.25rem * 3); + padding-block: calc(0.25rem * 2); + } + } + } + .rounded { + border-radius: 0.25rem; + } + .rounded-box { + border-radius: var(--radius-box); + } + .rounded-box { + border-radius: var(--radius-box); + } + .rounded-full { + border-radius: calc(infinity * 1px); + } + .rounded-lg { + border-radius: var(--radius-lg); + } + .rounded-md { + border-radius: var(--radius-md); + } + .bg-base-100 { + background-color: var(--color-base-100); + } + .p-2 { + padding: calc(var(--spacing) * 2); + } + .p-4 { + padding: calc(var(--spacing) * 4); + } + .p-6 { + padding: calc(var(--spacing) * 6); + } + .p-8 { + padding: calc(var(--spacing) * 8); + } + .px-2\.5 { + padding-inline: calc(var(--spacing) * 2.5); + } + .px-3 { + padding-inline: calc(var(--spacing) * 3); + } + .px-4 { + padding-inline: calc(var(--spacing) * 4); + } + .px-5 { + padding-inline: calc(var(--spacing) * 5); + } + .px-6 { + padding-inline: calc(var(--spacing) * 6); + } + .px-8 { + padding-inline: calc(var(--spacing) * 8); + } + .py-0\.5 { + padding-block: calc(var(--spacing) * 0.5); + } + .py-2 { + padding-block: calc(var(--spacing) * 2); + } + .py-2\.5 { + padding-block: calc(var(--spacing) * 2.5); + } + .py-6 { + padding-block: calc(var(--spacing) * 6); + } + .py-8 { + padding-block: calc(var(--spacing) * 8); + } + .pt-2 { + padding-top: calc(var(--spacing) * 2); + } + .pt-6 { + padding-top: calc(var(--spacing) * 6); + } + .text-center { + text-align: center; + } + .text-end { + text-align: end; + } + .text-start { + text-align: start; + } + .text-2xl { + font-size: var(--text-2xl); + line-height: var(--tw-leading, var(--text-2xl--line-height)); + } + .text-base { + font-size: var(--text-base); + line-height: var(--tw-leading, var(--text-base--line-height)); + } + .text-sm { + font-size: var(--text-sm); + line-height: var(--tw-leading, var(--text-sm--line-height)); + } + .text-xl { + font-size: var(--text-xl); + line-height: var(--tw-leading, var(--text-xl--line-height)); + } + .text-xs { + font-size: var(--text-xs); + line-height: var(--tw-leading, var(--text-xs--line-height)); + } + .leading-none { + --tw-leading: 1; + line-height: 1; + } + .leading-tight { + --tw-leading: var(--leading-tight); + line-height: var(--leading-tight); + } + .font-bold { + --tw-font-weight: var(--font-weight-bold); + font-weight: var(--font-weight-bold); + } + .font-extrabold { + --tw-font-weight: var(--font-weight-extrabold); + font-weight: var(--font-weight-extrabold); + } + .font-light { + --tw-font-weight: var(--font-weight-light); + font-weight: var(--font-weight-light); + } + .font-medium { + --tw-font-weight: var(--font-weight-medium); + font-weight: var(--font-weight-medium); + } + .font-normal { + --tw-font-weight: var(--font-weight-normal); + font-weight: var(--font-weight-normal); + } + .font-semibold { + --tw-font-weight: var(--font-weight-semibold); + font-weight: var(--font-weight-semibold); + } + .tracking-tight { + --tw-tracking: var(--tracking-tight); + letter-spacing: var(--tracking-tight); + } + .text-base-content { + color: var(--color-base-content); + } + .text-blue-800 { + color: var(--color-blue-800); + } + .text-gray-500 { + color: var(--color-gray-500); + } + .text-gray-900 { + color: var(--color-gray-900); + } + .text-green-600 { + color: var(--color-green-600); + } + .text-green-800 { + color: var(--color-green-800); + } + .text-red-600 { + color: var(--color-red-600); + } + .text-red-700 { + color: var(--color-red-700); + } + .text-red-800 { + color: var(--color-red-800); + } + .text-red-900 { + color: var(--color-red-900); + } + .text-white { + color: var(--color-white); + } + .text-yellow-800 { + color: var(--color-yellow-800); + } + .underline { + text-decoration-line: underline; + } + .antialiased { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + .opacity-0 { + opacity: 0%; + } + .opacity-50 { + opacity: 50%; + } + .shadow { + --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .shadow-md { + --tw-shadow: 0 4px 6px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 2px 4px -2px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .transition-opacity { + transition-property: opacity; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } + .duration-300 { + --tw-duration: 300ms; + transition-duration: 300ms; + } + .btn-xs { + @layer daisyui.l1.l2 { + --fontsize: 0.6875rem; + --btn-p: 0.5rem; + --size: calc(var(--size-field, 0.25rem) * 6); + } + } + .btn-primary { + @layer daisyui.l1.l2.l3 { + --btn-color: var(--color-primary); + --btn-fg: var(--color-primary-content); + } + } + .hover\:text-red-700 { + &:hover { + @media (hover: hover) { + color: var(--color-red-700); + } + } + } + .hover\:no-underline { + &:hover { + @media (hover: hover) { + text-decoration-line: none; + } + } + } + .hover\:underline { + &:hover { + @media (hover: hover) { + text-decoration-line: underline; + } + } + } + .focus\:z-10 { + &:focus { + z-index: 10; + } + } + .focus\:ring-0 { + &:focus { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + } + .focus\:ring-4 { + &:focus { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + } + .focus\:ring-gray-100 { + &:focus { + --tw-ring-color: var(--color-gray-100); + } + } + .focus\:outline-none { + &:focus { + --tw-outline-style: none; + outline-style: none; + } + } + .sm\:col-span-2 { + @media (width >= 40rem) { + grid-column: span 2 / span 2; + } + } + .sm\:m-8 { + @media (width >= 40rem) { + margin: calc(var(--spacing) * 8); + } + } + .sm\:mt-6 { + @media (width >= 40rem) { + margin-top: calc(var(--spacing) * 6); + } + } + .sm\:mt-8 { + @media (width >= 40rem) { + margin-top: calc(var(--spacing) * 8); + } + } + .sm\:flex { + @media (width >= 40rem) { + display: flex; + } + } + .sm\:w-1\/4 { + @media (width >= 40rem) { + width: calc(1 / 4 * 100%); + } + } + .sm\:w-auto { + @media (width >= 40rem) { + width: auto; + } + } + .sm\:max-w-md { + @media (width >= 40rem) { + max-width: var(--container-md); + } + } + .sm\:grid-cols-2 { + @media (width >= 40rem) { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + } + .sm\:items-center { + @media (width >= 40rem) { + align-items: center; + } + } + .sm\:gap-4 { + @media (width >= 40rem) { + gap: calc(var(--spacing) * 4); + } + } + .sm\:gap-6 { + @media (width >= 40rem) { + gap: calc(var(--spacing) * 6); + } + } + .sm\:gap-8 { + @media (width >= 40rem) { + gap: calc(var(--spacing) * 8); + } + } + .sm\:rounded-lg { + @media (width >= 40rem) { + border-radius: var(--radius-lg); + } + } + .sm\:p-6 { + @media (width >= 40rem) { + padding: calc(var(--spacing) * 6); + } + } + .sm\:p-8 { + @media (width >= 40rem) { + padding: calc(var(--spacing) * 8); + } + } + .sm\:text-2xl { + @media (width >= 40rem) { + font-size: var(--text-2xl); + line-height: var(--tw-leading, var(--text-2xl--line-height)); + } + } + .sm\:text-3xl { + @media (width >= 40rem) { + font-size: var(--text-3xl); + line-height: var(--tw-leading, var(--text-3xl--line-height)); + } + } + .md\:order-1 { + @media (width >= 48rem) { + order: 1; + } + } + .md\:order-2 { + @media (width >= 48rem) { + order: 2; + } + } + .md\:order-3 { + @media (width >= 48rem) { + order: 3; + } + } + .md\:order-4 { + @media (width >= 48rem) { + order: 4; + } + } + .md\:my-8 { + @media (width >= 48rem) { + margin-block: calc(var(--spacing) * 8); + } + } + .md\:mt-0 { + @media (width >= 48rem) { + margin-top: calc(var(--spacing) * 0); + } + } + .md\:mb-6 { + @media (width >= 48rem) { + margin-bottom: calc(var(--spacing) * 6); + } + } + .md\:flex { + @media (width >= 48rem) { + display: flex; + } + } + .md\:grid { + @media (width >= 48rem) { + display: grid; + } + } + .md\:h-screen { + @media (width >= 48rem) { + height: 100vh; + } + } + .md\:w-32 { + @media (width >= 48rem) { + width: calc(var(--spacing) * 32); + } + } + .md\:w-full { + @media (width >= 48rem) { + width: 100%; + } + } + .md\:max-w-md { + @media (width >= 48rem) { + max-width: var(--container-md); + } + } + .md\:grid-cols-2 { + @media (width >= 48rem) { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + } + .md\:flex-row { + @media (width >= 48rem) { + flex-direction: row; + } + } + .md\:items-center { + @media (width >= 48rem) { + align-items: center; + } + } + .md\:justify-between { + @media (width >= 48rem) { + justify-content: space-between; + } + } + .md\:justify-end { + @media (width >= 48rem) { + justify-content: flex-end; + } + } + .md\:gap-4 { + @media (width >= 48rem) { + gap: calc(var(--spacing) * 4); + } + } + .md\:gap-6 { + @media (width >= 48rem) { + gap: calc(var(--spacing) * 6); + } + } + .md\:space-y-0 { + @media (width >= 48rem) { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 0) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 0) * calc(1 - var(--tw-space-y-reverse))); + } + } + } + .md\:space-y-6 { + @media (width >= 48rem) { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))); + } + } + } + .md\:space-x-4 { + @media (width >= 48rem) { + :where(& > :not(:last-child)) { + --tw-space-x-reverse: 0; + margin-inline-start: calc(calc(var(--spacing) * 4) * var(--tw-space-x-reverse)); + margin-inline-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-x-reverse))); + } + } + } + .md\:p-6 { + @media (width >= 48rem) { + padding: calc(var(--spacing) * 6); + } + } + .md\:py-4 { + @media (width >= 48rem) { + padding-block: calc(var(--spacing) * 4); + } + } + .md\:py-8 { + @media (width >= 48rem) { + padding-block: calc(var(--spacing) * 8); + } + } + .md\:py-16 { + @media (width >= 48rem) { + padding-block: calc(var(--spacing) * 16); + } + } + .md\:text-2xl { + @media (width >= 48rem) { + font-size: var(--text-2xl); + line-height: var(--tw-leading, var(--text-2xl--line-height)); + } + } + .lg\:m-0 { + @media (width >= 64rem) { + margin: calc(var(--spacing) * 0); + } + } + .lg\:me-1 { + @media (width >= 64rem) { + margin-inline-end: calc(var(--spacing) * 1); + } + } + .lg\:mt-0 { + @media (width >= 64rem) { + margin-top: calc(var(--spacing) * 0); + } + } + .lg\:flex { + @media (width >= 64rem) { + display: flex; + } + } + .lg\:grid { + @media (width >= 64rem) { + display: grid; + } + } + .lg\:w-auto { + @media (width >= 64rem) { + width: auto; + } + } + .lg\:w-full { + @media (width >= 64rem) { + width: 100%; + } + } + .lg\:max-w-2xl { + @media (width >= 64rem) { + max-width: var(--container-2xl); + } + } + .lg\:max-w-lg { + @media (width >= 64rem) { + max-width: var(--container-lg); + } + } + .lg\:flex-1 { + @media (width >= 64rem) { + flex: 1; + } + } + .lg\:grid-cols-2 { + @media (width >= 64rem) { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + } + .lg\:items-start { + @media (width >= 64rem) { + align-items: flex-start; + } + } + .lg\:gap-8 { + @media (width >= 64rem) { + gap: calc(var(--spacing) * 8); + } + } + .lg\:gap-16 { + @media (width >= 64rem) { + gap: calc(var(--spacing) * 16); + } + } + .lg\:px-12 { + @media (width >= 64rem) { + padding-inline: calc(var(--spacing) * 12); + } + } + .lg\:py-0 { + @media (width >= 64rem) { + padding-block: calc(var(--spacing) * 0); + } + } + .xl\:max-w-4xl { + @media (width >= 80rem) { + max-width: var(--container-4xl); + } + } + .xl\:gap-8 { + @media (width >= 80rem) { + gap: calc(var(--spacing) * 8); + } + } + .xl\:gap-16 { + @media (width >= 80rem) { + gap: calc(var(--spacing) * 16); + } + } + .xl\:p-0 { + @media (width >= 80rem) { + padding: calc(var(--spacing) * 0); + } + } + .\32 xl\:px-0 { + @media (width >= 96rem) { + padding-inline: calc(var(--spacing) * 0); + } + } + .dark\:text-gray-400 { + @media (prefers-color-scheme: dark) { + color: var(--color-gray-400); + } + } + .dark\:text-white { + @media (prefers-color-scheme: dark) { + color: var(--color-white); + } + } +} @layer base { :where(:root),:root:has(input.theme-controller[value=light]:checked),[data-theme=light] { color-scheme: light; @@ -405,3 +2424,137 @@ background-position-x: -115%; } } +@property --tw-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-shadow-color { + syntax: "*"; + inherits: false; +} +@property --tw-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 100%; +} +@property --tw-inset-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-inset-shadow-color { + syntax: "*"; + inherits: false; +} +@property --tw-inset-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 100%; +} +@property --tw-ring-color { + syntax: "*"; + inherits: false; +} +@property --tw-ring-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-inset-ring-color { + syntax: "*"; + inherits: false; +} +@property --tw-inset-ring-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-ring-inset { + syntax: "*"; + inherits: false; +} +@property --tw-ring-offset-width { + syntax: ""; + inherits: false; + initial-value: 0px; +} +@property --tw-ring-offset-color { + syntax: "*"; + inherits: false; + initial-value: #fff; +} +@property --tw-ring-offset-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-space-y-reverse { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-space-x-reverse { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-divide-y-reverse { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-border-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} +@property --tw-leading { + syntax: "*"; + inherits: false; +} +@property --tw-font-weight { + syntax: "*"; + inherits: false; +} +@property --tw-tracking { + syntax: "*"; + inherits: false; +} +@property --tw-duration { + syntax: "*"; + inherits: false; +} +@keyframes spin { + to { + transform: rotate(360deg); + } +} +@layer properties { + @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { + *, ::before, ::after, ::backdrop { + --tw-shadow: 0 0 #0000; + --tw-shadow-color: initial; + --tw-shadow-alpha: 100%; + --tw-inset-shadow: 0 0 #0000; + --tw-inset-shadow-color: initial; + --tw-inset-shadow-alpha: 100%; + --tw-ring-color: initial; + --tw-ring-shadow: 0 0 #0000; + --tw-inset-ring-color: initial; + --tw-inset-ring-shadow: 0 0 #0000; + --tw-ring-inset: initial; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-offset-shadow: 0 0 #0000; + --tw-space-y-reverse: 0; + --tw-space-x-reverse: 0; + --tw-divide-y-reverse: 0; + --tw-border-style: solid; + --tw-leading: initial; + --tw-font-weight: initial; + --tw-tracking: initial; + --tw-duration: initial; + } + } +} diff --git a/web/templates/components/generic/navbar.html b/web/templates/components/generic/navbar.html index c61cb3b..7b3e648 100644 --- a/web/templates/components/generic/navbar.html +++ b/web/templates/components/generic/navbar.html @@ -1,6 +1,6 @@ {% load i18n %} {% load static %} -