- {% for name, d in difficulties.items %}
-
- {{ name }}
-
+
+ {% for tag in difficulties %}
+ {% if tag == active_difficulty %}
+ {% querystring difficulty="" as link %}
+ {% render_tag tag link=link highlighted=True %}
+ {% else %}
+ {% querystring difficulty=tag as link %}
+ {% render_tag tag link=link highlighted=False %}
+ {% endif %}
{% endfor %}
{% if user_authenticated %}
Stav:
-
- {% for name, d in states.items %}
-
- {{ name }}
-
+
+ {% for name, tag, tooltip, background, highlighted_background, highlighted in states %}
+ {% if highlighted %}
+ {% querystring state="" as link %}
+ {% else %}
+ {% querystring state=tag as link %}
+ {% endif %}
+ {% render_tag name link=link tooltip=tooltip background=background highlighted_background=highlighted_background highlighted=highlighted %}
{% endfor %}
{% endif %}
@@ -73,30 +80,13 @@
Stav:
- {% if problem.difficulty == problem.ProblemDifficulty.EASY %}
-
- easy
-
- {% elif problem.difficulty == problem.ProblemDifficulty.MEDIUM %}
-
- medium
-
- {% elif problem.difficulty == problem.ProblemDifficulty.HARD %}
-
- hard
-
- {% endif %}
+ {% render_tag problem.difficulty is_difficulty=True %}
|
-
+
{% for tag in problem.tags.all %}
-
- {{ tag }}
-
+ {% render_tag tag %}
{% endfor %}
|
diff --git a/school/problems/templatetags/tags.py b/school/problems/templatetags/tags.py
index 5e2f928..102c94f 100644
--- a/school/problems/templatetags/tags.py
+++ b/school/problems/templatetags/tags.py
@@ -2,6 +2,9 @@
from django import template
from django.template.defaulttags import querystring
+from django.urls import reverse
+
+from school.problems.models import Problem, Tag
register = template.Library()
@@ -17,3 +20,60 @@ def tagquery(
kwargs[name] = list(new_tags)
return querystring(context, *args, **kwargs)
+
+
+@register.inclusion_tag("problems/_partials/tag.html")
+def render_tag(
+ tag,
+ background="bg-blue-900",
+ highlighted_background="bg-blue-600",
+ link="",
+ tooltip="",
+ highlighted=False,
+ is_difficulty=False,
+):
+ if isinstance(tag, Tag) and not link:
+ link = reverse("problem_list", query={"tags": tag})
+ tag = tag.name
+ if is_difficulty:
+ tag = Problem.ProblemDifficulty(tag)
+
+ if isinstance(tag, Problem.ProblemDifficulty):
+ if not link:
+ link = reverse("problem_list", query={"difficulty": tag.value})
+ match tag.value:
+ case "basics":
+ background = "bg-cyan-900"
+ highlighted_background = "bg-cyan-600"
+ tooltip = "Úloha by mala byť zvládnuteľná začiatočníkmi."
+ case "easy":
+ background = "bg-green-900"
+ highlighted_background = "bg-green-600"
+ tooltip = "Úloha by mala byť zvládnuteľná bez väčších problémov."
+ case "medium":
+ background = "bg-yellow-900"
+ highlighted_background = "bg-yellow-600"
+ tooltip = "Úloha nemusí mať úplne priamočiare riešenie."
+ case "hard":
+ background = "bg-orange-900"
+ highlighted_background = "bg-orange-600"
+ tooltip = "Úloha vyžaduje pokročilé vedomosti z iných kurzov."
+ case "very-hard":
+ background = "bg-red-900"
+ highlighted_background = "bg-red-600"
+ tooltip = "Úloha vyžaduje pokročilé algoritmické myslenie a hľadanie neštandardných riešení."
+ case "unknown":
+ background = "bg-gray-900"
+ highlighted_background = "bg-gray-600"
+ tooltip = "Here be dragons."
+ tag = tag.label
+
+ if highlighted:
+ background = highlighted_background
+
+ return {
+ "tag": tag,
+ "background": background,
+ "link": link,
+ "tooltip": tooltip,
+ }
diff --git a/school/problems/views.py b/school/problems/views.py
index 57be9b9..574b953 100644
--- a/school/problems/views.py
+++ b/school/problems/views.py
@@ -95,38 +95,26 @@ def get_context_data(self, **kwargs: Any) -> dict[str, Any]:
ctx["user_authenticated"] = self.request.user.is_authenticated
ctx["active_difficulty"] = self.active_difficulty
- ctx["difficulties"] = {
- "easy": (
- "easy" if self.active_difficulty != "easy" else "",
- "bg-green-700" if self.active_difficulty == "easy" else "bg-green-900",
- "Úloha by mala byť zvládnuteľná bez väčších problémov.",
- ),
- "medium": (
- "medium" if self.active_difficulty != "medium" else "",
- "bg-orange-700"
- if self.active_difficulty == "medium"
- else "bg-orange-900",
- "Úloha nemusí mať úplne priamočiare riešenie.",
- ),
- "hard": (
- "hard" if self.active_difficulty != "hard" else "",
- "bg-red-700" if self.active_difficulty == "hard" else "bg-red-900",
- "Úloha vyžaduje pokročilé vedomosti z iných kurzov.",
- ),
- }
+ ctx["difficulties"] = Problem.ProblemDifficulty
ctx["active_state"] = self.active_state
- ctx["states"] = {
- "Nedokončená": (
- "started" if self.active_state != "started" else "",
- "bg-orange-700" if self.active_state == "started" else "bg-orange-900",
+ ctx["states"] = [
+ (
+ "Nedokončená",
+ "started",
"Nezačatá alebo nedokončená úloha.",
+ "bg-orange-900",
+ "bg-orange-600",
+ self.active_state == "started",
),
- "Dokončená": (
- "completed" if self.active_state != "completed" else "",
- "bg-green-700" if self.active_state == "completed" else "bg-green-900",
+ (
+ "Dokončená",
+ "completed",
"Dokončená úloha.",
+ "bg-green-900",
+ "bg-green-600",
+ self.active_state == "completed",
),
- }
+ ]
return ctx
From ebf543c4769a171548a12bbd256d4b3cf801580c Mon Sep 17 00:00:00 2001
From: Aiq0 <66842415+Aiq0@users.noreply.github.com>
Date: Tue, 30 Jun 2026 16:25:11 +0200
Subject: [PATCH 03/13] feat: show problem difficulty in lesson sidebar
---
school/courses/templates/courses/lesson.html | 13 +++++-
school/problems/models.py | 4 ++
.../templates/problems/_partials/icon.html | 1 +
.../problems/_partials/problem_statement.html | 2 +-
.../templates/problems/_partials/tag.html | 10 ++++-
.../templates/problems/problem_list.html | 2 +-
school/problems/templatetags/tags.py | 40 +++++++++++++++----
7 files changed, 60 insertions(+), 12 deletions(-)
create mode 100644 school/problems/templates/problems/_partials/icon.html
diff --git a/school/courses/templates/courses/lesson.html b/school/courses/templates/courses/lesson.html
index 71629ac..e01e6a6 100644
--- a/school/courses/templates/courses/lesson.html
+++ b/school/courses/templates/courses/lesson.html
@@ -2,6 +2,7 @@
{% load percent %}
{% load submits %}
{% load markdownify %}
+{% load tags %}
{% block title %}{{ item.name }} {{ block.super }}{% endblock %}
@@ -35,10 +36,20 @@
{% for it in items %}
-
+
+ {% if it.item.problem %}
+ {% if item == it.item %}
+ {% render_icon it.item.problem.difficulty_tag icon="code" highlighted=True %}
+ {% else %}
+ {% render_icon it.item.problem.difficulty_tag icon="code" %}
+ {% endif %}
+ {% else %}
+
+ {% endif %}
{{ it.item.name|markdownify }}
+
{% if it.tracker and it.tracker.state == it.tracker.state.COMPLETE %}
{% endif %}
diff --git a/school/problems/models.py b/school/problems/models.py
index 489aad1..2490c4a 100644
--- a/school/problems/models.py
+++ b/school/problems/models.py
@@ -75,6 +75,10 @@ class Meta:
def __str__(self):
return self.name
+ @property
+ def difficulty_tag(self):
+ return self.ProblemDifficulty(self.difficulty)
+
class Submit(models.Model):
class JudgeTestingStatus(models.IntegerChoices):
diff --git a/school/problems/templates/problems/_partials/icon.html b/school/problems/templates/problems/_partials/icon.html
new file mode 100644
index 0000000..d9c636f
--- /dev/null
+++ b/school/problems/templates/problems/_partials/icon.html
@@ -0,0 +1 @@
+
diff --git a/school/problems/templates/problems/_partials/problem_statement.html b/school/problems/templates/problems/_partials/problem_statement.html
index 60eea4d..1aed037 100644
--- a/school/problems/templates/problems/_partials/problem_statement.html
+++ b/school/problems/templates/problems/_partials/problem_statement.html
@@ -8,6 +8,6 @@
Obtiažnosť:
- {% render_tag problem.difficulty is_difficulty=True %}
+ {% render_tag problem.difficulty_tag %}
{{ problem.content|markdownify }}
diff --git a/school/problems/templates/problems/_partials/tag.html b/school/problems/templates/problems/_partials/tag.html
index 6d8cb8b..ad7d27f 100644
--- a/school/problems/templates/problems/_partials/tag.html
+++ b/school/problems/templates/problems/_partials/tag.html
@@ -1,7 +1,15 @@
+{% if link %}
{{ tag }}
+{% if link %}
+{% else %}
+
+{% endif %}
diff --git a/school/problems/templates/problems/problem_list.html b/school/problems/templates/problems/problem_list.html
index 133434c..c8a4b81 100644
--- a/school/problems/templates/problems/problem_list.html
+++ b/school/problems/templates/problems/problem_list.html
@@ -80,7 +80,7 @@
Stav:
- {% render_tag problem.difficulty is_difficulty=True %}
+ {% render_tag problem.difficulty_tag %}
|
diff --git a/school/problems/templatetags/tags.py b/school/problems/templatetags/tags.py
index 102c94f..e859e49 100644
--- a/school/problems/templatetags/tags.py
+++ b/school/problems/templatetags/tags.py
@@ -22,58 +22,82 @@ def tagquery(
return querystring(context, *args, **kwargs)
-@register.inclusion_tag("problems/_partials/tag.html")
-def render_tag(
+def _parse_tag(
tag,
background="bg-blue-900",
highlighted_background="bg-blue-600",
- link="",
- tooltip="",
+ color="text-gray-400",
+ highlighted_color="text-white",
+ icon=None,
+ link=None,
+ tooltip=None,
highlighted=False,
- is_difficulty=False,
):
if isinstance(tag, Tag) and not link:
link = reverse("problem_list", query={"tags": tag})
tag = tag.name
- if is_difficulty:
- tag = Problem.ProblemDifficulty(tag)
if isinstance(tag, Problem.ProblemDifficulty):
- if not link:
+ if link is None:
link = reverse("problem_list", query={"difficulty": tag.value})
match tag.value:
case "basics":
background = "bg-cyan-900"
highlighted_background = "bg-cyan-600"
+ color = "text-cyan-600"
+ highlighted_color = "text-cyan-400"
tooltip = "Úloha by mala byť zvládnuteľná začiatočníkmi."
case "easy":
background = "bg-green-900"
highlighted_background = "bg-green-600"
+ color = "text-green-600"
+ highlighted_color = "text-green-400"
tooltip = "Úloha by mala byť zvládnuteľná bez väčších problémov."
case "medium":
background = "bg-yellow-900"
highlighted_background = "bg-yellow-600"
+ color = "text-yellow-600"
+ highlighted_color = "text-yellow-400"
tooltip = "Úloha nemusí mať úplne priamočiare riešenie."
case "hard":
background = "bg-orange-900"
highlighted_background = "bg-orange-600"
+ color = "text-orange-600"
+ highlighted_color = "text-orange-400"
tooltip = "Úloha vyžaduje pokročilé vedomosti z iných kurzov."
case "very-hard":
background = "bg-red-900"
highlighted_background = "bg-red-600"
+ color = "text-red-600"
+ highlighted_color = "text-red-400"
tooltip = "Úloha vyžaduje pokročilé algoritmické myslenie a hľadanie neštandardných riešení."
case "unknown":
background = "bg-gray-900"
highlighted_background = "bg-gray-600"
+ color = "text-gray-600"
+ highlighted_color = "text-gray-400"
tooltip = "Here be dragons."
tag = tag.label
if highlighted:
background = highlighted_background
+ color = highlighted_color
return {
"tag": tag,
"background": background,
+ "color": color,
+ "icon": icon,
"link": link,
"tooltip": tooltip,
}
+
+
+@register.inclusion_tag("problems/_partials/tag.html")
+def render_tag(*args, **kwargs):
+ return _parse_tag(*args, **kwargs)
+
+
+@register.inclusion_tag("problems/_partials/icon.html")
+def render_icon(*args, **kwargs):
+ return _parse_tag(*args, **kwargs)
From 5be0c1294033d11f284d5959c7fffbe290abbf94 Mon Sep 17 00:00:00 2001
From: Aiq0 <66842415+Aiq0@users.noreply.github.com>
Date: Tue, 30 Jun 2026 16:28:18 +0200
Subject: [PATCH 04/13] chore: update deps
---
package.json | 6 +-
pnpm-lock.yaml | 338 +++++++++++++++++++++++++-------------------
pnpm-workspace.yaml | 4 +
uv.lock | 165 ++++++++++-----------
4 files changed, 282 insertions(+), 231 deletions(-)
create mode 100644 pnpm-workspace.yaml
diff --git a/package.json b/package.json
index 9012a6d..6f69d41 100644
--- a/package.json
+++ b/package.json
@@ -6,15 +6,15 @@
"build-js": "esbuild school/bundle.js --bundle --minify --outfile=./school/static/bundle.js"
},
"dependencies": {
- "@tailwindcss/cli": "^4.3.0",
+ "@tailwindcss/cli": "^4.3.1",
"@tailwindcss/forms": "^0.5.11",
- "@tailwindcss/typography": "^0.5.19",
+ "@tailwindcss/typography": "^0.5.20",
"alpinejs": "^3.15.12",
"esbuild": "^0.25.12",
"feather-icons": "^4.29.2",
"htmx.org": "^1.9.12",
"iconify-icon": "^1.0.8",
- "tailwindcss": "^4.3.0",
+ "tailwindcss": "^4.3.1",
"tippy.js": "^6.3.7"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 360c0ef..0948d7d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -9,14 +9,14 @@ importers:
.:
dependencies:
'@tailwindcss/cli':
- specifier: ^4.3.0
- version: 4.3.0
+ specifier: ^4.3.1
+ version: 4.3.1
'@tailwindcss/forms':
specifier: ^0.5.11
- version: 0.5.11(tailwindcss@4.3.0)
+ version: 0.5.11(tailwindcss@4.3.1)
'@tailwindcss/typography':
- specifier: ^0.5.19
- version: 0.5.19(tailwindcss@4.3.0)
+ specifier: ^0.5.20
+ version: 0.5.20(tailwindcss@4.3.1)
alpinejs:
specifier: ^3.15.12
version: 3.15.12
@@ -33,8 +33,8 @@ importers:
specifier: ^1.0.8
version: 1.0.8
tailwindcss:
- specifier: ^4.3.0
- version: 4.3.0
+ specifier: ^4.3.1
+ version: 4.3.1
tippy.js:
specifier: ^6.3.7
version: 6.3.7
@@ -216,99 +216,99 @@ packages:
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
- '@parcel/watcher-android-arm64@2.5.6':
- resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==}
+ '@parcel/watcher-android-arm64@2.5.1':
+ resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [android]
- '@parcel/watcher-darwin-arm64@2.5.6':
- resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==}
+ '@parcel/watcher-darwin-arm64@2.5.1':
+ resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [darwin]
- '@parcel/watcher-darwin-x64@2.5.6':
- resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==}
+ '@parcel/watcher-darwin-x64@2.5.1':
+ resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [darwin]
- '@parcel/watcher-freebsd-x64@2.5.6':
- resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==}
+ '@parcel/watcher-freebsd-x64@2.5.1':
+ resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [freebsd]
- '@parcel/watcher-linux-arm-glibc@2.5.6':
- resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==}
+ '@parcel/watcher-linux-arm-glibc@2.5.1':
+ resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
libc: [glibc]
- '@parcel/watcher-linux-arm-musl@2.5.6':
- resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==}
+ '@parcel/watcher-linux-arm-musl@2.5.1':
+ resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
engines: {node: '>= 10.0.0'}
cpu: [arm]
os: [linux]
libc: [musl]
- '@parcel/watcher-linux-arm64-glibc@2.5.6':
- resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==}
+ '@parcel/watcher-linux-arm64-glibc@2.5.1':
+ resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@parcel/watcher-linux-arm64-musl@2.5.6':
- resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==}
+ '@parcel/watcher-linux-arm64-musl@2.5.1':
+ resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@parcel/watcher-linux-x64-glibc@2.5.6':
- resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==}
+ '@parcel/watcher-linux-x64-glibc@2.5.1':
+ resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@parcel/watcher-linux-x64-musl@2.5.6':
- resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==}
+ '@parcel/watcher-linux-x64-musl@2.5.1':
+ resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@parcel/watcher-win32-arm64@2.5.6':
- resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==}
+ '@parcel/watcher-win32-arm64@2.5.1':
+ resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
engines: {node: '>= 10.0.0'}
cpu: [arm64]
os: [win32]
- '@parcel/watcher-win32-ia32@2.5.6':
- resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==}
+ '@parcel/watcher-win32-ia32@2.5.1':
+ resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
engines: {node: '>= 10.0.0'}
cpu: [ia32]
os: [win32]
- '@parcel/watcher-win32-x64@2.5.6':
- resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==}
+ '@parcel/watcher-win32-x64@2.5.1':
+ resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
engines: {node: '>= 10.0.0'}
cpu: [x64]
os: [win32]
- '@parcel/watcher@2.5.6':
- resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==}
+ '@parcel/watcher@2.5.1':
+ resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
engines: {node: '>= 10.0.0'}
'@popperjs/core@2.11.8':
resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==}
- '@tailwindcss/cli@4.3.0':
- resolution: {integrity: sha512-X9kdlqyMopO9fewbgHsEeuy31YzMHbdZ9VsKt004tB+mxSg1CNbyhZYCzvhciN0AM4R4b5lvIprPjtNq7iQxpQ==}
+ '@tailwindcss/cli@4.3.1':
+ resolution: {integrity: sha512-ZWPy20rF+TBfTImxDMG3Wr75Y3RpaPlo9lc+oJbInlMyjT+XPkTVKVIL5RZ7JirXuIahcfHoLNFRmDorKi+JQQ==}
hasBin: true
'@tailwindcss/forms@0.5.11':
@@ -316,69 +316,69 @@ packages:
peerDependencies:
tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1'
- '@tailwindcss/node@4.3.0':
- resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==}
+ '@tailwindcss/node@4.3.1':
+ resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==}
- '@tailwindcss/oxide-android-arm64@4.3.0':
- resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==}
+ '@tailwindcss/oxide-android-arm64@4.3.1':
+ resolution: {integrity: sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [android]
- '@tailwindcss/oxide-darwin-arm64@4.3.0':
- resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==}
+ '@tailwindcss/oxide-darwin-arm64@4.3.1':
+ resolution: {integrity: sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [darwin]
- '@tailwindcss/oxide-darwin-x64@4.3.0':
- resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==}
+ '@tailwindcss/oxide-darwin-x64@4.3.1':
+ resolution: {integrity: sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==}
engines: {node: '>= 20'}
cpu: [x64]
os: [darwin]
- '@tailwindcss/oxide-freebsd-x64@4.3.0':
- resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==}
+ '@tailwindcss/oxide-freebsd-x64@4.3.1':
+ resolution: {integrity: sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==}
engines: {node: '>= 20'}
cpu: [x64]
os: [freebsd]
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0':
- resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==}
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
+ resolution: {integrity: sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==}
engines: {node: '>= 20'}
cpu: [arm]
os: [linux]
- '@tailwindcss/oxide-linux-arm64-gnu@4.3.0':
- resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==}
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
+ resolution: {integrity: sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@tailwindcss/oxide-linux-arm64-musl@4.3.0':
- resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==}
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.1':
+ resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@tailwindcss/oxide-linux-x64-gnu@4.3.0':
- resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==}
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.1':
+ resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@tailwindcss/oxide-linux-x64-musl@4.3.0':
- resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==}
+ '@tailwindcss/oxide-linux-x64-musl@4.3.1':
+ resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@tailwindcss/oxide-wasm32-wasi@4.3.0':
- resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==}
+ '@tailwindcss/oxide-wasm32-wasi@4.3.1':
+ resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
bundledDependencies:
@@ -389,26 +389,26 @@ packages:
- '@emnapi/wasi-threads'
- tslib
- '@tailwindcss/oxide-win32-arm64-msvc@4.3.0':
- resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==}
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
+ resolution: {integrity: sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [win32]
- '@tailwindcss/oxide-win32-x64-msvc@4.3.0':
- resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==}
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.1':
+ resolution: {integrity: sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==}
engines: {node: '>= 20'}
cpu: [x64]
os: [win32]
- '@tailwindcss/oxide@4.3.0':
- resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==}
+ '@tailwindcss/oxide@4.3.1':
+ resolution: {integrity: sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==}
engines: {node: '>= 20'}
- '@tailwindcss/typography@0.5.19':
- resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==}
+ '@tailwindcss/typography@0.5.20':
+ resolution: {integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==}
peerDependencies:
- tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
+ tailwindcss: '>=3.0.0 || >=4.0.0 || insiders'
'@vue/reactivity@3.1.5':
resolution: {integrity: sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==}
@@ -419,6 +419,10 @@ packages:
alpinejs@3.15.12:
resolution: {integrity: sha512-nJvPAQVNPdZZ0NrExJ/kzQco3ijR8LwvCOadQecllESiqT4NyZ/57sN9V2XyvhlBGAbmlKYgeWZvYdKq99ij/Q==}
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
classnames@2.5.1:
resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
@@ -430,12 +434,17 @@ packages:
engines: {node: '>=4'}
hasBin: true
+ detect-libc@1.0.3:
+ resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+ engines: {node: '>=0.10'}
+ hasBin: true
+
detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
- enhanced-resolve@5.21.3:
- resolution: {integrity: sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==}
+ enhanced-resolve@5.21.6:
+ resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==}
engines: {node: '>=10.13.0'}
esbuild@0.25.12:
@@ -446,6 +455,10 @@ packages:
feather-icons@4.29.2:
resolution: {integrity: sha512-0TaCFTnBTVCz6U+baY2UJNKne5ifGh7sMG4ZC2LoBWCZdIyPa+y6UiR4lEYGws1JOFWdee8KAsAIvu0VcXqiqA==}
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
@@ -463,6 +476,10 @@ packages:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
jiti@2.7.0:
resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true
@@ -544,6 +561,10 @@ packages:
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
mini-svg-data-uri@1.4.4:
resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
hasBin: true
@@ -558,9 +579,9 @@ packages:
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
- picomatch@4.0.4:
- resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
- engines: {node: '>=12'}
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
postcss-selector-parser@6.0.10:
resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
@@ -570,8 +591,8 @@ packages:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
- tailwindcss@4.3.0:
- resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==}
+ tailwindcss@4.3.1:
+ resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==}
tapable@2.3.3:
resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
@@ -580,6 +601,10 @@ packages:
tippy.js@6.3.7:
resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==}
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -684,148 +709,148 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.5
- '@parcel/watcher-android-arm64@2.5.6':
+ '@parcel/watcher-android-arm64@2.5.1':
optional: true
- '@parcel/watcher-darwin-arm64@2.5.6':
+ '@parcel/watcher-darwin-arm64@2.5.1':
optional: true
- '@parcel/watcher-darwin-x64@2.5.6':
+ '@parcel/watcher-darwin-x64@2.5.1':
optional: true
- '@parcel/watcher-freebsd-x64@2.5.6':
+ '@parcel/watcher-freebsd-x64@2.5.1':
optional: true
- '@parcel/watcher-linux-arm-glibc@2.5.6':
+ '@parcel/watcher-linux-arm-glibc@2.5.1':
optional: true
- '@parcel/watcher-linux-arm-musl@2.5.6':
+ '@parcel/watcher-linux-arm-musl@2.5.1':
optional: true
- '@parcel/watcher-linux-arm64-glibc@2.5.6':
+ '@parcel/watcher-linux-arm64-glibc@2.5.1':
optional: true
- '@parcel/watcher-linux-arm64-musl@2.5.6':
+ '@parcel/watcher-linux-arm64-musl@2.5.1':
optional: true
- '@parcel/watcher-linux-x64-glibc@2.5.6':
+ '@parcel/watcher-linux-x64-glibc@2.5.1':
optional: true
- '@parcel/watcher-linux-x64-musl@2.5.6':
+ '@parcel/watcher-linux-x64-musl@2.5.1':
optional: true
- '@parcel/watcher-win32-arm64@2.5.6':
+ '@parcel/watcher-win32-arm64@2.5.1':
optional: true
- '@parcel/watcher-win32-ia32@2.5.6':
+ '@parcel/watcher-win32-ia32@2.5.1':
optional: true
- '@parcel/watcher-win32-x64@2.5.6':
+ '@parcel/watcher-win32-x64@2.5.1':
optional: true
- '@parcel/watcher@2.5.6':
+ '@parcel/watcher@2.5.1':
dependencies:
- detect-libc: 2.1.2
+ detect-libc: 1.0.3
is-glob: 4.0.3
+ micromatch: 4.0.8
node-addon-api: 7.1.1
- picomatch: 4.0.4
optionalDependencies:
- '@parcel/watcher-android-arm64': 2.5.6
- '@parcel/watcher-darwin-arm64': 2.5.6
- '@parcel/watcher-darwin-x64': 2.5.6
- '@parcel/watcher-freebsd-x64': 2.5.6
- '@parcel/watcher-linux-arm-glibc': 2.5.6
- '@parcel/watcher-linux-arm-musl': 2.5.6
- '@parcel/watcher-linux-arm64-glibc': 2.5.6
- '@parcel/watcher-linux-arm64-musl': 2.5.6
- '@parcel/watcher-linux-x64-glibc': 2.5.6
- '@parcel/watcher-linux-x64-musl': 2.5.6
- '@parcel/watcher-win32-arm64': 2.5.6
- '@parcel/watcher-win32-ia32': 2.5.6
- '@parcel/watcher-win32-x64': 2.5.6
+ '@parcel/watcher-android-arm64': 2.5.1
+ '@parcel/watcher-darwin-arm64': 2.5.1
+ '@parcel/watcher-darwin-x64': 2.5.1
+ '@parcel/watcher-freebsd-x64': 2.5.1
+ '@parcel/watcher-linux-arm-glibc': 2.5.1
+ '@parcel/watcher-linux-arm-musl': 2.5.1
+ '@parcel/watcher-linux-arm64-glibc': 2.5.1
+ '@parcel/watcher-linux-arm64-musl': 2.5.1
+ '@parcel/watcher-linux-x64-glibc': 2.5.1
+ '@parcel/watcher-linux-x64-musl': 2.5.1
+ '@parcel/watcher-win32-arm64': 2.5.1
+ '@parcel/watcher-win32-ia32': 2.5.1
+ '@parcel/watcher-win32-x64': 2.5.1
'@popperjs/core@2.11.8': {}
- '@tailwindcss/cli@4.3.0':
+ '@tailwindcss/cli@4.3.1':
dependencies:
- '@parcel/watcher': 2.5.6
- '@tailwindcss/node': 4.3.0
- '@tailwindcss/oxide': 4.3.0
- enhanced-resolve: 5.21.3
+ '@parcel/watcher': 2.5.1
+ '@tailwindcss/node': 4.3.1
+ '@tailwindcss/oxide': 4.3.1
+ enhanced-resolve: 5.21.6
mri: 1.2.0
picocolors: 1.1.1
- tailwindcss: 4.3.0
+ tailwindcss: 4.3.1
- '@tailwindcss/forms@0.5.11(tailwindcss@4.3.0)':
+ '@tailwindcss/forms@0.5.11(tailwindcss@4.3.1)':
dependencies:
mini-svg-data-uri: 1.4.4
- tailwindcss: 4.3.0
+ tailwindcss: 4.3.1
- '@tailwindcss/node@4.3.0':
+ '@tailwindcss/node@4.3.1':
dependencies:
'@jridgewell/remapping': 2.3.5
- enhanced-resolve: 5.21.3
+ enhanced-resolve: 5.21.6
jiti: 2.7.0
lightningcss: 1.32.0
magic-string: 0.30.21
source-map-js: 1.2.1
- tailwindcss: 4.3.0
+ tailwindcss: 4.3.1
- '@tailwindcss/oxide-android-arm64@4.3.0':
+ '@tailwindcss/oxide-android-arm64@4.3.1':
optional: true
- '@tailwindcss/oxide-darwin-arm64@4.3.0':
+ '@tailwindcss/oxide-darwin-arm64@4.3.1':
optional: true
- '@tailwindcss/oxide-darwin-x64@4.3.0':
+ '@tailwindcss/oxide-darwin-x64@4.3.1':
optional: true
- '@tailwindcss/oxide-freebsd-x64@4.3.0':
+ '@tailwindcss/oxide-freebsd-x64@4.3.1':
optional: true
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0':
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
optional: true
- '@tailwindcss/oxide-linux-arm64-gnu@4.3.0':
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
optional: true
- '@tailwindcss/oxide-linux-arm64-musl@4.3.0':
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.1':
optional: true
- '@tailwindcss/oxide-linux-x64-gnu@4.3.0':
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.1':
optional: true
- '@tailwindcss/oxide-linux-x64-musl@4.3.0':
+ '@tailwindcss/oxide-linux-x64-musl@4.3.1':
optional: true
- '@tailwindcss/oxide-wasm32-wasi@4.3.0':
+ '@tailwindcss/oxide-wasm32-wasi@4.3.1':
optional: true
- '@tailwindcss/oxide-win32-arm64-msvc@4.3.0':
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
optional: true
- '@tailwindcss/oxide-win32-x64-msvc@4.3.0':
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.1':
optional: true
- '@tailwindcss/oxide@4.3.0':
+ '@tailwindcss/oxide@4.3.1':
optionalDependencies:
- '@tailwindcss/oxide-android-arm64': 4.3.0
- '@tailwindcss/oxide-darwin-arm64': 4.3.0
- '@tailwindcss/oxide-darwin-x64': 4.3.0
- '@tailwindcss/oxide-freebsd-x64': 4.3.0
- '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0
- '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0
- '@tailwindcss/oxide-linux-arm64-musl': 4.3.0
- '@tailwindcss/oxide-linux-x64-gnu': 4.3.0
- '@tailwindcss/oxide-linux-x64-musl': 4.3.0
- '@tailwindcss/oxide-wasm32-wasi': 4.3.0
- '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0
- '@tailwindcss/oxide-win32-x64-msvc': 4.3.0
-
- '@tailwindcss/typography@0.5.19(tailwindcss@4.3.0)':
+ '@tailwindcss/oxide-android-arm64': 4.3.1
+ '@tailwindcss/oxide-darwin-arm64': 4.3.1
+ '@tailwindcss/oxide-darwin-x64': 4.3.1
+ '@tailwindcss/oxide-freebsd-x64': 4.3.1
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.1
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.1
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.1
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.1
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.1
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.1
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.1
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.1
+
+ '@tailwindcss/typography@0.5.20(tailwindcss@4.3.1)':
dependencies:
postcss-selector-parser: 6.0.10
- tailwindcss: 4.3.0
+ tailwindcss: 4.3.1
'@vue/reactivity@3.1.5':
dependencies:
@@ -837,15 +862,21 @@ snapshots:
dependencies:
'@vue/reactivity': 3.1.5
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
classnames@2.5.1: {}
core-js@3.49.0: {}
cssesc@3.0.0: {}
+ detect-libc@1.0.3: {}
+
detect-libc@2.1.2: {}
- enhanced-resolve@5.21.3:
+ enhanced-resolve@5.21.6:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.3
@@ -884,6 +915,10 @@ snapshots:
classnames: 2.5.1
core-js: 3.49.0
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
graceful-fs@4.2.11: {}
htmx.org@1.9.12: {}
@@ -898,6 +933,8 @@ snapshots:
dependencies:
is-extglob: 2.1.1
+ is-number@7.0.0: {}
+
jiti@2.7.0: {}
lightningcss-android-arm64@1.32.0:
@@ -953,6 +990,11 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.2
+
mini-svg-data-uri@1.4.4: {}
mri@1.2.0: {}
@@ -961,7 +1003,7 @@ snapshots:
picocolors@1.1.1: {}
- picomatch@4.0.4: {}
+ picomatch@2.3.2: {}
postcss-selector-parser@6.0.10:
dependencies:
@@ -970,7 +1012,7 @@ snapshots:
source-map-js@1.2.1: {}
- tailwindcss@4.3.0: {}
+ tailwindcss@4.3.1: {}
tapable@2.3.3: {}
@@ -978,4 +1020,8 @@ snapshots:
dependencies:
'@popperjs/core': 2.11.8
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
util-deprecate@1.0.2: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 0000000..12d9ab2
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,4 @@
+allowBuilds:
+ '@parcel/watcher': set this to true or false
+ core-js: set this to true or false
+ esbuild: set this to true or false
diff --git a/uv.lock b/uv.lock
index 3cefa96..d13a08a 100644
--- a/uv.lock
+++ b/uv.lock
@@ -2,6 +2,10 @@ version = 1
revision = 3
requires-python = ">=3.12, <4"
+[options]
+exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values.
+exclude-newer-span = "P7D"
+
[[package]]
name = "annotated-types"
version = "0.7.0"
@@ -22,7 +26,7 @@ wheels = [
[[package]]
name = "bumpver"
-version = "2025.1131"
+version = "2026.1132"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "click" },
@@ -30,18 +34,18 @@ dependencies = [
{ name = "lexid" },
{ name = "toml" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/8f/8a/cc13e816e9f0849dce423b904b06fd91b5444cba6df3200d512a702f2e95/bumpver-2025.1131.tar.gz", hash = "sha256:a35fd2d43a5f65f014035c094866bd3bd6c739606f29fd41246d6ec6e839d3f9", size = 115372, upload-time = "2025-07-02T20:36:11.982Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/25/22/c0c9bf9e7ad6877e4c7c3dedd464e390d9fadb8927c61d6d77547eb17539/bumpver-2026.1132.tar.gz", hash = "sha256:80b223c23fca9bc9dd569b7a44680949d34bee23a738860d9a9b36f1abe3b0e0", size = 116784, upload-time = "2026-05-22T18:40:32.333Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/1d/5b/2d5ea6802495ee4506721977be522804314aa66ad629d9356e3c7e5af4a6/bumpver-2025.1131-py2.py3-none-any.whl", hash = "sha256:c02527f6ed7887afbc06c07630047b24a9f9d02d544a65639e99bf8b92aaa674", size = 65361, upload-time = "2025-07-02T20:36:10.103Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/d6/45c1bf6bcf7b3f174ec0c7fe2d7dce773cbc853cfd8fde06c3153104ffff/bumpver-2026.1132-py2.py3-none-any.whl", hash = "sha256:b060170e7ff5d9ad7043a9d3d6288c7175f9c126744d08a2d6ef9b8377f6bd60", size = 65963, upload-time = "2026-05-22T18:40:30.515Z" },
]
[[package]]
name = "certifi"
-version = "2026.4.22"
+version = "2026.6.17"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" },
+ { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" },
]
[[package]]
@@ -185,14 +189,14 @@ wheels = [
[[package]]
name = "click"
-version = "8.4.0"
+version = "8.4.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorama", marker = "sys_platform == 'win32'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/23/e4/796662cd90cf80e3a363c99db2b88e0e394b988a575f60a17e16440cd011/click-8.4.0.tar.gz", hash = "sha256:638f1338fe1235c8f4e008e4a8a254fb5c5fbdcbb40ece3c9142ebb78e792973", size = 350843, upload-time = "2026-05-17T00:47:58.425Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/ee/ae/8e92f8058baf87f6c7d86ee7e457668690195cc77efedb8d3797a06e3940/click-8.4.0-py3-none-any.whl", hash = "sha256:40c50b7c6c6adac2823d411041ec84f3f103f1b280d5e9ce0d7f998995832f81", size = 116147, upload-time = "2026-05-17T00:47:56.842Z" },
+ { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" },
]
[[package]]
@@ -206,78 +210,75 @@ wheels = [
[[package]]
name = "cryptography"
-version = "48.0.0"
+version = "49.0.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "cffi", marker = "platform_python_implementation != 'PyPy'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/df/3d/01f6dd9190170a5a241e0e98c2d04be3664a9e6f5b9b872cde63aff1c3dd/cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6", size = 8001587, upload-time = "2026-05-04T22:57:36.803Z" },
- { url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" },
- { url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" },
- { url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" },
- { url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" },
- { url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" },
- { url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" },
- { url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" },
- { url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" },
- { url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" },
- { url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" },
- { url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" },
- { url = "https://files.pythonhosted.org/packages/04/70/e5a1b41d325f797f39427aa44ef8baf0be500065ab6d8e10369d850d4a4f/cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4", size = 3294868, upload-time = "2026-05-04T22:58:06.467Z" },
- { url = "https://files.pythonhosted.org/packages/f4/ac/8ac51b4a5fc5932eb7ee5c517ba7dc8cd834f0048962b6b352f00f41ebf9/cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7", size = 3817107, upload-time = "2026-05-04T22:58:08.845Z" },
- { url = "https://files.pythonhosted.org/packages/6b/84/70e3feea9feea87fd7cbe77efb2712ae1e3e6edf10749dc6e95f4e60e455/cryptography-48.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec", size = 7986556, upload-time = "2026-05-04T22:58:11.172Z" },
- { url = "https://files.pythonhosted.org/packages/89/6e/18e07a618bb5442ba10cf4df16e99c071365528aa570dfcb8c02e25a303b/cryptography-48.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18", size = 4684776, upload-time = "2026-05-04T22:58:13.712Z" },
- { url = "https://files.pythonhosted.org/packages/be/6a/4ea3b4c6c6759794d5ee2103c304a5076dc4b19ae1f9fe47dba439e159e9/cryptography-48.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20", size = 4698121, upload-time = "2026-05-04T22:58:16.448Z" },
- { url = "https://files.pythonhosted.org/packages/2f/59/6ff6ad6cae03bb887da2a5860b2c9805f8dac969ef01ce563336c49bd1d1/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff", size = 4690042, upload-time = "2026-05-04T22:58:18.544Z" },
- { url = "https://files.pythonhosted.org/packages/ca/b4/fc334ed8cfd705aca282fe4d8f5ae64a8e0f74932e9feecb344610cf6e4d/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c", size = 5282526, upload-time = "2026-05-04T22:58:20.75Z" },
- { url = "https://files.pythonhosted.org/packages/11/08/9f8c5386cc4cd90d8255c7cdd0f5baf459a08502a09de30dc51f553d38dc/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db", size = 4733116, upload-time = "2026-05-04T22:58:23.627Z" },
- { url = "https://files.pythonhosted.org/packages/b8/77/99307d7574045699f8805aa500fa0fb83422d115b5400a064ddd306d7750/cryptography-48.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741", size = 4316030, upload-time = "2026-05-04T22:58:25.581Z" },
- { url = "https://files.pythonhosted.org/packages/fd/36/a608b98337af3cb2aff4818e406649d30572b7031918b04c87d979495348/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166", size = 4689640, upload-time = "2026-05-04T22:58:27.747Z" },
- { url = "https://files.pythonhosted.org/packages/dd/a6/825010a291b4438aecc1f568bc428189fc1175515223632477c07dc0a6df/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336", size = 5237657, upload-time = "2026-05-04T22:58:29.848Z" },
- { url = "https://files.pythonhosted.org/packages/b9/09/4e76a09b4caa29aad535ddc806f5d4c5d01885bd978bd984fbc6ca032cae/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057", size = 4732362, upload-time = "2026-05-04T22:58:32.009Z" },
- { url = "https://files.pythonhosted.org/packages/18/78/444fa04a77d0cb95f417dda20d450e13c56ba8e5220fc892a1658f44f882/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae", size = 4819580, upload-time = "2026-05-04T22:58:34.254Z" },
- { url = "https://files.pythonhosted.org/packages/38/85/ea67067c70a1fd4be2c63d35eeed82658023021affccc7b17705f8527dd2/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c", size = 4963283, upload-time = "2026-05-04T22:58:36.376Z" },
- { url = "https://files.pythonhosted.org/packages/75/54/cc6d0f3deac3e81c7f847e8a189a12b6cdd65059b43dad25d4316abd849a/cryptography-48.0.0-cp314-cp314t-win32.whl", hash = "sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f", size = 3270954, upload-time = "2026-05-04T22:58:38.791Z" },
- { url = "https://files.pythonhosted.org/packages/49/67/cc947e288c0758a4e5473d1dcb743037ab7785541265a969240b8885441a/cryptography-48.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12", size = 3797313, upload-time = "2026-05-04T22:58:40.746Z" },
- { url = "https://files.pythonhosted.org/packages/f2/63/61d4a4e1c6b6bab6ce1e213cd36a24c415d90e76d78c5eb8577c5541d2e8/cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86", size = 7983482, upload-time = "2026-05-04T22:58:43.769Z" },
- { url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" },
- { url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" },
- { url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" },
- { url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" },
- { url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" },
- { url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" },
- { url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" },
- { url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" },
- { url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" },
- { url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" },
- { url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" },
- { url = "https://files.pythonhosted.org/packages/b8/23/6e6f32143ab5d8b36ca848a502c4bcd477ae75b9e1677e3530d669062578/cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd", size = 3279117, upload-time = "2026-05-04T22:59:12.019Z" },
- { url = "https://files.pythonhosted.org/packages/9d/9a/0fea98a70cf1749d41d738836f6349d97945f7c89433a259a6c2642eefeb/cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8", size = 3792100, upload-time = "2026-05-04T22:59:14.884Z" },
+sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", size = 4032100, upload-time = "2026-06-12T20:02:32.143Z" },
+ { url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" },
+ { url = "https://files.pythonhosted.org/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779, upload-time = "2026-06-12T20:02:08.987Z" },
+ { url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" },
+ { url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" },
+ { url = "https://files.pythonhosted.org/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844, upload-time = "2026-06-12T20:01:24.09Z" },
+ { url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" },
+ { url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" },
+ { url = "https://files.pythonhosted.org/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", size = 3810026, upload-time = "2026-06-12T20:02:39.262Z" },
+ { url = "https://files.pythonhosted.org/packages/ec/9e/db72b3ae7fc9cfad53e630e56c6ae83b9b6ff0bf3718ffb8012d20b3aabf/cryptography-49.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:73a205dce83953d131a4aa1e0fd917a2fd1c5b1eef251e9d7152efefcbf5caf7", size = 4013892, upload-time = "2026-06-12T20:02:10.735Z" },
+ { url = "https://files.pythonhosted.org/packages/86/12/c48a424f38db03027be9f7ed5c7dc5de9933dbee992865f98b13727a009d/cryptography-49.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:196ecd6a36e4e9aa10270393bb98d8df88fccee0bf1e5128b91ae4eb4375896d", size = 4678835, upload-time = "2026-06-12T20:02:48.743Z" },
+ { url = "https://files.pythonhosted.org/packages/68/28/8a3ad4653662c93fc44dc4e5d8fd374c25c42e07b34bbfbadf49cf57a5a8/cryptography-49.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7abcee80084cda3f7691f3eb1ce480d8df49cec637b429aa35986c1de71738aa", size = 4697239, upload-time = "2026-06-12T20:02:56.03Z" },
+ { url = "https://files.pythonhosted.org/packages/a8/b2/2193fc74f81aee4f9b62733133b73b5176718932ed8f2e4b03fa040480a6/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:4ae387c9cb68ea569ca17e490d66d8142b81c3cc814bf179974b7d146e490bbb", size = 4685593, upload-time = "2026-06-12T20:02:50.666Z" },
+ { url = "https://files.pythonhosted.org/packages/47/f1/1d3eaa243bfc5de4a187b22aa8c048b3e4980bfbe830ac46e6bac2e66947/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:f37d847238971164fdbc68ade6f6574aecc9c0af714190e2083429ff68f4ce9d", size = 5289961, upload-time = "2026-06-12T20:01:46.468Z" },
+ { url = "https://files.pythonhosted.org/packages/58/39/2d51306721330c486495853eda1c567880ff036de15a14c4b74f399934af/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c2bc30226390d60ea19d9f82b19db005fe0452154a23c1c410c12ea801e43561", size = 4731145, upload-time = "2026-06-12T20:02:16.832Z" },
+ { url = "https://files.pythonhosted.org/packages/17/50/983e838c7fd0d87fd8c969bcdd328edaf5f756e38df5281637424c155873/cryptography-49.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:07cab27cc7b7e0fd28e5e26bb9eeedde5c135c868b46de4a27845abe94af6122", size = 4321719, upload-time = "2026-06-12T20:02:52.611Z" },
+ { url = "https://files.pythonhosted.org/packages/a7/f5/8f571d7e27c55bce9f76f026143bcb1e040a4233149ecca0bea5fa5dd5f7/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:b20133d204d2bb56ba047642199603876c872026ca53e79c35b83772ab2cc505", size = 4685209, upload-time = "2026-06-12T20:02:07.282Z" },
+ { url = "https://files.pythonhosted.org/packages/e7/84/0e27016a6fc5a0886f797018b26aa42f40c09a82332bff77822a451deaaa/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b970c6da94d5bb18629db453d14f2a1300f6bf59b61e9b82377931ef95504866", size = 5246285, upload-time = "2026-06-12T20:01:32.439Z" },
+ { url = "https://files.pythonhosted.org/packages/11/2d/5e1fb307cb5931881516b464c98774b3f2c36b5d4bb9a2830253cf553cad/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d8ecde755e2e91bf773fc94e8c9d730cd7f2007004cb492263a794ec3899a1c8", size = 4730441, upload-time = "2026-06-12T20:02:01.469Z" },
+ { url = "https://files.pythonhosted.org/packages/e4/c0/bff5a02ee731d207d6a1ed51732549d8c53d2bc8da1d10ec6f2844201d68/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e3fb64c420688e5319ae25113a354015abbd8dffbfbc41781a1ea66fc7622ac3", size = 4815869, upload-time = "2026-06-12T20:01:36.574Z" },
+ { url = "https://files.pythonhosted.org/packages/b9/26/814681d14248d95d73d5c3eea0c39a94eb8302df966f670a2c60de90974b/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32703d93296f5c1f4b53349ad3a250c2cae0fdecd3a3dd5d47e616d8d616af27", size = 4960948, upload-time = "2026-06-12T20:02:18.688Z" },
+ { url = "https://files.pythonhosted.org/packages/4c/fe/93ecac273d3738939d023612ad12cca9a3740a5345d69fda04134c43fd96/cryptography-49.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:33cd0565932807baddb67b96dbee92f2c374b5c89dee09fd74079aeb8c8dba61", size = 3799153, upload-time = "2026-06-12T20:01:39.059Z" },
+ { url = "https://files.pythonhosted.org/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", size = 4025947, upload-time = "2026-06-12T20:01:25.745Z" },
+ { url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" },
+ { url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" },
+ { url = "https://files.pythonhosted.org/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863, upload-time = "2026-06-12T20:02:24.579Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" },
+ { url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" },
+ { url = "https://files.pythonhosted.org/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338, upload-time = "2026-06-12T20:02:22.737Z" },
+ { url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" },
+ { url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" },
+ { url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", size = 3785547, upload-time = "2026-06-12T20:02:26.847Z" },
]
[[package]]
name = "distlib"
-version = "0.4.0"
+version = "0.4.3"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" },
+ { url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z" },
]
[[package]]
name = "django"
-version = "5.2.14"
+version = "5.2.15"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "asgiref" },
{ name = "sqlparse" },
{ name = "tzdata", marker = "sys_platform == 'win32'" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/65/95/95f7faa0950867afaa0bef2460c6263afd6a2c78cc9434046ed28160b015/django-5.2.14.tar.gz", hash = "sha256:58a63ba841662e5c686b57ba1fec52ddd68c0b93bd96ac3029d55728f00bf8a2", size = 10895118, upload-time = "2026-05-05T13:57:31.104Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/2b/e3/31722f7284c9f43333daff9aee9184678e4487adcb5506af0db8cea09ce1/django-5.2.15.tar.gz", hash = "sha256:5154a9bf84ac01dde011e367f355c07dbb329532e06810dcf3ef2af269e236e7", size = 10873669, upload-time = "2026-06-03T13:03:35.892Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/14/44/f172870cf87aa25afef48fb72adba89ee8b77fcab6f3b23d240b923f1528/django-5.2.14-py3-none-any.whl", hash = "sha256:6f712143bd3064310d1f50fac859c3e9a274bdcfc9595339853be7779297fc76", size = 8311320, upload-time = "2026-05-05T13:57:25.795Z" },
+ { url = "https://files.pythonhosted.org/packages/92/b5/38140b1643c00d5c46ce69c78e6980fd285aee223100319631bedee4f5e7/django-5.2.15-py3-none-any.whl", hash = "sha256:0eb4a9bb1853a35b0286dbc6d916bd352c8c2687195a7f2d6f80cefd840e4970", size = 8311957, upload-time = "2026-06-03T13:03:31.329Z" },
]
[[package]]
@@ -362,11 +363,11 @@ wheels = [
[[package]]
name = "filelock"
-version = "3.29.0"
+version = "3.29.4"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/b5/fe/997687a931ab51049acce6fa1f23e8f01216374ea81374ddee763c493db5/filelock-3.29.0.tar.gz", hash = "sha256:69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90", size = 57571, upload-time = "2026-04-19T15:39:10.068Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/e6/dc/be6cbe99670cd6e4ad387123647cb08e0c32975e223f82551e914c5568a6/filelock-3.29.4.tar.gz", hash = "sha256:10cdb3656fc44541cdf30652a93fb10ec6b05325620eb316bd26893e4201538a", size = 63028, upload-time = "2026-06-13T16:12:00.744Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl", hash = "sha256:96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258", size = 39812, upload-time = "2026-04-19T15:39:08.752Z" },
+ { url = "https://files.pythonhosted.org/packages/13/37/a065dc3bd6e49423a6532c642ca7378d3f467b1ef44c2800c937af7f9739/filelock-3.29.4-py3-none-any.whl", hash = "sha256:dac1648087d5115554850d113e7dd8c83ab2d38e3435dde2d4f163847e57b767", size = 42757, upload-time = "2026-06-13T16:11:59.582Z" },
]
[[package]]
@@ -392,11 +393,11 @@ wheels = [
[[package]]
name = "idna"
-version = "3.15"
+version = "3.18"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" },
+ { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" },
]
[[package]]
@@ -414,7 +415,7 @@ wheels = [
[[package]]
name = "judge-client"
version = "2.2.3"
-source = { git = "https://github.com/trojsten/judge-client#5b4ff8b0d883835bb18f7fe093cb2f7da8b1b35e" }
+source = { git = "https://github.com/trojsten/judge-client#2ae4b1ac38ae03de3881f865b4801e06ba84186b" }
dependencies = [
{ name = "pydantic" },
{ name = "requests" },
@@ -503,11 +504,11 @@ wheels = [
[[package]]
name = "platformdirs"
-version = "4.9.6"
+version = "4.10.0"
source = { registry = "https://pypi.org/simple" }
-sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" },
+ { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" },
]
[[package]]
@@ -694,27 +695,27 @@ wheels = [
[[package]]
name = "python-discovery"
-version = "1.3.1"
+version = "1.4.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "filelock" },
{ name = "platformdirs" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/48/60/e88788207d81e46362cfbef0d4aaf4c0f49efc3c12d4c3fa3f542c34ebec/python_discovery-1.3.1.tar.gz", hash = "sha256:62f6db28064c9613e7ca76cb3f00c38c839a07c31c00dfe7ed0986493d2150a6", size = 68011, upload-time = "2026-05-12T20:53:36.336Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/0b/1a/cbbaf13b730abb0a16b964d984e19f2fe520c21a4dc664051359a3f5a9e7/python_discovery-1.4.2.tar.gz", hash = "sha256:8f3746c4b4968d22afbb97d36e1a0e5b66e6c0f297290f2e95f05b9b8bf18690", size = 70277, upload-time = "2026-06-11T16:10:42.383Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/b7/6f/a05a317a66fee0aad270011461f1a63a453ed12471249f172f7d2e2bc7b4/python_discovery-1.3.1-py3-none-any.whl", hash = "sha256:ed188687ebb3b82c01a17cd5ac62fc94d9f6487a7f1a0f9dfe89753fec91039c", size = 33185, upload-time = "2026-05-12T20:53:34.969Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/82/a70006589557f267f15bd384c0642ad49f0d97b690c3a05b166b9dcbad3b/python_discovery-1.4.2-py3-none-any.whl", hash = "sha256:475803f53b7b2ed6e490e27373f9d8340f7d2eebf9acdaf645d7d714c97bb500", size = 33886, upload-time = "2026-06-11T16:10:41.192Z" },
]
[[package]]
name = "python-frontmatter"
-version = "1.2.0"
+version = "1.3.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pyyaml" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/e9/21/88aefb4f1de6661b5a003175e21e4a5ad94f5e52b2abf4170a11883c7d81/python_frontmatter-1.2.0.tar.gz", hash = "sha256:5b26ccd3cb85af77feb11d83b922c7bb5aeccb0c9d3fb236b938c600b6322984", size = 16890, upload-time = "2026-05-17T23:42:05.493Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/9d/e8/79cbe69864d44f3b48e70ebee0a872a7d5a4e7150c9f8577ed7a5beefff0/python_frontmatter-1.3.0.tar.gz", hash = "sha256:acc73e477a568dc2a25c9e130c6c68ae8daa8c204c8f7e813db47d6a7280dcf2", size = 8322, upload-time = "2026-05-20T19:21:44.164Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/1c/b1/ec12e3e746234006b77dec69d53878253b1da09dbb55fa3cb456083d9069/python_frontmatter-1.2.0-py3-none-any.whl", hash = "sha256:e1ee1d4300450a2f84e778eb4f70edf573da6cd7d463801066f05edc4e819c78", size = 10396, upload-time = "2026-05-17T23:42:04.637Z" },
+ { url = "https://files.pythonhosted.org/packages/a6/a3/17c284b4f4d8ad50f0f9ba70ad8fcc35c777aeafcdbbffdd91bbdc5ab379/python_frontmatter-1.3.0-py3-none-any.whl", hash = "sha256:9f7dd9260bec99044219159a329f64f039087f9d1a2124c9442556f2fe6f82ec", size = 10562, upload-time = "2026-05-20T19:21:43.323Z" },
]
[[package]]
@@ -839,15 +840,15 @@ dev = [
[[package]]
name = "sentry-sdk"
-version = "2.60.0"
+version = "2.63.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "certifi" },
{ name = "urllib3" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/54/a2/2e6c090db384cc515069f4f85542bd5baf6786852073020ea73d4a76d3ea/sentry_sdk-2.60.0.tar.gz", hash = "sha256:0bd25e54e78ca02d0be512529fa644bbbf9e8470d7b26371294012d4ca93c978", size = 452946, upload-time = "2026-05-13T13:34:52.516Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/ba/c8/b3c970a5b186722d276cd40a05b3254e03bccc0208560aff20f612e018e8/sentry_sdk-2.63.0.tar.gz", hash = "sha256:2a1502bf864769275dbc8c2c9fc7a0f7f5e18358180b615d262d13a31ffba216", size = 912449, upload-time = "2026-06-16T12:45:57.553Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/29/41/f2b800b7f12a05dd48c2a6280d4dd812d1425fc66ed3fe3fd99420c41d1a/sentry_sdk-2.60.0-py3-none-any.whl", hash = "sha256:28a536c03291c8bcb363cf35c611b32738ec118ff64d8d6383b096448ac4c803", size = 475616, upload-time = "2026-05-13T13:34:50.259Z" },
+ { url = "https://files.pythonhosted.org/packages/7b/57/cb205f7d93373120f666b9c5736dc0815524d96a9b278e7a728f018dc22a/sentry_sdk-2.63.0-py3-none-any.whl", hash = "sha256:3a9b5ddd403f79eb73bd670f75f04485819db53d28f76ced7bc09041cb0dfd6a", size = 495950, upload-time = "2026-06-16T12:45:55.819Z" },
]
[[package]]
@@ -918,7 +919,7 @@ wheels = [
[[package]]
name = "virtualenv"
-version = "21.3.3"
+version = "21.5.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "distlib" },
@@ -926,7 +927,7 @@ dependencies = [
{ name = "platformdirs" },
{ name = "python-discovery" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/15/ba/1f6e8c957e4932be060dcdc482d339c12e0216351478add3645cdaa53c05/virtualenv-21.3.3.tar.gz", hash = "sha256:f5bda277e553b1c2b3c1a8debfc30496e1288cc93ce6b7b71b3280047e317328", size = 7613784, upload-time = "2026-05-13T18:01:30.19Z" }
+sdist = { url = "https://files.pythonhosted.org/packages/f1/a5/81f987504738e6defeed61ec1c47e2aefab3c35d8eeb87e1b3f38cf28254/virtualenv-21.5.1.tar.gz", hash = "sha256:dca3bf98275a59c652b69d68e73433e597d977c2da9198882479d1a7188009c8", size = 4578798, upload-time = "2026-06-16T16:23:58.603Z" }
wheels = [
- { url = "https://files.pythonhosted.org/packages/f4/34/a9dbe051de88a63eb7408ea66630bac38e72f7f6077d4be58737106860d9/virtualenv-21.3.3-py3-none-any.whl", hash = "sha256:7d5987d8369e098e41406efb780a3d4ca79280097293899e351a6407ee153ab3", size = 7594554, upload-time = "2026-05-13T18:01:27.815Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/02/3623e6169bed617ed1e2d372f7c69f92ec28d54c4dfc997055c8578ec148/virtualenv-21.5.1-py3-none-any.whl", hash = "sha256:55aa670b67bbfb991b03fda39bd3276d92c419d702376e98c5df1c9989a26783", size = 4558820, upload-time = "2026-06-16T16:23:56.963Z" },
]
From 0b7cfd961aaa947b81caa4641176122324d78c10 Mon Sep 17 00:00:00 2001
From: Aiq0 <66842415+Aiq0@users.noreply.github.com>
Date: Tue, 30 Jun 2026 16:28:58 +0200
Subject: [PATCH 05/13] fix: generate missing migration
---
.../0010_alter_problem_difficulty.py | 28 +++++++++++++++++++
1 file changed, 28 insertions(+)
create mode 100644 school/problems/migrations/0010_alter_problem_difficulty.py
diff --git a/school/problems/migrations/0010_alter_problem_difficulty.py b/school/problems/migrations/0010_alter_problem_difficulty.py
new file mode 100644
index 0000000..5ee3211
--- /dev/null
+++ b/school/problems/migrations/0010_alter_problem_difficulty.py
@@ -0,0 +1,28 @@
+# Generated by Django 5.2.15 on 2026-06-30 14:28
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("problems", "0009_remove_submit_language_alter_problem_slug"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="problem",
+ name="difficulty",
+ field=models.CharField(
+ choices=[
+ ("basics", "základy"),
+ ("easy", "ľahká"),
+ ("medium", "stredná"),
+ ("hard", "ťažká"),
+ ("very-hard", "veľmi ťažká"),
+ ("unknown", "neznáma"),
+ ],
+ default="unknown",
+ verbose_name="obtiažnosť",
+ ),
+ ),
+ ]
From 5588570e481c9f7f9678aa30c8a6ab5dbba9c8fe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A1n=20Plach=C3=BD?=
Date: Thu, 2 Jul 2026 18:25:56 +0200
Subject: [PATCH 06/13] Improve texts
---
school/courses/templates/courses/detail.html | 4 +--
school/courses/templates/courses/lesson.html | 2 +-
school/courses/templates/courses/list.html | 6 ++--
school/pages/templates/pages/home.html | 26 ++++++++--------
.../pages/templates/pages/home_history.html | 30 ++++++++++++-------
school/pages/templates/pages/home_text.html | 2 +-
.../templates/problems/problem_detail.html | 2 +-
.../templates/problems/problem_list.html | 4 +--
tailwind.config.js | 10 +++++++
9 files changed, 53 insertions(+), 33 deletions(-)
diff --git a/school/courses/templates/courses/detail.html b/school/courses/templates/courses/detail.html
index edf6f3c..ee2ac36 100644
--- a/school/courses/templates/courses/detail.html
+++ b/school/courses/templates/courses/detail.html
@@ -11,7 +11,7 @@
Späť na zoznam kurzov
-
+
{{ course.name|markdownify }}
{{ course.description|markdownify }}
@@ -28,7 +28,7 @@ {{ course.n
{% with course.recommended_courses.all as next %}
{% if next|length %}
- Asi sa pýtaš, čo ďalej, a my to vieme. Môžeš pokračovať týmito kurzami:
+ Asi sa pýtaš, čo ďalej... a my to vieme. Môžeš pokračovať napríklad týmito kurzami:
{% for course in next %}
diff --git a/school/courses/templates/courses/lesson.html b/school/courses/templates/courses/lesson.html
index e01e6a6..f72b751 100644
--- a/school/courses/templates/courses/lesson.html
+++ b/school/courses/templates/courses/lesson.html
@@ -107,7 +107,7 @@ Posledné submity
{% endif %}
{% else %}
- Ak chceš riešiť túto úlohu, musíš sa najprv prihlásiť.
+ Ak chceš odovzdať riešenie tejto úlohy, musíš sa najskôr prihlásiť.
{% endif %}
diff --git a/school/courses/templates/courses/list.html b/school/courses/templates/courses/list.html
index c45b5b5..cc1543a 100644
--- a/school/courses/templates/courses/list.html
+++ b/school/courses/templates/courses/list.html
@@ -5,12 +5,12 @@
{% block body %}
-
+
Zoznam kurzov
Na tejto stránke sa nachádza zoznam kurzov.
- Neskoršie kurzy nadväzujú na poznatky z predchádzajúcich,
- preto ich odporúčame absolvovať po poradí.
+ Pokročilé kurzy predpokladajú znalosti základov,
+ preto ich odporúčame absolvovať v uvedenom poradí.
diff --git a/school/pages/templates/pages/home.html b/school/pages/templates/pages/home.html
index d3e6162..864c553 100644
--- a/school/pages/templates/pages/home.html
+++ b/school/pages/templates/pages/home.html
@@ -1,7 +1,7 @@
{% extends 'common/base.html' %}
{% load static %}
-{% block title %}KSP School – Online výučba programovania{% endblock %}
+{% block title %}KSP School – Online škola programovania{% endblock %}
{% block meta %}
Chceš kódiť jak ďábel?
- KSP School obsahuje texty a úlohy,
+ KSP School obsahuje materiály a úlohy,
pomocou ktorých sa naučíš programovať aj ty!
Poďme na to!
@@ -30,26 +30,26 @@ Chceš kód
Učebné materiály
- V KSP School nájdeš množstvo učebných textov o rôznych témach z informatiky,
- ktoré posunú tvoju úroveň programovania na ďalší level.
+ V KSP School nájdeš množstvo učebných textov z rôznych informatický tém,
+ ktoré ti vysvetlia nielen základy programovania, ale aj algoritmy a dátové štruktúry, ktoré by mal každý správny programátor poznať.
Python
- Či už si nikdy neprogramoval/a, alebo máš veci ako lambda funkcie a dedičnosť v malíčku, máme niečo pre každého.
+ Nemáš s programovaním zatiaľ žiadne skúsenosti? Alebo máš veci ako lambda funkcie a dedičnosť v malíčku? V Pythone sa nájde niečo pre každého.
C++
- Ak sa ti zdá Python príliš pomalý, alebo jednoduchý, máme tu pre teba kurzy C++.
+ Ak chceš písať bleskovo rýchle programy, C++ je kompilovaný jazyk, ktorý ti to umožní. Naučíme ťa orientovať sa v ňom a správne ho používať.
Algoritmy a dátové štruktúry
- Programovací jazyk nie je jediný spôsob, ako zrýchliť program.
- Ak sa naučíš dáta správne ukladať a správne s nimi pracovať, budú tvoje programy ešte rýchlejšie.
+ Žiadny programovací jazyk nie je dostatočne rýchly, pokiaľ ho nepoužívaš s rozumom.
+ Naučíme ťa dáta ukladať do správnych štruktúr a spracovávať správnymi algoritmami, aby tvoje programy boli čo najefektívnejšie.
@@ -65,10 +65,9 @@ Učebné materiály
Programátorské úlohy
- Pripravili sme si pre teba aj programátorské úlohy, na ktorých si môžeš otestovať nadobudnuté vedomosti.
- Tieto úlohy môžeš riešiť a odovzdávať.
- Tvoje riešenia budú po odovzdaní automaticky otestované. Okamžite sa dozvieš,
- či sú správne a dostatočne efektívne.
+ Pripravili sme si pre teba aj programátorské úlohy, na ktorých si môžeš svoje nadobudnuté vedomosti otestovať.
+ Po prihlásení sa môžeš riešiť a odovzdávať všetky úlohy na stránke.
+ Riešenia sú automaticky otestované, takže sa okamžite dozvieš, či sú tvoje programy správne a dostatočne efektívne.
@@ -78,13 +77,14 @@ Programátorské úlohyDlhoročná tradícia
KSP School vzniklo v dielňach
-
+
Korešpondenčného seminára z programovania.
V KSP sa venujeme neformálnemu vzdelávaniu a popularizácii informatiky medzi žiakmi stredných škôl už od roku 1983.
V roku 2005 sme spustili náš prvý vzdelávací projekt - Programátorskú liaheň.
Novšia verzia Programátorskej liahne bola spustená v roku 2010.
Od roku 2015 každé leto organizujeme Letnú školu,
kde počas intenzívnych dvoch letných týždňov učíme stredoškolákov programovať.
+ Najnovšou súčasťou Letnej školy je práve táto online škola programovania - KSP School.
diff --git a/school/pages/templates/pages/home_history.html b/school/pages/templates/pages/home_history.html
index a489a6d..d1dbb7d 100644
--- a/school/pages/templates/pages/home_history.html
+++ b/school/pages/templates/pages/home_history.html
@@ -3,18 +3,18 @@
-
+
1974
- Počítač Altair 8800
+ Prvý osobý počítač Altair 8800
-
-
+
+
1983
Vznik Korešpondenčného seminára z programovania
@@ -23,8 +23,8 @@
-
-
+
+
2005
Vzdelávací projekt Programátorská liaheň
@@ -33,8 +33,8 @@
-
-
+
+
2010
Nová Programátorská liaheň
@@ -42,12 +42,22 @@
-
-
+
+
+
2015
Prvá Letná škola Programovania
+
+
+
diff --git a/school/pages/templates/pages/home_text.html b/school/pages/templates/pages/home_text.html
index f6e206d..dab0edb 100644
--- a/school/pages/templates/pages/home_text.html
+++ b/school/pages/templates/pages/home_text.html
@@ -8,7 +8,7 @@
Prioritná fronta
- Naším hlavným cieľom v tomto článku bude efektívna implementácia takzvanej prioritnej fronty. Toto je dátová štruktúra, ktorá vie efektívne robiť dve operácie:
+ Hlavným cieľom v tomto článku bude implementácia prioritnej fronty. To je dátová štruktúra, ktorá vie efektívne robiť dve operácie:
push(prvok,priorita): vlož nový prvok a nastav mu konkrétnu prioritu
diff --git a/school/problems/templates/problems/problem_detail.html b/school/problems/templates/problems/problem_detail.html
index 622f090..a58fc29 100644
--- a/school/problems/templates/problems/problem_detail.html
+++ b/school/problems/templates/problems/problem_detail.html
@@ -35,7 +35,7 @@ Posledné submity
{% endif %}
{% else %}
- Ak chceš riešiť túto úlohu, musíš sa najprv prihlásiť.
+ Ak chceš odovzdať riešenie tejto úlohy, musíš sa najskôr prihlásiť.
{% endif %}
diff --git a/school/problems/templates/problems/problem_list.html b/school/problems/templates/problems/problem_list.html
index c8a4b81..fa8ddda 100644
--- a/school/problems/templates/problems/problem_list.html
+++ b/school/problems/templates/problems/problem_list.html
@@ -5,13 +5,13 @@
{% block body %}
-
+
Zoznam úloh
Na tejto stránke sa nachádza zoznam všetkých úloh.
Ak ešte nemáš absolvované aspoň
základné kurzy,
- silno ti odporúčame si prejsť najskôr tie.
+ silno ti odporúčame prejsť si najskôr tie.
diff --git a/tailwind.config.js b/tailwind.config.js
index 39aad77..909a7ba 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -8,9 +8,19 @@ module.exports = {
sans: ['Inter', ...defaultTheme.fontFamily.sans],
mono: ['"Fira Mono"', ...defaultTheme.fontFamily.mono],
},
+ colors: {
+ 'ksp': '#818f3d',
+ 'ksp-dark': '#41481f',
+ 'ksp-semi-dark': '#565f29',
+ 'ksp-light': '#abb47e',
+ 'ksp-semi-light': '#9aa564',
+ },
typography: {
DEFAULT: {
css: {
+ 'a': {
+ color: '#818f3d',
+ },
'code::before': {
content: '',
},
From 5f6747966c150ad16f8831fcbddf7a5cc7d329f8 Mon Sep 17 00:00:00 2001
From: Aiq0 <66842415+Aiq0@users.noreply.github.com>
Date: Thu, 2 Jul 2026 19:08:40 +0200
Subject: [PATCH 07/13] feat: make import atomic
---
school/imports/views/__init__.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/school/imports/views/__init__.py b/school/imports/views/__init__.py
index 3f8afc9..52ba68b 100644
--- a/school/imports/views/__init__.py
+++ b/school/imports/views/__init__.py
@@ -4,6 +4,7 @@
import frontmatter
from django.conf import settings
+from django.db import transaction
from django.http import HttpRequest, JsonResponse
from django.utils.decorators import method_decorator
from django.views import View
@@ -15,6 +16,7 @@
@method_decorator(csrf_exempt, name="dispatch")
class ImportView(View):
+ @transaction.atomic()
def dispatch(self, request: HttpRequest, *args, **kwargs):
token = request.headers.get("X-Token", None)
if token != settings.SCHOOL_IMPORT_TOKEN:
From 5bd4eb5d06dabefe09c7e34a135cf869d450d5a8 Mon Sep 17 00:00:00 2001
From: Aiq0 <66842415+Aiq0@users.noreply.github.com>
Date: Thu, 2 Jul 2026 19:08:47 +0200
Subject: [PATCH 08/13] fix: error message
---
school/imports/views/courses.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/school/imports/views/courses.py b/school/imports/views/courses.py
index 09f0de4..8863d4f 100644
--- a/school/imports/views/courses.py
+++ b/school/imports/views/courses.py
@@ -91,7 +91,7 @@ def post(self, request, *args, **kwargs):
if problem is None:
return JsonResponse(
{
- "errors": f"Problem '{item['material']}' don't exist.'",
+ "errors": f"Problem '{item['problem']}' don't exist.'",
"ok": False,
},
status=400,
From b54d86b1f182a27397c6f3b0e8961ce8fcb83e50 Mon Sep 17 00:00:00 2001
From: Aiq0 <66842415+Aiq0@users.noreply.github.com>
Date: Thu, 2 Jul 2026 21:26:46 +0200
Subject: [PATCH 09/13] fix: remove unused styles
---
tailwind.config.js | 6 ------
1 file changed, 6 deletions(-)
diff --git a/tailwind.config.js b/tailwind.config.js
index 909a7ba..3bc83a3 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -10,17 +10,11 @@ module.exports = {
},
colors: {
'ksp': '#818f3d',
- 'ksp-dark': '#41481f',
- 'ksp-semi-dark': '#565f29',
- 'ksp-light': '#abb47e',
'ksp-semi-light': '#9aa564',
},
typography: {
DEFAULT: {
css: {
- 'a': {
- color: '#818f3d',
- },
'code::before': {
content: '',
},
From 460a406a92b853ef72e56557c0ab7055440ec3b5 Mon Sep 17 00:00:00 2001
From: Aiq0 <66842415+Aiq0@users.noreply.github.com>
Date: Thu, 2 Jul 2026 21:30:05 +0200
Subject: [PATCH 10/13] fix: better styles
---
school/problems/templates/problems/_partials/tag.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/school/problems/templates/problems/_partials/tag.html b/school/problems/templates/problems/_partials/tag.html
index ad7d27f..cd913ac 100644
--- a/school/problems/templates/problems/_partials/tag.html
+++ b/school/problems/templates/problems/_partials/tag.html
@@ -4,7 +4,7 @@
{% else %}
{{ tag }}
From 76a2191975eb047c56b2ac0d4d175d0bc353bf21 Mon Sep 17 00:00:00 2001
From: Aiq0 <66842415+Aiq0@users.noreply.github.com>
Date: Thu, 2 Jul 2026 21:35:28 +0200
Subject: [PATCH 11/13] fix: do not include `None` tag if problem with no tag
exists
---
school/problems/views.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/school/problems/views.py b/school/problems/views.py
index 574b953..4044681 100644
--- a/school/problems/views.py
+++ b/school/problems/views.py
@@ -76,7 +76,8 @@ def get_queryset(self):
@cached_property
def tags(self):
return (
- Problem.objects.values_list("tags__name", flat=True)
+ Problem.objects.exclude(tags__name__isnull=True)
+ .values_list("tags__name", flat=True)
.order_by("tags__name")
.distinct()
)
From 195b03fdbc8933e4c3e0970efd54db1f217129b0 Mon Sep 17 00:00:00 2001
From: Aiq0 <66842415+Aiq0@users.noreply.github.com>
Date: Fri, 3 Jul 2026 12:14:30 +0200
Subject: [PATCH 12/13] feat: hide tags list when empty
---
.../problems/_partials/problem_statement.html | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/school/problems/templates/problems/_partials/problem_statement.html b/school/problems/templates/problems/_partials/problem_statement.html
index 1aed037..ce49e33 100644
--- a/school/problems/templates/problems/_partials/problem_statement.html
+++ b/school/problems/templates/problems/_partials/problem_statement.html
@@ -1,11 +1,13 @@
{% load markdownify tags %}
-
- Tagy:
- {% for tag in problem.tags.all %}
- {% render_tag tag %}
- {% endfor %}
-
+{% if problem.tags.all %}
+
+ Tagy:
+ {% for tag in problem.tags.all %}
+ {% render_tag tag %}
+ {% endfor %}
+
+{% endif %}
Obtiažnosť:
{% render_tag problem.difficulty_tag %}
From 74becd434e5689eed82972c821349af6db99b2f9 Mon Sep 17 00:00:00 2001
From: Aiq0 <66842415+Aiq0@users.noreply.github.com>
Date: Fri, 3 Jul 2026 15:40:39 +0200
Subject: [PATCH 13/13] fix: disable build scripts
---
pnpm-workspace.yaml | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index 12d9ab2..6307130 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,4 +1,4 @@
allowBuilds:
- '@parcel/watcher': set this to true or false
- core-js: set this to true or false
- esbuild: set this to true or false
+ '@parcel/watcher': false
+ core-js: false
+ esbuild: false
|