diff --git a/apps/gnocchi/hub/package.json b/apps/gnocchi/hub/package.json index e7f544f1..928def5e 100644 --- a/apps/gnocchi/hub/package.json +++ b/apps/gnocchi/hub/package.json @@ -20,7 +20,7 @@ "typecheck": "tsc --build tsconfig.json" }, "dependencies": { - "@a-type/ui": "^0.8.20", + "@a-type/ui": "^0.8.21", "@a-type/utils": "^1.0.8", "@tiptap/core": "^2.2.4", "@tiptap/extension-document": "^2.2.4", diff --git a/apps/gnocchi/web/package.json b/apps/gnocchi/web/package.json index e32823b4..f70a58e4 100644 --- a/apps/gnocchi/web/package.json +++ b/apps/gnocchi/web/package.json @@ -14,7 +14,7 @@ "typecheck": "tsc --build tsconfig.json" }, "dependencies": { - "@a-type/ui": "^0.8.20", + "@a-type/ui": "^0.8.21", "@a-type/utils": "^1.0.8", "@biscuits/client": "workspace:*", "@biscuits/error": "workspace:*", @@ -59,7 +59,6 @@ "prosemirror-model": "1.21.1", "react": "18.3.1", "react-dom": "18.3.1", - "react-hot-toast": "^2.3.0", "react-lazy-with-preload": "^2.2.1", "react-use-measure": "^2.1.1", "stopword": "^2.0.8", diff --git a/apps/gnocchi/web/src/App.tsx b/apps/gnocchi/web/src/App.tsx index 6491c8d3..b4c5b3b9 100644 --- a/apps/gnocchi/web/src/App.tsx +++ b/apps/gnocchi/web/src/App.tsx @@ -1,31 +1,17 @@ -import classNames from 'classnames'; -import { Suspense, useLayoutEffect, useState } from 'react'; -import { Toaster } from 'react-hot-toast'; -import { Pages } from './pages/Pages.jsx'; -import { Provider as GroceriesProvider } from './stores/groceries/Provider.jsx'; -import { IconSpritesheet } from '@a-type/ui/components/icon'; import { ReloadButton } from '@/components/sync/ReloadButton.jsx'; import { GlobalLoader } from '@/GlobalLoader.jsx'; -import { useVisualViewportOffset } from '@a-type/ui/hooks'; import { ErrorBoundary } from '@a-type/ui/components/errorBoundary'; -import { TooltipProvider } from '@a-type/ui/components/tooltip'; -import { P, H1 } from '@a-type/ui/components/typography'; -import { ParticleLayer } from '@a-type/ui/components/particles'; -import { GlobalSyncingIndicator } from '@/components/sync/GlobalSyncingIndicator.jsx'; -import { AppPreviewNotice, Provider } from '@biscuits/client'; -import { graphqlClient } from './graphql.js'; -import { groceriesDescriptor } from './stores/groceries/index.js'; +import { Provider as UIProvider } from '@a-type/ui/components/provider'; +import { H1, P } from '@a-type/ui/components/typography'; +import { Provider } from '@biscuits/client'; +import classNames from 'classnames'; +import { Suspense } from 'react'; import { AppMoved } from './components/promotional/AppMoved.jsx'; +import { Pages } from './pages/Pages.jsx'; +import { groceriesDescriptor } from './stores/groceries/index.js'; +import { Provider as GroceriesProvider } from './stores/groceries/Provider.jsx'; export function App() { - useLayoutEffect(() => { - if (typeof window !== 'undefined') { - document.body.className = 'theme-lemon'; - } - }, []); - - useVisualViewportOffset(); - return (
}> - + }> - - - - - - - - + + - +
); diff --git a/apps/gnocchi/web/src/components/foods/FoodNamesEditor.tsx b/apps/gnocchi/web/src/components/foods/FoodNamesEditor.tsx index 175243b0..9c77ab3a 100644 --- a/apps/gnocchi/web/src/components/foods/FoodNamesEditor.tsx +++ b/apps/gnocchi/web/src/components/foods/FoodNamesEditor.tsx @@ -16,7 +16,7 @@ import { } from '@a-type/ui/components/forms'; import { Cross2Icon, PlusIcon } from '@radix-ui/react-icons'; import { useState } from 'react'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; export interface FoodNamesEditorProps { names: FoodAlternateNames; diff --git a/apps/gnocchi/web/src/components/promotional/AppMoved.tsx b/apps/gnocchi/web/src/components/promotional/AppMoved.tsx index 39311c8b..756194d5 100644 --- a/apps/gnocchi/web/src/components/promotional/AppMoved.tsx +++ b/apps/gnocchi/web/src/components/promotional/AppMoved.tsx @@ -15,7 +15,7 @@ import { } from '@biscuits/client'; import { Link } from '@verdant-web/react-router'; import { Icon } from '@a-type/ui/components/icon'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; import { Button } from '@a-type/ui/components/button'; import { ExportDataButton } from '@biscuits/client/storage'; diff --git a/apps/gnocchi/web/src/components/recipes/cook/CookingActionBar.tsx b/apps/gnocchi/web/src/components/recipes/cook/CookingActionBar.tsx index 20b6921c..5a824bef 100644 --- a/apps/gnocchi/web/src/components/recipes/cook/CookingActionBar.tsx +++ b/apps/gnocchi/web/src/components/recipes/cook/CookingActionBar.tsx @@ -34,7 +34,7 @@ import { PopoverTrigger, } from '@a-type/ui/components/popover'; import { Note } from '@a-type/ui/components/note'; -import { HOME_ORIGIN } from 'node_modules/@biscuits/client/src/config.js'; +import { CONFIG } from '@biscuits/client'; export interface CookingActionBarProps { recipe: Recipe; @@ -130,7 +130,7 @@ function AddChefsAction() { device sync, grocery collaboration, and web recipe scanning.

- + Learn more about subscription features.

diff --git a/apps/gnocchi/web/src/components/recipes/viewer/RecipePublishControl.tsx b/apps/gnocchi/web/src/components/recipes/viewer/RecipePublishControl.tsx index dd5b15fd..cb63c1c5 100644 --- a/apps/gnocchi/web/src/components/recipes/viewer/RecipePublishControl.tsx +++ b/apps/gnocchi/web/src/components/recipes/viewer/RecipePublishControl.tsx @@ -22,7 +22,7 @@ import { import { Recipe } from '@gnocchi.biscuits/verdant'; import { format } from 'date-fns/esm'; import { useState } from 'react'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; export interface RecipePublishControlProps { recipe: Recipe; diff --git a/apps/gnocchi/web/src/graphql.ts b/apps/gnocchi/web/src/graphql.ts deleted file mode 100644 index 1d192a37..00000000 --- a/apps/gnocchi/web/src/graphql.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { createGraphQLClient } from '@biscuits/client'; -import { toast } from 'react-hot-toast'; - -export const graphqlClient = createGraphQLClient({ - onError: (err) => toast.error(err), -}); diff --git a/apps/gnocchi/web/src/pages/PlanPage.tsx b/apps/gnocchi/web/src/pages/PlanPage.tsx index 135c1760..f6f54efd 100644 --- a/apps/gnocchi/web/src/pages/PlanPage.tsx +++ b/apps/gnocchi/web/src/pages/PlanPage.tsx @@ -29,7 +29,7 @@ import { ArrowRightIcon } from '@radix-ui/react-icons'; import { ReactNode, useEffect } from 'react'; import { groceriesDescriptor } from '@/stores/groceries/index.js'; import { AutoRestoreScroll } from '@/components/nav/AutoRestoreScroll.jsx'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; const contents = { offline: OfflineContents, diff --git a/apps/gnocchi/web/src/stores/groceries/index.ts b/apps/gnocchi/web/src/stores/groceries/index.ts index 933a3c31..e5618294 100644 --- a/apps/gnocchi/web/src/stores/groceries/index.ts +++ b/apps/gnocchi/web/src/stores/groceries/index.ts @@ -1,6 +1,6 @@ import { pickBestNameMatch } from '@/components/foods/lookup.jsx'; import { groceriesState } from '@/components/groceries/state.js'; -import { graphqlClient } from '@/graphql.js'; +import { graphqlClient } from '@biscuits/client'; import { getVerdantSync, graphql, VerdantContext } from '@biscuits/client'; import { parseIngredient } from '@gnocchi.biscuits/conversion'; import { depluralize } from '@gnocchi.biscuits/conversion'; @@ -24,7 +24,7 @@ import { useSearchParams } from '@verdant-web/react-router'; import cuid from 'cuid'; import pluralize from 'pluralize'; import { useCallback } from 'react'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; import { getScannedRecipe } from './scanRecipe.js'; export interface Presence { diff --git a/apps/gnocchi/web/src/stores/groceries/scanRecipe.ts b/apps/gnocchi/web/src/stores/groceries/scanRecipe.ts index 1e134aa7..132a2400 100644 --- a/apps/gnocchi/web/src/stores/groceries/scanRecipe.ts +++ b/apps/gnocchi/web/src/stores/groceries/scanRecipe.ts @@ -2,13 +2,13 @@ import { graphql, isClientError, showSubscriptionPromotion, + graphqlClient, } from '@biscuits/client'; import { detailedInstructionsToDoc, instructionsToDoc } from '@/lib/tiptap.js'; import { BiscuitsError } from '@biscuits/error'; import { lookupUnit, parseIngredient } from '@gnocchi.biscuits/conversion'; -import { graphqlClient } from '@/graphql.js'; import { RecipeInit, Client } from '@gnocchi.biscuits/verdant'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; const recipeScanQuery = graphql(` query RecipeScan($input: RecipeScanInput!) { @@ -82,7 +82,7 @@ export async function getScannedRecipe( comments: [...(i.comments ?? [])], text: i.original, note: i.note, - isSectionHeader: i.isSectionHeader, + isSectionHeader: i.isSectionHeader ?? undefined, }; }); } else if (scanned.rawIngredients?.length) { diff --git a/apps/marginalia/web/package.json b/apps/marginalia/web/package.json index 9a636bde..1f6ff545 100644 --- a/apps/marginalia/web/package.json +++ b/apps/marginalia/web/package.json @@ -4,12 +4,12 @@ "private": true, "type": "module", "scripts": { - "app-dev": "vite --open --serve", + "app-dev": "vite --host --open", "build": "vite build", "preview": "vite preview" }, "dependencies": { - "@a-type/ui": "0.8.20", + "@a-type/ui": "0.8.21", "@a-type/utils": "1.1.0", "@biscuits/client": "workspace:*", "@marginalia.biscuits/verdant": "workspace:*", @@ -19,7 +19,6 @@ "classnames": "^2.5.0", "react": "18.3.1", "react-dom": "18.3.1", - "react-hot-toast": "^2.4.1", "unocss": "0.60.3", "valtio": "^1.13.2", "workbox-core": "^7.1.0", diff --git a/apps/marginalia/web/src/App.tsx b/apps/marginalia/web/src/App.tsx index 06bb1eef..4512628f 100644 --- a/apps/marginalia/web/src/App.tsx +++ b/apps/marginalia/web/src/App.tsx @@ -1,25 +1,15 @@ -import { clientDescriptor, hooks } from '@/store.js'; -import { ReactNode, Suspense, useLayoutEffect } from 'react'; import { Pages } from '@/pages/Pages.jsx'; -import { useVisualViewportOffset } from '@a-type/ui/hooks'; -import { Toaster } from 'react-hot-toast'; -import { IconSpritesheet } from '@a-type/ui/components/icon'; +import { clientDescriptor, hooks } from '@/store.js'; import { ErrorBoundary } from '@a-type/ui/components/errorBoundary'; -import { TooltipProvider } from '@a-type/ui/components/tooltip'; -import { ParticleLayer } from '@a-type/ui/components/particles'; -import { PrereleaseWarning, ReloadButton } from '@biscuits/client'; +import { Provider as UIProvider } from '@a-type/ui/components/provider'; import { H1, P } from '@a-type/ui/components/typography'; -import { - useCanSync, - Provider, - createGraphQLClient, - AppPreviewNotice, -} from '@biscuits/client'; -import { QueryClientProvider, QueryClient } from '@tanstack/react-query'; +import { useVisualViewportOffset } from '@a-type/ui/hooks'; +import { Provider, ReloadButton, useCanSync } from '@biscuits/client'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ReactNode, Suspense, useLayoutEffect } from 'react'; export interface AppProps {} -const graphqlClient = createGraphQLClient(); const queryClient = new QueryClient({ defaultOptions: { queries: { @@ -39,30 +29,20 @@ export function App({}: AppProps) { return ( }> - + - - - - - - - + - + ); } diff --git a/apps/marginalia/web/src/components/nav/TopLoader.tsx b/apps/marginalia/web/src/components/nav/TopLoader.tsx deleted file mode 100644 index 44cca7a2..00000000 --- a/apps/marginalia/web/src/components/nav/TopLoader.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { useIsRouteTransitioning } from '@verdant-web/react-router'; -import { animated, useSpring } from '@react-spring/web'; -import classNames from 'classnames'; -import { useCallback, useEffect } from 'react'; - -export interface TopLoaderProps { - className?: string; -} - -export function TopLoader({ className }: TopLoaderProps) { - const show = useIsRouteTransitioning(500); - - const [style, spring] = useSpring(() => ({ - width: '0%', - })); - - const run = useCallback(() => { - let timeout: NodeJS.Timer | undefined; - function step(previous: number) { - spring.start({ - width: `${previous}%`, - }); - const nextStep = Math.min( - 95 - previous, - Math.min((95 - previous) / 2, Math.random() * 20), - ); - timeout = setTimeout( - step, - 500 + Math.random() * 1000, - previous + nextStep, - ); - } - step(0); - return () => { - if (timeout) clearTimeout(timeout); - spring.start({ - width: '100%', - }); - }; - }, [show, spring]); - - useEffect(() => { - if (show) { - return run(); - } - }, [show, run]); - - return ( -
- -
- ); -} diff --git a/apps/marginalia/web/src/pages/Pages.tsx b/apps/marginalia/web/src/pages/Pages.tsx index d03f101e..f8df25c5 100644 --- a/apps/marginalia/web/src/pages/Pages.tsx +++ b/apps/marginalia/web/src/pages/Pages.tsx @@ -6,7 +6,6 @@ import { Spinner } from '@a-type/ui/components/spinner'; import { lazy, useCallback, Suspense } from 'react'; import { updateApp, updateState } from '@/updateState.js'; import { Link } from '@verdant-web/react-router'; -import { TopLoader } from '@/components/nav/TopLoader.jsx'; import { Button } from '@a-type/ui/components/button'; import { ReloadButton } from '@biscuits/client'; import { PageRoot } from '@a-type/ui/components/layouts'; @@ -47,7 +46,6 @@ export function Pages() { }> }> - diff --git a/apps/star-chart/web/index.html b/apps/star-chart/web/index.html index f3284a45..a4915ce4 100644 --- a/apps/star-chart/web/index.html +++ b/apps/star-chart/web/index.html @@ -39,7 +39,7 @@ - +
diff --git a/apps/star-chart/web/package.json b/apps/star-chart/web/package.json index 76f0958c..062454e3 100644 --- a/apps/star-chart/web/package.json +++ b/apps/star-chart/web/package.json @@ -9,7 +9,7 @@ "preview": "vite preview" }, "dependencies": { - "@a-type/ui": "0.8.20", + "@a-type/ui": "0.8.21", "@a-type/utils": "1.1.2", "@biscuits/client": "workspace:*", "@react-spring/web": "^9.7.3", @@ -21,7 +21,6 @@ "raf": "^3.4.1", "react": "18.3.1", "react-dom": "18.3.1", - "react-hot-toast": "^2.4.1", "react-hotkeys-hook": "^4.5.0", "rete": "^2.0.3", "rete-area-plugin": "^2.0.4", diff --git a/apps/star-chart/web/src/App.tsx b/apps/star-chart/web/src/App.tsx index 1d513582..ea78e672 100644 --- a/apps/star-chart/web/src/App.tsx +++ b/apps/star-chart/web/src/App.tsx @@ -1,60 +1,30 @@ -import { clientDescriptor, hooks } from '@/store.js'; -import { ReactNode, Suspense, useLayoutEffect } from 'react'; import { Pages } from '@/pages/Pages.jsx'; -import { useVisualViewportOffset } from '@a-type/ui/hooks'; -import { Toaster } from 'react-hot-toast'; -import { IconSpritesheet } from '@a-type/ui/components/icon'; +import { clientDescriptor, hooks } from '@/store.js'; import { ErrorBoundary } from '@a-type/ui/components/errorBoundary'; -import { TooltipProvider } from '@a-type/ui/components/tooltip'; -import { ParticleLayer } from '@a-type/ui/components/particles'; -import { PrereleaseWarning, ReloadButton } from '@biscuits/client'; +import { Provider as UIProvider } from '@a-type/ui/components/provider'; import { H1, P } from '@a-type/ui/components/typography'; -import { - useCanSync, - Provider, - createGraphQLClient, - AppPreviewNotice, -} from '@biscuits/client'; +import { Provider, ReloadButton, useCanSync } from '@biscuits/client'; +import { ReactNode, Suspense } from 'react'; import { ProjectSettingsDialog } from './components/project/ProjectSettingsDialog.jsx'; export interface AppProps {} -const graphqlClient = createGraphQLClient(); - export function App({}: AppProps) { - useLayoutEffect(() => { - if (typeof window !== 'undefined') { - document.body.className = 'theme-lemon'; - } - }, []); - - useVisualViewportOffset(); - return ( }> - + - - - - - - - - + + - + ); } diff --git a/apps/trip-tick/web/package.json b/apps/trip-tick/web/package.json index e7666cfc..68450fa7 100644 --- a/apps/trip-tick/web/package.json +++ b/apps/trip-tick/web/package.json @@ -9,7 +9,7 @@ "preview": "vite preview" }, "dependencies": { - "@a-type/ui": "^0.8.20", + "@a-type/ui": "^0.8.21", "@a-type/utils": "^1.0.6", "@biscuits/client": "workspace:*", "@radix-ui/react-progress": "^1.0.3", diff --git a/apps/trip-tick/web/src/App.tsx b/apps/trip-tick/web/src/App.tsx index 291428b3..b0f5cf99 100644 --- a/apps/trip-tick/web/src/App.tsx +++ b/apps/trip-tick/web/src/App.tsx @@ -1,47 +1,23 @@ import { Pages } from '@/pages/Pages.jsx'; import { clientDescriptor, hooks } from '@/store.js'; -import { IconSpritesheet } from '@a-type/ui/components/icon'; -import { TooltipProvider } from '@a-type/ui/components/tooltip'; -import { - useCanSync, - Provider, - createGraphQLClient, - AppPreviewNotice, -} from '@biscuits/client'; -import { ReactNode, Suspense } from 'react'; -import { Toaster } from 'react-hot-toast'; +import { Provider as UIProvider } from '@a-type/ui/components/provider'; import { FullScreenSpinner } from '@a-type/ui/components/spinner'; -import { ParticleLayer } from '@a-type/ui/components/particles'; -import { useVisualViewportOffset } from '@a-type/ui/hooks'; +import { Provider, useCanSync } from '@biscuits/client'; +import { ReactNode, Suspense } from 'react'; import { Explainer } from './components/onboarding/Explainer.jsx'; -const graphqlClient = createGraphQLClient(); - export function App() { - useVisualViewportOffset(); return (
}> - - - - - - - - - + + + + - - - + + +
); diff --git a/apps/trip-tick/web/src/components/lists/ListEditor.tsx b/apps/trip-tick/web/src/components/lists/ListEditor.tsx index 681894fc..47980823 100644 --- a/apps/trip-tick/web/src/components/lists/ListEditor.tsx +++ b/apps/trip-tick/web/src/components/lists/ListEditor.tsx @@ -8,7 +8,7 @@ import { debounce } from '@a-type/utils'; import { OnboardingTooltip } from '@biscuits/client'; import { List } from '@trip-tick.biscuits/verdant'; import { forwardRef, useState } from 'react'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; import { AddSuggested } from './AddSuggested.jsx'; import { ListInfoEditor } from './ListInfoEditor.jsx'; import { ListItemEditor } from './ListItemEditor.jsx'; diff --git a/apps/trip-tick/web/src/components/lists/ListMenu.tsx b/apps/trip-tick/web/src/components/lists/ListMenu.tsx index b605a455..18394eb3 100644 --- a/apps/trip-tick/web/src/components/lists/ListMenu.tsx +++ b/apps/trip-tick/web/src/components/lists/ListMenu.tsx @@ -10,7 +10,7 @@ import { import { Icon } from '@a-type/ui/components/icon'; import { List } from '@trip-tick.biscuits/verdant'; import { useNavigate } from '@verdant-web/react-router'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; export function ListMenu({ list }: { list: List }) { const client = hooks.useClient(); diff --git a/apps/trip-tick/web/src/components/trips/TripMenu.tsx b/apps/trip-tick/web/src/components/trips/TripMenu.tsx index 2f7d5ab9..d6e168ad 100644 --- a/apps/trip-tick/web/src/components/trips/TripMenu.tsx +++ b/apps/trip-tick/web/src/components/trips/TripMenu.tsx @@ -8,7 +8,7 @@ import { } from '@a-type/ui/components/dropdownMenu'; import { Icon } from '@a-type/ui/components/icon'; import { useNavigate } from '@verdant-web/react-router'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; export interface TripMenuProps { tripId: string; diff --git a/apps/trip-tick/web/src/components/weather/LocationSelect.tsx b/apps/trip-tick/web/src/components/weather/LocationSelect.tsx index 4f9cc385..b79a97fd 100644 --- a/apps/trip-tick/web/src/components/weather/LocationSelect.tsx +++ b/apps/trip-tick/web/src/components/weather/LocationSelect.tsx @@ -18,7 +18,7 @@ import { useCombobox } from 'downshift'; import { preventDefault } from '@a-type/utils'; import { useCallback, useRef, useState, useTransition } from 'react'; import { useSize } from '@a-type/ui/hooks'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; import { Button } from '@a-type/ui/components/button'; import { Icon } from '@a-type/ui/components/icon'; diff --git a/apps/trip-tick/web/src/pages/Pages.tsx b/apps/trip-tick/web/src/pages/Pages.tsx index e41f8080..bc634458 100644 --- a/apps/trip-tick/web/src/pages/Pages.tsx +++ b/apps/trip-tick/web/src/pages/Pages.tsx @@ -1,7 +1,5 @@ -import { TopLoader } from '@/components/nav/TopLoader.jsx'; import { updateApp, updateState } from '@/updateState.js'; import { PageRoot } from '@a-type/ui/components/layouts'; -import { Essentials } from '@biscuits/client'; import { Outlet, Router, makeRoutes } from '@verdant-web/react-router'; import { useCallback } from 'react'; import { lazyWithPreload as lazy } from 'react-lazy-with-preload'; @@ -49,8 +47,6 @@ export function Pages() { - - ); diff --git a/apps/trip-tick/web/src/pages/SettingsPage.tsx b/apps/trip-tick/web/src/pages/SettingsPage.tsx index d84715af..b10141f8 100644 --- a/apps/trip-tick/web/src/pages/SettingsPage.tsx +++ b/apps/trip-tick/web/src/pages/SettingsPage.tsx @@ -7,7 +7,7 @@ import { H1 } from '@a-type/ui/components/typography'; import { DarkModeToggle, usePageTitle } from '@biscuits/client'; import { ManageStorage } from '@biscuits/client/storage'; import { AutoRestoreScroll, Link } from '@verdant-web/react-router'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; export interface SettingsPageProps {} diff --git a/apps/wish-wash/.vscode/tasks.json b/apps/wish-wash/.vscode/tasks.json index edb179da..964bb2b8 100644 --- a/apps/wish-wash/.vscode/tasks.json +++ b/apps/wish-wash/.vscode/tasks.json @@ -6,7 +6,7 @@ "script": "app-dev", "path": "web", "problemMatcher": [], - "label": "npm: app-dev - web", + "label": "Dev", "detail": "vite" } ] diff --git a/apps/wish-wash/web/package.json b/apps/wish-wash/web/package.json index d812fc9d..ff18b174 100644 --- a/apps/wish-wash/web/package.json +++ b/apps/wish-wash/web/package.json @@ -9,18 +9,17 @@ "preview": "vite preview" }, "dependencies": { - "@a-type/ui": "^0.8.20", - "@a-type/utils": "^1.0.8", + "@a-type/ui": "0.8.21", + "@a-type/utils": "1.1.3", "@biscuits/client": "workspace:*", "@react-spring/web": "^9.7.3", "@unocss/transformer-variant-group": "^0.54.1", "@verdant-web/react-router": "^0.6.2", "@wish-wash.biscuits/verdant": "workspace:*", "react": "18.3.1", - "react-dom": "^18.2.0", - "react-hot-toast": "^2.4.1", - "unocss": "0.58.8", - "valtio": "^1.12.1", + "react-dom": "18.3.1", + "unocss": "0.61.0", + "valtio": "1.13.2", "workbox-core": "^6.5.4", "workbox-expiration": "^6.5.4", "workbox-precaching": "^6.5.4", @@ -29,10 +28,11 @@ "workbox-window": "^6.5.4" }, "devDependencies": { - "@types/react": "^18.2.79", - "@types/react-dom": "^18.2.25", - "@vitejs/plugin-react-swc": "3.5.0", - "vite": "5.2.7", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react-swc": "3.7.0", + "@originjs/vite-plugin-commonjs": "1.0.3", + "vite": "5.3.1", "vite-plugin-pwa": "^0.19.8" } } diff --git a/apps/wish-wash/web/public/favicon.ico b/apps/wish-wash/web/public/favicon.ico new file mode 100644 index 00000000..85000bf9 Binary files /dev/null and b/apps/wish-wash/web/public/favicon.ico differ diff --git a/apps/wish-wash/web/public/icon.png b/apps/wish-wash/web/public/icon.png new file mode 100644 index 00000000..53959604 Binary files /dev/null and b/apps/wish-wash/web/public/icon.png differ diff --git a/apps/wish-wash/web/src/App.tsx b/apps/wish-wash/web/src/App.tsx new file mode 100644 index 00000000..4ae82840 --- /dev/null +++ b/apps/wish-wash/web/src/App.tsx @@ -0,0 +1,53 @@ +import { Pages } from '@/pages/Pages.jsx'; +import { clientDescriptor, hooks } from '@/store.js'; +import { ErrorBoundary } from '@a-type/ui/components/errorBoundary'; +import { Provider as UIProvider } from '@a-type/ui/components/provider'; +import { H1, P } from '@a-type/ui/components/typography'; +import { useVisualViewportOffset } from '@a-type/ui/hooks'; +import { Provider, ReloadButton } from '@biscuits/client'; +import { ReactNode, Suspense } from 'react'; + +export interface AppProps {} + +export function App({}: AppProps) { + useVisualViewportOffset(); + + return ( + }> + + + + + + + + + + + ); +} + +function VerdantProvider({ children }: { children: ReactNode }) { + return {children}; +} + +function ErrorFallback() { + return ( +
+
+

Something went wrong

+

+ Sorry about this. The app has crashed. You can try refreshing, but if + that doesn't work,{' '} + + let me know about it. + +

+ +
+
+ ); +} diff --git a/apps/wish-wash/web/src/components/brand/Logo.tsx b/apps/wish-wash/web/src/components/brand/Logo.tsx new file mode 100644 index 00000000..201eeee3 --- /dev/null +++ b/apps/wish-wash/web/src/components/brand/Logo.tsx @@ -0,0 +1,7 @@ +export interface LogoProps { + className?: string; +} + +export function Logo({ className }: LogoProps) { + return App icon; +} diff --git a/apps/wish-wash/web/src/components/lists/CreateItemButton.tsx b/apps/wish-wash/web/src/components/lists/CreateItemButton.tsx new file mode 100644 index 00000000..fed84895 --- /dev/null +++ b/apps/wish-wash/web/src/components/lists/CreateItemButton.tsx @@ -0,0 +1,29 @@ +import { ButtonProps, Button } from '@a-type/ui/components/button'; +import { Icon } from '@a-type/ui/components/icon'; +import { List } from '@wish-wash.biscuits/verdant'; + +export interface CreateItemButtonProps extends ButtonProps { + list: List; +} + +export function CreateItemButton({ + list, + children, + ...rest +}: CreateItemButtonProps) { + const createItem = () => { + const item = list.get('items').push({ + description: 'New idea', + }); + }; + return ( + + ); +} diff --git a/apps/wish-wash/web/src/components/lists/CreateListButton.tsx b/apps/wish-wash/web/src/components/lists/CreateListButton.tsx new file mode 100644 index 00000000..e39961cc --- /dev/null +++ b/apps/wish-wash/web/src/components/lists/CreateListButton.tsx @@ -0,0 +1,31 @@ +import { hooks } from '@/store.js'; +import { ButtonProps, Button } from '@a-type/ui/components/button'; +import { Icon } from '@a-type/ui/components/icon'; +import { useNavigate } from '@verdant-web/react-router'; +import { MouseEvent } from 'react'; + +export interface CreateListButtonProps extends ButtonProps {} + +export function CreateListButton({ + children, + onClick, + ...props +}: CreateListButtonProps) { + const client = hooks.useClient(); + const navigate = useNavigate(); + const createList = async (ev: MouseEvent) => { + const list = await client.lists.put({ name: 'New list' }); + navigate(`/list/${list.get('id')}`); + onClick?.(ev); + }; + return ( + + ); +} diff --git a/apps/wish-wash/web/src/components/lists/ListItem.tsx b/apps/wish-wash/web/src/components/lists/ListItem.tsx new file mode 100644 index 00000000..bf2a3bb0 --- /dev/null +++ b/apps/wish-wash/web/src/components/lists/ListItem.tsx @@ -0,0 +1,34 @@ +import { ListItemsItem } from '@wish-wash.biscuits/verdant'; +import { Checkbox } from '@a-type/ui/components/checkbox'; +import { hooks } from '@/store.js'; + +export interface ListItemProps { + item: ListItemsItem; +} + +export function ListItem({ item }: ListItemProps) { + const { purchasedAt, description, link } = hooks.useWatch(item); + + return ( +
+ { + if (val) { + item.set('purchasedAt', Date.now()); + } else { + item.set('purchasedAt', null); + } + }} + /> +
+ {description} + {link && ( + + (link) + + )} +
+
+ ); +} diff --git a/apps/wish-wash/web/src/components/lists/ListView.tsx b/apps/wish-wash/web/src/components/lists/ListView.tsx new file mode 100644 index 00000000..87aa1435 --- /dev/null +++ b/apps/wish-wash/web/src/components/lists/ListView.tsx @@ -0,0 +1,28 @@ +import { hooks } from '@/store.js'; +import { H1 } from '@a-type/ui/components/typography'; +import { List } from '@wish-wash.biscuits/verdant'; +import { ListItem } from './ListItem.jsx'; +import { PageNowPlaying } from '@a-type/ui/components/layouts'; +import { CreateItemButton } from './CreateItemButton.jsx'; + +export interface ListViewProps { + list: List; +} + +export function ListView({ list }: ListViewProps) { + const { name, items } = hooks.useWatch(list); + hooks.useWatch(items); + return ( +
+

{name}

+
+ {items.map((item) => ( + + ))} +
+ + + +
+ ); +} diff --git a/apps/wish-wash/web/src/components/nav/NavBar.tsx b/apps/wish-wash/web/src/components/nav/NavBar.tsx new file mode 100644 index 00000000..539522c7 --- /dev/null +++ b/apps/wish-wash/web/src/components/nav/NavBar.tsx @@ -0,0 +1,58 @@ +import { PageNav } from '@a-type/ui/components/layouts'; +import { Link, useOnLocationChange } from '@verdant-web/react-router'; +import { + NavBarRoot, + NavBarItem, + NavBarItemText, + NavBarItemIconWrapper, + NavBarItemIcon, +} from '@a-type/ui/components/navBar'; +import { useState } from 'react'; +import { AppPickerNavItem } from '@biscuits/client'; +import { Logo } from '../brand/Logo.jsx'; + +export interface NavigationProps {} + +export function Navigation({}: NavigationProps) { + const [pathname, setPathname] = useState(() => window.location.pathname); + useOnLocationChange((location) => setPathname(location.pathname)); + const matchTrips = pathname === '/' || pathname.startsWith('/trips'); + const matchLists = pathname.startsWith('/lists'); + + return ( + +
+ +

+ Trip Tick +

+
+ + + + + + + Trips + + + + + + + + Lists + + + + + +
+ ); +} diff --git a/apps/wish-wash/web/src/main.tsx b/apps/wish-wash/web/src/main.tsx new file mode 100644 index 00000000..c98daf06 --- /dev/null +++ b/apps/wish-wash/web/src/main.tsx @@ -0,0 +1,15 @@ +import 'virtual:uno.css'; +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import { App } from './App.jsx'; + +function main() { + const root = createRoot(document.getElementById('root')!); + root.render( + + + , + ); +} + +main(); diff --git a/apps/wish-wash/web/src/pages/HomePage.tsx b/apps/wish-wash/web/src/pages/HomePage.tsx new file mode 100644 index 00000000..b747588d --- /dev/null +++ b/apps/wish-wash/web/src/pages/HomePage.tsx @@ -0,0 +1,44 @@ +import { CreateListButton } from '@/components/lists/CreateListButton.jsx'; +import { hooks } from '@/store.js'; +import { PageContent } from '@a-type/ui/components/layouts'; +import { H1, P } from '@a-type/ui/components/typography'; +import { useLocalStorage } from '@biscuits/client'; +import { useNavigate } from '@verdant-web/react-router'; +import { useEffect } from 'react'; + +export interface HomePageProps {} + +export function HomePage({}: HomePageProps) { + const [lastList] = useLocalStorage('last-list', null); + const someList = hooks.useOneList(); + const navigate = useNavigate(); + + useEffect(() => { + if (lastList || someList) { + navigate(`/list/${lastList || someList!.get('id')}`, { + replace: true, + skipTransition: true, + }); + } + }, [navigate, lastList, someList]); + + return ( + + + + ); +} + +export default HomePage; + +function EmptyContent() { + return ( + <> +

No lists!

+

+ You might have deleted all your lists. You can create a new one below. +

+ + + ); +} diff --git a/apps/wish-wash/web/src/pages/ListPage.tsx b/apps/wish-wash/web/src/pages/ListPage.tsx new file mode 100644 index 00000000..77a464b7 --- /dev/null +++ b/apps/wish-wash/web/src/pages/ListPage.tsx @@ -0,0 +1,47 @@ +import { ListView } from '@/components/lists/ListView.jsx'; +import { hooks } from '@/store.js'; +import { Button } from '@a-type/ui/components/button'; +import { PageContent } from '@a-type/ui/components/layouts'; +import { H1 } from '@a-type/ui/components/typography'; +import { useLocalStorage } from '@biscuits/client'; +import { Link, useNavigate, useParams } from '@verdant-web/react-router'; +import { useEffect } from 'react'; + +export interface ListPageProps {} + +export function ListPage({}: ListPageProps) { + const { listId } = useParams(); + const [_, setLastList] = useLocalStorage('last-list', null); + + const list = hooks.useList(listId); + + useEffect(() => { + setLastList(listId); + }, [listId, setLastList]); + const navigate = useNavigate(); + useEffect(() => { + if (!list) { + setLastList(null); + navigate('/'); + } + }, [!!list, setLastList]); + + if (!list) { + return ( + +

List not found

+ +
+ ); + } + + return ( + + + + ); +} + +export default ListPage; diff --git a/apps/wish-wash/web/src/pages/Pages.tsx b/apps/wish-wash/web/src/pages/Pages.tsx new file mode 100644 index 00000000..5302415a --- /dev/null +++ b/apps/wish-wash/web/src/pages/Pages.tsx @@ -0,0 +1,72 @@ +import { makeRoutes, Outlet, Router } from '@verdant-web/react-router'; +import { HomePage } from './HomePage.jsx'; +import { H1, P } from '@a-type/ui/components/typography'; +import { ErrorBoundary } from '@a-type/ui/components/errorBoundary'; +import { Button } from '@a-type/ui/components/button'; +import { Spinner } from '@a-type/ui/components/spinner'; +import { lazy, useCallback, Suspense } from 'react'; +import { updateApp, updateState } from '@/updateState.js'; +import { Link } from '@verdant-web/react-router'; +import { ReloadButton } from '@biscuits/client'; +import ListPage from './ListPage.jsx'; +import { PageRoot } from '@a-type/ui/components/layouts'; + +const routes = makeRoutes([ + { + path: '/', + exact: true, + component: HomePage, + }, + { + path: '/list/:listId', + component: ListPage, + }, + { + path: '/settings', + component: lazy(() => import('./SettingsPage.jsx')), + }, +]); + +export function Pages() { + const handleNavigate = useCallback( + (_: Location, ev: { state?: any; skipTransition?: boolean }) => { + if (updateState.updateAvailable) { + console.info('Update ready to install, intercepting navigation...'); + updateApp(); + return false; + } + }, + [], + ); + return ( + }> + }> + + + + + + + + ); +} + +function ErrorFallback({ clearError }: { clearError: () => void }) { + return ( +
+
+

Something went wrong

+

+ Sorry about this. The app has crashed. You can try refreshing, but if + that doesn't work, use the button below to report the issue. +

+ + +
+
+ ); +} diff --git a/apps/wish-wash/web/src/pages/SettingsPage.tsx b/apps/wish-wash/web/src/pages/SettingsPage.tsx new file mode 100644 index 00000000..34c8eec7 --- /dev/null +++ b/apps/wish-wash/web/src/pages/SettingsPage.tsx @@ -0,0 +1,26 @@ +import { useEffect } from 'react'; +import { checkForUpdate } from '@/updateState.js'; +import { H1 } from '@a-type/ui/components/typography'; +import { DarkModeToggle } from '@biscuits/client'; +import { PageContent } from '@a-type/ui/components/layouts'; + +export interface SettingsPageProps {} + +export function SettingsPage({}: SettingsPageProps) { + useEffect(() => { + checkForUpdate(); + }, []); + + return ( + +
+

Settings

+
+ +
+
+
+ ); +} + +export default SettingsPage; diff --git a/apps/wish-wash/web/src/privateStore.ts b/apps/wish-wash/web/src/privateStore.ts new file mode 100644 index 00000000..1987e9e5 --- /dev/null +++ b/apps/wish-wash/web/src/privateStore.ts @@ -0,0 +1,39 @@ +import { + ClientDescriptor, + createHooks, + migrations, + UserInfo, +} from '@wish-wash.biscuits/verdant'; +import { getVerdantSync, VerdantProfile } from '@biscuits/client'; +import { undoHistory } from './undo.js'; + +export interface Presence { + /** + * Put any transient presence state for users + * you want here + */ +} + +export type Participant = UserInfo; + +export const privateHooks = createHooks(); + +export const privateClientDescriptor = new ClientDescriptor({ + namespace: 'private_wish-wash', + migrations, + undoHistory, + sync: getVerdantSync({ + appId: 'wish-wash', + access: 'user', + initialPresence: {} satisfies Presence, + }), +}); + +// these are some helpers I like to use. You can delete them if you want. + +async function exposeClientOnWindowForDebug() { + const privateClient = await privateClientDescriptor.open(); + (window as any).client = privateClient; +} + +exposeClientOnWindowForDebug(); diff --git a/apps/wish-wash/web/src/service-worker.ts b/apps/wish-wash/web/src/service-worker.ts new file mode 100644 index 00000000..b9e8640c --- /dev/null +++ b/apps/wish-wash/web/src/service-worker.ts @@ -0,0 +1,60 @@ +/// +/* eslint-disable no-restricted-globals */ + +// This service worker can be customized! +// See https://developers.google.com/web/tools/workbox/modules +// for the list of available Workbox modules, or add any other +// code you'd like. +// You can also remove this file if you'd prefer not to use a +// service worker, and the Workbox build step will be skipped. + +import { ExpirationPlugin } from 'workbox-expiration'; +import { + precacheAndRoute, + createHandlerBoundToURL, + cleanupOutdatedCaches, +} from 'workbox-precaching'; +import { NavigationRoute, registerRoute } from 'workbox-routing'; +import { StaleWhileRevalidate } from 'workbox-strategies'; + +declare const self: ServiceWorkerGlobalScope; + +// auto-update on ready +// self.skipWaiting(); +// clientsClaim(); + +cleanupOutdatedCaches(); + +// Precache all of the assets generated by your build process. +// Their URLs are injected into the manifest variable below. +// This variable must be present somewhere in your service worker file, +// even if you decide not to use precaching. See https://cra.link/PWA +precacheAndRoute(self.__WB_MANIFEST); + +registerRoute(new NavigationRoute(createHandlerBoundToURL('/index.html'))); + +// An example runtime caching route for requests that aren't handled by the +// precache, in this case same-origin .png requests like those from in public/ +registerRoute( + // Add in any other file extensions or routing criteria as needed. + ({ url }) => + url.origin === self.location.origin && url.pathname.endsWith('.png'), + // Customize this strategy as needed, e.g., by changing to CacheFirst. + new StaleWhileRevalidate({ + cacheName: 'images', + plugins: [ + // Ensure that once this runtime cache reaches a maximum size the + // least-recently used images are removed. + new ExpirationPlugin({ maxEntries: 50 }), + ], + }), +); + +// This allows the web app to trigger skipWaiting via +// registration.waiting.postMessage({type: 'SKIP_WAITING'}) +self.addEventListener('message', (event) => { + if (event.data && event.data.type === 'SKIP_WAITING') { + console.log('Skip waiting'); + self.skipWaiting(); + } +}); diff --git a/apps/wish-wash/web/src/store.ts b/apps/wish-wash/web/src/store.ts new file mode 100644 index 00000000..b15a0a5b --- /dev/null +++ b/apps/wish-wash/web/src/store.ts @@ -0,0 +1,39 @@ +import { + ClientDescriptor, + createHooks, + migrations, + UserInfo, +} from '@wish-wash.biscuits/verdant'; +import { getVerdantSync, VerdantProfile } from '@biscuits/client'; +import { undoHistory } from './undo.js'; + +export interface Presence { + /** + * Put any transient presence state for users + * you want here + */ +} + +export type Participant = UserInfo; + +export const hooks = createHooks(); + +export const clientDescriptor = new ClientDescriptor({ + namespace: 'wish-wash', + migrations, + undoHistory, + sync: getVerdantSync({ + appId: 'wish-wash', + access: 'members', + initialPresence: {} satisfies Presence, + }), +}); + +// these are some helpers I like to use. You can delete them if you want. + +async function exposeClientOnWindowForDebug() { + const client = await clientDescriptor.open(); + (window as any).client = client; +} + +exposeClientOnWindowForDebug(); diff --git a/apps/wish-wash/web/src/undo.ts b/apps/wish-wash/web/src/undo.ts new file mode 100644 index 00000000..e8c21a6a --- /dev/null +++ b/apps/wish-wash/web/src/undo.ts @@ -0,0 +1,27 @@ +import { UndoHistory } from '@wish-wash.biscuits/verdant'; + +export const undoHistory = new UndoHistory(); + +async function registerUndoKeybinds() { + document.addEventListener('keydown', async (e) => { + if (e.key === 'z' && (e.ctrlKey || e.metaKey) && !e.shiftKey) { + e.preventDefault(); + const result = await undoHistory.undo(); + if (!result) { + console.log('Nothing to undo'); + } + } + if ( + (e.key === 'y' && (e.ctrlKey || e.metaKey)) || + (e.key === 'z' && e.shiftKey && (e.ctrlKey || e.metaKey)) + ) { + e.preventDefault(); + const result = await undoHistory.redo(); + if (!result) { + console.log('Nothing to redo'); + } + } + }); +} + +registerUndoKeybinds(); diff --git a/apps/wish-wash/web/src/updateState.ts b/apps/wish-wash/web/src/updateState.ts new file mode 100644 index 00000000..26793ec7 --- /dev/null +++ b/apps/wish-wash/web/src/updateState.ts @@ -0,0 +1,43 @@ +import { proxy } from 'valtio'; +import { registerSW } from 'virtual:pwa-register'; + +export const updateState = proxy({ + updateAvailable: false, +}); + +let check: (() => void) | undefined = undefined; + +const update = registerSW({ + onNeedRefresh() { + updateState.updateAvailable = true; + console.log('Update available and ready to install'); + }, + onRegisteredSW(swUrl, registration) { + console.log('Service worker registered', swUrl); + if (registration) { + setInterval( + () => { + registration.update(); + check = registration.update; + // hourly + }, + 60 * 60 * 1000, + ); + } + }, + onRegisterError(error) { + console.error('Service worker registration error', error); + }, +}); + +export async function updateApp(reload?: boolean) { + let timeout = setTimeout(() => { + window.location.reload(); + }, 5000); + await update(!!reload); + clearTimeout(timeout); +} + +export function checkForUpdate() { + check?.(); +} diff --git a/apps/wish-wash/web/src/vite-env.d.ts b/apps/wish-wash/web/src/vite-env.d.ts new file mode 100644 index 00000000..0c32a012 --- /dev/null +++ b/apps/wish-wash/web/src/vite-env.d.ts @@ -0,0 +1,51 @@ +/// +/// + +// declare module 'prosemirror-state' { +// export * from 'prosemirror-state/dist/index.d.ts'; +// } + +// extend navigator with wakelock API +declare interface Navigator { + wakeLock: any; +} + +// declare global WakeLockSentinel type +declare type WakeLockSentinel = any; + +declare module 'virtual:pwa-register/react' { + // @ts-expect-error ignore when react is not installed + import type { Dispatch, SetStateAction } from 'react'; + + export interface RegisterSWOptions { + immediate?: boolean; + onNeedRefresh?: () => void; + onOfflineReady?: () => void; + /** + * Called only if `onRegisteredSW` is not provided. + * + * @deprecated Use `onRegisteredSW` instead. + * @param registration The service worker registration if available. + */ + onRegistered?: ( + registration: ServiceWorkerRegistration | undefined, + ) => void; + /** + * Called once the service worker is registered (requires version `0.12.8+`). + * + * @param swScriptUrl The service worker script url. + * @param registration The service worker registration if available. + */ + onRegisteredSW?: ( + swScriptUrl: string, + registration: ServiceWorkerRegistration | undefined, + ) => void; + onRegisterError?: (error: any) => void; + } + + export function useRegisterSW(options?: RegisterSWOptions): { + needRefresh: [boolean, Dispatch>]; + offlineReady: [boolean, Dispatch>]; + updateServiceWorker: (reloadPage?: boolean) => Promise; + }; +} diff --git a/apps/wish-wash/web/vite.config.ts b/apps/wish-wash/web/vite.config.ts index 9977148e..e62a1399 100644 --- a/apps/wish-wash/web/vite.config.ts +++ b/apps/wish-wash/web/vite.config.ts @@ -3,6 +3,7 @@ import react from '@vitejs/plugin-react-swc'; import { fileURLToPath } from 'url'; import { VitePWA } from 'vite-plugin-pwa'; import UnoCSS from 'unocss/vite'; +import { viteCommonjs } from '@originjs/vite-plugin-commonjs'; // https://vitejs.dev/config/ export default defineConfig(({ command, mode }) => ({ @@ -37,6 +38,7 @@ export default defineConfig(({ command, mode }) => ({ navigateFallback: 'index.html', }, }), + viteCommonjs(), ], optimizeDeps: { exclude: ['@a-type/ui'], diff --git a/blog/package.json b/blog/package.json index e6817d52..953bf7c0 100644 --- a/blog/package.json +++ b/blog/package.json @@ -10,7 +10,7 @@ "astro": "astro" }, "dependencies": { - "@a-type/ui": "^0.8.20", + "@a-type/ui": "^0.8.21", "@astrojs/check": "^0.5.10", "@astrojs/mdx": "^2.3.1", "@astrojs/rss": "^4.0.5", diff --git a/packages/apps/src/index.ts b/packages/apps/src/index.ts index e6c8fae7..da524ddf 100644 --- a/packages/apps/src/index.ts +++ b/packages/apps/src/index.ts @@ -83,24 +83,24 @@ export const apps = [ 'Now everyone can be on the same page when packing. Plus, get a weather forecast and more powerful trip planning tools.', } as AppManifest<'trip-tick'>, { - id: 'shopping', + id: 'wish-wash', demoVideoSrc: '', description: 'TODO', devOriginOverride: 'http://localhost:6222', iconPath: 'icon.png', - name: 'Shopping', + name: 'Wish Wash', paidDescription: 'TODO', paidFeatures: [], - url: 'https://shopping.biscuits.club', + url: 'https://wish-wash.biscuits.club', prerelease: true, - } as AppManifest<'shopping'>, + } as AppManifest<'wish-wash'>, { id: 'marginalia', demoVideoSrc: '', description: 'TODO', devOriginOverride: 'http://localhost:6223', iconPath: 'icon.png', - name: 'Bible', + name: 'Marginalia', paidDescription: 'TODO', paidFeatures: [], url: 'https://marginalia.biscuits.club', diff --git a/packages/client/package.json b/packages/client/package.json index 08176870..4e7232ed 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -52,14 +52,17 @@ "peerDependencies": { "@a-type/ui": "^0.6.17", "@verdant-web/store": "^3.2.2", + "@verdant-web/react-router": "^0.6.0", + "@react-spring/web": "^9", "react": "18.3.1", "valtio": "^1.13.2", "vite-plugin-pwa": "0.19.2" }, "devDependencies": { - "@a-type/ui": "^0.8.20", + "@a-type/ui": "^0.8.21", "@types/react": "18.3.3", "@verdant-web/store": "^3.6.4", + "@verdant-web/react-router": "0.6.2", "react": "18.3.1", "vite-plugin-pwa": "0.19.2" } diff --git a/packages/client/src/components/Context.tsx b/packages/client/src/components/Context.tsx index b0fe0589..4a44a02c 100644 --- a/packages/client/src/components/Context.tsx +++ b/packages/client/src/components/Context.tsx @@ -3,24 +3,40 @@ import { ReactNode, createContext, useContext } from 'react'; import { AppId } from '@biscuits/apps'; import { VerdantContext } from '../verdant.js'; import { ClientDescriptor } from '@verdant-web/store'; -import { VerdantProfile } from '../index.js'; +import { + AppPreviewNotice, + Essentials, + PrereleaseWarning, + TopLoader, + VerdantProfile, +} from '../index.js'; +import { graphqlClient as defaultClient } from '../index.js'; +import { GlobalSyncingIndicator } from './GlobalSyncingIndicator.js'; +import { useVisualViewportOffset } from '@a-type/ui/hooks'; export function Provider({ - graphqlClient, + graphqlClient = defaultClient, appId, children, storeDescriptor = null, }: { appId?: AppId; - graphqlClient: ApolloClient; + graphqlClient?: ApolloClient; children: ReactNode; storeDescriptor?: ClientDescriptor | null; }) { + useVisualViewportOffset(); + return ( + {appId && } + {appId && } + + {storeDescriptor && } {children} + diff --git a/packages/client/src/components/GlobalSyncingIndicator.tsx b/packages/client/src/components/GlobalSyncingIndicator.tsx new file mode 100644 index 00000000..3b8c2eca --- /dev/null +++ b/packages/client/src/components/GlobalSyncingIndicator.tsx @@ -0,0 +1,33 @@ +import classNames from 'classnames'; +import { useContext, useEffect, useState } from 'react'; +import { VerdantContext } from '../verdant.js'; +import { Icon } from '@a-type/ui/components/icon'; + +export interface GlobalSyncingIndicatorProps {} + +export function GlobalSyncingIndicator({}: GlobalSyncingIndicatorProps) { + const [syncing, setSyncing] = useState(false); + const clientDesc = useContext(VerdantContext); + useEffect(() => { + if (!clientDesc?.current) return; + const client = clientDesc.current; + return client.sync.subscribe('syncingChange', setSyncing); + }, [clientDesc]); + + if (!clientDesc) return null; + + return ( +
+ + Syncing +
+ ); +} diff --git a/packages/client/src/components/LogoutNotice.tsx b/packages/client/src/components/LogoutNotice.tsx index 1ae99485..de07b7f1 100644 --- a/packages/client/src/components/LogoutNotice.tsx +++ b/packages/client/src/components/LogoutNotice.tsx @@ -18,6 +18,8 @@ export function LogoutNotice({}: LogoutNoticeProps) { const [isLoggedIn, loadingLoggedInStatus] = useIsLoggedIn(); const [close, setClose] = useState(false); + const isLoginPage = window.location.pathname === '/login'; + const wasLoggedInButNowLoggedOut = !close && wasLoggedIn && !isLoggedIn && !loadingLoggedInStatus; @@ -29,6 +31,8 @@ export function LogoutNotice({}: LogoutNoticeProps) { } }, [isLoggedIn, setWasLoggedIn]); + if (isLoginPage) return null; + return ( diff --git a/scripts/create-app/template/web/src/components/nav/TopLoader.tsx b/packages/client/src/components/TopLoader.tsx similarity index 97% rename from scripts/create-app/template/web/src/components/nav/TopLoader.tsx rename to packages/client/src/components/TopLoader.tsx index 48a1d5cc..15ef0056 100644 --- a/scripts/create-app/template/web/src/components/nav/TopLoader.tsx +++ b/packages/client/src/components/TopLoader.tsx @@ -1,7 +1,7 @@ import { useIsRouteTransitioning } from '@verdant-web/react-router'; import { animated, useSpring } from '@react-spring/web'; -import { clsx } from '@a-type/ui'; import { useCallback, useEffect } from 'react'; +import { clsx } from '@a-type/ui'; export interface TopLoaderProps { className?: string; @@ -15,7 +15,7 @@ export function TopLoader({ className }: TopLoaderProps) { })); const run = useCallback(() => { - let timeout: any; + let timeout: any | undefined; function step(previous: number) { spring.start({ width: `${previous}%`, diff --git a/packages/client/src/components/index.ts b/packages/client/src/components/index.ts index 67556765..7013bf6e 100644 --- a/packages/client/src/components/index.ts +++ b/packages/client/src/components/index.ts @@ -25,3 +25,4 @@ export * from './Essentials.js'; export * from './ReloadButton.js'; export * from './Explainer.js'; export * from './PrereleaseWarning.js'; +export * from './TopLoader.js'; diff --git a/packages/client/src/graphql.ts b/packages/client/src/graphql.ts index aacfedb3..4542d53b 100644 --- a/packages/client/src/graphql.ts +++ b/packages/client/src/graphql.ts @@ -15,6 +15,7 @@ import { fetch } from './fetch.js'; import type { introspection } from './graphql-env.d.js'; import { CONFIG, refreshSession } from './index.js'; import { useEffect } from 'react'; +import { toast } from '@a-type/ui'; export const graphql = initGraphQLTada<{ introspection: introspection; @@ -156,6 +157,10 @@ export function createGraphQLClient({ }); } +export const graphqlClient = createGraphQLClient({ + onError: toast.error, +}); + function deduplicateErrors(onError?: (error: string) => void) { if (!onError) return undefined; // only show 1 of each error message within a time window diff --git a/packages/client/src/pageError.ts b/packages/client/src/pageError.ts index 5fb0935c..688877c0 100644 --- a/packages/client/src/pageError.ts +++ b/packages/client/src/pageError.ts @@ -1,5 +1,7 @@ +import { toast } from '@a-type/ui'; + let callback: (message: string) => boolean | void = (message: string) => { - alert(message); + toast.error(message); return true; }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 44016b95..b78be2ae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,8 +61,8 @@ importers: apps/gnocchi/hub: dependencies: '@a-type/ui': - specifier: ^0.8.20 - version: 0.8.20(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) + specifier: ^0.8.21 + version: 0.8.21(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) '@a-type/utils': specifier: ^1.0.8 version: 1.1.0 @@ -181,8 +181,8 @@ importers: apps/gnocchi/web: dependencies: '@a-type/ui': - specifier: ^0.8.20 - version: 0.8.20(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.2)(react-dom@18.3.1)(react@18.3.1) + specifier: ^0.8.21 + version: 0.8.21(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.2)(react-dom@18.3.1)(react@18.3.1) '@a-type/utils': specifier: ^1.0.8 version: 1.0.8 @@ -315,9 +315,6 @@ importers: react-dom: specifier: 18.3.1 version: 18.3.1(react@18.3.1) - react-hot-toast: - specifier: ^2.3.0 - version: 2.4.1(csstype@3.1.2)(react-dom@18.3.1)(react@18.3.1) react-lazy-with-preload: specifier: ^2.2.1 version: 2.2.1 @@ -461,8 +458,8 @@ importers: apps/marginalia/web: dependencies: '@a-type/ui': - specifier: 0.8.20 - version: 0.8.20(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) + specifier: 0.8.21 + version: 0.8.21(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) '@a-type/utils': specifier: 1.1.0 version: 1.1.0 @@ -490,9 +487,6 @@ importers: react-dom: specifier: 18.3.1 version: 18.3.1(react@18.3.1) - react-hot-toast: - specifier: ^2.4.1 - version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) unocss: specifier: 0.60.3 version: 0.60.3(postcss@8.4.38)(rollup@2.79.1)(vite@5.2.11) @@ -564,8 +558,8 @@ importers: apps/star-chart/web: dependencies: '@a-type/ui': - specifier: 0.8.20 - version: 0.8.20(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) + specifier: 0.8.21 + version: 0.8.21(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) '@a-type/utils': specifier: 1.1.2 version: 1.1.2 @@ -599,9 +593,6 @@ importers: react-dom: specifier: 18.3.1 version: 18.3.1(react@18.3.1) - react-hot-toast: - specifier: ^2.4.1 - version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) react-hotkeys-hook: specifier: ^4.5.0 version: 4.5.0(react-dom@18.3.1)(react@18.3.1) @@ -694,8 +685,8 @@ importers: apps/trip-tick/web: dependencies: '@a-type/ui': - specifier: ^0.8.20 - version: 0.8.20(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.2.0)(react@18.3.1) + specifier: ^0.8.21 + version: 0.8.21(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.2.0)(react@18.3.1) '@a-type/utils': specifier: ^1.0.6 version: 1.0.6 @@ -827,10 +818,10 @@ importers: apps/wish-wash/web: dependencies: '@a-type/ui': - specifier: ^0.8.20 - version: 0.8.20(@types/react-dom@18.3.0)(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) + specifier: 0.8.21 + version: 0.8.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) '@a-type/utils': - specifier: ^1.0.8 + specifier: 1.1.3 version: 1.1.3 '@biscuits/client': specifier: workspace:* @@ -851,16 +842,13 @@ importers: specifier: 18.3.1 version: 18.3.1 react-dom: - specifier: ^18.2.0 + specifier: 18.3.1 version: 18.3.1(react@18.3.1) - react-hot-toast: - specifier: ^2.4.1 - version: 2.4.1(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) unocss: - specifier: 0.58.8 - version: 0.58.8(postcss@8.4.38)(rollup@2.79.1)(vite@5.2.7) + specifier: 0.61.0 + version: 0.61.0(postcss@8.4.38)(rollup@2.79.1)(vite@5.3.1) valtio: - specifier: ^1.12.1 + specifier: 1.13.2 version: 1.13.2(@types/react@18.3.3)(react@18.3.1) workbox-core: specifier: ^6.5.4 @@ -881,27 +869,30 @@ importers: specifier: ^6.5.4 version: 6.6.1 devDependencies: + '@originjs/vite-plugin-commonjs': + specifier: 1.0.3 + version: 1.0.3 '@types/react': - specifier: ^18.2.79 + specifier: ^18.3.3 version: 18.3.3 '@types/react-dom': - specifier: ^18.2.25 + specifier: ^18.3.0 version: 18.3.0 '@vitejs/plugin-react-swc': - specifier: 3.5.0 - version: 3.5.0(vite@5.2.7) + specifier: 3.7.0 + version: 3.7.0(vite@5.3.1) vite: - specifier: 5.2.7 - version: 5.2.7 + specifier: 5.3.1 + version: 5.3.1(@types/node@20.12.7) vite-plugin-pwa: specifier: ^0.19.8 - version: 0.19.8(vite@5.2.7)(workbox-build@7.1.1)(workbox-window@6.6.1) + version: 0.19.8(vite@5.3.1)(workbox-build@7.1.1)(workbox-window@6.6.1) blog: dependencies: '@a-type/ui': - specifier: ^0.8.20 - version: 0.8.20(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) + specifier: ^0.8.21 + version: 0.8.21(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) '@astrojs/check': specifier: ^0.5.10 version: 0.5.10(prettier@3.2.5)(typescript@5.4.5) @@ -919,7 +910,7 @@ importers: version: link:../packages/client '@unocss/astro': specifier: ^0.59.4 - version: 0.59.4(vite@5.2.13) + version: 0.59.4(vite@5.3.1) '@unocss/reset': specifier: ^0.59.4 version: 0.59.4 @@ -934,7 +925,7 @@ importers: version: 5.4.5 unocss: specifier: ^0.59.4 - version: 0.59.4(postcss@8.4.38)(vite@5.2.13) + version: 0.59.4(postcss@8.4.38)(vite@5.3.1) cdk: dependencies: @@ -994,7 +985,7 @@ importers: version: 1.12.8(graphql@16.8.1)(typescript@5.4.5) '@a-type/auth-client': specifier: 1.0.6 - version: 1.0.6(@a-type/ui@0.8.20)(react@18.3.1) + version: 1.0.6(@a-type/ui@0.8.21)(react@18.3.1) '@apollo/client': specifier: ^3.9.9 version: 3.9.9(@types/react@18.3.3)(graphql@16.8.1)(react-dom@18.3.1)(react@18.3.1) @@ -1007,6 +998,9 @@ importers: '@biscuits/libraries': specifier: workspace:* version: link:../libraries + '@react-spring/web': + specifier: ^9 + version: 9.7.3(react-dom@18.3.1)(react@18.3.1) classnames: specifier: ^2.3.2 version: 2.3.2 @@ -1024,11 +1018,14 @@ importers: version: 1.13.2(@types/react@18.3.3)(react@18.3.1) devDependencies: '@a-type/ui': - specifier: ^0.8.20 - version: 0.8.20(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) + specifier: ^0.8.21 + version: 0.8.21(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) '@types/react': specifier: 18.3.3 version: 18.3.3 + '@verdant-web/react-router': + specifier: 0.6.2 + version: 0.6.2(react@18.3.1) '@verdant-web/store': specifier: ^3.6.4 version: 3.6.4 @@ -1037,7 +1034,7 @@ importers: version: 18.3.1 vite-plugin-pwa: specifier: 0.19.2 - version: 0.19.2(vite@5.2.13)(workbox-build@7.1.1)(workbox-window@7.1.0) + version: 0.19.2(vite@5.3.1)(workbox-build@7.1.1)(workbox-window@7.1.0) packages/db: dependencies: @@ -1229,10 +1226,10 @@ importers: dependencies: '@a-type/auth-client': specifier: 1.0.6 - version: 1.0.6(@a-type/ui@0.8.20)(react@18.3.1) + version: 1.0.6(@a-type/ui@0.8.21)(react@18.3.1) '@a-type/ui': - specifier: ^0.8.20 - version: 0.8.20(@types/react-dom@18.3.0)(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) + specifier: ^0.8.21 + version: 0.8.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) '@biscuits/apps': specifier: workspace:* version: link:../packages/apps @@ -1373,13 +1370,13 @@ packages: graphql: 16.8.1 typescript: 5.4.5 - /@a-type/auth-client@1.0.6(@a-type/ui@0.8.20)(react@18.3.1): + /@a-type/auth-client@1.0.6(@a-type/ui@0.8.21)(react@18.3.1): resolution: {integrity: sha512-AGKAEpExelRupmveEVfYzpwEMVwAPJ6fCqdpJKQeL41rHyCY/CpwAF4+XG7AEFgU/1EzEjr00MYEC1QQNJZzzw==} peerDependencies: '@a-type/ui': ^0.8.0 react: ^18 dependencies: - '@a-type/ui': 0.8.20(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) + '@a-type/ui': 0.8.21(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 dev: false @@ -1409,13 +1406,13 @@ packages: - encoding - supports-color - /@a-type/ui@0.8.20(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.2)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-XFwp9ghCqtcLCSyVe7X7ZCMSKqGPBryCJxRUZDS+LSo4gODTSTJjjcMW0k4ZqeO9A/JvvZACO2Sc4FtX1LwPDw==} + /@a-type/ui@0.8.21(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.2)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZ7WtvLW4ShSxdnMUmijbfF3S9GMoCtDN425ZxAQV1ZAvBaqXCIu85x2Jd6jb/CkxAJkKrIhQ9RiuSWYcEFvww==} peerDependencies: react: ^18 react-dom: ^18 dependencies: - '@a-type/utils': 1.1.0 + '@a-type/utils': 1.1.3 '@radix-ui/react-accordion': 1.1.2(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-checkbox': 1.0.4(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1) @@ -1449,7 +1446,7 @@ packages: color-parse: 2.0.2 color-space: 2.0.1 date-fns: 2.30.0 - formik: 2.4.6(react@18.3.1) + formik: 2.4.5(react@18.3.1) pluralize: 8.0.0 prosemirror-model: 1.21.1 react: 18.3.1 @@ -1461,13 +1458,13 @@ packages: - csstype dev: false - /@a-type/ui@0.8.20(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.2.0)(react@18.3.1): - resolution: {integrity: sha512-XFwp9ghCqtcLCSyVe7X7ZCMSKqGPBryCJxRUZDS+LSo4gODTSTJjjcMW0k4ZqeO9A/JvvZACO2Sc4FtX1LwPDw==} + /@a-type/ui@0.8.21(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.2.0)(react@18.3.1): + resolution: {integrity: sha512-pZ7WtvLW4ShSxdnMUmijbfF3S9GMoCtDN425ZxAQV1ZAvBaqXCIu85x2Jd6jb/CkxAJkKrIhQ9RiuSWYcEFvww==} peerDependencies: react: ^18 react-dom: ^18 dependencies: - '@a-type/utils': 1.1.0 + '@a-type/utils': 1.1.3 '@radix-ui/react-accordion': 1.1.2(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-checkbox': 1.0.4(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.3.1) '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.25)(@types/react@18.2.79)(react-dom@18.2.0)(react@18.3.1) @@ -1501,7 +1498,7 @@ packages: color-parse: 2.0.2 color-space: 2.0.1 date-fns: 2.30.0 - formik: 2.4.6(react@18.3.1) + formik: 2.4.5(react@18.3.1) pluralize: 8.0.0 prosemirror-model: 1.21.1 react: 18.3.1 @@ -1513,8 +1510,8 @@ packages: - csstype dev: false - /@a-type/ui@0.8.20(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-XFwp9ghCqtcLCSyVe7X7ZCMSKqGPBryCJxRUZDS+LSo4gODTSTJjjcMW0k4ZqeO9A/JvvZACO2Sc4FtX1LwPDw==} + /@a-type/ui@0.8.21(@types/react-dom@18.2.25)(@types/react@18.2.79)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZ7WtvLW4ShSxdnMUmijbfF3S9GMoCtDN425ZxAQV1ZAvBaqXCIu85x2Jd6jb/CkxAJkKrIhQ9RiuSWYcEFvww==} peerDependencies: react: ^18 react-dom: ^18 @@ -1565,13 +1562,13 @@ packages: - csstype dev: false - /@a-type/ui@0.8.20(@types/react-dom@18.3.0)(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-XFwp9ghCqtcLCSyVe7X7ZCMSKqGPBryCJxRUZDS+LSo4gODTSTJjjcMW0k4ZqeO9A/JvvZACO2Sc4FtX1LwPDw==} + /@a-type/ui@0.8.21(@types/react-dom@18.3.0)(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZ7WtvLW4ShSxdnMUmijbfF3S9GMoCtDN425ZxAQV1ZAvBaqXCIu85x2Jd6jb/CkxAJkKrIhQ9RiuSWYcEFvww==} peerDependencies: react: ^18 react-dom: ^18 dependencies: - '@a-type/utils': 1.1.0 + '@a-type/utils': 1.1.3 '@radix-ui/react-accordion': 1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-checkbox': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) @@ -1605,7 +1602,7 @@ packages: color-parse: 2.0.2 color-space: 2.0.1 date-fns: 2.30.0 - formik: 2.4.6(react@18.3.1) + formik: 2.4.5(react@18.3.1) pluralize: 8.0.0 prosemirror-model: 1.21.1 react: 18.3.1 @@ -1617,13 +1614,13 @@ packages: - csstype dev: false - /@a-type/ui@0.8.20(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-XFwp9ghCqtcLCSyVe7X7ZCMSKqGPBryCJxRUZDS+LSo4gODTSTJjjcMW0k4ZqeO9A/JvvZACO2Sc4FtX1LwPDw==} + /@a-type/ui@0.8.21(@types/react@18.3.3)(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZ7WtvLW4ShSxdnMUmijbfF3S9GMoCtDN425ZxAQV1ZAvBaqXCIu85x2Jd6jb/CkxAJkKrIhQ9RiuSWYcEFvww==} peerDependencies: react: ^18 react-dom: ^18 dependencies: - '@a-type/utils': 1.1.0 + '@a-type/utils': 1.1.3 '@radix-ui/react-accordion': 1.1.2(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-checkbox': 1.0.4(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.3.0)(@types/react@18.3.3)(react-dom@18.3.1)(react@18.3.1) @@ -1657,7 +1654,7 @@ packages: color-parse: 2.0.2 color-space: 2.0.1 date-fns: 2.30.0 - formik: 2.4.6(react@18.3.1) + formik: 2.4.5(react@18.3.1) pluralize: 8.0.0 prosemirror-model: 1.21.1 react: 18.3.1 @@ -1668,13 +1665,13 @@ packages: - '@types/react-dom' - csstype - /@a-type/ui@0.8.20(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-XFwp9ghCqtcLCSyVe7X7ZCMSKqGPBryCJxRUZDS+LSo4gODTSTJjjcMW0k4ZqeO9A/JvvZACO2Sc4FtX1LwPDw==} + /@a-type/ui@0.8.21(csstype@3.1.3)(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-pZ7WtvLW4ShSxdnMUmijbfF3S9GMoCtDN425ZxAQV1ZAvBaqXCIu85x2Jd6jb/CkxAJkKrIhQ9RiuSWYcEFvww==} peerDependencies: react: ^18 react-dom: ^18 dependencies: - '@a-type/utils': 1.1.0 + '@a-type/utils': 1.1.3 '@radix-ui/react-accordion': 1.1.2(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-checkbox': 1.0.4(react-dom@18.3.1)(react@18.3.1) '@radix-ui/react-collapsible': 1.0.3(react-dom@18.3.1)(react@18.3.1) @@ -1708,7 +1705,7 @@ packages: color-parse: 2.0.2 color-space: 2.0.1 date-fns: 2.30.0 - formik: 2.4.6(react@18.3.1) + formik: 2.4.5(react@18.3.1) pluralize: 8.0.0 prosemirror-model: 1.21.1 react: 18.3.1 @@ -1734,6 +1731,7 @@ packages: /@a-type/utils@1.1.0: resolution: {integrity: sha512-dwM1bl6XQaC/X9RZQUp0LDGQF70nn0QV6TFq/bKsjqlt8OEBGWlr++um4oigl2QMKkwzto9XwoBJ/D38IvROIQ==} + dev: false /@a-type/utils@1.1.2: resolution: {integrity: sha512-VM/iA7Gco+RloJa8sNXdMgB+REIiNSL+H/ai4BJKPPUJq8woDY06Frd+XVw/V7lAorUrcBaGf0E1Z+7bXO9VMA==} @@ -1741,7 +1739,6 @@ packages: /@a-type/utils@1.1.3: resolution: {integrity: sha512-wdd3pHus6WNYzoBZjwZhn2DJhgtK02VE/fky7t6soEl4DIUZamaCJmHivmFX4mvHL5/WIq/T2iXyZjDIC5F3KQ==} - dev: false /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} @@ -2818,7 +2815,6 @@ packages: dependencies: '@babel/highlight': 7.24.7 picocolors: 1.0.1 - dev: true /@babel/compat-data@7.24.4: resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} @@ -2831,7 +2827,6 @@ packages: /@babel/compat-data@7.24.7: resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} - dev: true /@babel/core@7.24.0: resolution: {integrity: sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==} @@ -2920,7 +2915,6 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true /@babel/generator@7.23.6: resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} @@ -2957,7 +2951,6 @@ packages: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - dev: true /@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} @@ -2976,7 +2969,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.7 - dev: true /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7: resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} @@ -3017,7 +3009,6 @@ packages: browserslist: 4.23.1 lru-cache: 5.1.1 semver: 6.3.1 - dev: true /@babel/helper-create-class-features-plugin@7.22.15(@babel/core@7.24.0): resolution: {integrity: sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==} @@ -3089,7 +3080,6 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-create-regexp-features-plugin@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==} @@ -3131,7 +3121,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.7 - dev: true /@babel/helper-function-name@7.23.0: resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} @@ -3153,7 +3142,6 @@ packages: dependencies: '@babel/template': 7.24.7 '@babel/types': 7.24.7 - dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} @@ -3172,7 +3160,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.7 - dev: true /@babel/helper-member-expression-to-functions@7.23.0: resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} @@ -3195,7 +3182,6 @@ packages: '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-module-imports@7.22.15: resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} @@ -3223,7 +3209,6 @@ packages: '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.0): resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} @@ -3305,7 +3290,6 @@ packages: '@babel/helper-validator-identifier': 7.24.7 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} @@ -3325,7 +3309,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.7 - dev: true /@babel/helper-plugin-utils@7.24.0: resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} @@ -3344,7 +3327,6 @@ packages: /@babel/helper-plugin-utils@7.24.7: resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-remap-async-to-generator@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==} @@ -3406,7 +3388,6 @@ packages: '@babel/helper-optimise-call-expression': 7.24.7 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} @@ -3434,7 +3415,6 @@ packages: '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} @@ -3457,7 +3437,6 @@ packages: '@babel/types': 7.24.7 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} @@ -3482,7 +3461,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.24.7 - dev: true /@babel/helper-string-parser@7.23.4: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} @@ -3499,7 +3477,6 @@ packages: /@babel/helper-string-parser@7.24.7: resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} @@ -3516,7 +3493,6 @@ packages: /@babel/helper-validator-identifier@7.24.7: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-option@7.23.5: resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} @@ -3529,7 +3505,6 @@ packages: /@babel/helper-validator-option@7.24.7: resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-wrap-function@7.24.7: resolution: {integrity: sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==} @@ -3576,7 +3551,6 @@ packages: dependencies: '@babel/template': 7.24.7 '@babel/types': 7.24.7 - dev: true /@babel/highlight@7.23.4: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} @@ -3612,7 +3586,6 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 - dev: true /@babel/parser@7.23.4: resolution: {integrity: sha512-vf3Xna6UEprW+7t6EtOmFpHNAuxw3xqPZghy+brsnusscJRW5BMUzzHZc5ICjULee81WeUV2jjakG09MDglJXQ==} @@ -3655,7 +3628,6 @@ packages: hasBin: true dependencies: '@babel/types': 7.24.7 - dev: true /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==} @@ -3834,6 +3806,16 @@ packages: '@babel/core': 7.24.6 '@babel/helper-plugin-utils': 7.24.6 + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + dev: false + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -3936,6 +3918,16 @@ packages: '@babel/core': 7.24.6 '@babel/helper-plugin-utils': 7.24.6 + /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + dev: false + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.7): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} @@ -4255,7 +4247,6 @@ packages: '@babel/helper-simple-access': 7.24.7 transitivePeerDependencies: - supports-color - dev: true /@babel/plugin-transform-modules-systemjs@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==} @@ -4572,6 +4563,21 @@ packages: '@babel/helper-plugin-utils': 7.24.6 '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.6) + /@babel/plugin-transform-typescript@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.24.7(@babel/core@7.24.7) + '@babel/helper-plugin-utils': 7.24.7 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.24.7): resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} engines: {node: '>=6.9.0'} @@ -4758,6 +4764,22 @@ packages: '@babel/plugin-transform-modules-commonjs': 7.24.6(@babel/core@7.24.6) '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.6) + /@babel/preset-typescript@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-modules-commonjs': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.24.7) + transitivePeerDependencies: + - supports-color + dev: false + /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} dev: true @@ -4817,7 +4839,6 @@ packages: '@babel/code-frame': 7.24.7 '@babel/parser': 7.24.7 '@babel/types': 7.24.7 - dev: true /@babel/traverse@7.24.0: resolution: {integrity: sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==} @@ -4886,7 +4907,6 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: true /@babel/types@7.23.4: resolution: {integrity: sha512-7uIFwVYpoplT5jp/kVv6EF93VaJ8H+Yn5IczYiaAi98ajzjfoZfslet/e0sLh+wVBjb2qqIut1b0S26VSafsSQ==} @@ -4935,7 +4955,6 @@ packages: '@babel/helper-string-parser': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - dev: true /@clack/core@0.2.1: resolution: {integrity: sha512-MIZMbzA9IOdjXDAKh2/gfTic3yt554WFXszjjpVfI/Rs5/ofoEjuvdOE2amDQeVnGTHfRL0QB1SBPnoxyliuuA==} @@ -5103,6 +5122,14 @@ packages: requiresBuild: true optional: true + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + optional: true + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -5138,6 +5165,14 @@ packages: requiresBuild: true optional: true + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + /@esbuild/android-arm@0.15.18: resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} engines: {node: '>=12'} @@ -5182,6 +5217,14 @@ packages: requiresBuild: true optional: true + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + /@esbuild/android-x64@0.18.20: resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -5217,6 +5260,14 @@ packages: requiresBuild: true optional: true + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + /@esbuild/darwin-arm64@0.18.20: resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -5252,6 +5303,14 @@ packages: requiresBuild: true optional: true + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + /@esbuild/darwin-x64@0.18.20: resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -5287,6 +5346,14 @@ packages: requiresBuild: true optional: true + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + /@esbuild/freebsd-arm64@0.18.20: resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -5322,6 +5389,14 @@ packages: requiresBuild: true optional: true + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + /@esbuild/freebsd-x64@0.18.20: resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -5357,6 +5432,14 @@ packages: requiresBuild: true optional: true + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + /@esbuild/linux-arm64@0.18.20: resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -5392,6 +5475,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-arm@0.18.20: resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -5427,6 +5518,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-ia32@0.18.20: resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -5462,6 +5561,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-loong64@0.14.54: resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} engines: {node: '>=12'} @@ -5515,6 +5622,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-mips64el@0.18.20: resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -5550,6 +5665,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-ppc64@0.18.20: resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -5585,6 +5708,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-riscv64@0.18.20: resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -5620,6 +5751,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-s390x@0.18.20: resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -5655,6 +5794,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/linux-x64@0.18.20: resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -5690,6 +5837,14 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + /@esbuild/netbsd-x64@0.18.20: resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -5725,6 +5880,14 @@ packages: requiresBuild: true optional: true + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + /@esbuild/openbsd-x64@0.18.20: resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -5760,6 +5923,14 @@ packages: requiresBuild: true optional: true + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + /@esbuild/sunos-x64@0.18.20: resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -5795,6 +5966,14 @@ packages: requiresBuild: true optional: true + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + /@esbuild/win32-arm64@0.18.20: resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -5830,6 +6009,14 @@ packages: requiresBuild: true optional: true + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + /@esbuild/win32-ia32@0.18.20: resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -5865,6 +6052,14 @@ packages: requiresBuild: true optional: true + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + /@esbuild/win32-x64@0.18.20: resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -5900,6 +6095,14 @@ packages: requiresBuild: true optional: true + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -6198,6 +6401,20 @@ packages: transitivePeerDependencies: - supports-color + /@iconify/utils@2.1.24: + resolution: {integrity: sha512-H8r2KpL5uKyrkb3z9/3HD/22JcxqW3BJyjEWZhX2T7DehnYVZthEap1cNsEl/UtCDC3TlpNmwiPX8wg3y8E4dg==} + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.7 + '@iconify/types': 2.0.0 + debug: 4.3.5 + kolorist: 1.8.0 + local-pkg: 0.5.0 + mlly: 1.6.1 + transitivePeerDependencies: + - supports-color + dev: false + /@img/sharp-darwin-arm64@0.33.4: resolution: {integrity: sha512-p0suNqXufJs9t3RqLBO6vvrgr5OhgbWp76s5gTRvdmxmuv9E1rcaqGUsl3l4mKVmXPkTkTErXediAui4x+8PSA==} engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} @@ -12812,6 +13029,23 @@ packages: vite: 5.2.13(@types/node@20.12.7) transitivePeerDependencies: - rollup + dev: true + + /@unocss/astro@0.59.4(vite@5.3.1): + resolution: {integrity: sha512-DU3OR5MMR1Uvvec4/wB9EetDASHRg19Moy6z/MiIhn8JWJ0QzWYgSeJcfUX8exomMYv6WUEQJL+CyLI34Wmn8w==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@unocss/core': 0.59.4 + '@unocss/reset': 0.59.4 + '@unocss/vite': 0.59.4(vite@5.3.1) + vite: 5.3.1(@types/node@20.12.7) + transitivePeerDependencies: + - rollup + dev: false /@unocss/astro@0.60.3(rollup@2.79.1)(vite@5.2.11): resolution: {integrity: sha512-duFuyVhqYqQ15JZqx41UNgIxndqYRbOwDkJ7Y+R5N+u59a27vImz8B9eOFkHaZCFBWyH5jywkT8LVK1sfddFaw==} @@ -12829,6 +13063,22 @@ packages: - rollup dev: false + /@unocss/astro@0.61.0(rollup@2.79.1)(vite@5.3.1): + resolution: {integrity: sha512-cbgztX/to5rMhAtEGCcR3ClMlK9F+lPxq21A72qsbWVQjiKa7W4O7qKBmUKPYsWRzJEJtdyN11A65H2037aKQw==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + '@unocss/core': 0.61.0 + '@unocss/reset': 0.61.0 + '@unocss/vite': 0.61.0(rollup@2.79.1)(vite@5.3.1) + vite: 5.3.1(@types/node@20.12.7) + transitivePeerDependencies: + - rollup + dev: false + /@unocss/cli@0.58.5(rollup@2.79.1): resolution: {integrity: sha512-FzVVXO9ghsGtJpu9uR4o7JeM9gUfWNbVZZ/IfH+0WbDJuyx4rO/jwN55z0yA5QDkhvOz9DvzwPCBzLpTJ5q+Lw==} engines: {node: '>=14'} @@ -12915,6 +13165,28 @@ packages: - rollup dev: false + /@unocss/cli@0.61.0(rollup@2.79.1): + resolution: {integrity: sha512-NuwBFHpnI40PBu84/3c9JpyO02TBNoRPzZ+kJ0hmFa+dv8Ro7Sb1AMlLJ5t3ZjELhsh0zXQf6ucS9mpqu+785g==} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@unocss/config': 0.61.0 + '@unocss/core': 0.61.0 + '@unocss/preset-uno': 0.61.0 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.2.3 + fast-glob: 3.3.2 + magic-string: 0.30.10 + pathe: 1.1.2 + perfect-debounce: 1.0.0 + transitivePeerDependencies: + - rollup + dev: false + /@unocss/config@0.58.5: resolution: {integrity: sha512-O1pLSeNXfG11QHaLSVwS9rJKvE4b9304IQ3UvOdbYN+7SAT4YTZ7JDU4ngO1KWyOFBO6RD0WspCR95pgqOqJiQ==} engines: {node: '>=14'} @@ -12945,6 +13217,14 @@ packages: unconfig: 0.3.13 dev: false + /@unocss/config@0.61.0: + resolution: {integrity: sha512-k8uV4n8eMti4S6BFeAkc9QBXJefDIlPyOWrdKykUMOHLIWVAIS53JixW9FJNgJRw0RVI6B7UR+rOznWwKpORPA==} + engines: {node: '>=14'} + dependencies: + '@unocss/core': 0.61.0 + unconfig: 0.3.13 + dev: false + /@unocss/core@0.54.3: resolution: {integrity: sha512-XAVfnq6hO7Zaa5VnsFKi1KQKgUS3jOhZYgdedIgJVx2WkmkpM/UQ2lummIlB27uHp0o+Wzf5kueKlMS3q+2lvA==} dev: false @@ -12967,6 +13247,10 @@ packages: resolution: {integrity: sha512-4bBX1pavDl2DSCozEII7bxYGT0IkyO7kKlUuCtooTePWyLjf2F7essdzHkJ00EpNR64kkebR9V0lqBMBo07VPw==} dev: false + /@unocss/core@0.61.0: + resolution: {integrity: sha512-Y/Ly3LPIAzOBlWCdKBVzVzIaaWDsf+oWPIUZlaW7DL++WWypVBCghmxXIT5dyuMGXE560Hj92st4AkXfuVdxGQ==} + dev: false + /@unocss/extractor-arbitrary-variants@0.58.5: resolution: {integrity: sha512-KJQX0OJKzy4YjJo09h2la2Q+cn5IJ1JdyPVJJkzovHnv7jSBWzsfct+bj/6a+SJ4p4JBIqEJz3M/qxHv4EPJyA==} dependencies: @@ -12989,6 +13273,12 @@ packages: '@unocss/core': 0.60.3 dev: false + /@unocss/extractor-arbitrary-variants@0.61.0: + resolution: {integrity: sha512-9ru/UR4kZ1+jGXpMawV9T8kpL54FrJBmWKMuFlDTEDIwtzDyyfLbt/buoXdzKDLmil9hOXH3IH8+dah/OiiDoA==} + dependencies: + '@unocss/core': 0.61.0 + dev: false + /@unocss/inspector@0.58.5: resolution: {integrity: sha512-cbJlIHEZ14puTtttf7sl+VZFDscV1DJiSseh9sSe0xJ/1NVBT9Bvkm09/1tnpLYAgF5gfa1CaCcjKmURgYzKrA==} dependencies: @@ -13023,6 +13313,15 @@ packages: sirv: 2.0.4 dev: false + /@unocss/inspector@0.61.0: + resolution: {integrity: sha512-gpL2RNw6Cp145kTxWN0BG/tWd4x3LVbgkZfyUlh5IAZHWKAq9MWA0jIifV2RU94h4rbSBNHxz50bodYtkzeM8A==} + dependencies: + '@unocss/core': 0.61.0 + '@unocss/rule-utils': 0.61.0 + gzip-size: 6.0.0 + sirv: 2.0.4 + dev: false + /@unocss/postcss@0.58.5(postcss@8.4.38): resolution: {integrity: sha512-m4L2YRdYfT6CV306Kl2VwEwbqa/92EpW4GE2Kqak1RuJyFJXBnWEEMJV4Uy6B1jWKLlCEWkuVUW33JUg7X6BxQ==} engines: {node: '>=14'} @@ -13081,6 +13380,21 @@ packages: postcss: 8.4.38 dev: false + /@unocss/postcss@0.61.0(postcss@8.4.38): + resolution: {integrity: sha512-0ZHUeLYu057xL1vXg2coV62ly6zaCgYdA/oHKCMaU9KT0TI49+DE73GouHypRNM5YXfuUPfXhPGGUuFWkAbI1A==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + dependencies: + '@unocss/config': 0.61.0 + '@unocss/core': 0.61.0 + '@unocss/rule-utils': 0.61.0 + css-tree: 2.3.1 + fast-glob: 3.3.2 + magic-string: 0.30.10 + postcss: 8.4.38 + dev: false + /@unocss/preset-attributify@0.58.5: resolution: {integrity: sha512-OR4gUHamHCb4/LB/zZHlibaraTyILfFvRIzgmJnEb6lITGApQUl86qaJcTbTyfTfLVRufLG/JVeuz2HLUBPRXw==} dependencies: @@ -13103,6 +13417,12 @@ packages: '@unocss/core': 0.60.3 dev: false + /@unocss/preset-attributify@0.61.0: + resolution: {integrity: sha512-E0oIfYAnnm8piSU7cbAnLIKKz0TwlHMOfAcg0Z0jv2N/MatCpq0BCJZHeE0fEw53OUc+oa6Dpd509rOEUXp/tA==} + dependencies: + '@unocss/core': 0.61.0 + dev: false + /@unocss/preset-icons@0.55.7: resolution: {integrity: sha512-JXLOHkyEKKAjLTqjAxYfhwln05WXilGg3jctkZWKpMNawPaonrGt3kZT12YMuMmOryxk7UcyKB0dtYc+p3QYvw==} dependencies: @@ -13151,6 +13471,16 @@ packages: - supports-color dev: false + /@unocss/preset-icons@0.61.0: + resolution: {integrity: sha512-xI7isKu1fQbyGee1lcJBLwvUlmubYbPN4ymepUamfprNPlWrzb5Gj2+SROERlzzrTaI8C0YdBxsYMGyOV94dXQ==} + dependencies: + '@iconify/utils': 2.1.24 + '@unocss/core': 0.61.0 + ofetch: 1.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /@unocss/preset-mini@0.58.5: resolution: {integrity: sha512-WqD31fKUAN28OCUOyi1uremmLk0eTMqtCizjbbXsY/DP6RKYUT7trFAtppTcHWFhSQcknb4FURfAZppACsTVQQ==} dependencies: @@ -13181,6 +13511,14 @@ packages: '@unocss/rule-utils': 0.60.3 dev: false + /@unocss/preset-mini@0.61.0: + resolution: {integrity: sha512-P+DdMtPtzAQ2aQ1/WWPoO3X/qvky+Fqq4eKXIvbqXOQ9c2oem7/dnsPeT08zzLIqxVJnuykymPwRT85EumS0gg==} + dependencies: + '@unocss/core': 0.61.0 + '@unocss/extractor-arbitrary-variants': 0.61.0 + '@unocss/rule-utils': 0.61.0 + dev: false + /@unocss/preset-tagify@0.58.5: resolution: {integrity: sha512-UB9IXi8vA/SzmmRLMWR7bzeBpxpiRo7y9xk3ruvDddYlsyiwIeDIMwG23YtcA6q41FDQvkrmvTxUEH9LFlv6aA==} dependencies: @@ -13203,6 +13541,12 @@ packages: '@unocss/core': 0.60.3 dev: false + /@unocss/preset-tagify@0.61.0: + resolution: {integrity: sha512-Q3709A8/4fFZdQ4vfKfgDSugQYd21BoSO+TomJp/QMi9iyPjGsrERQilciMmkuRyAe8Q1rdLh+6ioGiJEU0XHQ==} + dependencies: + '@unocss/core': 0.61.0 + dev: false + /@unocss/preset-typography@0.58.5: resolution: {integrity: sha512-rFny4a9yxgY34XOom5euCqQaOLV8PpbTg0Pn+5FelUMG4OfMevTwBCe9JttFJcUc3cNTL2enkzIdMa3l66114g==} dependencies: @@ -13229,6 +13573,13 @@ packages: '@unocss/preset-mini': 0.60.3 dev: false + /@unocss/preset-typography@0.61.0: + resolution: {integrity: sha512-chT2KvgeKsXoDFSedfP0BjhFLYgcDUBJCX0omJOXVVz9q7vB898abhZ5zA9Rcpmbkby4ovtbIjc2RqG9uIKLaQ==} + dependencies: + '@unocss/core': 0.61.0 + '@unocss/preset-mini': 0.61.0 + dev: false + /@unocss/preset-uno@0.58.5: resolution: {integrity: sha512-vgq/R4f7RDmdROy+pX+PeE38I3SgYKd4LL7Wb1HJUaVwz7PkF0XHCynOTbwrPXnK1kp1cnZYYEww7/RiYp+IQQ==} dependencies: @@ -13263,6 +13614,15 @@ packages: '@unocss/rule-utils': 0.60.3 dev: false + /@unocss/preset-uno@0.61.0: + resolution: {integrity: sha512-mkKOra3dQEc3uI7aPIqa3t8MJXlmpLSgGaPfEJK52xkFe991ex6CiUunYMMWbh6ZSzmdxkO31IwQIH9lcmj/Uw==} + dependencies: + '@unocss/core': 0.61.0 + '@unocss/preset-mini': 0.61.0 + '@unocss/preset-wind': 0.61.0 + '@unocss/rule-utils': 0.61.0 + dev: false + /@unocss/preset-web-fonts@0.58.5: resolution: {integrity: sha512-WKZ5raSClFXhqzfAhApef3+fuMq6cjKBxvhJ1FBIxFKcSOvN8e2czty2iGQVl02yMsxBWMv0Bpfm7np+cCoI1w==} dependencies: @@ -13289,6 +13649,13 @@ packages: ofetch: 1.3.4 dev: false + /@unocss/preset-web-fonts@0.61.0: + resolution: {integrity: sha512-9bYvk2BSryLgguZ5qTDPVEhgD/olZiTAy/7JqHzrKKTh7xPURO1IcG2vbX354unfhTDR6GZIKiAkk64qJZUDPw==} + dependencies: + '@unocss/core': 0.61.0 + ofetch: 1.3.4 + dev: false + /@unocss/preset-wind@0.58.5: resolution: {integrity: sha512-54RkjLmlqMUlC8o8nDCVzB25D1zzK4eth+/3uQzt739qU0U92NxuZKY21ADj9Rp/mVhKBV5FKuXPjmYc6yTQRQ==} dependencies: @@ -13319,6 +13686,14 @@ packages: '@unocss/rule-utils': 0.60.3 dev: false + /@unocss/preset-wind@0.61.0: + resolution: {integrity: sha512-PooyLVAF4wH9KvW4OKfDxYFuM4qmnlU+Ci6O6RGgVsKyQMq76crRqqK76lbnehg7jOoZJVxmWfQ6k5gT3aQeXQ==} + dependencies: + '@unocss/core': 0.61.0 + '@unocss/preset-mini': 0.61.0 + '@unocss/rule-utils': 0.61.0 + dev: false + /@unocss/reset@0.58.5: resolution: {integrity: sha512-2wMrkCj3SSb5hrx9TKs5jZa34QIRkHv9FotbJutAPo7o8hx+XXn56ogzdoUrcFPJZJUx2R2nyOVbSlGMIjtFtw==} dev: true @@ -13333,6 +13708,10 @@ packages: resolution: {integrity: sha512-EuC8gkh8L8WvPOcjS/KqprEJXIKcpBPm+ou5G9D6WgDmJ+TgQrri5oR+QUmOmEnueQkVL7bnkFkIKeg71SJLFA==} dev: false + /@unocss/reset@0.61.0: + resolution: {integrity: sha512-VqemtmzH8Rgu5yNomtv50gIcy4KZ2x1aP+7WZCds9x5ZdTSEjbfCOgUDI9rDrrGSipJkCmJ1yOhUPMC7ND6Hfw==} + dev: false + /@unocss/rule-utils@0.58.5: resolution: {integrity: sha512-w0sGJoeUGwMWLVFLEE9PDiv/fQcQqZnTIIQLYNCjTdqXDRlwTp9ACW0h47x/hAAIXdOtEOOBuTfjGD79GznUmA==} engines: {node: '>=14'} @@ -13363,6 +13742,14 @@ packages: magic-string: 0.30.10 dev: false + /@unocss/rule-utils@0.61.0: + resolution: {integrity: sha512-MCdmfhE6Q9HSWjWqi2sx5/nnKyOEhfhoo+pVumHIqkHQICQ/LuKioFf7Y7e5ycqjFE/7dC2hKGZJ8WTMGIOMwA==} + engines: {node: '>=14'} + dependencies: + '@unocss/core': 0.61.0 + magic-string: 0.30.10 + dev: false + /@unocss/scope@0.58.5: resolution: {integrity: sha512-vSentagAwYTnThGRCjzZ6eNSSRuzdWBl21L1BbvVNM91Ss/FugQnZ1hd0m3TrVvvStYXnFVHMQ/MjCAEJ4cMYg==} dev: true @@ -13377,6 +13764,10 @@ packages: resolution: {integrity: sha512-uDUcBkFe8nRwNiU4YQyrOCjY7/+qFJI/Qr0eouMPOSEsQ6uIXQEWjykqUBJg2fvm0S2vbfBGO9tO/wCDIk5O3w==} dev: false + /@unocss/scope@0.61.0: + resolution: {integrity: sha512-uDk84LX2meZHskSvy0Mad7jgF0Be6el16F9DKYYvxlUxlzu/mCj6PQpQrXi8uZ2+O3akneHFqAbO6ewYShKdQA==} + dev: false + /@unocss/transformer-attributify-jsx-babel@0.58.5: resolution: {integrity: sha512-IAWSSKN3V0D87DE8bqaaPrZBWOdWQ06QNfi9vRuQJfRWOui87ezi9+NffjcnQw/ap9xMk1O6z74/WOW3zo6uYA==} dependencies: @@ -13419,6 +13810,17 @@ packages: - supports-color dev: false + /@unocss/transformer-attributify-jsx-babel@0.61.0: + resolution: {integrity: sha512-D9z28MQM4w8oowMZRiz7kxEVlor1/XUfaVBTujAS6Ks7Ly+0/91LuOLSHU9uC7vcKmMRI0Q2+Ww2hsVNf2z7ww==} + dependencies: + '@babel/core': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/preset-typescript': 7.24.7(@babel/core@7.24.7) + '@unocss/core': 0.61.0 + transitivePeerDependencies: + - supports-color + dev: false + /@unocss/transformer-attributify-jsx@0.58.5: resolution: {integrity: sha512-sItEALyvAt3PZLd9Q1tlIATjaj3kWbS/qI3otUVsYBdZjP4UudzJ3D1fcWNL2WPlgz8KtlVzRUuxob8TQ4ibZg==} dependencies: @@ -13441,6 +13843,12 @@ packages: '@unocss/core': 0.60.3 dev: false + /@unocss/transformer-attributify-jsx@0.61.0: + resolution: {integrity: sha512-mC0+O7KmxP5b0DlPyGVdu/3NM/33f9CgfXmwu+U+3NSsAfcCLjJ7nD1MOjl3vcFV5YpudTy1EVaqhcROQRSZIg==} + dependencies: + '@unocss/core': 0.61.0 + dev: false + /@unocss/transformer-compile-class@0.58.5: resolution: {integrity: sha512-4MaxjaZo1rf5uHvDGa2mbnXxAYVYoj1+oRNpL4fE3FoExS1Ka2CiNGQn/S4bHMF51vmXMSWtOzurJpPD4BaJUQ==} dependencies: @@ -13463,6 +13871,12 @@ packages: '@unocss/core': 0.60.3 dev: false + /@unocss/transformer-compile-class@0.61.0: + resolution: {integrity: sha512-iTQyWz+IbNZrQWCQaibHMY2+8+VoG4ZpizeyYKXHZe11/HaomSvorJwZdufEUTrdWmUzRhJgumGl1TW4FaJwpg==} + dependencies: + '@unocss/core': 0.61.0 + dev: false + /@unocss/transformer-directives@0.58.5: resolution: {integrity: sha512-allspF5TlT1B2bJSZ1houHScXOTaTPlatLiEmgQKzr/m93rCvktokaO5J6qeN2VXQdpTIsxdA5B8//7UkfTuIA==} dependencies: @@ -13493,6 +13907,14 @@ packages: css-tree: 2.3.1 dev: false + /@unocss/transformer-directives@0.61.0: + resolution: {integrity: sha512-15nIynJPYFYnW/TUQu0NyZ5uxTDcrRyY8sB3axcYZOqqlu1hgPFotVukl6jqCZgGUR1AbfbnJwuDlcBQeT8xpA==} + dependencies: + '@unocss/core': 0.61.0 + '@unocss/rule-utils': 0.61.0 + css-tree: 2.3.1 + dev: false + /@unocss/transformer-variant-group@0.54.3: resolution: {integrity: sha512-4YZSi2LBTvrvPKDFZdb7rmqAlFr+hf4f92MfmPDRPwFp/qvJeO2UoBUCkiZoTjLHzCykHuLEJUiXgr3QNO2D1A==} dependencies: @@ -13521,6 +13943,12 @@ packages: '@unocss/core': 0.60.3 dev: false + /@unocss/transformer-variant-group@0.61.0: + resolution: {integrity: sha512-5DHEram3iv+c9jPQW8p629aFyptyzdP5yNnRSMLBZcwyJ672VAKzPUZLYHh5UOUb69eaet3og1cU8uxpHhGKtQ==} + dependencies: + '@unocss/core': 0.61.0 + dev: false + /@unocss/vite@0.58.5(rollup@2.79.1)(vite@5.1.5): resolution: {integrity: sha512-p4o1XNX1rvjmoUqSSdua8XyWNg/d+YUChDd2L/xEty+6j2qv0wUaohs3UQ87vWlv632/UmgdX+2MbrgtqthCtw==} peerDependencies: @@ -13599,6 +14027,27 @@ packages: vite: 5.2.13(@types/node@20.12.7) transitivePeerDependencies: - rollup + dev: true + + /@unocss/vite@0.59.4(vite@5.3.1): + resolution: {integrity: sha512-q7GN7vkQYn79n7vYIUlaa7gXGwc7pk0Qo3z3ZFwWGE43/DtZnn2Hwl5UjgBAgi9McA+xqHJEHRsJnI7HJPHUYA==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@unocss/config': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/inspector': 0.59.4 + '@unocss/scope': 0.59.4 + '@unocss/transformer-directives': 0.59.4 + chokidar: 3.6.0 + fast-glob: 3.3.2 + magic-string: 0.30.10 + vite: 5.3.1(@types/node@20.12.7) + transitivePeerDependencies: + - rollup + dev: false /@unocss/vite@0.60.3(rollup@2.79.1)(vite@5.2.11): resolution: {integrity: sha512-I3EOR3g245IGDp3DS17AQAMwNQrh6L6kIlXG3+wt5IZ1zu1ahZmKA8/xxh6oo2TNdu4rI6nQbcLIRn+8eSyfQw==} @@ -13620,6 +14069,26 @@ packages: - rollup dev: false + /@unocss/vite@0.61.0(rollup@2.79.1)(vite@5.3.1): + resolution: {integrity: sha512-gjxLJrja1hqDwdd8z3QvzfMCcKppGqiL2+A6aHwG/AXfEmZMydA50U7VvJK7Wx8/Enm26G6JQrtGrpu+kK3QpQ==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + dependencies: + '@ampproject/remapping': 2.3.0 + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@unocss/config': 0.61.0 + '@unocss/core': 0.61.0 + '@unocss/inspector': 0.61.0 + '@unocss/scope': 0.61.0 + '@unocss/transformer-directives': 0.61.0 + chokidar: 3.6.0 + fast-glob: 3.3.2 + magic-string: 0.30.10 + vite: 5.3.1(@types/node@20.12.7) + transitivePeerDependencies: + - rollup + dev: false + /@use-gesture/core@10.3.0: resolution: {integrity: sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A==} dev: false @@ -13681,7 +14150,6 @@ packages: dependencies: path-to-regexp: 6.2.2 react: 18.3.1 - dev: false /@verdant-web/react@32.0.0(@verdant-web/store@3.6.4)(react@18.3.1): resolution: {integrity: sha512-/1IXRMzYv9Gq4hGNe52QnlZ13ViybVGCgKS0C/8lYem7OeVXbQ6gkmbf0DE7cjQvvuARrBxYCHmyMwMoDhWpKA==} @@ -13756,17 +14224,6 @@ packages: - '@swc/helpers' dev: true - /@vitejs/plugin-react-swc@3.5.0(vite@5.2.7): - resolution: {integrity: sha512-1PrOvAaDpqlCV+Up8RkAh9qaiUjoDUcjtttyhXDKw53XA6Ve16SOp6cCOpRs8Dj8DqUQs6eTW5YkLcLJjrXAig==} - peerDependencies: - vite: ^4 || ^5 - dependencies: - '@swc/core': 1.5.27 - vite: 5.2.7 - transitivePeerDependencies: - - '@swc/helpers' - dev: true - /@vitejs/plugin-react-swc@3.6.0(vite@5.1.5): resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==} peerDependencies: @@ -13811,6 +14268,17 @@ packages: - '@swc/helpers' dev: true + /@vitejs/plugin-react-swc@3.7.0(vite@5.3.1): + resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==} + peerDependencies: + vite: ^4 || ^5 + dependencies: + '@swc/core': 1.5.27 + vite: 5.3.1(@types/node@20.12.7) + transitivePeerDependencies: + - '@swc/helpers' + dev: true + /@vitejs/plugin-react@4.3.1(vite@5.2.13): resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} @@ -14065,6 +14533,12 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -14391,8 +14865,8 @@ packages: tsconfck: 3.0.3(typescript@5.4.5) unist-util-visit: 5.0.0 vfile: 6.0.1 - vite: 5.2.13(@types/node@20.12.7) - vitefu: 0.2.5(vite@5.2.13) + vite: 5.3.1(@types/node@20.12.7) + vitefu: 0.2.5(vite@5.3.1) which-pm: 2.1.1 yargs-parser: 21.1.1 zod: 3.23.5 @@ -14705,7 +15179,6 @@ packages: electron-to-chromium: 1.4.796 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) - dev: true /buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -14819,7 +15292,6 @@ packages: /caniuse-lite@1.0.30001632: resolution: {integrity: sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==} - dev: true /capital-case@1.0.4: resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} @@ -15765,7 +16237,6 @@ packages: /electron-to-chromium@1.4.796: resolution: {integrity: sha512-NglN/xprcM+SHD2XCli4oC6bWe6kHoytcyLKCWXmRL854F0qhPhaYgUswUsglnPxYaNQIg2uMY4BvaomIf3kLA==} - dev: true /emmet@2.4.7: resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} @@ -16485,6 +16956,36 @@ packages: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -17222,7 +17723,6 @@ packages: react-fast-compare: 2.0.4 tiny-warning: 1.0.3 tslib: 2.6.2 - dev: false /formik@2.4.6(react@18.3.1): resolution: {integrity: sha512-A+2EI7U7aG296q2TLGvNapDNTZp1khVt5Vk0Q/fyfSROss0V/V6+txt2aJnwEos44IxTCW/LYAi/zgWzlevj+g==} @@ -17238,6 +17738,7 @@ packages: react-fast-compare: 2.0.4 tiny-warning: 1.0.3 tslib: 2.6.3 + dev: false /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -20113,7 +20614,6 @@ packages: /path-to-regexp@6.2.2: resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} - dev: false /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -22022,7 +22522,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.12.0 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -22885,6 +23385,46 @@ packages: - postcss - rollup - supports-color + dev: true + + /unocss@0.59.4(postcss@8.4.38)(vite@5.3.1): + resolution: {integrity: sha512-QmCVjRObvVu/gsGrJGVt0NnrdhFFn314BUZn2WQyXV9rIvHLRmG5bIu0j5vibJkj7ZhFchTrnTM1pTFXP1xt5g==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 0.59.4 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + dependencies: + '@unocss/astro': 0.59.4(vite@5.3.1) + '@unocss/cli': 0.59.4 + '@unocss/core': 0.59.4 + '@unocss/extractor-arbitrary-variants': 0.59.4 + '@unocss/postcss': 0.59.4(postcss@8.4.38) + '@unocss/preset-attributify': 0.59.4 + '@unocss/preset-icons': 0.59.4 + '@unocss/preset-mini': 0.59.4 + '@unocss/preset-tagify': 0.59.4 + '@unocss/preset-typography': 0.59.4 + '@unocss/preset-uno': 0.59.4 + '@unocss/preset-web-fonts': 0.59.4 + '@unocss/preset-wind': 0.59.4 + '@unocss/reset': 0.59.4 + '@unocss/transformer-attributify-jsx': 0.59.4 + '@unocss/transformer-attributify-jsx-babel': 0.59.4 + '@unocss/transformer-compile-class': 0.59.4 + '@unocss/transformer-directives': 0.59.4 + '@unocss/transformer-variant-group': 0.59.4 + '@unocss/vite': 0.59.4(vite@5.3.1) + vite: 5.3.1(@types/node@20.12.7) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + dev: false /unocss@0.60.3(postcss@8.4.38)(rollup@2.79.1)(vite@5.2.11): resolution: {integrity: sha512-pUBbpgGRKCa6oB/LrGEFBWP2/2E1ZOY8XO7aVJKo2x10rqLS8tGykn1VoBUgbGJsv/8W8tskTVz+RFbCyKP+kA==} @@ -22925,6 +23465,45 @@ packages: - supports-color dev: false + /unocss@0.61.0(postcss@8.4.38)(rollup@2.79.1)(vite@5.3.1): + resolution: {integrity: sha512-7642v5tHpEpHO9dl9sqYbKT/Ri4X4lmGHhj/znE4uheEfXcptPPiZ1/hVmQVciHUSI8CnQBqDwkZuxNPDG3bTQ==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 0.61.0 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + dependencies: + '@unocss/astro': 0.61.0(rollup@2.79.1)(vite@5.3.1) + '@unocss/cli': 0.61.0(rollup@2.79.1) + '@unocss/core': 0.61.0 + '@unocss/extractor-arbitrary-variants': 0.61.0 + '@unocss/postcss': 0.61.0(postcss@8.4.38) + '@unocss/preset-attributify': 0.61.0 + '@unocss/preset-icons': 0.61.0 + '@unocss/preset-mini': 0.61.0 + '@unocss/preset-tagify': 0.61.0 + '@unocss/preset-typography': 0.61.0 + '@unocss/preset-uno': 0.61.0 + '@unocss/preset-web-fonts': 0.61.0 + '@unocss/preset-wind': 0.61.0 + '@unocss/reset': 0.61.0 + '@unocss/transformer-attributify-jsx': 0.61.0 + '@unocss/transformer-attributify-jsx-babel': 0.61.0 + '@unocss/transformer-compile-class': 0.61.0 + '@unocss/transformer-directives': 0.61.0 + '@unocss/transformer-variant-group': 0.61.0 + '@unocss/vite': 0.61.0(rollup@2.79.1)(vite@5.3.1) + vite: 5.3.1(@types/node@20.12.7) + transitivePeerDependencies: + - postcss + - rollup + - supports-color + dev: false + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -22954,7 +23533,6 @@ packages: browserslist: 4.23.1 escalade: 3.1.2 picocolors: 1.0.1 - dev: true /upper-case-first@2.0.2: resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} @@ -23203,7 +23781,7 @@ packages: debug: 4.3.5 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.2.13(@types/node@20.12.7) + vite: 5.3.1(@types/node@20.12.7) transitivePeerDependencies: - '@types/node' - less @@ -23302,7 +23880,7 @@ packages: - supports-color dev: true - /vite-plugin-pwa@0.19.2(vite@5.2.13)(workbox-build@7.1.1)(workbox-window@7.1.0): + /vite-plugin-pwa@0.19.2(vite@5.3.1)(workbox-build@7.1.1)(workbox-window@7.1.0): resolution: {integrity: sha512-LSQJFPxCAQYbRuSyc9EbRLRqLpaBA9onIZuQFomfUYjWSgHuQLonahetDlPSC9zsxmkSEhQH8dXZN8yL978h3w==} engines: {node: '>=16.0.0'} peerDependencies: @@ -23317,7 +23895,7 @@ packages: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.2.13(@types/node@20.12.7) + vite: 5.3.1(@types/node@20.12.7) workbox-build: 7.1.1 workbox-window: 7.1.0 transitivePeerDependencies: @@ -23368,7 +23946,7 @@ packages: - supports-color dev: true - /vite-plugin-pwa@0.19.8(vite@5.2.7)(workbox-build@7.1.1)(workbox-window@6.6.1): + /vite-plugin-pwa@0.19.8(vite@5.3.1)(workbox-build@7.1.1)(workbox-window@6.6.1): resolution: {integrity: sha512-e1oK0dfhzhDhY3VBuML6c0h8Xfx6EkOVYqolj7g+u8eRfdauZe5RLteCIA/c5gH0CBQ0CNFAuv/AFTx4Z7IXTw==} engines: {node: '>=16.0.0'} peerDependencies: @@ -23383,7 +23961,7 @@ packages: debug: 4.3.4 fast-glob: 3.3.2 pretty-bytes: 6.1.1 - vite: 5.2.7 + vite: 5.3.1(@types/node@20.12.7) workbox-build: 7.1.1 workbox-window: 6.6.1 transitivePeerDependencies: @@ -23527,6 +24105,7 @@ packages: rollup: 4.17.2 optionalDependencies: fsevents: 2.3.3 + dev: true /vite@5.2.7: resolution: {integrity: sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==} @@ -23562,7 +24141,42 @@ packages: optionalDependencies: fsevents: 2.3.3 - /vitefu@0.2.5(vite@5.2.13): + /vite@5.3.1(@types/node@20.12.7): + resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.12.7 + esbuild: 0.21.5 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + fsevents: 2.3.3 + + /vitefu@0.2.5(vite@5.3.1): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 @@ -23570,7 +24184,7 @@ packages: vite: optional: true dependencies: - vite: 5.2.13(@types/node@20.12.7) + vite: 5.3.1(@types/node@20.12.7) dev: false /vitest@0.22.1: @@ -23656,7 +24270,7 @@ packages: strip-literal: 2.1.0 tinybench: 2.8.0 tinypool: 0.8.4 - vite: 5.2.13(@types/node@20.12.7) + vite: 5.3.1(@types/node@20.12.7) vite-node: 1.6.0(@types/node@20.12.7) why-is-node-running: 2.2.2 transitivePeerDependencies: diff --git a/scripts/create-app/template/web/index.html b/scripts/create-app/template/web/index.html index 1ea164d3..11aa157b 100644 --- a/scripts/create-app/template/web/index.html +++ b/scripts/create-app/template/web/index.html @@ -32,7 +32,7 @@ - +
diff --git a/scripts/create-app/template/web/src/App.tsx b/scripts/create-app/template/web/src/App.tsx index c031931b..597e86b9 100644 --- a/scripts/create-app/template/web/src/App.tsx +++ b/scripts/create-app/template/web/src/App.tsx @@ -1,59 +1,28 @@ -import { clientDescriptor, hooks } from '@/store.js'; -import { ReactNode, Suspense, useLayoutEffect } from 'react'; import { Pages } from '@/pages/Pages.jsx'; -import { useVisualViewportOffset } from '@a-type/ui/hooks'; -import { Toaster } from 'react-hot-toast'; -import { IconSpritesheet } from '@a-type/ui/components/icon'; +import { clientDescriptor, hooks } from '@/store.js'; import { ErrorBoundary } from '@a-type/ui/components/errorBoundary'; -import { TooltipProvider } from '@a-type/ui/components/tooltip'; -import { ParticleLayer } from '@a-type/ui/components/particles'; -import { ReloadButton } from '@biscuits/client'; +import { Provider as UIProvider } from '@a-type/ui/components/provider'; import { H1, P } from '@a-type/ui/components/typography'; -import { - useCanSync, - Provider, - createGraphQLClient, - AppPreviewNotice, - PrereleaseWarning, -} from '@biscuits/client'; +import { Provider, ReloadButton, useCanSync } from '@biscuits/client'; +import { ReactNode, Suspense } from 'react'; export interface AppProps {} -const graphqlClient = createGraphQLClient(); - export function App({}: AppProps) { - useLayoutEffect(() => { - if (typeof window !== 'undefined') { - document.body.className = 'theme-lemon'; - } - }, []); - - useVisualViewportOffset(); - return ( }> - + - - - - - - - + - + ); } @@ -76,7 +45,7 @@ function ErrorFallback() {

Sorry about this. The app has crashed. You can try refreshing, but if that doesn't work,{' '} - + let me know about it.

diff --git a/web/package.json b/web/package.json index 962dd221..08597029 100644 --- a/web/package.json +++ b/web/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@a-type/auth-client": "1.0.6", - "@a-type/ui": "^0.8.20", + "@a-type/ui": "^0.8.21", "@biscuits/apps": "workspace:*", "@biscuits/client": "workspace:*", "@biscuits/error": "workspace:*", diff --git a/web/src/components/plan/InviteMember.tsx b/web/src/components/plan/InviteMember.tsx index 02e059d3..43558d07 100644 --- a/web/src/components/plan/InviteMember.tsx +++ b/web/src/components/plan/InviteMember.tsx @@ -4,7 +4,7 @@ import { SubmitButton, TextField, } from '@a-type/ui/components/forms'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; import { useMutation } from '@biscuits/client'; const invite = graphql(` diff --git a/web/src/components/subscription/ManageSubscription.tsx b/web/src/components/subscription/ManageSubscription.tsx index 76849bd6..039094e2 100644 --- a/web/src/components/subscription/ManageSubscription.tsx +++ b/web/src/components/subscription/ManageSubscription.tsx @@ -2,7 +2,7 @@ import { FragmentOf, graphql, readFragment } from '@/graphql.js'; import { Button } from '@a-type/ui/components/button'; import { useSearchParams } from '@verdant-web/react-router'; import { useEffect } from 'react'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; import { PlanInfo, planProductInfo } from './PlanInfo.js'; import { CancelPlanButton } from './CancelPlanButton.js'; import classNames from 'classnames'; diff --git a/web/src/graphql.ts b/web/src/graphql.ts index 495746ec..9bac877e 100644 --- a/web/src/graphql.ts +++ b/web/src/graphql.ts @@ -1,6 +1,6 @@ export { graphql, type FragmentOf, readFragment } from '@biscuits/client'; import { createGraphQLClient } from '@biscuits/client'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; export const client = createGraphQLClient({ onError: (err) => { diff --git a/web/src/main.tsx b/web/src/main.tsx index e566cdcc..771eb688 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -1,30 +1,22 @@ -import 'uno.css'; +import { Provider as UIProvider } from '@a-type/ui/components/provider'; +import { Provider } from '@biscuits/client'; import '@biscuits/client/henrietta.css'; -import './main.css'; import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; -import { Pages } from './pages/index.jsx'; -import { Provider, onPageError } from '@biscuits/client'; -import { toast, Toaster } from 'react-hot-toast'; -import { IconSpritesheet } from '@a-type/ui/components/icon'; +import 'uno.css'; import { client } from './graphql.js'; - -onPageError( - (err) => - !!toast.error(err, { - duration: 10000, - }), -); +import './main.css'; +import { Pages } from './pages/index.jsx'; function main() { const root = createRoot(document.getElementById('root')!); root.render( - - - - - + + + + + , ); } diff --git a/web/src/pages/ClaimInvitePage.tsx b/web/src/pages/ClaimInvitePage.tsx index b3232891..a4486a31 100644 --- a/web/src/pages/ClaimInvitePage.tsx +++ b/web/src/pages/ClaimInvitePage.tsx @@ -6,7 +6,7 @@ import { PageRoot, PageContent } from '@a-type/ui/components/layouts'; import { H1, P } from '@a-type/ui/components/typography'; import { withClassName } from '@a-type/ui/hooks'; import { Button } from '@a-type/ui/components/button'; -import { toast } from 'react-hot-toast'; +import { toast } from '@a-type/ui'; import { Footer } from '@/components/help/Footer.jsx'; const claimInviteInfo = graphql(` diff --git a/web/src/pages/HomePage.tsx b/web/src/pages/HomePage.tsx index f33c1564..76c527a4 100644 --- a/web/src/pages/HomePage.tsx +++ b/web/src/pages/HomePage.tsx @@ -73,7 +73,6 @@ export default function HomePage() { )}