4 Commits
v0.1.6 ... dev

6 changed files with 186 additions and 162 deletions

View File

@@ -50,8 +50,8 @@ jobs:
- name: Install uv - name: Install uv
uses: astral-sh/setup-uv@v5 uses: astral-sh/setup-uv@v5
- name: Set up Python - name: "Set up Python"
run: uv python install uses: actions/setup-python@v6
with: with:
python-version-file: "pyproject.toml" python-version-file: "pyproject.toml"

57
bug.yml
View File

@@ -1,57 +0,0 @@
name: Bug Report
description: Report a bug in this project
title: "[Bug]: "
labels:
- kind/bug
- triage/needs triage
body:
- type: textarea
id: bug
attributes:
label: Describe the bug
description: |
A clear and concise description of what the bug is.
What did you expect to happen? What happened instead?
Include screenshots if applicable.
validations:
required: true
- type: textarea
id: reproduction
attributes:
label: Steps to reproduce
description: |
A clear and concise description of how to reproduce the bug.
Include steps, code snippets, or screenshots if applicable.
validations:
required: true
- type: textarea
id: additional-info
attributes:
label: Additional information
description: |
Add any other context or screenshots about the bug here.
- type: dropdown
id: browsers
attributes:
label: What browsers are you seeing the problem on?
multiple: true
options:
- Firefox
- Chrome
- Safari
- Microsoft Edge
- type: dropdown
id: operating-systems
attributes:
label: What operating systems are you seeing the problem on?
multiple: true
options:
- Windows
- macOS
- Linux
- iOS
- Android

View File

@@ -1,6 +1,6 @@
[project] [project]
name = "kompage" name = "kompage"
version = "0.1.6" version = "0.1.0"
description = "Add your description here" description = "Add your description here"
readme = "README.md" readme = "README.md"
requires-python = ">=3.13" requires-python = ">=3.13"
@@ -29,7 +29,7 @@ url = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/"
[tool.bumpversion] [tool.bumpversion]
current_version = "0.1.6" current_version = "0.1.0"
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)" parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
serialize = ["{major}.{minor}.{patch}"] serialize = ["{major}.{minor}.{patch}"]
search = "{current_version}" search = "{current_version}"

View File

