From 874fafd0f3b01b14e384183f621250013fdf95de Mon Sep 17 00:00:00 2001 From: Wayne <5291640+ringoinca@users.noreply.github.com> Date: Sat, 18 Oct 2025 18:30:27 +0200 Subject: [PATCH] frontend: Responsive design for menu bar, pagination --- apps/open-archiver-enterprise/package.json | 2 +- package.json | 4 +- packages/enterprise/package.json | 2 +- packages/frontend/package.json | 4 +- .../src/lib/components/ui/pagination/index.ts | 25 +++ .../ui/pagination/pagination-content.svelte | 20 ++ .../ui/pagination/pagination-ellipsis.svelte | 22 +++ .../ui/pagination/pagination-item.svelte | 14 ++ .../ui/pagination/pagination-link.svelte | 39 ++++ .../pagination/pagination-next-button.svelte | 33 ++++ .../pagination/pagination-prev-button.svelte | 33 ++++ .../ui/pagination/pagination.svelte | 28 +++ .../src/routes/dashboard/+layout.svelte | 180 +++++++++++++----- .../routes/dashboard/admin/jobs/+page.svelte | 2 +- .../admin/jobs/[queueName]/+page.svelte | 112 +++++++---- .../dashboard/archived-emails/+page.svelte | 147 ++++++-------- .../compliance/audit-log/+page.svelte | 123 +++++------- .../src/routes/dashboard/search/+page.svelte | 139 ++++++-------- pnpm-lock.yaml | 146 +++++--------- 19 files changed, 640 insertions(+), 435 deletions(-) create mode 100644 packages/frontend/src/lib/components/ui/pagination/index.ts create mode 100644 packages/frontend/src/lib/components/ui/pagination/pagination-content.svelte create mode 100644 packages/frontend/src/lib/components/ui/pagination/pagination-ellipsis.svelte create mode 100644 packages/frontend/src/lib/components/ui/pagination/pagination-item.svelte create mode 100644 packages/frontend/src/lib/components/ui/pagination/pagination-link.svelte create mode 100644 packages/frontend/src/lib/components/ui/pagination/pagination-next-button.svelte create mode 100644 packages/frontend/src/lib/components/ui/pagination/pagination-prev-button.svelte create mode 100644 packages/frontend/src/lib/components/ui/pagination/pagination.svelte diff --git a/apps/open-archiver-enterprise/package.json b/apps/open-archiver-enterprise/package.json index 38de88d..1718c3b 100644 --- a/apps/open-archiver-enterprise/package.json +++ b/apps/open-archiver-enterprise/package.json @@ -1,6 +1,6 @@ { "name": "open-archiver-enterprise-app", - "version": "1.0.0", + "version": "1.4.0", "private": true, "scripts": { "dev": "ts-node-dev -r tsconfig-paths/register --project tsconfig.json --respawn --transpile-only index.ts", diff --git a/package.json b/package.json index 51da752..9703dbb 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "open-archiver", - "version": "0.3.4", + "version": "0.4.0", "private": true, - "license": "SEE LICENSE IN LICENSE-AGPL.txt", + "license": "SEE LICENSE IN LICENSE file", "scripts": { "build:oss": "pnpm --filter \"./packages/*\" --filter \"!./packages/enterprise\" --filter \"./apps/open-archiver\" build", "build:enterprise": "cross-env VITE_ENTERPRISE_MODE=true pnpm build", diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index 7bdfb6a..900ba78 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -2,7 +2,7 @@ "name": "@open-archiver/enterprise", "version": "1.0.0", "private": true, - "license": "SEE LICENSE IN LICENSE.txt", + "license": "SEE LICENSE IN LICENSE-BSL.txt", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { diff --git a/packages/frontend/package.json b/packages/frontend/package.json index c2e7f95..844548d 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -17,7 +17,6 @@ "@iconify/svelte": "^5.0.1", "@open-archiver/types": "workspace:*", "@sveltejs/kit": "^2.38.1", - "bits-ui": "^2.8.10", "clsx": "^2.1.1", "d3-shape": "^3.2.0", "html-entities": "^2.6.0", @@ -32,13 +31,14 @@ }, "devDependencies": { "@internationalized/date": "^3.8.2", - "@lucide/svelte": "^0.515.0", + "@lucide/svelte": "^0.544.0", "@sveltejs/adapter-auto": "^6.0.0", "@sveltejs/adapter-node": "^5.2.13", "@sveltejs/vite-plugin-svelte": "^5.0.0", "@tailwindcss/vite": "^4.0.0", "@types/d3-shape": "^3.1.7", "@types/semver": "^7.7.1", + "bits-ui": "^2.12.0", "dotenv": "^17.2.0", "layerchart": "2.0.0-next.27", "mode-watcher": "^1.1.0", diff --git a/packages/frontend/src/lib/components/ui/pagination/index.ts b/packages/frontend/src/lib/components/ui/pagination/index.ts new file mode 100644 index 0000000..d83c7a9 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/pagination/index.ts @@ -0,0 +1,25 @@ +import Root from "./pagination.svelte"; +import Content from "./pagination-content.svelte"; +import Item from "./pagination-item.svelte"; +import Link from "./pagination-link.svelte"; +import PrevButton from "./pagination-prev-button.svelte"; +import NextButton from "./pagination-next-button.svelte"; +import Ellipsis from "./pagination-ellipsis.svelte"; + +export { + Root, + Content, + Item, + Link, + PrevButton, + NextButton, + Ellipsis, + // + Root as Pagination, + Content as PaginationContent, + Item as PaginationItem, + Link as PaginationLink, + PrevButton as PaginationPrevButton, + NextButton as PaginationNextButton, + Ellipsis as PaginationEllipsis, +}; diff --git a/packages/frontend/src/lib/components/ui/pagination/pagination-content.svelte b/packages/frontend/src/lib/components/ui/pagination/pagination-content.svelte new file mode 100644 index 0000000..e1124fc --- /dev/null +++ b/packages/frontend/src/lib/components/ui/pagination/pagination-content.svelte @@ -0,0 +1,20 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/pagination/pagination-ellipsis.svelte b/packages/frontend/src/lib/components/ui/pagination/pagination-ellipsis.svelte new file mode 100644 index 0000000..3be94c9 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/pagination/pagination-ellipsis.svelte @@ -0,0 +1,22 @@ + + + diff --git a/packages/frontend/src/lib/components/ui/pagination/pagination-item.svelte b/packages/frontend/src/lib/components/ui/pagination/pagination-item.svelte new file mode 100644 index 0000000..fd7ffc3 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/pagination/pagination-item.svelte @@ -0,0 +1,14 @@ + + +
  • + {@render children?.()} +
  • diff --git a/packages/frontend/src/lib/components/ui/pagination/pagination-link.svelte b/packages/frontend/src/lib/components/ui/pagination/pagination-link.svelte new file mode 100644 index 0000000..58b1a5c --- /dev/null +++ b/packages/frontend/src/lib/components/ui/pagination/pagination-link.svelte @@ -0,0 +1,39 @@ + + +{#snippet Fallback()} + {page.value} +{/snippet} + + diff --git a/packages/frontend/src/lib/components/ui/pagination/pagination-next-button.svelte b/packages/frontend/src/lib/components/ui/pagination/pagination-next-button.svelte new file mode 100644 index 0000000..d4b9553 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/pagination/pagination-next-button.svelte @@ -0,0 +1,33 @@ + + +{#snippet Fallback()} + Next + +{/snippet} + + diff --git a/packages/frontend/src/lib/components/ui/pagination/pagination-prev-button.svelte b/packages/frontend/src/lib/components/ui/pagination/pagination-prev-button.svelte new file mode 100644 index 0000000..2d3dc70 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/pagination/pagination-prev-button.svelte @@ -0,0 +1,33 @@ + + +{#snippet Fallback()} + + Previous +{/snippet} + + diff --git a/packages/frontend/src/lib/components/ui/pagination/pagination.svelte b/packages/frontend/src/lib/components/ui/pagination/pagination.svelte new file mode 100644 index 0000000..60e3471 --- /dev/null +++ b/packages/frontend/src/lib/components/ui/pagination/pagination.svelte @@ -0,0 +1,28 @@ + + + diff --git a/packages/frontend/src/routes/dashboard/+layout.svelte b/packages/frontend/src/routes/dashboard/+layout.svelte index a946779..c8d83bd 100644 --- a/packages/frontend/src/routes/dashboard/+layout.svelte +++ b/packages/frontend/src/routes/dashboard/+layout.svelte @@ -1,7 +1,9 @@ -
    +
    OpenArchiver Logo - Open Archiver + - - - {#each navItems as item} - {#if item.subMenu && item.subMenu.length > 0} - - page.url.pathname.startsWith( - sub.href.substring(0, sub.href.lastIndexOf('/')) + + + +
    + +
    + + + {#snippet child({ props })} + + {/snippet} + + + {#each navItems as item} + {#if item.subMenu && item.subMenu.length > 0} + + {item.label} + + {#each item.subMenu as subItem} + + {subItem.label} + + {/each} + + + {:else if item.href} + + {item.label} + + {/if} + {/each} + + +
    -
    +
    {@render children()}
    diff --git a/packages/frontend/src/routes/dashboard/admin/jobs/+page.svelte b/packages/frontend/src/routes/dashboard/admin/jobs/+page.svelte index 841f24f..916c96a 100644 --- a/packages/frontend/src/routes/dashboard/admin/jobs/+page.svelte +++ b/packages/frontend/src/routes/dashboard/admin/jobs/+page.svelte @@ -18,7 +18,7 @@
    {#each queues as queue} - + {queue.name.split('_').join(' ')} diff --git a/packages/frontend/src/routes/dashboard/admin/jobs/[queueName]/+page.svelte b/packages/frontend/src/routes/dashboard/admin/jobs/[queueName]/+page.svelte index 505066f..fd93e2f 100644 --- a/packages/frontend/src/routes/dashboard/admin/jobs/[queueName]/+page.svelte +++ b/packages/frontend/src/routes/dashboard/admin/jobs/[queueName]/+page.svelte @@ -2,11 +2,15 @@ import type { PageData } from './$types'; import * as Card from '$lib/components/ui/card'; import { t } from '$lib/translations'; - import { Badge } from '$lib/components/ui/badge'; import * as Table from '$lib/components/ui/table'; - import { Button, buttonVariants } from '$lib/components/ui/button'; + import { Button } from '$lib/components/ui/button'; import { goto } from '$app/navigation'; import type { JobStatus } from '@open-archiver/types'; + import * as Pagination from '$lib/components/ui/pagination/index.js'; + import ChevronLeft from 'lucide-svelte/icons/chevron-left'; + import ChevronRight from 'lucide-svelte/icons/chevron-right'; + import { onMount } from 'svelte'; + import { browser } from '$app/environment'; let { data }: { data: PageData } = $props(); let queue = $derived(data.queue); @@ -22,6 +26,16 @@ let selectedStatus: JobStatus | undefined = $state('failed'); + onMount(() => { + if (browser) { + const url = new URL(window.location.href); + const status = url.searchParams.get('status') as JobStatus; + if (status) { + selectedStatus = status; + } + } + }); + function handleStatusChange(status: JobStatus) { selectedStatus = status; const url = new URL(window.location.href); @@ -29,12 +43,6 @@ url.searchParams.set('page', '1'); goto(url.toString(), { invalidateAll: true }); } - - function handlePageChange(page: number) { - const url = new URL(window.location.href); - url.searchParams.set('page', page.toString()); - goto(url.toString(), { invalidateAll: true }); - } @@ -132,32 +140,72 @@ - -
    -

    - {$t('app.jobs.showing')} - {queue.jobs.length} - {$t('app.jobs.of')} - {queue.pagination.totalJobs} - {$t('app.jobs.jobs')} -

    + +
    + {$t('app.jobs.showing')} + {queue.jobs.length} + {$t('app.jobs.of')} + {queue.pagination.totalJobs} + {$t('app.jobs.jobs')}
    -
    - - -
    + {#snippet children({ pages, currentPage })} + + +
    + + + + + + + {#each pages as page (page.key)} + {#if page.type === 'ellipsis'} + + + + {:else} + + + + {page.value} + + + + {/if} + {/each} + + + + + + + + + + {/snippet} + + {/if}
    diff --git a/packages/frontend/src/routes/dashboard/archived-emails/+page.svelte b/packages/frontend/src/routes/dashboard/archived-emails/+page.svelte index 80cee6f..7d9e2df 100644 --- a/packages/frontend/src/routes/dashboard/archived-emails/+page.svelte +++ b/packages/frontend/src/routes/dashboard/archived-emails/+page.svelte @@ -5,6 +5,9 @@ import * as Select from '$lib/components/ui/select'; import { goto } from '$app/navigation'; import { t } from '$lib/translations'; + import * as Pagination from '$lib/components/ui/pagination/index.js'; + import ChevronLeft from 'lucide-svelte/icons/chevron-left'; + import ChevronRight from 'lucide-svelte/icons/chevron-right'; let { data }: { data: PageData } = $props(); @@ -17,55 +20,6 @@ goto(`/dashboard/archived-emails?ingestionSourceId=${value}`); } }; - - const getPaginationItems = (currentPage: number, totalPages: number, siblingCount = 1) => { - const totalPageNumbers = siblingCount + 5; - - if (totalPages <= totalPageNumbers) { - return Array.from({ length: totalPages }, (_, i) => i + 1); - } - - const leftSiblingIndex = Math.max(currentPage - siblingCount, 1); - const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages); - - const shouldShowLeftDots = leftSiblingIndex > 2; - const shouldShowRightDots = rightSiblingIndex < totalPages - 2; - - const firstPageIndex = 1; - const lastPageIndex = totalPages; - - if (!shouldShowLeftDots && shouldShowRightDots) { - let leftItemCount = 3 + 2 * siblingCount; - let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); - return [...leftRange, '...', totalPages]; - } - - if (shouldShowLeftDots && !shouldShowRightDots) { - let rightItemCount = 3 + 2 * siblingCount; - let rightRange = Array.from( - { length: rightItemCount }, - (_, i) => totalPages - rightItemCount + i + 1 - ); - return [firstPageIndex, '...', ...rightRange]; - } - - if (shouldShowLeftDots && shouldShowRightDots) { - let middleRange = Array.from( - { length: rightSiblingIndex - leftSiblingIndex + 1 }, - (_, i) => leftSiblingIndex + i - ); - return [firstPageIndex, '...', ...middleRange, '...', lastPageIndex]; - } - - return []; - }; - - let paginationItems = $derived( - getPaginationItems( - archivedEmails.page, - Math.ceil(archivedEmails.total / archivedEmails.limit) - ) - ); @@ -155,46 +109,61 @@
    {#if archivedEmails.total > archivedEmails.limit} -
    - + - - - - {#each paginationItems as item} - {#if typeof item === 'number'} - - - - {:else} - ... - {/if} - {/each} - - - - + {#snippet children({ pages, currentPage })} + + + + + + + + + + {#each pages as page (page.key)} + {#if page.type === 'ellipsis'} + + + + {:else} + + + + {page.value} + + + + {/if} + {/each} + + + + + + + + + + {/snippet} +
    {/if} diff --git a/packages/frontend/src/routes/dashboard/compliance/audit-log/+page.svelte b/packages/frontend/src/routes/dashboard/compliance/audit-log/+page.svelte index f429d16..775f3e0 100644 --- a/packages/frontend/src/routes/dashboard/compliance/audit-log/+page.svelte +++ b/packages/frontend/src/routes/dashboard/compliance/audit-log/+page.svelte @@ -14,58 +14,15 @@ import type { AuditLogAction, AuditLogEntry } from '@open-archiver/types'; import * as Dialog from '$lib/components/ui/dialog/index.js'; import { Label } from '$lib/components/ui/label'; + import * as Pagination from '$lib/components/ui/pagination/index.js'; + import ChevronLeft from 'lucide-svelte/icons/chevron-left'; + import ChevronRight from 'lucide-svelte/icons/chevron-right'; let { data }: { data: PageData } = $props(); let logs = $derived(data.logs); let meta = $derived(data.meta); - const getPaginationItems = (currentPage: number, totalPages: number, siblingCount = 1) => { - const totalPageNumbers = siblingCount + 5; - - if (totalPages <= totalPageNumbers) { - return Array.from({ length: totalPages }, (_, i) => i + 1); - } - - const leftSiblingIndex = Math.max(currentPage - siblingCount, 1); - const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages); - - const shouldShowLeftDots = leftSiblingIndex > 2; - const shouldShowRightDots = rightSiblingIndex < totalPages - 2; - - const firstPageIndex = 1; - const lastPageIndex = totalPages; - - if (!shouldShowLeftDots && shouldShowRightDots) { - let leftItemCount = 3 + 2 * siblingCount; - let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); - return [...leftRange, '...', totalPages]; - } - - if (shouldShowLeftDots && !shouldShowRightDots) { - let rightItemCount = 3 + 2 * siblingCount; - let rightRange = Array.from( - { length: rightItemCount }, - (_, i) => totalPages - rightItemCount + i + 1 - ); - return [firstPageIndex, '...', ...rightRange]; - } - - if (shouldShowLeftDots && shouldShowRightDots) { - let middleRange = Array.from( - { length: rightSiblingIndex - leftSiblingIndex + 1 }, - (_, i) => leftSiblingIndex + i - ); - return [firstPageIndex, '...', ...middleRange, '...', lastPageIndex]; - } - - return []; - }; - - let paginationItems = $derived( - getPaginationItems(meta.page, Math.ceil(meta.total / meta.limit)) - ); - let isDetailViewOpen = $state(false); let selectedLog = $state(null); @@ -228,32 +185,54 @@ {#if meta.total > meta.limit} -
    - - - - - {#each paginationItems as item} - {#if typeof item === 'number'} - - - - {:else} - ... - {/if} - {/each} - - - - +
    + + {#snippet children({ pages, currentPage })} + + + + + + + + + + {#each pages as page (page.key)} + {#if page.type === 'ellipsis'} + + + + {:else} + + + + {page.value} + + + + {/if} + {/each} + + + + + + + + + + {/snippet} +
    {/if} diff --git a/packages/frontend/src/routes/dashboard/search/+page.svelte b/packages/frontend/src/routes/dashboard/search/+page.svelte index 4fd539b..34df5df 100644 --- a/packages/frontend/src/routes/dashboard/search/+page.svelte +++ b/packages/frontend/src/routes/dashboard/search/+page.svelte @@ -17,6 +17,9 @@ import CircleAlertIcon from '@lucide/svelte/icons/circle-alert'; import * as Alert from '$lib/components/ui/alert/index.js'; import { t } from '$lib/translations'; + import * as Pagination from '$lib/components/ui/pagination/index.js'; + import ChevronLeft from 'lucide-svelte/icons/chevron-left'; + import ChevronRight from 'lucide-svelte/icons/chevron-right'; let { data }: { data: PageData } = $props(); let searchResult = $derived(data.searchResult); @@ -121,55 +124,6 @@ return snippets; } - - const getPaginationItems = (currentPage: number, totalPages: number, siblingCount = 1) => { - const totalPageNumbers = siblingCount + 5; - - if (totalPages <= totalPageNumbers) { - return Array.from({ length: totalPages }, (_, i) => i + 1); - } - - const leftSiblingIndex = Math.max(currentPage - siblingCount, 1); - const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages); - - const shouldShowLeftDots = leftSiblingIndex > 2; - const shouldShowRightDots = rightSiblingIndex < totalPages - 2; - - const firstPageIndex = 1; - const lastPageIndex = totalPages; - - if (!shouldShowLeftDots && shouldShowRightDots) { - let leftItemCount = 3 + 2 * siblingCount; - let leftRange = Array.from({ length: leftItemCount }, (_, i) => i + 1); - return [...leftRange, '...', totalPages]; - } - - if (shouldShowLeftDots && !shouldShowRightDots) { - let rightItemCount = 3 + 2 * siblingCount; - let rightRange = Array.from( - { length: rightItemCount }, - (_, i) => totalPages - rightItemCount + i + 1 - ); - return [firstPageIndex, '...', ...rightRange]; - } - - if (shouldShowLeftDots && shouldShowRightDots) { - let middleRange = Array.from( - { length: rightSiblingIndex - leftSiblingIndex + 1 }, - (_, i) => leftSiblingIndex + i - ); - return [firstPageIndex, '...', ...middleRange, '...', lastPageIndex]; - } - - return []; - }; - - let paginationItems = $derived( - getPaginationItems( - page, - Math.ceil((searchResult?.total || 0) / (searchResult?.limit || 10)) - ) - ); @@ -336,42 +290,57 @@
    {#if searchResult.total > searchResult.limit} -
    - - - - - {#each paginationItems as item} - {#if typeof item === 'number'} - - - - {:else} - ... - {/if} - {/each} - - - - +
    + + {#snippet children({ pages, currentPage })} + + + + + + + + + + {#each pages as page (page.key)} + {#if page.type === 'ellipsis'} + + + + {:else} + + + + {page.value} + + + + {/if} + {/each} + + + + + + + + + + {/snippet} +
    {/if} {/if} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 71c7dee..2bb8071 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -83,12 +83,6 @@ importers: '@azure/msal-node': specifier: ^3.6.3 version: 3.6.3 - '@bull-board/api': - specifier: ^6.13.0 - version: 6.13.0(@bull-board/ui@6.13.0) - '@bull-board/express': - specifier: ^6.13.0 - version: 6.13.0 '@casl/ability': specifier: ^6.7.3 version: 6.7.3 @@ -283,9 +277,6 @@ importers: '@sveltejs/kit': specifier: ^2.38.1 version: 2.38.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)) - bits-ui: - specifier: ^2.8.10 - version: 2.8.10(@internationalized/date@3.8.2)(svelte@5.35.5) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -324,8 +315,8 @@ importers: specifier: ^3.8.2 version: 3.8.2 '@lucide/svelte': - specifier: ^0.515.0 - version: 0.515.0(svelte@5.35.5) + specifier: ^0.544.0 + version: 0.544.0(svelte@5.35.5) '@sveltejs/adapter-auto': specifier: ^6.0.0 version: 6.0.1(@sveltejs/kit@2.38.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1))) @@ -344,6 +335,9 @@ importers: '@types/semver': specifier: ^7.7.1 version: 7.7.1 + bits-ui: + specifier: ^2.12.0 + version: 2.12.0(@internationalized/date@3.8.2)(@sveltejs/kit@2.38.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5) dotenv: specifier: ^17.2.0 version: 17.2.0 @@ -652,17 +646,6 @@ packages: resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} engines: {node: '>=6.9.0'} - '@bull-board/api@6.13.0': - resolution: {integrity: sha512-GZ0On0VeL5uZVS1x7UdU90F9GV1kdmHa1955hW3Ow1PmslCY/2YwmvnapVdbvCUSVBqluTfbVZsE9X3h79r1kw==} - peerDependencies: - '@bull-board/ui': 6.13.0 - - '@bull-board/express@6.13.0': - resolution: {integrity: sha512-PAbzD3dplV2NtN8ETs00bp++pBOD+cVb1BEYltXrjyViA2WluDBVKdlh/2wM+sHbYO2TAMNg8bUtKxGNCmxG7w==} - - '@bull-board/ui@6.13.0': - resolution: {integrity: sha512-63I6b3nZnKWI5ok6mw/Tk2rIObuzMTY/tLGyO51p0GW4rAImdXxrK6mT7j4SgEuP2B+tt/8L1jU7sLu8MMcCNw==} - '@casl/ability@6.7.3': resolution: {integrity: sha512-A4L28Ko+phJAsTDhRjzCOZWECQWN2jzZnJPnROWWHjJpyMq1h7h9ZqjwS2WbIUa3Z474X1ZPSgW0f1PboZGC0A==} @@ -1205,8 +1188,8 @@ packages: '@layerstack/utils@2.0.0-next.12': resolution: {integrity: sha512-fhGZUlSr3N+D44BYm37WKMGSEFyZBW+dwIqtGU8Cl54mR4TLQ/UwyGhdpgIHyH/x/8q1abE0fP0Dn6ZsrDE3BA==} - '@lucide/svelte@0.515.0': - resolution: {integrity: sha512-CEAyqcZmNBfYzVgaRmK2RFJP5tnbXxekRyDk0XX/eZQRfsJmkDvmQwXNX8C869BgNeryzmrRyjHhUL6g9ZOHNA==} + '@lucide/svelte@0.544.0': + resolution: {integrity: sha512-9f9O6uxng2pLB01sxNySHduJN3HTl5p0HDu4H26VR51vhZfiMzyOMe9Mhof3XAk4l813eTtl+/DYRvGyoRR+yw==} peerDependencies: svelte: ^5 @@ -2176,8 +2159,8 @@ packages: birpc@2.5.0: resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==} - bits-ui@2.8.10: - resolution: {integrity: sha512-MOobkqapDZNrpcNmeL2g664xFmH4tZBOKBTxFmsQYMZQuybSZHQnPXy+AjM5XZEXRmCFx5+XRmo6+fC3vHh1hQ==} + bits-ui@2.12.0: + resolution: {integrity: sha512-8NF4ILNyAJlIxDXpl/akGXGBV5QmZAe+8gTfPttM5P6/+LrijumcSfFXY5cr4QkXwTmLA7H5stYpbgJf2XFJvg==} engines: {node: '>=20'} peerDependencies: '@internationalized/date': ^3.8.1 @@ -2726,11 +2709,6 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - emoji-regex-xs@1.0.0: resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} @@ -2886,9 +2864,6 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3217,11 +3192,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true - jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true @@ -3416,6 +3386,10 @@ packages: resolution: {integrity: sha512-RkRWjA926cTvz5rAb1BqyWkKbbjzCGchDUIKMCUvNi17j6f6j8uHGDV82Aqcqtzd+icoYpELmG3ksgGiFNNcNg==} engines: {node: '>=12'} + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -4017,9 +3991,6 @@ packages: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} - redis-info@3.1.0: - resolution: {integrity: sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==} - redis-parser@3.0.0: resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} engines: {node: '>=4'} @@ -4092,10 +4063,14 @@ packages: peerDependencies: svelte: ^5.7.0 - runed@0.29.2: - resolution: {integrity: sha512-0cq6cA6sYGZwl/FvVqjx9YN+1xEBu9sDDyuWdDW1yWX7JF2wmvmVKfH+hVCZs+csW+P3ARH92MjI3H9QTagOQA==} + runed@0.35.1: + resolution: {integrity: sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==} peerDependencies: + '@sveltejs/kit': ^2.21.0 svelte: ^5.7.0 + peerDependenciesMeta: + '@sveltejs/kit': + optional: true rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} @@ -4351,18 +4326,18 @@ packages: peerDependencies: svelte: ^5.0.0 + svelte-toolbelt@0.10.6: + resolution: {integrity: sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} + peerDependencies: + svelte: ^5.30.2 + svelte-toolbelt@0.7.1: resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==} engines: {node: '>=18', pnpm: '>=8.7.0'} peerDependencies: svelte: ^5.0.0 - svelte-toolbelt@0.9.3: - resolution: {integrity: sha512-HCSWxCtVmv+c6g1ACb8LTwHVbDqLKJvHpo6J8TaqwUme2hj9ATJCpjCPNISR1OCq2Q4U1KT41if9ON0isINQZw==} - engines: {node: '>=18', pnpm: '>=8.7.0'} - peerDependencies: - svelte: ^5.30.2 - svelte@5.35.5: resolution: {integrity: sha512-KuRvI82rhh0RMz1EKsUJD96gZyHJ+h2+8zrwO8iqE/p/CmcNKvIItDUAeUePhuCDgtegDJmF8IKThbHIfmTgTA==} engines: {node: '>=18'} @@ -5367,24 +5342,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@bull-board/api@6.13.0(@bull-board/ui@6.13.0)': - dependencies: - '@bull-board/ui': 6.13.0 - redis-info: 3.1.0 - - '@bull-board/express@6.13.0': - dependencies: - '@bull-board/api': 6.13.0(@bull-board/ui@6.13.0) - '@bull-board/ui': 6.13.0 - ejs: 3.1.10 - express: 5.1.0 - transitivePeerDependencies: - - supports-color - - '@bull-board/ui@6.13.0': - dependencies: - '@bull-board/api': 6.13.0(@bull-board/ui@6.13.0) - '@casl/ability@6.7.3': dependencies: '@ucast/mongo2js': 1.4.0 @@ -5738,7 +5695,7 @@ snapshots: d3-time-format: 4.1.0 lodash-es: 4.17.21 - '@lucide/svelte@0.515.0(svelte@5.35.5)': + '@lucide/svelte@0.544.0(svelte@5.35.5)': dependencies: svelte: 5.35.5 @@ -6805,16 +6762,18 @@ snapshots: birpc@2.5.0: {} - bits-ui@2.8.10(@internationalized/date@3.8.2)(svelte@5.35.5): + bits-ui@2.12.0(@internationalized/date@3.8.2)(@sveltejs/kit@2.38.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5): dependencies: '@floating-ui/core': 1.7.2 '@floating-ui/dom': 1.7.2 '@internationalized/date': 3.8.2 esm-env: 1.2.2 - runed: 0.29.2(svelte@5.35.5) + runed: 0.35.1(@sveltejs/kit@2.38.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5) svelte: 5.35.5 - svelte-toolbelt: 0.9.3(svelte@5.35.5) + svelte-toolbelt: 0.10.6(@sveltejs/kit@2.38.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5) tabbable: 6.2.0 + transitivePeerDependencies: + - '@sveltejs/kit' bl@4.1.0: dependencies: @@ -7293,10 +7252,6 @@ snapshots: ee-first@1.1.1: {} - ejs@3.1.10: - dependencies: - jake: 10.9.2 - emoji-regex-xs@1.0.0: {} emoji-regex@8.0.0: {} @@ -7518,10 +7473,6 @@ snapshots: file-uri-to-path@1.0.0: {} - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -7917,13 +7868,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jake@10.9.2: - dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - jiti@2.4.2: {} jose@6.0.11: {} @@ -8128,6 +8072,8 @@ snapshots: luxon@3.7.1: {} + lz-string@1.5.0: {} + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 @@ -8717,10 +8663,6 @@ snapshots: redis-errors@1.2.0: {} - redis-info@3.1.0: - dependencies: - lodash: 4.17.21 - redis-parser@3.0.0: dependencies: redis-errors: 1.2.0 @@ -8814,10 +8756,14 @@ snapshots: esm-env: 1.2.2 svelte: 5.35.5 - runed@0.29.2(svelte@5.35.5): + runed@0.35.1(@sveltejs/kit@2.38.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5): dependencies: + dequal: 2.0.3 esm-env: 1.2.2 + lz-string: 1.5.0 svelte: 5.35.5 + optionalDependencies: + '@sveltejs/kit': 2.38.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)) rw@1.3.3: {} @@ -9103,6 +9049,15 @@ snapshots: runed: 0.28.0(svelte@5.35.5) svelte: 5.35.5 + svelte-toolbelt@0.10.6(@sveltejs/kit@2.38.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5): + dependencies: + clsx: 2.1.1 + runed: 0.35.1(@sveltejs/kit@2.38.1(@sveltejs/vite-plugin-svelte@5.1.0(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)))(svelte@5.35.5) + style-to-object: 1.0.9 + svelte: 5.35.5 + transitivePeerDependencies: + - '@sveltejs/kit' + svelte-toolbelt@0.7.1(svelte@5.35.5): dependencies: clsx: 2.1.1 @@ -9110,13 +9065,6 @@ snapshots: style-to-object: 1.0.9 svelte: 5.35.5 - svelte-toolbelt@0.9.3(svelte@5.35.5): - dependencies: - clsx: 2.1.1 - runed: 0.29.2(svelte@5.35.5) - style-to-object: 1.0.9 - svelte: 5.35.5 - svelte@5.35.5: dependencies: '@ampproject/remapping': 2.3.0