From 51cd091481e10ad8d3b527085b0af27dabf4aa19 Mon Sep 17 00:00:00 2001 From: WarningImHack3r <43064022+WarningImHack3r@users.noreply.github.com> Date: Sat, 3 May 2025 20:03:19 +0200 Subject: [PATCH 1/6] feat: add per-package RSS feed --- package.json | 1 + pnpm-lock.yaml | 24 +++++++ .../package/[...package]/atom.xml/+server.ts | 11 +++ .../package/[...package]/rss.json/+server.ts | 11 +++ src/routes/package/[...package]/rss.ts | 67 +++++++++++++++++++ .../package/[...package]/rss.xml/+server.ts | 11 +++ 6 files changed, 125 insertions(+) create mode 100644 src/routes/package/[...package]/atom.xml/+server.ts create mode 100644 src/routes/package/[...package]/rss.json/+server.ts create mode 100644 src/routes/package/[...package]/rss.ts create mode 100644 src/routes/package/[...package]/rss.xml/+server.ts diff --git a/package.json b/package.json index 3edcf87e..94c8e3be 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "eslint": "^9.25.1", "eslint-config-prettier": "^10.1.2", "eslint-plugin-svelte": "^3.5.1", + "feed": "^4.2.2", "globals": "^16.0.0", "mode-watcher": "^1.0.2", "octokit": "^4.1.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e603b0f6..a7fdf9d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,6 +86,9 @@ importers: eslint-plugin-svelte: specifier: ^3.5.1 version: 3.5.1(eslint@9.25.1(jiti@2.4.2))(svelte@5.28.2) + feed: + specifier: ^4.2.2 + version: 4.2.2 globals: specifier: ^16.0.0 version: 16.0.0 @@ -1464,6 +1467,10 @@ packages: picomatch: optional: true + feed@4.2.2: + resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} + engines: {node: '>=0.4.0'} + fflate@0.4.8: resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==} @@ -2247,6 +2254,9 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + schema-dts@1.1.5: resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} @@ -2560,6 +2570,10 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + xml-js@1.6.11: + resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} + hasBin: true + yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} @@ -3807,6 +3821,10 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + feed@4.2.2: + dependencies: + xml-js: 1.6.11 + fflate@0.4.8: {} file-entry-cache@8.0.0: @@ -4727,6 +4745,8 @@ snapshots: dependencies: mri: 1.2.0 + sax@1.4.1: {} + schema-dts@1.1.5: {} semver@7.7.1: {} @@ -5043,6 +5063,10 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + xml-js@1.6.11: + dependencies: + sax: 1.4.1 + yallist@5.0.0: {} yaml@1.10.2: {} diff --git a/src/routes/package/[...package]/atom.xml/+server.ts b/src/routes/package/[...package]/atom.xml/+server.ts new file mode 100644 index 00000000..39903fb8 --- /dev/null +++ b/src/routes/package/[...package]/atom.xml/+server.ts @@ -0,0 +1,11 @@ +import { type RequestHandler, text } from "@sveltejs/kit"; +import { rssHandler } from "../rss"; + +export const GET: RequestHandler = rssHandler(feed => + text(feed.atom1(), { + headers: { + "Cache-Control": "max-age=0, s-max-age=600", + "Content-Type": "application/xml" + } + }) +); diff --git a/src/routes/package/[...package]/rss.json/+server.ts b/src/routes/package/[...package]/rss.json/+server.ts new file mode 100644 index 00000000..2c784413 --- /dev/null +++ b/src/routes/package/[...package]/rss.json/+server.ts @@ -0,0 +1,11 @@ +import { type RequestHandler, text } from "@sveltejs/kit"; +import { rssHandler } from "../rss"; + +export const GET: RequestHandler = rssHandler(feed => + text(feed.json1(), { + headers: { + "Cache-Control": "max-age=0, s-max-age=600", + "Content-Type": "application/json" + } + }) +); diff --git a/src/routes/package/[...package]/rss.ts b/src/routes/package/[...package]/rss.ts new file mode 100644 index 00000000..6401a746 --- /dev/null +++ b/src/routes/package/[...package]/rss.ts @@ -0,0 +1,67 @@ +import { error, type RequestHandler } from "@sveltejs/kit"; +import { Feed } from "feed"; +import { discoverer } from "$lib/server/package-discoverer"; +import { getPackageReleases } from "../releases"; + +function getBaseFeed(url: URL, title: string) { + const feed = new Feed({ + copyright: "", + description: `The releases feed for ${title}, brought by Svelte Changelog.`, + favicon: "https://raw.githubusercontent.com/sveltejs/branding/master/svelte-logo.svg", + feedLinks: { + xml: url.toString().replace(/[A-z\d]+\.[A-z\d]+$/, "rss.xml"), + json: url.toString().replace(/[A-z\d]+\.[A-z\d]+$/, "rss.json"), + atom: url.toString().replace(/[A-z\d]+\.[A-z\d]+$/, "atom.xml") + }, + id: url.toString(), + language: "en", + link: url.toString(), + title + }); + feed.addCategory("Technology"); + feed.addContributor({ + name: "Antoine Lethimonnier", + link: "https://github.com/WarningImHack3r" + }); + return feed; +} + +export function rssHandler(response: (feed: Feed) => Response): RequestHandler { + return async ({ params, url, locals }) => { + const { package: slugPackage } = params; + if (!slugPackage) error(400); + + // 1. Get all the discovered packages + const categorizedPackages = await discoverer.getOrDiscoverCategorized(); + + // 2. Get the releases and package info + const packageReleases = await getPackageReleases( + slugPackage, + categorizedPackages, + locals.posthog + ); + if (!packageReleases) error(404); + + const feed = getBaseFeed(url, `${packageReleases.releasesRepo.pkg.name} releases`); + for (const release of packageReleases.releases) { + feed.addItem({ + author: [ + { + name: release.author.name ?? undefined, + link: release.author.url, + email: release.author.email ?? undefined + } + ], + content: release.body ?? undefined, + date: new Date(release.published_at ?? release.created_at), + description: `${release.cleanName} ${release.cleanVersion} release`, + id: release.id.toString(), + link: release.html_url, + published: release.published_at ? new Date(release.published_at) : undefined, + title: `${release.cleanName}@${release.cleanVersion}` + }); + } + + return response(feed); + }; +} diff --git a/src/routes/package/[...package]/rss.xml/+server.ts b/src/routes/package/[...package]/rss.xml/+server.ts new file mode 100644 index 00000000..27ae2a60 --- /dev/null +++ b/src/routes/package/[...package]/rss.xml/+server.ts @@ -0,0 +1,11 @@ +import { type RequestHandler, text } from "@sveltejs/kit"; +import { rssHandler } from "../rss"; + +export const GET: RequestHandler = rssHandler(feed => + text(feed.rss2(), { + headers: { + "Cache-Control": "max-age=0, s-max-age=600", + "Content-Type": "application/xml" + } + }) +); From ed9c618ada80debf504024d933cf9eb93ba1c1e9 Mon Sep 17 00:00:00 2001 From: WarningImHack3r <43064022+WarningImHack3r@users.noreply.github.com> Date: Sun, 4 May 2025 00:10:52 +0200 Subject: [PATCH 2/6] feat: add per-package UI --- package.json | 4 +- pnpm-lock.yaml | 150 +++++++++--------- .../AnimatedCollapsibleContent.svelte | 32 ++++ src/lib/components/ui/collapsible/index.ts | 15 ++ src/routes/package/[...package]/+page.svelte | 59 +++++-- 5 files changed, 172 insertions(+), 88 deletions(-) create mode 100644 src/lib/components/AnimatedCollapsibleContent.svelte create mode 100644 src/lib/components/ui/collapsible/index.ts diff --git a/package.json b/package.json index 94c8e3be..074b2632 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@sveltejs/kit": "^2.20.7", "@sveltejs/vite-plugin-svelte": "^5.0.3", "@tailwindcss/typography": "^0.5.16", - "@tailwindcss/vite": "^4.1.4", + "@tailwindcss/vite": "^4.1.5", "@total-typescript/ts-reset": "^0.6.1", "@types/eslint-config-prettier": "^6.11.3", "@types/node": "^22.15.2", @@ -59,7 +59,7 @@ "svelte-sonner": "https://pkg.pr.new/wobsoriano/svelte-sonner@126", "tailwind-merge": "^3.2.0", "tailwind-variants": "^1.0.0", - "tailwindcss": "^4.1.4", + "tailwindcss": "^4.1.5", "tslib": "^2.8.1", "tw-animate-css": "^1.2.8", "typescript": "^5.8.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a7fdf9d5..b0e70f85 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,10 +49,10 @@ importers: version: 5.0.3(svelte@5.28.2)(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) '@tailwindcss/typography': specifier: ^0.5.16 - version: 0.5.16(tailwindcss@4.1.4) + version: 0.5.16(tailwindcss@4.1.5) '@tailwindcss/vite': - specifier: ^4.1.4 - version: 4.1.4(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) + specifier: ^4.1.5 + version: 4.1.5(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2)) '@total-typescript/ts-reset': specifier: ^0.6.1 version: 0.6.1 @@ -142,10 +142,10 @@ importers: version: 3.2.0 tailwind-variants: specifier: ^1.0.0 - version: 1.0.0(tailwindcss@4.1.4) + version: 1.0.0(tailwindcss@4.1.5) tailwindcss: - specifier: ^4.1.4 - version: 4.1.4 + specifier: ^4.1.5 + version: 4.1.5 tslib: specifier: ^2.8.1 version: 2.8.1 @@ -894,65 +894,65 @@ packages: '@swc/helpers@0.5.11': resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} - '@tailwindcss/node@4.1.4': - resolution: {integrity: sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==} + '@tailwindcss/node@4.1.5': + resolution: {integrity: sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==} - '@tailwindcss/oxide-android-arm64@4.1.4': - resolution: {integrity: sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==} + '@tailwindcss/oxide-android-arm64@4.1.5': + resolution: {integrity: sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.4': - resolution: {integrity: sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==} + '@tailwindcss/oxide-darwin-arm64@4.1.5': + resolution: {integrity: sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.4': - resolution: {integrity: sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==} + '@tailwindcss/oxide-darwin-x64@4.1.5': + resolution: {integrity: sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.4': - resolution: {integrity: sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==} + '@tailwindcss/oxide-freebsd-x64@4.1.5': + resolution: {integrity: sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': - resolution: {integrity: sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.5': + resolution: {integrity: sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': - resolution: {integrity: sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.5': + resolution: {integrity: sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.4': - resolution: {integrity: sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.5': + resolution: {integrity: sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.4': - resolution: {integrity: sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.5': + resolution: {integrity: sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.4': - resolution: {integrity: sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==} + '@tailwindcss/oxide-linux-x64-musl@4.1.5': + resolution: {integrity: sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.4': - resolution: {integrity: sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==} + '@tailwindcss/oxide-wasm32-wasi@4.1.5': + resolution: {integrity: sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -963,20 +963,20 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': - resolution: {integrity: sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.5': + resolution: {integrity: sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.4': - resolution: {integrity: sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.5': + resolution: {integrity: sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.4': - resolution: {integrity: sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==} + '@tailwindcss/oxide@4.1.5': + resolution: {integrity: sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==} engines: {node: '>= 10'} '@tailwindcss/typography@0.5.16': @@ -984,8 +984,8 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tailwindcss/vite@4.1.4': - resolution: {integrity: sha512-4UQeMrONbvrsXKXXp/uxmdEN5JIJ9RkH7YVzs6AMxC/KC1+Np7WZBaNIco7TEjlkthqxZbt8pU/ipD+hKjm80A==} + '@tailwindcss/vite@4.1.5': + resolution: {integrity: sha512-FE1stRoqdHSb7RxesMfCXE8icwI1W6zGE/512ae3ZDrpkQYTTYeSyUJPRCjZd8CwVAhpDUbi1YR8pcZioFJQ/w==} peerDependencies: vite: ^5.2.0 || ^6 @@ -2382,8 +2382,8 @@ packages: peerDependencies: tailwindcss: '*' - tailwindcss@4.1.4: - resolution: {integrity: sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==} + tailwindcss@4.1.5: + resolution: {integrity: sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==} tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} @@ -3222,77 +3222,77 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/node@4.1.4': + '@tailwindcss/node@4.1.5': dependencies: enhanced-resolve: 5.18.1 jiti: 2.4.2 lightningcss: 1.29.2 - tailwindcss: 4.1.4 + tailwindcss: 4.1.5 - '@tailwindcss/oxide-android-arm64@4.1.4': + '@tailwindcss/oxide-android-arm64@4.1.5': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.4': + '@tailwindcss/oxide-darwin-arm64@4.1.5': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.4': + '@tailwindcss/oxide-darwin-x64@4.1.5': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.4': + '@tailwindcss/oxide-freebsd-x64@4.1.5': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.4': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.5': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.4': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.5': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.4': + '@tailwindcss/oxide-linux-arm64-musl@4.1.5': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.4': + '@tailwindcss/oxide-linux-x64-gnu@4.1.5': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.4': + '@tailwindcss/oxide-linux-x64-musl@4.1.5': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.4': + '@tailwindcss/oxide-wasm32-wasi@4.1.5': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.4': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.5': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.4': + '@tailwindcss/oxide-win32-x64-msvc@4.1.5': optional: true - '@tailwindcss/oxide@4.1.4': + '@tailwindcss/oxide@4.1.5': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.4 - '@tailwindcss/oxide-darwin-arm64': 4.1.4 - '@tailwindcss/oxide-darwin-x64': 4.1.4 - '@tailwindcss/oxide-freebsd-x64': 4.1.4 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.4 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.4 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.4 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.4 - '@tailwindcss/oxide-linux-x64-musl': 4.1.4 - '@tailwindcss/oxide-wasm32-wasi': 4.1.4 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.4 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.4 - - '@tailwindcss/typography@0.5.16(tailwindcss@4.1.4)': + '@tailwindcss/oxide-android-arm64': 4.1.5 + '@tailwindcss/oxide-darwin-arm64': 4.1.5 + '@tailwindcss/oxide-darwin-x64': 4.1.5 + '@tailwindcss/oxide-freebsd-x64': 4.1.5 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.5 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.5 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.5 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.5 + '@tailwindcss/oxide-linux-x64-musl': 4.1.5 + '@tailwindcss/oxide-wasm32-wasi': 4.1.5 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.5 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.5 + + '@tailwindcss/typography@0.5.16(tailwindcss@4.1.5)': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 4.1.4 + tailwindcss: 4.1.5 - '@tailwindcss/vite@4.1.4(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))': + '@tailwindcss/vite@4.1.5(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2))': dependencies: - '@tailwindcss/node': 4.1.4 - '@tailwindcss/oxide': 4.1.4 - tailwindcss: 4.1.4 + '@tailwindcss/node': 4.1.5 + '@tailwindcss/oxide': 4.1.5 + tailwindcss: 4.1.5 vite: 6.3.3(@types/node@22.15.2)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.4.2) '@total-typescript/ts-reset@0.6.1': {} @@ -4889,12 +4889,12 @@ snapshots: tailwind-merge@3.2.0: {} - tailwind-variants@1.0.0(tailwindcss@4.1.4): + tailwind-variants@1.0.0(tailwindcss@4.1.5): dependencies: tailwind-merge: 3.0.2 - tailwindcss: 4.1.4 + tailwindcss: 4.1.5 - tailwindcss@4.1.4: {} + tailwindcss@4.1.5: {} tapable@2.2.1: {} diff --git a/src/lib/components/AnimatedCollapsibleContent.svelte b/src/lib/components/AnimatedCollapsibleContent.svelte new file mode 100644 index 00000000..fc6b133b --- /dev/null +++ b/src/lib/components/AnimatedCollapsibleContent.svelte @@ -0,0 +1,32 @@ + + + + + {#snippet child({ props, open })} + {#if open} +
+ {@render children?.()} +
+ {/if} + {/snippet} +
diff --git a/src/lib/components/ui/collapsible/index.ts b/src/lib/components/ui/collapsible/index.ts new file mode 100644 index 00000000..83c01988 --- /dev/null +++ b/src/lib/components/ui/collapsible/index.ts @@ -0,0 +1,15 @@ +import { Collapsible as CollapsiblePrimitive } from "bits-ui"; + +const Root = CollapsiblePrimitive.Root; +const Trigger = CollapsiblePrimitive.Trigger; +const Content = CollapsiblePrimitive.Content; + +export { + Root, + Content, + Trigger, + // + Root as Collapsible, + Content as CollapsibleContent, + Trigger as CollapsibleTrigger, +}; diff --git a/src/routes/package/[...package]/+page.svelte b/src/routes/package/[...package]/+page.svelte index 66c81aa7..f768404b 100644 --- a/src/routes/package/[...package]/+page.svelte +++ b/src/routes/package/[...package]/+page.svelte @@ -1,10 +1,14 @@