@@ -1,96 +1,135 @@
/* other styles are in magic.css */ /* Modern UI refresh */
/* ========== GRID LAYOUT ========== */
:root {
--bg: #0b1020;
--bg-soft: #0f172a;
--surface: #111827;
--surface-2: #0f172a;
--text: #e5e7eb;
--muted: #9ca3af;
--ring: #60a5fa;
--primary: #6366f1;
--primary-600: #4f46e5;
--success: #10b981;
--danger: #ef4444;
--warning: #f59e0b;
}
* { box-sizing: border-box; }
html, body {
margin: 0;
padding: 0;
background: linear-gradient(180deg, var(--bg), var(--bg-soft));
color: var(--text);
font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Helvetica Neue, Arial, "Apple Color Emoji", "Segoe UI Emoji";
}
body {
max-width: 1200px;
margin: 0 auto;
padding: 24px 16px 64px;
}
h1 {
font-size: 1.75rem;
line-height: 2rem;
margin: 0 0 16px 0;
font-weight: 700;
}
/* Layout */
.results { .results {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 1em; gap: 16px;
margin-top: 20px; margin-top: 16px;
} }
/* Responsive: show 1 per row on small screens */ @media (max-width: 768px) {
@media screen and (max-width: 768px) { .results { grid-template-columns: 1fr; }
.results {
grid-template-columns: 1fr;
}
} }
/* ========== CARD STYLING ========== */ /* Cards */
.card { .card {
position: relative; position: relative;
padding: 10px; padding: 10px;
border: 1px solid #ccc; border: 1px solid rgba(255,255,255,0.06);
background: #fafafa; background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02));
backdrop-filter: blur(6px);
text-align: center; text-align: center;
transition: box-shadow 0.2s transform 0.2s; transition: box-shadow 0.2s ease, transform 0.2s ease, border-color 0.2s ease;
border-radius: 10px; border-radius: 14px;
box-shadow:
0 1px 1px rgba(0,0,0,0.08),
0 10px 20px rgba(0,0,0,0.15);
} }
.card:hover { .card:hover {
box-shadow: 0 0 10px #aaa; box-shadow:
transform: scale(1.1); 0 1px 1px rgba(0,0,0,0.08),
/* pop out by 10% */ 0 16px 32px rgba(0,0,0,0.25);
z-index: 2; transform: translateY(-2px) scale(1.02);
/* ensure it appears above others */ z-index: 2;
} }
.card img { .card img { width: 100%; height: auto; border-radius: 8px; }
width: 100%;
height: auto;
}
/* ========== ACTION BUTTONS ========== */ /* ========== ACTION BUTTONS ========== */
.actions { .actions {
margin-top: 10px; margin-top: 10px;
display: flex; display: flex;
justify-content: space-around; justify-content: space-between;
gap: 8px;
} }
.actions .info { button, .button {
background-color: #007bff; appearance: none;
color: white; border: 1px solid rgba(255,255,255,0.1);
border: none; background: linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.04));
padding: 0.5em 1em; color: var(--text);
padding: 8px 12px;
border-radius: 10px;
cursor: pointer; cursor: pointer;
border-radius: 5px; transition: transform 0.15s ease, box-shadow 0.2s ease, border-color 0.2s ease;
margin-right: 0.5em;
} }
button:hover, .button:hover {
.actions .info:hover { transform: translateY(-1px);
background-color: #0056b3; border-color: rgba(255,255,255,0.2);
box-shadow: 0 8px 16px rgba(0,0,0,0.25);
} }
.actions .request { .actions .info, .refresh, .index, .request-page { border-color: rgba(99,102,241,0.4); }
background-color: #28a745; .actions .info { background: linear-gradient(180deg, rgba(99,102,241,0.35), rgba(99,102,241,0.2)); }
color: white; .actions .request { border-color: rgba(16,185,129,0.4); background: linear-gradient(180deg, rgba(16,185,129,0.35), rgba(16,185,129,0.2)); }
border: none; .delete-button { border-color: rgba(239,68,68,0.4); background: linear-gradient(180deg, rgba(239,68,68,0.35), rgba(239,68,68,0.2)); }
padding: 0.5em 1em; .reset { border-color: rgba(239,68,68,0.4); background: linear-gradient(180deg, rgba(239,68,68,0.35), rgba(239,68,68,0.2)); color: #fff; }
cursor: pointer;
border-radius: 5px;
}
.actions .request:hover { /* Page actions */
background-color: #1e7e34; .refresh, .index, .request-page { padding: 10px 14px; }
}
/* ========== MODAL ========== */ /* ========== MODAL ========== */
.modal { .modal {
position: fixed; position: fixed;
z-index: 1; z-index: 50;
left: 0; inset: 0;
top: 0; display: none;
width: 100%; background: rgba(2,6,23,0.7);
height: 100%; -webkit-backdrop-filter: blur(4px);
overflow: auto; backdrop-filter: blur(4px);
background-color: rgba(0, 0, 0, 0.4);
} }
.modal[style*="display: block"] { display: block; }
.modal-content { .modal-content {
background-color: #fefefe; background: linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.03));
border: 1px solid rgba(255,255,255,0.1);
margin: 5% auto; margin: 5% auto;
padding: 20px; padding: 20px;
border: 1px solid #888; width: min(720px, 92%);
width: 50%; border-radius: 16px;
border-radius: 10px; color: var(--text);
box-shadow: 0 20px 40px rgba(0,0,0,0.4);
} }
.close { .close {
@@ -98,6 +137,8 @@
font-size: 28px; font-size: 28px;
font-weight: bold; font-weight: bold;
cursor: pointer; cursor: pointer;
padding: 2px 8px;
border-radius: 8px;
} }
/* ========== IMAGE CONTAINER ========== */ /* ========== IMAGE CONTAINER ========== */
@@ -144,48 +185,72 @@ body.nsfw-disabled .image-container.nsfw:hover img {
pointer-events: none; pointer-events: none;
} }
.download-badge {
position: absolute;
top: 8px;
right: 8px;
background-color: rgba(99,102,241,0.9);
color: white;
padding: 4px 8px;
font-size: 12px;
font-weight: 700;
border-radius: 6px;
z-index: 2;
}
.search-bar { .search-bar {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 10px; gap: 12px;
margin-bottom: 20px; margin-bottom: 20px;
padding: 16px;
border-radius: 16px;
background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02));
border: 1px solid rgba(255,255,255,0.08);
box-shadow: 0 10px 20px rgba(0,0,0,0.25);
} }
.search-bar select { .search-bar input[type="text"], .search-bar select {
padding: 5px; padding: 10px 12px;
border: 1px solid #ccc; border-radius: 10px;
border-radius: 4px; border: 1px solid rgba(255,255,255,0.15);
background: rgba(255,255,255,0.04);
color: var(--text);
outline: none;
transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.search-bar input[type="text"]:focus, .search-bar select:focus {
border-color: var(--ring);
box-shadow: 0 0 0 3px rgba(96,165,250,0.2);
} }
.dropdown-content { .dropdown-content {
display: none; display: none;
position: absolute; position: absolute;
background-color: #f9f9f9; background-color: var(--surface);
min-width: 160px; color: var(--text);
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); min-width: 200px;
z-index: 1; box-shadow: 0 12px 28px rgba(0,0,0,0.35);
border: 1px solid rgba(255,255,255,0.08);
border-radius: 10px;
z-index: 5;
} }
.dropdown-content .dropdown-item { .dropdown-content .dropdown-item {
padding: 8px 16px; padding: 10px 14px;
cursor: pointer; cursor: pointer;
} }
.dropdown-content .dropdown-item:hover { .dropdown-content .dropdown-item:hover {
background-color: #f1f1f1; background-color: rgba(255,255,255,0.06);
} }
.dropdown-content.show { .dropdown-content.show {
display: block; display: block;
} }
.reset { .reset { border-radius: 10px; }
/* Implement design here */
background-color: #f44336;
/* round the edges of the button */
border-radius: 9px;
}
.selectors { .selectors {
display: flex; display: flex;
@@ -200,23 +265,38 @@ body.nsfw-disabled .image-container.nsfw:hover img {
/* ========== KOMGA SPECIFIC STYLES ========== */ /* ========== KOMGA SPECIFIC STYLES ========== */
.card.komga {
border: 3px solid green;
box-sizing: border-box;
/* disable the request button for entries in Komga */
/* only allow the info button to be clicked */
opacity: 0.3;
.card.komga::after {
content: 'In Komga';
position: absolute;
top: 10px;
left: 10px;
background: rgba(16,185,129,0.9);
color: white;
font-size: 12px;
font-weight: 700;
padding: 4px 8px;
border-radius: 6px;
z-index: 3;
} }
.card.requested { .card.requested::after {
border: 3px solid orange; content: 'Requested';
box-sizing: border-box; position: absolute;
/* disable the request button for entries in Komga */ top: 10px;
/* only allow the info button to be clicked */ left: 10px;
opacity: 0.3; background: rgba(245,158,11,0.9);
color: #111827;
font-size: 12px;
font-weight: 700;
padding: 4px 8px;
border-radius: 6px;
z-index: 3;
} }
.card.komga { opacity: 0.6; }
.card.requested { opacity: 0.8; }
.card.manga.requested .request { .card.manga.requested .request {
pointer-events: none; pointer-events: none;
opacity: 0.5; opacity: 0.5;
@@ -236,9 +316,8 @@ body.nsfw-disabled .image-container.nsfw:hover img {
position: absolute; position: absolute;
top: 5px; top: 5px;
right: 5px; right: 5px;
background-color: #dc3545;
color: white; color: white;
border: none; border: 1px solid rgba(255,255,255,0.15);
padding: 0.5em; padding: 0.5em;
cursor: pointer; cursor: pointer;
border-radius: 50%; border-radius: 50%;

View File

@@ -330,7 +330,7 @@
} }
// Add download badge if applicable // Add download badge if applicable
if (result.downloads && document.getElementById("checkAvailability").checked) { if (document.getElementById("checkAvailability").checked) {
const downloadBadge = document.createElement('div'); const downloadBadge = document.createElement('div');
downloadBadge.className = 'download-badge'; downloadBadge.className = 'download-badge';
downloadBadge.textContent = `${result.downloads} Downloads`; downloadBadge.textContent = `${result.downloads} Downloads`;

24
uv.lock generated
View File

@@ -14,7 +14,7 @@ wheels = [
[[package]] [[package]]
name = "anilistapi" name = "anilistapi"
version = "0.1.1" version = "0.1.1"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/" } source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple" }
dependencies = [ dependencies = [
{ name = "limit" }, { name = "limit" },
{ name = "requests" }, { name = "requests" },
@@ -279,7 +279,7 @@ wheels = [
[[package]] [[package]]
name = "komcache" name = "komcache"
version = "0.1.2" version = "0.1.2"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/" } source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple" }
dependencies = [ dependencies = [
{ name = "komconfig" }, { name = "komconfig" },
{ name = "pymysql" }, { name = "pymysql" },
@@ -293,7 +293,7 @@ wheels = [
[[package]] [[package]]
name = "komconfig" name = "komconfig"
version = "0.2.2" version = "0.2.2"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/" } source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple" }
dependencies = [ dependencies = [
{ name = "omegaconf" }, { name = "omegaconf" },
] ]
@@ -305,7 +305,7 @@ wheels = [
[[package]] [[package]]
name = "komgapi" name = "komgapi"
version = "0.1.1" version = "0.1.1"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/" } source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple" }
dependencies = [ dependencies = [
{ name = "httpx" }, { name = "httpx" },
{ name = "komconfig" }, { name = "komconfig" },
@@ -358,8 +358,8 @@ requires-dist = [
[[package]] [[package]]
name = "komsuite-nyaapy" name = "komsuite-nyaapy"
version = "0.1.2" version = "0.1.3"
source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple/" } source = { registry = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/simple" }
dependencies = [ dependencies = [
{ name = "bencodepy" }, { name = "bencodepy" },
{ name = "httpx" }, { name = "httpx" },
@@ -367,9 +367,9 @@ dependencies = [
{ name = "lxml" }, { name = "lxml" },
{ name = "regex" }, { name = "regex" },
] ]
sdist = { url = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/files/komsuite-nyaapy/0.1.2/komsuite_nyaapy-0.1.2.tar.gz", hash = "sha256:8f336ba3977a0833f611c4dc6d589b817ace657eb5c32d713390ad981d28274d" } sdist = { url = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/files/komsuite-nyaapy/0.1.3/komsuite_nyaapy-0.1.3.tar.gz", hash = "sha256:bb11afe8f722bea974760e17fb6c3f199de2bf298202718449ad2fa3fec88a41" }
wheels = [ wheels = [
{ url = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/files/komsuite-nyaapy/0.1.2/komsuite_nyaapy-0.1.2-py3-none-any.whl", hash = "sha256:3ea99891dd041a40613567a21adb6844d22532de429bd74b2fa8c062e038e7cb" }, { url = "https://git.theprivateserver.de/api/packages/KomSuite/pypi/files/komsuite-nyaapy/0.1.3/komsuite_nyaapy-0.1.3-py3-none-any.whl", hash = "sha256:f8d3628759c8074928b412ea43305b9a972bac6eaaa645fbc4ab83cb14bef400" },
] ]
[[package]] [[package]]
@@ -403,10 +403,12 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/52/46/3572761efc1bd45fcafb44a63b3b0feeb5b3f0066886821e94b0254f9253/lxml-6.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d18a25b19ca7307045581b18b3ec9ead2b1db5ccd8719c291f0cd0a5cec6cb81", size = 4947559, upload-time = "2025-06-28T18:47:31.091Z" }, { url = "https://files.pythonhosted.org/packages/52/46/3572761efc1bd45fcafb44a63b3b0feeb5b3f0066886821e94b0254f9253/lxml-6.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d18a25b19ca7307045581b18b3ec9ead2b1db5ccd8719c291f0cd0a5cec6cb81", size = 4947559, upload-time = "2025-06-28T18:47:31.091Z" },
{ url = "https://files.pythonhosted.org/packages/94/8a/5e40de920e67c4f2eef9151097deb9b52d86c95762d8ee238134aff2125d/lxml-6.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d4f0c66df4386b75d2ab1e20a489f30dc7fd9a06a896d64980541506086be1f1", size = 5102143, upload-time = "2025-06-28T18:47:33.612Z" }, { url = "https://files.pythonhosted.org/packages/94/8a/5e40de920e67c4f2eef9151097deb9b52d86c95762d8ee238134aff2125d/lxml-6.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d4f0c66df4386b75d2ab1e20a489f30dc7fd9a06a896d64980541506086be1f1", size = 5102143, upload-time = "2025-06-28T18:47:33.612Z" },
{ url = "https://files.pythonhosted.org/packages/7c/4b/20555bdd75d57945bdabfbc45fdb1a36a1a0ff9eae4653e951b2b79c9209/lxml-6.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f4b481b6cc3a897adb4279216695150bbe7a44c03daba3c894f49d2037e0a24", size = 5021931, upload-time = "2025-06-26T16:26:47.503Z" }, { url = "https://files.pythonhosted.org/packages/7c/4b/20555bdd75d57945bdabfbc45fdb1a36a1a0ff9eae4653e951b2b79c9209/lxml-6.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f4b481b6cc3a897adb4279216695150bbe7a44c03daba3c894f49d2037e0a24", size = 5021931, upload-time = "2025-06-26T16:26:47.503Z" },
{ url = "https://files.pythonhosted.org/packages/b6/6e/cf03b412f3763d4ca23b25e70c96a74cfece64cec3addf1c4ec639586b13/lxml-6.0.0-cp313-cp313-manylinux_2_27_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a78d6c9168f5bcb20971bf3329c2b83078611fbe1f807baadc64afc70523b3a", size = 5645469, upload-time = "2025-07-03T19:19:13.32Z" },
{ url = "https://files.pythonhosted.org/packages/d4/dd/39c8507c16db6031f8c1ddf70ed95dbb0a6d466a40002a3522c128aba472/lxml-6.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae06fbab4f1bb7db4f7c8ca9897dc8db4447d1a2b9bee78474ad403437bcc29", size = 5247467, upload-time = "2025-06-26T16:26:49.998Z" }, { url = "https://files.pythonhosted.org/packages/d4/dd/39c8507c16db6031f8c1ddf70ed95dbb0a6d466a40002a3522c128aba472/lxml-6.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae06fbab4f1bb7db4f7c8ca9897dc8db4447d1a2b9bee78474ad403437bcc29", size = 5247467, upload-time = "2025-06-26T16:26:49.998Z" },
{ url = "https://files.pythonhosted.org/packages/4d/56/732d49def0631ad633844cfb2664563c830173a98d5efd9b172e89a4800d/lxml-6.0.0-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:1fa377b827ca2023244a06554c6e7dc6828a10aaf74ca41965c5d8a4925aebb4", size = 4720601, upload-time = "2025-06-26T16:26:52.564Z" }, { url = "https://files.pythonhosted.org/packages/4d/56/732d49def0631ad633844cfb2664563c830173a98d5efd9b172e89a4800d/lxml-6.0.0-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:1fa377b827ca2023244a06554c6e7dc6828a10aaf74ca41965c5d8a4925aebb4", size = 4720601, upload-time = "2025-06-26T16:26:52.564Z" },
{ url = "https://files.pythonhosted.org/packages/8f/7f/6b956fab95fa73462bca25d1ea7fc8274ddf68fb8e60b78d56c03b65278e/lxml-6.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1676b56d48048a62ef77a250428d1f31f610763636e0784ba67a9740823988ca", size = 5060227, upload-time = "2025-06-26T16:26:55.054Z" }, { url = "https://files.pythonhosted.org/packages/8f/7f/6b956fab95fa73462bca25d1ea7fc8274ddf68fb8e60b78d56c03b65278e/lxml-6.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1676b56d48048a62ef77a250428d1f31f610763636e0784ba67a9740823988ca", size = 5060227, upload-time = "2025-06-26T16:26:55.054Z" },
{ url = "https://files.pythonhosted.org/packages/97/06/e851ac2924447e8b15a294855caf3d543424364a143c001014d22c8ca94c/lxml-6.0.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0e32698462aacc5c1cf6bdfebc9c781821b7e74c79f13e5ffc8bfe27c42b1abf", size = 4790637, upload-time = "2025-06-26T16:26:57.384Z" }, { url = "https://files.pythonhosted.org/packages/97/06/e851ac2924447e8b15a294855caf3d543424364a143c001014d22c8ca94c/lxml-6.0.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:0e32698462aacc5c1cf6bdfebc9c781821b7e74c79f13e5ffc8bfe27c42b1abf", size = 4790637, upload-time = "2025-06-26T16:26:57.384Z" },
{ url = "https://files.pythonhosted.org/packages/06/d4/fd216f3cd6625022c25b336c7570d11f4a43adbaf0a56106d3d496f727a7/lxml-6.0.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4d6036c3a296707357efb375cfc24bb64cd955b9ec731abf11ebb1e40063949f", size = 5662049, upload-time = "2025-07-03T19:19:16.409Z" },
{ url = "https://files.pythonhosted.org/packages/52/03/0e764ce00b95e008d76b99d432f1807f3574fb2945b496a17807a1645dbd/lxml-6.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7488a43033c958637b1a08cddc9188eb06d3ad36582cebc7d4815980b47e27ef", size = 5272430, upload-time = "2025-06-26T16:27:00.031Z" }, { url = "https://files.pythonhosted.org/packages/52/03/0e764ce00b95e008d76b99d432f1807f3574fb2945b496a17807a1645dbd/lxml-6.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7488a43033c958637b1a08cddc9188eb06d3ad36582cebc7d4815980b47e27ef", size = 5272430, upload-time = "2025-06-26T16:27:00.031Z" },
{ url = "https://files.pythonhosted.org/packages/5f/01/d48cc141bc47bc1644d20fe97bbd5e8afb30415ec94f146f2f76d0d9d098/lxml-6.0.0-cp313-cp313-win32.whl", hash = "sha256:5fcd7d3b1d8ecb91445bd71b9c88bdbeae528fefee4f379895becfc72298d181", size = 3612896, upload-time = "2025-06-26T16:27:04.251Z" }, { url = "https://files.pythonhosted.org/packages/5f/01/d48cc141bc47bc1644d20fe97bbd5e8afb30415ec94f146f2f76d0d9d098/lxml-6.0.0-cp313-cp313-win32.whl", hash = "sha256:5fcd7d3b1d8ecb91445bd71b9c88bdbeae528fefee4f379895becfc72298d181", size = 3612896, upload-time = "2025-06-26T16:27:04.251Z" },
{ url = "https://files.pythonhosted.org/packages/f4/87/6456b9541d186ee7d4cb53bf1b9a0d7f3b1068532676940fdd594ac90865/lxml-6.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:2f34687222b78fff795feeb799a7d44eca2477c3d9d3a46ce17d51a4f383e32e", size = 4013132, upload-time = "2025-06-26T16:27:06.415Z" }, { url = "https://files.pythonhosted.org/packages/f4/87/6456b9541d186ee7d4cb53bf1b9a0d7f3b1068532676940fdd594ac90865/lxml-6.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:2f34687222b78fff795feeb799a7d44eca2477c3d9d3a46ce17d51a4f383e32e", size = 4013132, upload-time = "2025-06-26T16:27:06.415Z" },
@@ -584,11 +586,11 @@ asyncio = [
[[package]] [[package]]
name = "typing-extensions" name = "typing-extensions"
version = "4.14.0" version = "4.14.1"
source = { registry = "https://pypi.org/simple" } source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423, upload-time = "2025-06-02T14:52:11.399Z" } sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" }
wheels = [ wheels = [
{ url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839, upload-time = "2025-06-02T14:52:10.026Z" }, { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" },
] ]
[[package]] [[package]]