diff --git a/bun.lock b/bun.lock index a7df09b8..dffcda9c 100644 --- a/bun.lock +++ b/bun.lock @@ -4,8 +4,10 @@ "": { "name": "website-next", "dependencies": { + "@ariakit/react": "^0.4.17", "@aws-sdk/client-s3": "^3.806.0", "@aws-sdk/s3-request-presigner": "^3.806.0", + "@emoji-mart/data": "1.2.1", "@fullcalendar/core": "^6.1.15", "@fullcalendar/daygrid": "^6.1.15", "@fullcalendar/interaction": "^6.1.15", @@ -13,21 +15,50 @@ "@fullcalendar/timegrid": "^6.1.15", "@oslojs/crypto": "^1.0.1", "@oslojs/encoding": "^1.1.0", + "@platejs/autoformat": "^49.0.0", + "@platejs/basic-nodes": "^49.0.0", + "@platejs/basic-styles": "^49.0.0", + "@platejs/callout": "^49.0.0", + "@platejs/caption": "^49.0.0", + "@platejs/code-block": "^49.0.0", + "@platejs/combobox": "^49.0.0", + "@platejs/date": "^49.0.2", + "@platejs/dnd": "^49.2.7", + "@platejs/docx": "^49.0.0", + "@platejs/emoji": "^49.0.0", + "@platejs/floating": "^49.0.0", + "@platejs/indent": "^49.0.0", + "@platejs/juice": "^49.0.0", + "@platejs/layout": "^49.2.1", + "@platejs/link": "^49.1.1", + "@platejs/list": "^49.2.0", + "@platejs/markdown": "^49.2.1", + "@platejs/math": "^49.0.0", + "@platejs/media": "^49.0.0", + "@platejs/mention": "^49.0.0", + "@platejs/resizable": "^49.0.0", + "@platejs/selection": "^49.2.4", + "@platejs/slash-command": "^49.0.0", + "@platejs/table": "^49.1.13", + "@platejs/toc": "^49.0.0", + "@platejs/toggle": "^49.0.0", "@radix-ui/react-accordion": "^1.2.11", - "@radix-ui/react-alert-dialog": "^1.1.13", - "@radix-ui/react-avatar": "^1.1.9", - "@radix-ui/react-checkbox": "^1.3.1", + "@radix-ui/react-alert-dialog": "^1.1.14", + "@radix-ui/react-avatar": "^1.1.10", + "@radix-ui/react-checkbox": "^1.3.2", "@radix-ui/react-collapsible": "^1.1.10", - "@radix-ui/react-dialog": "^1.1.13", - "@radix-ui/react-dropdown-menu": "^2.1.14", + "@radix-ui/react-context-menu": "^2.2.16", + "@radix-ui/react-dialog": "^1.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.15", "@radix-ui/react-label": "^2.1.6", - "@radix-ui/react-popover": "^1.1.13", + "@radix-ui/react-popover": "^1.1.14", "@radix-ui/react-radio-group": "^1.3.6", "@radix-ui/react-scroll-area": "^1.2.8", "@radix-ui/react-select": "^2.2.4", - "@radix-ui/react-separator": "^1.1.6", - "@radix-ui/react-slot": "1.1.2", - "@radix-ui/react-tooltip": "^1.2.6", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-toolbar": "^1.1.10", + "@radix-ui/react-tooltip": "^1.2.7", "@react-email/components": "0.5.1", "@t3-oss/env-nextjs": "^0.12.0", "@tanstack/react-form": "^1.11.0", @@ -38,16 +69,21 @@ "@trpc/server": "^11.1.2", "@tsparticles/react": "^3.0.0", "@types/lodash.debounce": "^4.0.9", - "cmdk": "1.0.0", + "@udecode/cn": "^49.0.15", + "cmdk": "^1.1.1", "country-flag-icons": "^1.5.19", + "csstype": "^3.1.3", "cva": "^1.0.0-beta.3", "date-fns": "^4.1.0", "drizzle-orm": "^0.41.0", "drizzle-zod": "^0.7.1", + "html2canvas-pro": "^1.5.11", "input-otp": "^1.4.2", "libphonenumber-js": "^1.12.8", + "lodash": "^4.17.21", "lodash.debounce": "^4.0.8", - "lucide-react": "^0.486.0", + "lowlight": "^3.3.0", + "lucide-react": "^0.536.0", "maplibre-gl": "^5.5.0", "motion": "^11.18.2", "next": "^15.3.2", @@ -56,20 +92,30 @@ "nodemailer": "^6.10.1", "nuqs": "^2.4.3", "oslo": "^1.2.1", + "pdf-lib": "^1.17.1", + "platejs": "^49.2.6", "postgres": "^3.4.5", "posthog-js": "^1.240.5", "react": "^19.1.0", - "react-day-picker": "^9.6.7", + "react-day-picker": "^9.8.1", "react-dom": "^19.1.0", "react-dropzone": "^14.3.8", + "react-lite-youtube-embed": "^2.5.2", "react-map-gl": "^8.0.4", "react-phone-number-input": "^3.4.12", + "react-player": "^3.3.1", + "react-textarea-autosize": "^8.5.9", + "react-tweet": "^3.2.2", "reading-time": "^1.5.0", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", "run-script-os": "^1.1.6", - "sonner": "^2.0.3", + "sonner": "^2.0.7", "superjson": "^2.2.2", - "tailwind-merge": "^3.2.0", + "tailwind-merge": "^3.3.1", + "tailwind-scrollbar-hide": "^4.0.0", "tsparticles": "^3.8.1", + "use-file-picker": "2.1.2", "vaul": "^1.1.2", "zod": "^3.24.4", }, @@ -92,7 +138,7 @@ "react-scan": "^0.2.14", "server-only": "^0.0.1", "tailwindcss": "^4.1.6", - "tw-animate-css": "^1.2.9", + "tw-animate-css": "^1.3.6", "tw-clamp-css": "^2.0.0", "typescript": "^5.8.3", }, @@ -103,6 +149,12 @@ "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + "@ariakit/core": ["@ariakit/core@0.4.16", "", {}, "sha512-nPJ0Be8d5ZvRApYGqdLMuYUjP7ktkPmTPOXyZFw+0Illk8LKgF3Q74ctVGuoQurJNDsANXcewzlyXK4vyIAGTA=="], + + "@ariakit/react": ["@ariakit/react@0.4.19", "", { "dependencies": { "@ariakit/react-core": "0.4.19" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-n6q8leSQWXMk4vhcZlpnj8cIlAY0n+1bvVTwHvaVfmec4LjW49MFKkJRZd1AiV+SE73nkxPwSL3IbaS4p1aRxQ=="], + + "@ariakit/react-core": ["@ariakit/react-core@0.4.19", "", { "dependencies": { "@ariakit/core": "0.4.16", "@floating-ui/dom": "^1.0.0", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Aj+fu4pMyPXtlBghI+E7KSWItqJkbAqEhut3DlsFAjK9fQdHE+e1tQJG1PtnoEdD9BExkJWQ6R4M5a9HkEhqPA=="], + "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], "@aws-crypto/crc32c": ["@aws-crypto/crc32c@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag=="], @@ -117,33 +169,33 @@ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.906.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.906.0", "@aws-sdk/credential-provider-node": "3.906.0", "@aws-sdk/middleware-bucket-endpoint": "3.901.0", "@aws-sdk/middleware-expect-continue": "3.901.0", "@aws-sdk/middleware-flexible-checksums": "3.906.0", "@aws-sdk/middleware-host-header": "3.901.0", "@aws-sdk/middleware-location-constraint": "3.901.0", "@aws-sdk/middleware-logger": "3.901.0", "@aws-sdk/middleware-recursion-detection": "3.901.0", "@aws-sdk/middleware-sdk-s3": "3.906.0", "@aws-sdk/middleware-ssec": "3.901.0", "@aws-sdk/middleware-user-agent": "3.906.0", "@aws-sdk/region-config-resolver": "3.901.0", "@aws-sdk/signature-v4-multi-region": "3.906.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", "@aws-sdk/util-user-agent-browser": "3.901.0", "@aws-sdk/util-user-agent-node": "3.906.0", "@aws-sdk/xml-builder": "3.901.0", "@smithy/config-resolver": "^4.3.0", "@smithy/core": "^3.14.0", "@smithy/eventstream-serde-browser": "^4.2.0", "@smithy/eventstream-serde-config-resolver": "^4.3.0", "@smithy/eventstream-serde-node": "^4.2.0", "@smithy/fetch-http-handler": "^5.3.0", "@smithy/hash-blob-browser": "^4.2.0", "@smithy/hash-node": "^4.2.0", "@smithy/hash-stream-node": "^4.2.0", "@smithy/invalid-dependency": "^4.2.0", "@smithy/md5-js": "^4.2.0", "@smithy/middleware-content-length": "^4.2.0", "@smithy/middleware-endpoint": "^4.3.0", "@smithy/middleware-retry": "^4.4.0", "@smithy/middleware-serde": "^4.2.0", "@smithy/middleware-stack": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/node-http-handler": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.0", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", "@smithy/util-base64": "^4.2.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.0", "@smithy/util-defaults-mode-browser": "^4.2.0", "@smithy/util-defaults-mode-node": "^4.2.0", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", "@smithy/util-stream": "^4.4.0", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-6JQGrmQBHjnARQR+HSaj8DvLRbXTpPa8knYi1veT709JHXVkCkNNLKs7ULjVNCpSffRpzVYJn+eONHKj3Y0knQ=="], + "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.908.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.908.0", "@aws-sdk/credential-provider-node": "3.908.0", "@aws-sdk/middleware-bucket-endpoint": "3.901.0", "@aws-sdk/middleware-expect-continue": "3.901.0", "@aws-sdk/middleware-flexible-checksums": "3.908.0", "@aws-sdk/middleware-host-header": "3.901.0", "@aws-sdk/middleware-location-constraint": "3.901.0", "@aws-sdk/middleware-logger": "3.901.0", "@aws-sdk/middleware-recursion-detection": "3.901.0", "@aws-sdk/middleware-sdk-s3": "3.908.0", "@aws-sdk/middleware-ssec": "3.901.0", "@aws-sdk/middleware-user-agent": "3.908.0", "@aws-sdk/region-config-resolver": "3.901.0", "@aws-sdk/signature-v4-multi-region": "3.908.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", "@aws-sdk/util-user-agent-browser": "3.907.0", "@aws-sdk/util-user-agent-node": "3.908.0", "@aws-sdk/xml-builder": "3.901.0", "@smithy/config-resolver": "^4.3.0", "@smithy/core": "^3.15.0", "@smithy/eventstream-serde-browser": "^4.2.0", "@smithy/eventstream-serde-config-resolver": "^4.3.0", "@smithy/eventstream-serde-node": "^4.2.0", "@smithy/fetch-http-handler": "^5.3.1", "@smithy/hash-blob-browser": "^4.2.1", "@smithy/hash-node": "^4.2.0", "@smithy/hash-stream-node": "^4.2.0", "@smithy/invalid-dependency": "^4.2.0", "@smithy/md5-js": "^4.2.0", "@smithy/middleware-content-length": "^4.2.0", "@smithy/middleware-endpoint": "^4.3.1", "@smithy/middleware-retry": "^4.4.1", "@smithy/middleware-serde": "^4.2.0", "@smithy/middleware-stack": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/node-http-handler": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.0", "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", "@smithy/util-stream": "^4.5.0", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-c/89iG3of8UEiWbRK014DoHLy8PLLTJtM9IvYLPsvrf83kpV2P/K9WrdbjW4h6e5qt9XPgfNTZ8U607mt7pdmA=="], - "@aws-sdk/client-ses": ["@aws-sdk/client-ses@3.906.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.906.0", "@aws-sdk/credential-provider-node": "3.906.0", "@aws-sdk/middleware-host-header": "3.901.0", "@aws-sdk/middleware-logger": "3.901.0", "@aws-sdk/middleware-recursion-detection": "3.901.0", "@aws-sdk/middleware-user-agent": "3.906.0", "@aws-sdk/region-config-resolver": "3.901.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", "@aws-sdk/util-user-agent-browser": "3.901.0", "@aws-sdk/util-user-agent-node": "3.906.0", "@smithy/config-resolver": "^4.3.0", "@smithy/core": "^3.14.0", "@smithy/fetch-http-handler": "^5.3.0", "@smithy/hash-node": "^4.2.0", "@smithy/invalid-dependency": "^4.2.0", "@smithy/middleware-content-length": "^4.2.0", "@smithy/middleware-endpoint": "^4.3.0", "@smithy/middleware-retry": "^4.4.0", "@smithy/middleware-serde": "^4.2.0", "@smithy/middleware-stack": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/node-http-handler": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.0", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", "@smithy/util-base64": "^4.2.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.0", "@smithy/util-defaults-mode-browser": "^4.2.0", "@smithy/util-defaults-mode-node": "^4.2.0", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-5Z7ppHF/KH2A2mov4FCgR+Ccnpv3t5egTryXbeDZMtWOxkBxvWMi1SxvN7oGYnN2YstvMw7jxNX6/1PemnCivA=="], + "@aws-sdk/client-ses": ["@aws-sdk/client-ses@3.908.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.908.0", "@aws-sdk/credential-provider-node": "3.908.0", "@aws-sdk/middleware-host-header": "3.901.0", "@aws-sdk/middleware-logger": "3.901.0", "@aws-sdk/middleware-recursion-detection": "3.901.0", "@aws-sdk/middleware-user-agent": "3.908.0", "@aws-sdk/region-config-resolver": "3.901.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", "@aws-sdk/util-user-agent-browser": "3.907.0", "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", "@smithy/core": "^3.15.0", "@smithy/fetch-http-handler": "^5.3.1", "@smithy/hash-node": "^4.2.0", "@smithy/invalid-dependency": "^4.2.0", "@smithy/middleware-content-length": "^4.2.0", "@smithy/middleware-endpoint": "^4.3.1", "@smithy/middleware-retry": "^4.4.1", "@smithy/middleware-serde": "^4.2.0", "@smithy/middleware-stack": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/node-http-handler": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.0", "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "@smithy/util-waiter": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-e4bglczZvoDLmMeAgr0lou5QKCIOGfdCnfXp9jkEhkL6JLKNYvkmrRZpCrQiBwm/4j4H88oRPgLYk+sGQKFPlw=="], - "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.906.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.906.0", "@aws-sdk/middleware-host-header": "3.901.0", "@aws-sdk/middleware-logger": "3.901.0", "@aws-sdk/middleware-recursion-detection": "3.901.0", "@aws-sdk/middleware-user-agent": "3.906.0", "@aws-sdk/region-config-resolver": "3.901.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", "@aws-sdk/util-user-agent-browser": "3.901.0", "@aws-sdk/util-user-agent-node": "3.906.0", "@smithy/config-resolver": "^4.3.0", "@smithy/core": "^3.14.0", "@smithy/fetch-http-handler": "^5.3.0", "@smithy/hash-node": "^4.2.0", "@smithy/invalid-dependency": "^4.2.0", "@smithy/middleware-content-length": "^4.2.0", "@smithy/middleware-endpoint": "^4.3.0", "@smithy/middleware-retry": "^4.4.0", "@smithy/middleware-serde": "^4.2.0", "@smithy/middleware-stack": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/node-http-handler": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.0", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", "@smithy/util-base64": "^4.2.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.0", "@smithy/util-defaults-mode-browser": "^4.2.0", "@smithy/util-defaults-mode-node": "^4.2.0", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-GGDwjW2cLzoEF5A1tBlZQZXzhlZzuM6cKNbSxUsCcBXtPAX03eb2GKApVy1SzpD03nTJk5T6GicGAm+BzK+lEg=="], + "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.908.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.908.0", "@aws-sdk/middleware-host-header": "3.901.0", "@aws-sdk/middleware-logger": "3.901.0", "@aws-sdk/middleware-recursion-detection": "3.901.0", "@aws-sdk/middleware-user-agent": "3.908.0", "@aws-sdk/region-config-resolver": "3.901.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", "@aws-sdk/util-user-agent-browser": "3.907.0", "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", "@smithy/core": "^3.15.0", "@smithy/fetch-http-handler": "^5.3.1", "@smithy/hash-node": "^4.2.0", "@smithy/invalid-dependency": "^4.2.0", "@smithy/middleware-content-length": "^4.2.0", "@smithy/middleware-endpoint": "^4.3.1", "@smithy/middleware-retry": "^4.4.1", "@smithy/middleware-serde": "^4.2.0", "@smithy/middleware-stack": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/node-http-handler": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.0", "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-PseFMWvtac+Q+zaY9DMISE+2+glNh0ROJ1yR4gMzeafNHSwkdYu4qcgxLWIOnIodGydBv/tQ6nzHPzExXnUUgw=="], - "@aws-sdk/core": ["@aws-sdk/core@3.906.0", "", { "dependencies": { "@aws-sdk/types": "3.901.0", "@aws-sdk/xml-builder": "3.901.0", "@smithy/core": "^3.14.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/property-provider": "^4.2.0", "@smithy/protocol-http": "^5.3.0", "@smithy/signature-v4": "^5.3.0", "@smithy/smithy-client": "^4.7.0", "@smithy/types": "^4.6.0", "@smithy/util-base64": "^4.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-+FuwAcozee8joVfjwly/8kSFNCvQOkcQYjINUckqBkdjO4iCRfOgSaz+0JMpMcYgVPnnyZv62gJ2g0bj0U+YDQ=="], + "@aws-sdk/core": ["@aws-sdk/core@3.908.0", "", { "dependencies": { "@aws-sdk/types": "3.901.0", "@aws-sdk/xml-builder": "3.901.0", "@smithy/core": "^3.15.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/property-provider": "^4.2.0", "@smithy/protocol-http": "^5.3.0", "@smithy/signature-v4": "^5.3.0", "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-okl6FC2cQT1Oidvmnmvyp/IEvqENBagKO0ww4YV5UtBkf0VlhAymCWkZqhovtklsqgq0otag2VRPAgnrMt6nVQ=="], - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.906.0", "", { "dependencies": { "@aws-sdk/core": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-vtMDguMci2aXhkgEqg1iqyQ7vVcafpx9uypksM6FQsNr3Cc/8I6HgfBAja6BuPwkaCn9NoMnG0/iuuOWr8P9dg=="], + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.908.0", "", { "dependencies": { "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-FK2YuxoI5CxUflPOIMbVAwDbi6Xvu+2sXopXLmrHc2PfI39M3vmjEoQwYCP8WuQSRb+TbAP3xAkxHjFSBFR35w=="], - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.906.0", "", { "dependencies": { "@aws-sdk/core": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/fetch-http-handler": "^5.3.0", "@smithy/node-http-handler": "^4.3.0", "@smithy/property-provider": "^4.2.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.0", "@smithy/types": "^4.6.0", "@smithy/util-stream": "^4.4.0", "tslib": "^2.6.2" } }, "sha512-L97N2SUkZp03s1LJZ1sCkUaUZ7m9T72faaadn05wyst/iXonSZKPHYMQVWGYhTC2OtRV0FQvBXIAqFZsNGQD0Q=="], + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.908.0", "", { "dependencies": { "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/fetch-http-handler": "^5.3.1", "@smithy/node-http-handler": "^4.3.0", "@smithy/property-provider": "^4.2.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/util-stream": "^4.5.0", "tslib": "^2.6.2" } }, "sha512-eLbz0geVW9EykujQNnYfR35Of8MreI6pau5K6XDFDUSWO9GF8wqH7CQwbXpXHBlCTHtq4QSLxzorD8U5CROhUw=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.906.0", "", { "dependencies": { "@aws-sdk/core": "3.906.0", "@aws-sdk/credential-provider-env": "3.906.0", "@aws-sdk/credential-provider-http": "3.906.0", "@aws-sdk/credential-provider-process": "3.906.0", "@aws-sdk/credential-provider-sso": "3.906.0", "@aws-sdk/credential-provider-web-identity": "3.906.0", "@aws-sdk/nested-clients": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/credential-provider-imds": "^4.2.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-r7TbHD80WXo42kTEC5bqa4b87ho3T3yd2VEKo1qbEmOUovocntO8HC3JxHYr0XSeZ82DEYxLARb84akWjabPzg=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.908.0", "", { "dependencies": { "@aws-sdk/core": "3.908.0", "@aws-sdk/credential-provider-env": "3.908.0", "@aws-sdk/credential-provider-http": "3.908.0", "@aws-sdk/credential-provider-process": "3.908.0", "@aws-sdk/credential-provider-sso": "3.908.0", "@aws-sdk/credential-provider-web-identity": "3.908.0", "@aws-sdk/nested-clients": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/credential-provider-imds": "^4.2.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-7Cgnv5wabgFtsgr+Uc/76EfPNGyxmbG8aICn3g3D3iJlcO4uuOZI8a77i0afoDdchZrTC6TG6UusS/NAW6zEoQ=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.906.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.906.0", "@aws-sdk/credential-provider-http": "3.906.0", "@aws-sdk/credential-provider-ini": "3.906.0", "@aws-sdk/credential-provider-process": "3.906.0", "@aws-sdk/credential-provider-sso": "3.906.0", "@aws-sdk/credential-provider-web-identity": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/credential-provider-imds": "^4.2.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-xga127vP0rFxiHjEUjLe6Yf4hQ/AZinOF4AqQr/asWQO+/uwh3aH8nXcS4lkpZNygxMHbuNXm7Xg504GKCMlLQ=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.908.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.908.0", "@aws-sdk/credential-provider-http": "3.908.0", "@aws-sdk/credential-provider-ini": "3.908.0", "@aws-sdk/credential-provider-process": "3.908.0", "@aws-sdk/credential-provider-sso": "3.908.0", "@aws-sdk/credential-provider-web-identity": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/credential-provider-imds": "^4.2.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-8OKbykpGw5bdfF/pLTf8YfUi1Kl8o1CTjBqWQTsLOkE3Ho3hsp1eQx8Cz4ttrpv0919kb+lox62DgmAOEmTr1w=="], - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.906.0", "", { "dependencies": { "@aws-sdk/core": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-P8R4GpDLppe+8mp+SOj1fKaY3AwDULCi/fqMSJjvf8qN6OM+vGGpFP3iXvkjFYyyV+8nRXY+HQCLRoZKpRtzMg=="], + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.908.0", "", { "dependencies": { "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-sWnbkGjDPBi6sODUzrAh5BCDpnPw0wpK8UC/hWI13Q8KGfyatAmCBfr+9OeO3+xBHa8N5AskMncr7C4qS846yQ=="], - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.906.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.906.0", "@aws-sdk/core": "3.906.0", "@aws-sdk/token-providers": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-wYljHU7yNEzt7ngZZ21FWh+RlO16gTpWvXyRqlryuCgIWugHD8bl7JphGnUN1md5/v+mCRuGK58JoFGZq+qrjA=="], + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.908.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.908.0", "@aws-sdk/core": "3.908.0", "@aws-sdk/token-providers": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-WV/aOzuS6ZZhrkPty6TJ3ZG24iS8NXP0m3GuTVuZ5tKi9Guss31/PJ1CrKPRCYGm15CsIjf+mrUxVnNYv9ap5g=="], - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.906.0", "", { "dependencies": { "@aws-sdk/core": "3.906.0", "@aws-sdk/nested-clients": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-V9PurepVko8+iyEvI9WAlk5dXJ1uWIW03RPLnNBEmeCqFjjit16HrNaaVvnp9fQbG7CSKSGqK026SjDgtKGKYA=="], + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.908.0", "", { "dependencies": { "@aws-sdk/core": "3.908.0", "@aws-sdk/nested-clients": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-9xWrFn6nWlF5KlV4XYW+7E6F33S3wUUEGRZ/+pgDhkIZd527ycT2nPG2dZ3fWUZMlRmzijP20QIJDqEbbGWe1Q=="], "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.901.0", "", { "dependencies": { "@aws-sdk/types": "3.901.0", "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", "@smithy/util-config-provider": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-mPF3N6eZlVs9G8aBSzvtoxR1RZqMo1aIwR+X8BAZSkhfj55fVF2no4IfPXfdFO3I66N+zEQ8nKoB0uTATWrogQ=="], "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.901.0", "", { "dependencies": { "@aws-sdk/types": "3.901.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-bwq9nj6MH38hlJwOY9QXIDwa6lI48UsaZpaXbdD71BljEIRlxDzfB4JaYb+ZNNK7RIAdzsP/K05mJty6KJAQHw=="], - "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.906.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-stream": "^4.4.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-vbOf5Pf2bRjw+Is1OsUKKP88uPKES8/B3c3yq0B72Y4ZgZEDymXIxGvZYPkThLk266PH7eHo+ZneZjkdfz6Zbg=="], + "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.908.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/is-array-buffer": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-stream": "^4.5.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-hYGhNBvdfnxhhywYRkesdxIZD8rvhsp2CBci5kCqrR2o5VvEkn5+waUQtkREtkciEpC4ent4fadg7N9XfTKvgQ=="], "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.901.0", "", { "dependencies": { "@aws-sdk/types": "3.901.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-yWX7GvRmqBtbNnUW7qbre3GvZmyYwU0WHefpZzDTYDoNgatuYq6LgUIQ+z5C04/kCRoFkAFrHag8a3BXqFzq5A=="], @@ -153,21 +205,21 @@ "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.901.0", "", { "dependencies": { "@aws-sdk/types": "3.901.0", "@aws/lambda-invoke-store": "^0.0.1", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-Wd2t8qa/4OL0v/oDpCHHYkgsXJr8/ttCxrvCKAt0H1zZe2LlRhY9gpDVKqdertfHrHDj786fOvEQA28G1L75Dg=="], - "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.906.0", "", { "dependencies": { "@aws-sdk/core": "3.906.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/core": "^3.14.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/signature-v4": "^5.3.0", "@smithy/smithy-client": "^4.7.0", "@smithy/types": "^4.6.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-stream": "^4.4.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-8Ztl5natyVXOvpk/en2j9Bjn2t8vawjbvgcU0/ZF5/JtA1rKSTctRXusICJgCovFHzaAH2MVhA51nnp3d8rViA=="], + "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.908.0", "", { "dependencies": { "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/core": "^3.15.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/signature-v4": "^5.3.0", "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-stream": "^4.5.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-23MbAOHsGaD0kTVMVLumaIM1f9vtDImIn2lSvPullbjFHKS4XxfrKuPumtKDzl8gzcux+98XnmfDRKH0fzkOUA=="], "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.901.0", "", { "dependencies": { "@aws-sdk/types": "3.901.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-YiLLJmA3RvjL38mFLuu8fhTTGWtp2qT24VqpucgfoyziYcTgIQkJJmKi90Xp6R6/3VcArqilyRgM1+x8i/em+Q=="], - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.906.0", "", { "dependencies": { "@aws-sdk/core": "3.906.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", "@smithy/core": "^3.14.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-CMAjq2oCEv5EEvmlFvio8t4KQL2jGORyDQu7oLj4l0a2biPgxbwL3utalbm9yKty1rQM5zKpaa7id7ZG3X1f6A=="], + "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.908.0", "", { "dependencies": { "@aws-sdk/core": "3.908.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", "@smithy/core": "^3.15.0", "@smithy/protocol-http": "^5.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-R0ePEOku72EvyJWy/D0Z5f/Ifpfxa0U9gySO3stpNhOox87XhsILpcIsCHPy0OHz1a7cMoZsF6rMKSzDeCnogQ=="], - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.906.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.906.0", "@aws-sdk/middleware-host-header": "3.901.0", "@aws-sdk/middleware-logger": "3.901.0", "@aws-sdk/middleware-recursion-detection": "3.901.0", "@aws-sdk/middleware-user-agent": "3.906.0", "@aws-sdk/region-config-resolver": "3.901.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", "@aws-sdk/util-user-agent-browser": "3.901.0", "@aws-sdk/util-user-agent-node": "3.906.0", "@smithy/config-resolver": "^4.3.0", "@smithy/core": "^3.14.0", "@smithy/fetch-http-handler": "^5.3.0", "@smithy/hash-node": "^4.2.0", "@smithy/invalid-dependency": "^4.2.0", "@smithy/middleware-content-length": "^4.2.0", "@smithy/middleware-endpoint": "^4.3.0", "@smithy/middleware-retry": "^4.4.0", "@smithy/middleware-serde": "^4.2.0", "@smithy/middleware-stack": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/node-http-handler": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.0", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", "@smithy/util-base64": "^4.2.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.0", "@smithy/util-defaults-mode-browser": "^4.2.0", "@smithy/util-defaults-mode-node": "^4.2.0", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-0/r0bh/9Bm14lVe+jAzQQB2ufq9S4Vd9Wg5rZn8RhrhKl6y/DC1aRzOo2kJTNu5pCbVfQsd/VXLLnkcbOrDy6A=="], + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.908.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.908.0", "@aws-sdk/middleware-host-header": "3.901.0", "@aws-sdk/middleware-logger": "3.901.0", "@aws-sdk/middleware-recursion-detection": "3.901.0", "@aws-sdk/middleware-user-agent": "3.908.0", "@aws-sdk/region-config-resolver": "3.901.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-endpoints": "3.901.0", "@aws-sdk/util-user-agent-browser": "3.907.0", "@aws-sdk/util-user-agent-node": "3.908.0", "@smithy/config-resolver": "^4.3.0", "@smithy/core": "^3.15.0", "@smithy/fetch-http-handler": "^5.3.1", "@smithy/hash-node": "^4.2.0", "@smithy/invalid-dependency": "^4.2.0", "@smithy/middleware-content-length": "^4.2.0", "@smithy/middleware-endpoint": "^4.3.1", "@smithy/middleware-retry": "^4.4.1", "@smithy/middleware-serde": "^4.2.0", "@smithy/middleware-stack": "^4.2.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/node-http-handler": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "@smithy/url-parser": "^4.2.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.0", "@smithy/util-defaults-mode-node": "^4.2.1", "@smithy/util-endpoints": "^3.2.0", "@smithy/util-middleware": "^4.2.0", "@smithy/util-retry": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-ZxDYrfxOKXNFHLyvJtT96TJ0p4brZOhwRE4csRXrezEVUN+pNgxuem95YvMALPVhlVqON2CTzr8BX+CcBKvX9Q=="], "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.901.0", "", { "dependencies": { "@aws-sdk/types": "3.901.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/types": "^4.6.0", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-7F0N888qVLHo4CSQOsnkZ4QAp8uHLKJ4v3u09Ly5k4AEStrSlFpckTPyUx6elwGL+fxGjNE2aakK8vEgzzCV0A=="], - "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.906.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.906.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-format-url": "3.901.0", "@smithy/middleware-endpoint": "^4.3.0", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-gNdFoyerUYSE+xtSi+WCuBOw54PTZmvjri/lDq5Can3a7uOQnMSZLaIjFrCRV5RZlLyCPnb3VWy3hIWOppnYvQ=="], + "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.908.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.908.0", "@aws-sdk/types": "3.901.0", "@aws-sdk/util-format-url": "3.901.0", "@smithy/middleware-endpoint": "^4.3.1", "@smithy/protocol-http": "^5.3.0", "@smithy/smithy-client": "^4.7.1", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-MN/0kk2ZDazemXm5FHtB4sfefamIjxrtvPZtCkGYrxopAqoHEkHKS7WqflWz4dtvPtc1A1uMDDZMXTNQbjRkYw=="], - "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.906.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/protocol-http": "^5.3.0", "@smithy/signature-v4": "^5.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-zqxRN8/dSrAaAEi5oXIeScsrbDkS63+ZyaBrkC6bc8Jd/bCvJM6D4LjJJxIOPBNXuF0bNhBIlTmqwtbkiqCwZw=="], + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.908.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/protocol-http": "^5.3.0", "@smithy/signature-v4": "^5.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-8OodflIzZM2GVuCGiGK6hqwsbfHRDl4kQcEYzHRg9p91H4h5Y876DPvLRkwM7pSC7LKUL0XkKWWVVjwJbp6/Ig=="], - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.906.0", "", { "dependencies": { "@aws-sdk/core": "3.906.0", "@aws-sdk/nested-clients": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-gdxXleCjMUAKnyR/1ksdnv3Fuifr9iuaeEtINRHkwVluwcORabEdOlxW36th2QdkpTTyP1hW35VATz2R6v/i2Q=="], + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.908.0", "", { "dependencies": { "@aws-sdk/core": "3.908.0", "@aws-sdk/nested-clients": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/property-provider": "^4.2.0", "@smithy/shared-ini-file-loader": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-4SosHWRQ8hj1X2yDenCYHParcCjHcd7S+Mdb/lelwF0JBFCNC+dNCI9ws3cP/dFdZO/AIhJQGUBzEQtieloixw=="], "@aws-sdk/types": ["@aws-sdk/types@3.901.0", "", { "dependencies": { "@smithy/types": "^4.6.0", "tslib": "^2.6.2" } }, "sha512-FfEM25hLEs4LoXsLXQ/q6X6L4JmKkKkbVFpKD4mwfVHtRVQG6QxJiCPcrkcPISquiy6esbwK2eh64TWbiD60cg=="], @@ -179,9 +231,9 @@ "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.893.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg=="], - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.901.0", "", { "dependencies": { "@aws-sdk/types": "3.901.0", "@smithy/types": "^4.6.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-Ntb6V/WFI21Ed4PDgL/8NSfoZQQf9xzrwNgiwvnxgAl/KvAvRBgQtqj5gHsDX8Nj2YmJuVoHfH9BGjL9VQ4WNg=="], + "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.907.0", "", { "dependencies": { "@aws-sdk/types": "3.901.0", "@smithy/types": "^4.6.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-Hus/2YCQmtCEfr4Ls88d07Q99Ex59uvtktiPTV963Q7w7LHuIT/JBjrbwNxtSm2KlJR9PHNdqxwN+fSuNsMGMQ=="], - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.906.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.906.0", "@aws-sdk/types": "3.901.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-9Gaglw80E9UZ5FctCp5pZAzT40/vC4Oo0fcNXsfplLkpWqTU+NTdTRMYe3TMZ1/v1/JZKuGUVyHiuo/xLu3NmA=="], + "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.908.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.908.0", "@aws-sdk/types": "3.901.0", "@smithy/node-config-provider": "^4.3.0", "@smithy/types": "^4.6.0", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-l6AEaKUAYarcEy8T8NZ+dNZ00VGLs3fW2Cqu1AuPENaSad0/ahEU+VU7MpXS8FhMRGPgplxKVgCTLyTY0Lbssw=="], "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.901.0", "", { "dependencies": { "@smithy/types": "^4.6.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-pxFCkuAP7Q94wMTNPAwi6hEtNrp/BdFf+HOrIEeFQsk4EoOmpKY3I6S+u6A9Wg295J80Kh74LqDWM22ux3z6Aw=="], @@ -251,6 +303,8 @@ "@emnapi/runtime": ["@emnapi/runtime@1.5.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], + "@emoji-mart/data": ["@emoji-mart/data@1.2.1", "", {}, "sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw=="], + "@esbuild-kit/core-utils": ["@esbuild-kit/core-utils@3.3.2", "", { "dependencies": { "esbuild": "~0.18.20", "source-map-support": "^0.5.21" } }, "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ=="], "@esbuild-kit/esm-loader": ["@esbuild-kit/esm-loader@2.6.5", "", { "dependencies": { "@esbuild-kit/core-utils": "^3.3.2", "get-tsconfig": "^4.7.0" } }, "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA=="], @@ -311,17 +365,19 @@ "@floating-ui/dom": ["@floating-ui/dom@1.7.4", "", { "dependencies": { "@floating-ui/core": "^1.7.3", "@floating-ui/utils": "^0.2.10" } }, "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA=="], + "@floating-ui/react": ["@floating-ui/react@0.27.16", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.6", "@floating-ui/utils": "^0.2.10", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=17.0.0", "react-dom": ">=17.0.0" } }, "sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g=="], + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.6", "", { "dependencies": { "@floating-ui/dom": "^1.7.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw=="], "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], - "@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@2.3.5", "", { "dependencies": { "@formatjs/fast-memoize": "2.2.7", "@formatjs/intl-localematcher": "0.6.2", "decimal.js": "^10.4.3", "tslib": "^2.8.0" } }, "sha512-1HTESOq1IUa23g1lFZEGIXsfZKZOwWmB9RROwGn+xariiQnd++wwTMvlRAbZ8wtXRHFUamJPxsKcxpSzeCvFWQ=="], + "@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@2.3.6", "", { "dependencies": { "@formatjs/fast-memoize": "2.2.7", "@formatjs/intl-localematcher": "0.6.2", "decimal.js": "^10.4.3", "tslib": "^2.8.0" } }, "sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw=="], "@formatjs/fast-memoize": ["@formatjs/fast-memoize@2.2.7", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ=="], - "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@2.11.3", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.5", "@formatjs/icu-skeleton-parser": "1.8.15", "tslib": "^2.8.0" } }, "sha512-H/KfWSosaiDiOaW4nHe1Fn4Cgzm+oFQ8giTmB5RJzTBNSMmd+j2NVrvvZHAmlxJHcuOelzKBLjQ2EDcyH4NSWw=="], + "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@2.11.4", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/icu-skeleton-parser": "1.8.16", "tslib": "^2.8.0" } }, "sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw=="], - "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@1.8.15", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.5", "tslib": "^2.8.0" } }, "sha512-qNrKxWJmnWxin5U4A4Evy7C0rgRiNw3IqXu9OGuT31B8lDxBGl+OgT8kcq0ZVKK0gqA4l4SQB9x+SFAvLT5hcQ=="], + "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@1.8.16", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "tslib": "^2.8.0" } }, "sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ=="], "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.5.10", "", { "dependencies": { "tslib": "2" } }, "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q=="], @@ -401,6 +457,8 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@juggle/resize-observer": ["@juggle/resize-observer@3.4.0", "", {}, "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA=="], + "@lottiefiles/dotlottie-react": ["@lottiefiles/dotlottie-react@0.13.3", "", { "dependencies": { "@lottiefiles/dotlottie-web": "0.42.0" }, "peerDependencies": { "react": "^17 || ^18 || ^19" } }, "sha512-V4FfdYlqzjBUX7f0KV6vfQOOI0Cp+3XeG/ZqSDFSEVg5P7fpROpDv5/I9aTM8sOCESK1SWT96Fem+QVUnBV1wQ=="], "@lottiefiles/dotlottie-web": ["@lottiefiles/dotlottie-web@0.42.0", "", {}, "sha512-Zr2LCaOAoPCsdAQgeLyCSiQ1+xrAJtRCyuEYDj0qR5heUwpc+Pxbb88JyTVumcXFfKOBMOMmrlsTScLz2mrvQQ=="], @@ -423,6 +481,16 @@ "@maplibre/vt-pbf": ["@maplibre/vt-pbf@4.0.3", "", { "dependencies": { "@mapbox/point-geometry": "^1.1.0", "@mapbox/vector-tile": "^2.0.4", "@types/geojson-vt": "3.2.5", "@types/supercluster": "^7.1.3", "geojson-vt": "^4.0.2", "pbf": "^4.0.1", "supercluster": "^8.0.1" } }, "sha512-YsW99BwnT+ukJRkseBcLuZHfITB4puJoxnqPVjo72rhW/TaawVYsgQHcqWLzTxqknttYoDpgyERzWSa/XrETdA=="], + "@mux/mux-data-google-ima": ["@mux/mux-data-google-ima@0.2.8", "", { "dependencies": { "mux-embed": "5.9.0" } }, "sha512-0ZEkHdcZ6bS8QtcjFcoJeZxJTpX7qRIledf4q1trMWPznugvtajCjCM2kieK/pzkZj1JM6liDRFs1PJSfVUs2A=="], + + "@mux/mux-player": ["@mux/mux-player@3.6.1", "", { "dependencies": { "@mux/mux-video": "0.27.0", "@mux/playback-core": "0.31.0", "media-chrome": "~4.14.0", "player.style": "^0.2.0" } }, "sha512-QidL9CSkRBwa49ItphuDXWtarAiskP8AG/+vj5u0LsCa+VqObQxPfxE9t5S9YO/SDYHXqDMviMpmSzotSROGUQ=="], + + "@mux/mux-player-react": ["@mux/mux-player-react@3.6.1", "", { "dependencies": { "@mux/mux-player": "3.6.1", "@mux/playback-core": "0.31.0", "prop-types": "^15.8.1" }, "peerDependencies": { "@types/react": "^17.0.0 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0", "react": "^17.0.2 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0", "react-dom": "^17.0.2 || ^17.0.2-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0" }, "optionalPeers": ["@types/react"] }, "sha512-YKIieu9GmFI73+1EcAvd63ftZ0Z9ilGbWo2dGXqQeyCEcagIN0oEcXWUPuIuxhvYB0XXsxB8RBAD8SigHkCYAQ=="], + + "@mux/mux-video": ["@mux/mux-video@0.27.0", "", { "dependencies": { "@mux/mux-data-google-ima": "0.2.8", "@mux/playback-core": "0.31.0", "castable-video": "~1.1.10", "custom-media-element": "~1.4.5", "media-tracks": "~0.3.3" } }, "sha512-Oi142YAcPKrmHTG+eaWHWaE7ucMHeJwx1FXABbLM2hMGj9MQ7kYjsD5J3meFlvuyz5UeVDsPLHeUJgeBXUZovg=="], + + "@mux/playback-core": ["@mux/playback-core@0.31.0", "", { "dependencies": { "hls.js": "~1.6.6", "mux-embed": "^5.8.3" } }, "sha512-VADcrtS4O6fQBH8qmgavS6h7v7amzy2oCguu1NnLaVZ3Z8WccNXcF0s7jPRoRDyXWGShgtVhypW2uXjLpkPxyw=="], + "@next/env": ["@next/env@15.5.4", "", {}, "sha512-27SQhYp5QryzIT5uO8hq99C69eLQ7qkzkDPsk3N+GuS2XgOgoYEeOav7Pf8Tn4drECOVDsDg8oj+/DVy8qQL2A=="], "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.5.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nopqz+Ov6uvorej8ndRX6HlxCYWCO3AHLfKK2TYvxoSB2scETOcfm/HSS3piPqc3A+MUgyHoqE6je4wnkjfrOA=="], @@ -515,13 +583,77 @@ "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], - "@petamoriken/float16": ["@petamoriken/float16@3.9.2", "", {}, "sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog=="], + "@pdf-lib/standard-fonts": ["@pdf-lib/standard-fonts@1.0.0", "", { "dependencies": { "pako": "^1.0.6" } }, "sha512-hU30BK9IUN/su0Mn9VdlVKsWBS6GyhVfqjwl1FjZN4TxP6cCw0jP2w7V3Hf5uX7M0AZJ16vey9yE0ny7Sa59ZA=="], + + "@pdf-lib/upng": ["@pdf-lib/upng@1.0.1", "", { "dependencies": { "pako": "^1.0.10" } }, "sha512-dQK2FUMQtowVP00mtIksrlZhdFXQZPC+taih1q4CvPZ5vqdxR/LKBaFg0oAfzd1GlHZXXSPdQfzQnt+ViGvEIQ=="], + + "@petamoriken/float16": ["@petamoriken/float16@3.9.3", "", {}, "sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g=="], "@pivanov/utils": ["@pivanov/utils@0.0.2", "", { "peerDependencies": { "react": ">=18", "react-dom": ">=18" } }, "sha512-q9CN0bFWxWgMY5hVVYyBgez1jGiLBa6I+LkG37ycylPhFvEGOOeaADGtUSu46CaZasPnlY8fCdVJZmrgKb1EPA=="], "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - "@posthog/core": ["@posthog/core@1.2.3", "", {}, "sha512-rm3ULv4xPPCZ1Ek/60+bUZYNVravRcso8fk9zarxSu9ll/WNNdINSUJor04ULqoBADH6kh5O2t8dn9F7Tkj53A=="], + "@platejs/autoformat": ["@platejs/autoformat@49.0.0", "", { "dependencies": { "lodash": "^4.17.21" }, "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-KxgxyGhJQxoZ+jovshILRTu9sI4xo2paEMQnQjuH1egFuMkwa7ULyjW6g3JvaH3KicmB0fijqwkZwAZXNrJsRg=="], + + "@platejs/basic-nodes": ["@platejs/basic-nodes@49.0.0", "", { "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-l7MbW1Oy2uyRRYOiWVGxTNs8nIvBM/EWjZZFEmtOZcpzXrSY6c3cZd0KAA6u0Z+NLLbLABLJNxuYFBZ5ARvBsg=="], + + "@platejs/basic-styles": ["@platejs/basic-styles@49.0.0", "", { "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-MjbQj+LjflUBhd1DPZqnlodHZiX7kJo0LpJ7wHRUI515nNJ7zMQJHocCHo1EYfAU2VtV1j5CpZ7wxHUw3nuHmA=="], + + "@platejs/callout": ["@platejs/callout@49.0.0", "", { "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-8Juxp1pfcUfPj9DQdibFgoimZdeexbYgOEMmASY9UVOxbXNYNdn/l/IdlZfQFrWXYdA5Hlfqj6bMAm0Yl85QhA=="], + + "@platejs/caption": ["@platejs/caption@49.0.0", "", { "dependencies": { "react-textarea-autosize": "^8.5.9" }, "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-8a71Uwt+A1E1wzp9Wh+LVdkaByKpBysZ1jr0oMnbVmnwzjeCIMl+05bQhxOOKSfVkXFUEiIyRxLdq7gXeSejdg=="], + + "@platejs/code-block": ["@platejs/code-block@49.0.0", "", { "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-yDkJBGoCFHvWhhSnzgET2hyD+5+zBj4uCkO4qZpeNsncshBwJuADnSLUcPc6B4Xf6FC5rHDaIYL+889YykrlEA=="], + + "@platejs/combobox": ["@platejs/combobox@49.0.0", "", { "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-u+fPxYU4fo4g1hfY69fRuKzwmznx3DdyABN233dDwXzmBHQceWCwK5wEjMSr/1EU5TqVqKZyXeTkzYUDo/leSg=="], + + "@platejs/core": ["@platejs/core@49.2.21", "", { "dependencies": { "@platejs/slate": "49.2.21", "@udecode/react-hotkeys": "37.0.0", "@udecode/react-utils": "49.0.15", "@udecode/utils": "47.2.7", "clsx": "^2.1.1", "html-entities": "^2.6.0", "is-hotkey": "^0.2.0", "jotai": "~2.8.4", "jotai-optics": "0.4.0", "jotai-x": "2.3.3", "lodash": "^4.17.21", "nanoid": "^5.1.5", "optics-ts": "2.4.1", "slate": "0.118.1", "slate-dom": "0.118.1", "slate-hyperscript": "0.115.0", "slate-react": "0.117.4", "use-deep-compare": "^1.3.0", "zustand": "^5.0.5", "zustand-x": "6.1.0" }, "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-RjipAmkWM8UqDYQKP+T0uTX+QZJdkIuvwpXwJowXG6YhAeiJuIgBv/7hyMmZP1+1cZPCUj6JW0FBBTK4gmD0oA=="], + + "@platejs/date": ["@platejs/date@49.0.2", "", { "peerDependencies": { "platejs": ">=49.0.2", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-fh0jHpU4eXmnkPoJD1hEl432uvs1gIZtp9Zct1BupRqLldXkp0uh+qXwNvWCAgnLByhthLpVDUl/TL6gsD2TNg=="], + + "@platejs/dnd": ["@platejs/dnd@49.2.22", "", { "dependencies": { "lodash": "^4.17.21", "raf": "^3.4.1" }, "peerDependencies": { "platejs": ">=49.2.21", "react": ">=18.0.0", "react-dnd": ">=14.0.0", "react-dnd-html5-backend": ">=14.0.0", "react-dom": ">=18.0.0" } }, "sha512-t+nwzF6l1jQCusvfCHz82P/4R7UnrjeCMAnTfRmic1EBJviWIIc4kDiRL/oVtZICIskRKTONkxYQAM2kP6RlIA=="], + + "@platejs/docx": ["@platejs/docx@49.0.0", "", { "dependencies": { "validator": "^13.15.15" }, "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-KsJFlh1ZwCvckPPKk7QV9KUSf7DqmWBPUfGITjOcwfm++Di1bPZZ7YlX2dKl6ICPV0foXvYYj21SM0/xEdziBw=="], + + "@platejs/emoji": ["@platejs/emoji@49.0.0", "", { "dependencies": { "@platejs/combobox": "49.0.0" }, "peerDependencies": { "@emoji-mart/data": ">=1.2.0", "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-n9ARKeK6mfc8yzqk0AXuD3KrcBHk7FY3ClrEk4d8GYkz7iriMfDMd1fHSzC5uaDM/jSFmzaUszhlMaVhB8s95A=="], + + "@platejs/floating": ["@platejs/floating@49.0.0", "", { "dependencies": { "@floating-ui/core": "^1.7.1", "@floating-ui/react": "^0.27.12" }, "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-7DEp+GzhpW+lRJeAAIc3Hu6e8TawzaVG3ontlrUCTxPrtIm4J4RwCh1SnuLDC6jcXgTecb2xwsKWvQNKWd6REg=="], + + "@platejs/indent": ["@platejs/indent@49.0.0", "", { "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-CXgZEjpcHpvdSqqgjOmtfMMPBRhYDUQuYBFd+qmJovpfdfU9NBuNy0cv3JzSVyfQPvnUC7OEvQpwHHHsBsERyA=="], + + "@platejs/juice": ["@platejs/juice@49.0.0", "", { "dependencies": { "juice": "^11.0.1" }, "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-ZB2LYSkYXRK1/6C2i54jxDqxZj3nblyl9ZLGVnYJJdlj6oFwAezUHkb9rVqwzoD3oGehFsXIMK64A/L6ItSC2g=="], + + "@platejs/layout": ["@platejs/layout@49.2.1", "", { "peerDependencies": { "platejs": ">=49.1.13", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-ymhzA2vO8XrRLTsVV6/MwWhXBseoZioN47z1lOR4yEOv7Yv2m2dtqR955YaM1zvuOdnCyAnI85FDjnsowCuWpg=="], + + "@platejs/link": ["@platejs/link@49.1.1", "", { "dependencies": { "@platejs/floating": "49.0.0" }, "peerDependencies": { "platejs": ">=49.0.19", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-YumaA/KfAFt8/vt+By6ADZFdDSZhTnaayQbagPPJWSe69or3RNPJRjNYxecYRUx7PmGCp3xYwxYRozGsEdu3hA=="], + + "@platejs/list": ["@platejs/list@49.2.17", "", { "dependencies": { "@platejs/indent": "49.0.0", "clsx": "^2.1.1" }, "peerDependencies": { "platejs": ">=49.2.12", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-NwIThOoKHTlELgUCpJZQzyjSfMbkFXZaLa+ksAYPqNg0KBzBRf1q+e4ypMuQq+XQjBhljz7Ju2k7//W6bOCQvQ=="], + + "@platejs/markdown": ["@platejs/markdown@49.2.15", "", { "dependencies": { "marked": "^15.0.12", "mdast-util-math": "3.0.0", "mdast-util-mdx": "3.0.0", "remark-mdx": "^3.1.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "ts-essentials": "10.1.0", "unified": "^11.0.5" }, "peerDependencies": { "platejs": ">=49.2.12", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-zPxNwd4sJXoMWbp+FuTmpTmnaiR7o+MGh3MOuEN5r0JBheFxxQ3EDhTRce72oJfmCCk5TS0rlAejZKS3BSuwRQ=="], + + "@platejs/math": ["@platejs/math@49.0.0", "", { "dependencies": { "katex": "0.16.22" }, "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-biVfhYmr5/0ByqorphITx1oOhodn2M/uXpELNVOKY7v9TLYy/4on1yAOw1XCzCPOT4RweRTmAhVBHeJonJM6Tg=="], + + "@platejs/media": ["@platejs/media@49.0.0", "", { "dependencies": { "js-video-url-parser": "^0.5.1" }, "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-Xtdl+hRnYEuG758+ClBsJj7q5Iu6qp2zUSwM+XoSbUleaVuOxdkOUw1GuSWQmPTw9U6v/gArl1nptWQJ3ZgxbA=="], + + "@platejs/mention": ["@platejs/mention@49.0.0", "", { "dependencies": { "@platejs/combobox": "49.0.0" }, "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-xgdkj6pcbEFMkkqn4IxvbF6dpe72JULwroOoCS0b7SjnLkYryWpiDzTvP1gHh3z6ubD2ILLjfmt6pGC0ghvsFA=="], + + "@platejs/resizable": ["@platejs/resizable@49.0.0", "", { "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-oNqot0Ssd+kjWNbw2e5rlBVnt49CvzmYXauDYXJO+UmmO29sCl6ZgblqExlELuxpk4g0A5FHBT/GA7+4hOfitA=="], + + "@platejs/selection": ["@platejs/selection@49.2.4", "", { "dependencies": { "copy-to-clipboard": "^3.3.3" }, "peerDependencies": { "platejs": ">=49.2.4", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-dn8gcTcXOsGa7d90bBlCdp54ycGxrp22xrkqXwqBglg1dO/KJzgSR3hUhOuoj04i2/eiK04Km45Dyk6dSs5U9A=="], + + "@platejs/slash-command": ["@platejs/slash-command@49.0.0", "", { "dependencies": { "@platejs/combobox": "49.0.0" }, "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-ObAYoyFEXj+eUxWQD8JiZOCBPEOLQTVsfEJsWHmn61yNCRDmr0OrCyGFtdWpvw6bC72It4HSh8e/1DgzO2BnBg=="], + + "@platejs/slate": ["@platejs/slate@49.2.21", "", { "dependencies": { "@udecode/utils": "47.2.7", "is-plain-object": "^5.0.0", "lodash": "^4.17.21", "slate": "0.118.1", "slate-dom": "0.118.1" } }, "sha512-lvkdKRz18qxbuX8N8uXWHAGCkxPG2dldJmSSqFZkx8gCuIYGDGTWsAqKm9vdvpxVBHJ6j3cH4YiTQRRRNzKBpA=="], + + "@platejs/table": ["@platejs/table@49.1.13", "", { "dependencies": { "@platejs/resizable": "49.0.0", "lodash": "^4.17.21" }, "peerDependencies": { "platejs": ">=49.1.13", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-af3/Fcp/YINA7wfXJ5SILwtFDc7yW8n+LMmk/XDeFfQDfZZoKsqxjc0l+emgUxTKtg2ZVxZAodrjCNc3h+mUyw=="], + + "@platejs/toc": ["@platejs/toc@49.0.0", "", { "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-5D27dsltUADkQdrcAzc4opaEXtjfb3Feem+qUowgdiS7HE8lTzwaFM2BioFKjScYj1DSm2pXzFZKTEvXEk8tcg=="], + + "@platejs/toggle": ["@platejs/toggle@49.0.0", "", { "dependencies": { "@platejs/indent": "49.0.0", "lodash": "^4.17.21" }, "peerDependencies": { "platejs": ">=49.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-VMOATtu+8ltMl8mqSnoNCxOtyJyXt0vfVYtmKVRE6qGf6mCHoarFOBpwSX1k/yN6UTs3soc1f7G9dOwuB+aXNA=="], + + "@platejs/utils": ["@platejs/utils@49.2.21", "", { "dependencies": { "@platejs/core": "49.2.21", "@platejs/slate": "49.2.21", "@udecode/react-utils": "49.0.15", "@udecode/utils": "47.2.7", "clsx": "^2.1.1", "lodash": "^4.17.21" }, "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-SbgXptdhcMP7mIiE88cwZpc2AC5+r/G4YDjBxnr4WabSE5DK0G2lL13zhopRoNKNRPqAKzpdIkpLg0Arc0DvKA=="], + + "@posthog/core": ["@posthog/core@1.2.4", "", {}, "sha512-o2TkycuV98PtAkcqE8B1DJv5LBvHEDTWirK5TlkQMeF2MJg0BYliY95CeRZFILNgZJCbI3k/fhahSMRQlpXOMg=="], "@preact/signals": ["@preact/signals@1.3.2", "", { "dependencies": { "@preact/signals-core": "^1.7.0" }, "peerDependencies": { "preact": "10.x" } }, "sha512-naxcJgUJ6BTOROJ7C3QML7KvwKwCXQJYTc5L/b0eEsdYgPB6SxwoQ1vDGcS0Q7GVjAenVq/tXrybVdFShHYZWg=="], @@ -551,6 +683,8 @@ "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.2.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww=="], + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="], "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], @@ -589,7 +723,7 @@ "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA=="], - "@radix-ui/react-slot": ["@radix-ui/react-slot@1.1.2", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ=="], + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.6", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sawt4HkD+6haVGjYOC3BMIiCumBpqTK6o407n6zN/6yReed2EN7bXyykNrpqg+xCfudpBUZg7Y2cJBd/x/iybA=="], @@ -597,6 +731,8 @@ "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-roving-focus": "1.1.6", "@radix-ui/react-toggle": "1.1.6", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XOBq9VqC+mIn5hzjGdJLhQbvQeiOpV5ExNE6qMQQPvFsCT44QUcxFzYytTWVoyWg9XKfgrleKmTeEyu6aoTPhg=="], + "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-separator": "1.1.7", "@radix-ui/react-toggle-group": "1.1.11" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg=="], + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg=="], "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], @@ -621,6 +757,12 @@ "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + "@react-dnd/asap": ["@react-dnd/asap@5.0.2", "", {}, "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A=="], + + "@react-dnd/invariant": ["@react-dnd/invariant@4.0.2", "", {}, "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw=="], + + "@react-dnd/shallowequal": ["@react-dnd/shallowequal@4.0.2", "", {}, "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA=="], + "@react-email/body": ["@react-email/body@0.1.0", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-o1bcSAmDYNNHECbkeyceCVPGmVsYvT+O3sSO/Ct7apKUu3JphTi31hu+0Nwqr/pgV5QFqdoT5vdS3SW5DJFHgQ=="], "@react-email/button": ["@react-email/button@0.2.0", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-8i+v6cMxr2emz4ihCrRiYJPp2/sdYsNNsBzXStlcA+/B9Umpm5Jj3WJKYpgTPM+aeyiqlG/MMI1AucnBm4f1oQ=="], @@ -777,6 +919,8 @@ "@standard-schema/spec": ["@standard-schema/spec@1.0.0", "", {}, "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA=="], + "@svta/common-media-library": ["@svta/common-media-library@0.12.4", "", {}, "sha512-9EuOoaNmz7JrfGwjsrD9SxF9otU5TNMnbLu1yU4BeLK0W5cDxVXXR58Z89q9u2AnHjIctscjMTYdlqQ1gojTuw=="], + "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], "@t3-oss/env-core": ["@t3-oss/env-core@0.12.0", "", { "peerDependencies": { "typescript": ">=5.0.0", "valibot": "^1.0.0-beta.7 || ^1.0.0", "zod": "^3.24.0" }, "optionalPeers": ["typescript", "valibot", "zod"] }, "sha512-lOPj8d9nJJTt81mMuN9GMk8x5veOt7q9m11OSnCBJhwp1QrL/qR+M8Y467ULBSm9SunosryWNbmQQbgoiMgcdw=="], @@ -813,13 +957,13 @@ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.14", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.14", "@tailwindcss/oxide": "4.1.14", "postcss": "^8.4.41", "tailwindcss": "4.1.14" } }, "sha512-BdMjIxy7HUNThK87C7BC8I1rE8BVUsfNQSI5siQ4JK3iIa3w0XyVvVL9SXLWO//CtYTcp1v7zci0fYwJOjB+Zg=="], - "@tanstack/devtools-event-client": ["@tanstack/devtools-event-client@0.3.2", "", {}, "sha512-gkvph/YMCFUfAca75EsJBJnhbKitDGix7vdEcT/3lAV+eyGSv+uECYG43apVQN4yLJKnV6mzcNvGzOhDhb72gg=="], + "@tanstack/devtools-event-client": ["@tanstack/devtools-event-client@0.3.3", "", {}, "sha512-RfV+OPV/M3CGryYqTue684u10jUt55PEqeBOnOtCe6tAmHI9Iqyc8nHeDhWPEV9715gShuauFVaMc9RiUVNdwg=="], - "@tanstack/form-core": ["@tanstack/form-core@1.24.2", "", { "dependencies": { "@tanstack/devtools-event-client": "^0.3.2", "@tanstack/store": "^0.7.7" } }, "sha512-qc2YFhM0PsxjLbZ7Fn5ErX9kz/Wr6gmd4m47Nf3OFfsFbI1O2B5AQLwt9OApMs19CDeNiqe/zTSK+ayeHaDJNQ=="], + "@tanstack/form-core": ["@tanstack/form-core@1.24.3", "", { "dependencies": { "@tanstack/devtools-event-client": "^0.3.2", "@tanstack/store": "^0.7.7" } }, "sha512-e+HzSD49NWr4aIqJWtPPzmi+/phBJAP3nSPN8dvxwmJWqAxuB/cH138EcmCFf3+oA7j3BXvwvTY0I+8UweGPjQ=="], "@tanstack/query-core": ["@tanstack/query-core@5.90.2", "", {}, "sha512-k/TcR3YalnzibscALLwxeiLUub6jN5EDLwKDiO7q5f4ICEoptJ+n9+7vcEFy5/x/i6Q+Lb/tXrsKCggf5uQJXQ=="], - "@tanstack/react-form": ["@tanstack/react-form@1.23.6", "", { "dependencies": { "@tanstack/form-core": "1.24.2", "@tanstack/react-store": "^0.7.7", "decode-formdata": "^0.9.0", "devalue": "^5.3.2" }, "peerDependencies": { "@tanstack/react-start": "^1.130.10", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@tanstack/react-start"] }, "sha512-cz8Nskpe2zo24lJd0ky0hO7NOqV/U7drQ2XiK3bxt94v5hnMQtUOno6mtJ6Tvwy0p8xKwSN76SvnpU+tp8YMQA=="], + "@tanstack/react-form": ["@tanstack/react-form@1.23.7", "", { "dependencies": { "@tanstack/form-core": "1.24.3", "@tanstack/react-store": "^0.7.7", "decode-formdata": "^0.9.0", "devalue": "^5.3.2" }, "peerDependencies": { "@tanstack/react-start": "^1.130.10", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@tanstack/react-start"] }, "sha512-p/j9Gi2+s135sOjj48RjM+6xZQr1FVpliQlETLYBEGmmmxWHgYYs2b62mTDSnuv7AqtuZhpQ+t0CRFVfbQLsFA=="], "@tanstack/react-query": ["@tanstack/react-query@5.90.2", "", { "dependencies": { "@tanstack/query-core": "5.90.2" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-CLABiR+h5PYfOWr/z+vWFt5VsOA2ekQeRQBFSKlcoW6Ndx/f8rfyVmq4LbgOM4GG2qtxAxjLYLOpCNTYm4uKzw=="], @@ -933,26 +1077,38 @@ "@tybys/wasm-util": ["@tybys/wasm-util@0.8.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Z96T/L6dUFFxgFJ+pQtkPpne9q7i6kIPYCFnQBHSgSPV9idTsKfIhCss0h5iM9irweZCatkrdeP8yi5uM1eX6Q=="], - "@types/bun": ["@types/bun@1.2.23", "", { "dependencies": { "bun-types": "1.2.23" } }, "sha512-le8ueOY5b6VKYf19xT3McVbXqLqmxzPXHsQT/q9JHgikJ2X22wyTW3g3ohz2ZMnp7dod6aduIiq8A14Xyimm0A=="], + "@types/bun": ["@types/bun@1.3.0", "", { "dependencies": { "bun-types": "1.3.0" } }, "sha512-+lAGCYjXjip2qY375xX/scJeVRmZ5cY0wyHYyCYxNcdEXrQ4AOe3gACgd4iQ8ksOslJtW4VNxBJ8llUwc3a6AA=="], "@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="], + "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="], + "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], "@types/geojson-vt": ["@types/geojson-vt@3.2.5", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g=="], + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/katex": ["@types/katex@0.16.7", "", {}, "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="], + "@types/lodash": ["@types/lodash@4.17.20", "", {}, "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA=="], "@types/lodash.debounce": ["@types/lodash.debounce@4.0.9", "", { "dependencies": { "@types/lodash": "*" } }, "sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ=="], + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + "@types/node": ["@types/node@22.14.1", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw=="], "@types/nodemailer": ["@types/nodemailer@6.4.20", "", { "dependencies": { "@aws-sdk/client-ses": "^3.731.1", "@types/node": "*" } }, "sha512-uj83z0GqwqMUE6RI4EKptPlav0FYE6vpIlqJAnxzu+/sSezRdbH69rSBCMsdW6DdsCAzoFQZ52c2UIlhRVQYDA=="], @@ -971,8 +1127,20 @@ "@types/supercluster": ["@types/supercluster@7.1.3", "", { "dependencies": { "@types/geojson": "*" } }, "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA=="], + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + "@types/webpack": ["@types/webpack@5.28.5", "", { "dependencies": { "@types/node": "*", "tapable": "^2.2.0", "webpack": "^5" } }, "sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw=="], + "@udecode/cn": ["@udecode/cn@49.0.15", "", { "dependencies": { "@udecode/react-utils": "49.0.15" }, "peerDependencies": { "class-variance-authority": ">=0.7.0", "react": ">=18.0.0", "react-dom": ">=18.0.0", "tailwind-merge": ">=2.2.0" } }, "sha512-bNXPV5xwCM1heZ+lYmeDb1F92PRNcnLoI4jDGUh6ZLZ/pCx6hX0KdlWWDY/RufWdpchV7o6OLvDVjNy9bv0Rtw=="], + + "@udecode/react-hotkeys": ["@udecode/react-hotkeys@37.0.0", "", { "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-3ZV5LiaTnKyhXwN6U0NE2cofNsNN2IPMkNCDntbSIIRLYmI+o6LRkDwAucSNh/BIdNXfvxscsR04RYyIwjGbJw=="], + + "@udecode/react-utils": ["@udecode/react-utils@49.0.15", "", { "dependencies": { "@radix-ui/react-slot": "^1.2.3", "@udecode/utils": "47.2.7", "clsx": "^2.1.1" }, "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-ra9e0WyECZEnOLyW1nf4pqGBBTLcktHfFhL+qlr7woMAwmNHs7HLbw/khoKfpSFt2RgjieE+QhawT6haFQAuhA=="], + + "@udecode/utils": ["@udecode/utils@47.2.7", "", {}, "sha512-tQ8tIcdW+ZqWWrDgyf/moTLWtcErcHxaOfuCD/6qIL5hCq+jZm67nGHQToOT4Czti5Jr7CDPMgr8lYpdTEZcew=="], + + "@vimeo/player": ["@vimeo/player@2.29.0", "", { "dependencies": { "native-promise-only": "0.8.1", "weakmap-polyfill": "2.0.4" } }, "sha512-9JjvjeqUndb9otCCFd0/+2ESsLk7VkDE6sxOBy9iy2ukezuQbplVRi+g9g59yAurKofbmTi/KcKxBGO/22zWRw=="], + "@vis.gl/react-mapbox": ["@vis.gl/react-mapbox@8.1.0", "", { "peerDependencies": { "mapbox-gl": ">=3.5.0", "react": ">=16.3.0", "react-dom": ">=16.3.0" }, "optionalPeers": ["mapbox-gl"] }, "sha512-FwvH822oxEjWYOr+pP2L8hpv+7cZB2UsQbHHHT0ryrkvvqzmTgt7qHDhamv0EobKw86e1I+B4ojENdJ5G5BkyQ=="], "@vis.gl/react-maplibre": ["@vis.gl/react-maplibre@8.1.0", "", { "dependencies": { "@maplibre/maplibre-gl-style-spec": "^19.2.1" }, "peerDependencies": { "maplibre-gl": ">=4.0.0", "react": ">=16.3.0", "react-dom": ">=16.3.0" }, "optionalPeers": ["maplibre-gl"] }, "sha512-PkAK/gp3mUfhCLhUuc+4gc3PN9zCtVGxTF2hB6R5R5yYUw+hdg84OZ770U5MU4tPMTCG6fbduExuIW6RRKN6qQ=="], @@ -1017,12 +1185,16 @@ "acorn-import-phases": ["acorn-import-phases@1.0.4", "", { "peerDependencies": { "acorn": "^8.14.0" } }, "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ=="], + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], "ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -1043,13 +1215,23 @@ "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + "base64-arraybuffer": ["base64-arraybuffer@1.0.2", "", {}, "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="], + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], "base64id": ["base64id@2.0.0", "", {}, "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.8.14", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-GM9c0cWWR8Ga7//Ves/9KRgTS8nLausCkP3CGiFLrnwA2CDUluXgaQqvrULoR2Ujrd/mz/lkX87F5BHFsNr5sQ=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.8.16", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw=="], + + "bcp-47": ["bcp-47@2.1.0", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w=="], + + "bcp-47-match": ["bcp-47-match@2.0.3", "", {}, "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ=="], + + "bcp-47-normalize": ["bcp-47-normalize@2.3.0", "", { "dependencies": { "bcp-47": "^2.0.0", "bcp-47-match": "^2.0.0" } }, "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q=="], "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], @@ -1071,7 +1253,7 @@ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - "bun-types": ["bun-types@1.2.23", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-R9f0hKAZXgFU3mlrA0YpE/fiDvwV0FT9rORApt2aQVWSuJDzZOyB5QLc0N/4HF57CS8IXJ6+L5E4W1bW6NS2Aw=="], + "bun-types": ["bun-types@1.3.0", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-u8X0thhx+yJ0KmkxuEo9HAtdfgCBaM/aI9K90VQcQioAmkVp3SG3FkwWGibUFz3WdXAdcsqOcbU40lK7tbHdkQ=="], "bytewise": ["bytewise@1.1.0", "", { "dependencies": { "bytewise-core": "^1.2.2", "typewise": "^1.0.3" } }, "sha512-rHuuseJ9iQ0na6UDhnrRVDh8YnWVlU6xM3VH6q/+yHDeUH2zIhUzP+2/h3LIrhLDBtTqzWpE3p3tP/boefskKQ=="], @@ -1079,10 +1261,28 @@ "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], - "caniuse-lite": ["caniuse-lite@1.0.30001749", "", {}, "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q=="], + "caniuse-lite": ["caniuse-lite@1.0.30001750", "", {}, "sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ=="], + + "castable-video": ["castable-video@1.1.11", "", { "dependencies": { "custom-media-element": "~1.4.5" } }, "sha512-LCRTK6oe7SB1SiUQFzZCo6D6gcEzijqBTVIuj3smKpQdesXM18QTbCVqWgh9MfOeQgTx/i9ji5jGcdqNPeWg2g=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "ce-la-react": ["ce-la-react@0.3.1", "", { "peerDependencies": { "react": ">=17.0.0" } }, "sha512-g0YwpZDPIwTwFumGTzNHcgJA6VhFfFCJkSNdUdC04br2UfU+56JDrJrJva3FZ7MToB4NDHAFBiPE/PZdNl1mQA=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "cheerio": ["cheerio@1.0.0", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.1.0", "encoding-sniffer": "^0.2.0", "htmlparser2": "^9.1.0", "parse5": "^7.1.2", "parse5-htmlparser2-tree-adapter": "^7.0.0", "parse5-parser-stream": "^7.1.2", "undici": "^6.19.5", "whatwg-mimetype": "^4.0.0" } }, "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww=="], + + "cheerio-select": ["cheerio-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="], + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], @@ -1091,6 +1291,8 @@ "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + "classnames": ["classnames@2.5.1", "", {}, "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="], "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="], @@ -1101,9 +1303,13 @@ "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="], + "cloudflare-video-element": ["cloudflare-video-element@1.3.4", "", {}, "sha512-F9g+tXzGEXI6v6L48qXxr8vnR8+L6yy7IhpJxK++lpzuVekMHTixxH7/dzLuq6OacVGziU4RB5pzZYJ7/LYtJg=="], + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - "cmdk": ["cmdk@1.0.0", "", { "dependencies": { "@radix-ui/react-dialog": "1.0.5", "@radix-ui/react-primitive": "1.0.3" }, "peerDependencies": { "react": "^18.0.0", "react-dom": "^18.0.0" } }, "sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q=="], + "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="], + + "codem-isoboxer": ["codem-isoboxer@0.3.10", "", {}, "sha512-eNk3TRV+xQMJ1PEj0FQGY8KD4m0GPxT487XJ+Iftm7mVa9WpPFDMWqPt+46buiP5j5Wzqe5oMIhqBcAeKfygSA=="], "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], @@ -1115,6 +1321,8 @@ "commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], + "compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="], + "confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], @@ -1125,7 +1333,9 @@ "copy-anything": ["copy-anything@3.0.5", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="], - "core-js": ["core-js@3.45.1", "", {}, "sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg=="], + "copy-to-clipboard": ["copy-to-clipboard@3.3.3", "", { "dependencies": { "toggle-selection": "^1.0.6" } }, "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA=="], + + "core-js": ["core-js@3.46.0", "", {}, "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA=="], "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="], @@ -1133,6 +1343,8 @@ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + "css-line-break": ["css-line-break@2.1.0", "", { "dependencies": { "utrie": "^1.0.2" } }, "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w=="], + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], @@ -1141,8 +1353,14 @@ "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + "custom-media-element": ["custom-media-element@1.4.5", "", {}, "sha512-cjrsQufETwxjvwZbYbKBCJNvmQ2++G9AvT45zDi7NXL9k2PdVcs2h0jQz96J6G4TMKRCcEsoJ+QTgQD00Igtjw=="], + "cva": ["cva@1.0.0-beta.4", "", { "dependencies": { "clsx": "^2.1.1" }, "peerDependencies": { "typescript": ">= 4.5.5" }, "optionalPeers": ["typescript"] }, "sha512-F/JS9hScapq4DBVQXcK85l9U91M6ePeXoBMSp7vypzShoefUBxjQTo3g3935PUHgQd+IW77DjbPRIxugy4/GCQ=="], + "dash-video-element": ["dash-video-element@0.2.0", "", { "dependencies": { "custom-media-element": "^1.4.5", "dashjs": "^5.0.3", "media-tracks": "^0.3.3" } }, "sha512-dgmhBOte6JgvSvowvrh0Q/vhSrB52Q/AUl/KqminAUkPuUT3CCUNhto1X8ANigWkmNwhktFc/PCe0lF/4tBFwQ=="], + + "dashjs": ["dashjs@5.0.3", "", { "dependencies": { "@svta/common-media-library": "^0.12.4", "bcp-47-match": "^2.0.3", "bcp-47-normalize": "^2.3.0", "codem-isoboxer": "0.3.10", "fast-deep-equal": "3.1.3", "html-entities": "^2.5.2", "imsc": "^1.1.5", "localforage": "^1.10.0", "path-browserify": "^1.0.1", "ua-parser-js": "^1.0.37" } }, "sha512-TXndNnCUjFjF2nYBxDVba+hWRpVkadkQ8flLp7kHkem+5+wZTfRShJCnVkPUosmjS0YPE9fVNLbYPJxHBeQZvA=="], + "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], "date-fns-jalali": ["date-fns-jalali@4.1.0-0", "", {}, "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg=="], @@ -1155,20 +1373,30 @@ "decode-formdata": ["decode-formdata@0.9.0", "", {}, "sha512-q5uwOjR3Um5YD+ZWPOF/1sGHVW9A5rCrRwITQChRXlmPkxDFBqCm4jNTIVdGHNH9OnR+V9MoZVgRhsFb+ARbUw=="], + "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="], + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], "devalue": ["devalue@5.3.2", "", {}, "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw=="], + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], + "direction": ["direction@1.0.4", "", { "bin": { "direction": "cli.js" } }, "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ=="], + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + "dnd-core": ["dnd-core@16.0.1", "", { "dependencies": { "@react-dnd/asap": "^5.0.1", "@react-dnd/invariant": "^4.0.1", "redux": "^4.2.0" } }, "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng=="], + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], @@ -1189,10 +1417,12 @@ "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], - "electron-to-chromium": ["electron-to-chromium@1.5.233", "", {}, "sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.234", "", {}, "sha512-RXfEp2x+VRYn8jbKfQlRImzoJU01kyDvVPBmG39eU2iuRVhuS6vQNocB8J0/8GrIMLnPzgz4eW6WiRnJkTuNWg=="], "emoji-regex": ["emoji-regex@10.5.0", "", {}, "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg=="], + "encoding-sniffer": ["encoding-sniffer@0.2.1", "", { "dependencies": { "iconv-lite": "^0.6.3", "whatwg-encoding": "^3.1.1" } }, "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw=="], + "engine.io": ["engine.io@6.6.4", "", { "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1" } }, "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g=="], "engine.io-client": ["engine.io-client@6.6.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1", "xmlhttprequest-ssl": "~2.1.1" } }, "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w=="], @@ -1201,7 +1431,7 @@ "enhanced-resolve": ["enhanced-resolve@5.18.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww=="], - "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "entities": ["entities@7.0.0", "", {}, "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ=="], "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], @@ -1213,21 +1443,31 @@ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + "escape-goat": ["escape-goat@3.0.0", "", {}, "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw=="], + + "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + "eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], "estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], - "fast-deep-equal": ["fast-deep-equal@2.0.1", "", {}, "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], @@ -1289,19 +1529,43 @@ "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], + "highlight.js": ["highlight.js@11.11.1", "", {}, "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w=="], + + "hls-video-element": ["hls-video-element@1.5.8", "", { "dependencies": { "custom-media-element": "^1.4.5", "hls.js": "^1.6.5", "media-tracks": "^0.3.3" } }, "sha512-DdeX5NzhM2Bj+ls5aaRrzSSnriK+r6lCrDa0YyfviNO4zb10JyAnJHZM214lXBWQghCm+fKmlWW1qpzdNoSAvQ=="], + + "hls.js": ["hls.js@1.6.13", "", {}, "sha512-hNEzjZNHf5bFrUNvdS4/1RjIanuJ6szpWNfTaX5I6WfGynWXGT7K/YQLYtemSvFExzeMdgdE4SsyVLJbd5PcZA=="], + + "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], + + "html-entities": ["html-entities@2.6.0", "", {}, "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ=="], + "html-to-text": ["html-to-text@9.0.5", "", { "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", "deepmerge": "^4.3.1", "dom-serializer": "^2.0.0", "htmlparser2": "^8.0.2", "selderee": "^0.11.0" } }, "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg=="], - "htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="], + "html2canvas-pro": ["html2canvas-pro@1.5.12", "", { "dependencies": { "css-line-break": "^2.1.0", "text-segmentation": "^1.0.3" } }, "sha512-egtJIe6YXMKSLX/ls400OJD6tzEVtATJOE++mnXmxMWyqcu9HDXDoLiWeXnGv45QW2ZaIiDlXw46Gxqrqw6SEw=="], + + "htmlparser2": ["htmlparser2@9.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.1.0", "entities": "^4.5.0" } }, "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ=="], + + "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], + + "immer": ["immer@10.1.3", "", {}, "sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw=="], + + "imsc": ["imsc@1.1.5", "", { "dependencies": { "sax": "1.2.1" } }, "sha512-V8je+CGkcvGhgl2C1GlhqFFiUOIEdwXbXLiu1Fcubvvbo+g9inauqT3l0pNYXGoLPBj3jxtZz9t+wCopMkwadQ=="], + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], "input-format": ["input-format@0.3.14", "", { "dependencies": { "prop-types": "^15.8.1" }, "peerDependencies": { "react": ">=18.1.0", "react-dom": ">=18.1.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-gHMrgrbCgmT4uK5Um5eVDUohuV9lcs95ZUUN9Px2Y0VIfjTzT2wF8Q3Z4fwLFm7c5Z2OXCm53FHoovj6SlOKdg=="], "input-otp": ["input-otp@1.4.2", "", { "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA=="], - "intl-messageformat": ["intl-messageformat@10.7.17", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.5", "@formatjs/fast-memoize": "2.2.7", "@formatjs/icu-messageformat-parser": "2.11.3", "tslib": "^2.8.0" } }, "sha512-0Ugaf65B2J76rb31drgNF1l6bGEDkbIiYc2Glx6jaZINHnwa5kDRGy8KXYuA+/8P4G0c9prAFhfVhQJJfzUuvQ=="], + "intl-messageformat": ["intl-messageformat@10.7.18", "", { "dependencies": { "@formatjs/ecma402-abstract": "2.3.6", "@formatjs/fast-memoize": "2.2.7", "@formatjs/icu-messageformat-parser": "2.11.4", "tslib": "^2.8.0" } }, "sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], "is-arrayish": ["is-arrayish@0.3.4", "", {}, "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="], @@ -1309,6 +1573,8 @@ "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -1317,11 +1583,17 @@ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-hotkey": ["is-hotkey@0.2.0", "", {}, "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw=="], + "is-interactive": ["is-interactive@1.0.0", "", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="], "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], - "is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="], @@ -1337,8 +1609,16 @@ "jiti": ["jiti@2.4.2", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A=="], + "jotai": ["jotai@2.8.4", "", { "peerDependencies": { "@types/react": ">=17.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@types/react", "react"] }, "sha512-f6jwjhBJcDtpeauT2xH01gnqadKEySwwt1qNBLvAXcnojkmb76EdqRt05Ym8IamfHGAQz2qMKAwftnyjeSoHAA=="], + + "jotai-optics": ["jotai-optics@0.4.0", "", { "peerDependencies": { "jotai": ">=2.0.0", "optics-ts": ">=2.0.0" } }, "sha512-osbEt9AgS55hC4YTZDew2urXKZkaiLmLqkTS/wfW5/l0ib8bmmQ7kBXSFaosV6jDDWSp00IipITcJARFHdp42g=="], + + "jotai-x": ["jotai-x@2.3.3", "", { "peerDependencies": { "@types/react": ">=17.0.0", "jotai": ">=2.0.0", "react": ">=17.0.0" }, "optionalPeers": ["@types/react", "react"] }, "sha512-ZeSPjf77VINlJ0HyMfYcPv/9psjB0CtJIZP6S+s/eefaO/9+U37M9Jx5dWmILgTe8hAol99EbAv6DDrHobOucA=="], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "js-video-url-parser": ["js-video-url-parser@0.5.1", "", {}, "sha512-/vwqT67k0AyIGMHAvSOt+n4JfrZWF7cPKgKswDO35yr27GfW4HtjpQVlTx6JLF45QuPm8mkzFHkZgFVnFm4x/w=="], + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], @@ -1349,6 +1629,10 @@ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "juice": ["juice@11.0.3", "", { "dependencies": { "cheerio": "1.0.0", "commander": "^12.1.0", "entities": "^7.0.0", "mensch": "^0.3.4", "slick": "^1.12.2", "web-resource-inliner": "^7.0.0" }, "bin": { "juice": "bin/juice" } }, "sha512-VYjPg4WylyWyLPnSiUsJ9tnnGhRZF0vn0YD8WWwaI8FhP9+1UdRMyRDbvqPOH/nBotmLKOc+FI+Oma6FwVWfSw=="], + + "katex": ["katex@0.16.22", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg=="], + "kdbush": ["kdbush@4.0.2", "", {}, "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA=="], "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], @@ -1377,7 +1661,9 @@ "lefthook-windows-x64": ["lefthook-windows-x64@1.13.6", "", { "os": "win32", "cpu": "x64" }, "sha512-mOZoM3FQh3o08M8PQ/b3IYuL5oo36D9ehczIw1dAgp1Ly+Tr4fJ96A+4SEJrQuYeRD4mex9bR7Ps56I73sBSZA=="], - "libphonenumber-js": ["libphonenumber-js@1.12.23", "", {}, "sha512-RN3q3gImZ91BvRDYjWp7ICz3gRn81mW5L4SW+2afzNCC0I/nkXstBgZThQGTE3S/9q5J90FH4dP+TXx8NhdZKg=="], + "libphonenumber-js": ["libphonenumber-js@1.12.24", "", {}, "sha512-l5IlyL9AONj4voSd7q9xkuQOL4u8Ty44puTic7J88CmdXkxfGsRfoVLXHCxppwehgpb/Chdb80FFehHqjN3ItQ=="], + + "lie": ["lie@3.1.1", "", { "dependencies": { "immediate": "~3.0.5" } }, "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw=="], "lightningcss": ["lightningcss@1.30.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-darwin-arm64": "1.30.1", "lightningcss-darwin-x64": "1.30.1", "lightningcss-freebsd-x64": "1.30.1", "lightningcss-linux-arm-gnueabihf": "1.30.1", "lightningcss-linux-arm64-gnu": "1.30.1", "lightningcss-linux-arm64-musl": "1.30.1", "lightningcss-linux-x64-gnu": "1.30.1", "lightningcss-linux-x64-musl": "1.30.1", "lightningcss-win32-arm64-msvc": "1.30.1", "lightningcss-win32-x64-msvc": "1.30.1" } }, "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg=="], @@ -1407,34 +1693,158 @@ "loader-runner": ["loader-runner@4.3.1", "", {}, "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q=="], + "localforage": ["localforage@1.10.0", "", { "dependencies": { "lie": "3.1.1" } }, "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + "lodash.mapvalues": ["lodash.mapvalues@4.6.0", "", {}, "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ=="], + "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="], + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + "lowlight": ["lowlight@3.3.0", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.0.0", "highlight.js": "~11.11.0" } }, "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ=="], + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], - "lucide-react": ["lucide-react@0.486.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-xWop/wMsC1ikiEVLZrxXjPKw4vU/eAip33G2mZHgbWnr4Nr5Rt4Vx4s/q1D3B/rQVbxjOuqASkEZcUxDEKzecw=="], + "lucide-react": ["lucide-react@0.536.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-2PgvNa9v+qz4Jt/ni8vPLt4jwoFybXHuubQT8fv4iCW5TjDxkbZjNZZHa485ad73NSEn/jdsEtU57eE1g+ma8A=="], "magic-string": ["magic-string@0.30.19", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw=="], - "maplibre-gl": ["maplibre-gl@5.8.0", "", { "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/point-geometry": "^1.1.0", "@mapbox/tiny-sdf": "^2.0.7", "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^2.0.4", "@mapbox/whoots-js": "^3.1.0", "@maplibre/maplibre-gl-style-spec": "^24.2.0", "@maplibre/vt-pbf": "^4.0.3", "@types/geojson": "^7946.0.16", "@types/geojson-vt": "3.2.5", "@types/supercluster": "^7.1.3", "earcut": "^3.0.2", "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.4", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^4.0.1", "potpack": "^2.1.0", "quickselect": "^3.0.0", "supercluster": "^8.0.1", "tinyqueue": "^3.0.0" } }, "sha512-zLblPFK+z5sxeitDF8RL2cnqfRaivNwxbGoQMfwAm9st6d1lRGTxgI7NNNr/U1AEPkp5+X+wjROagiHvJD8aqg=="], + "maplibre-gl": ["maplibre-gl@5.9.0", "", { "dependencies": { "@mapbox/geojson-rewind": "^0.5.2", "@mapbox/jsonlint-lines-primitives": "^2.0.2", "@mapbox/point-geometry": "^1.1.0", "@mapbox/tiny-sdf": "^2.0.7", "@mapbox/unitbezier": "^0.0.1", "@mapbox/vector-tile": "^2.0.4", "@mapbox/whoots-js": "^3.1.0", "@maplibre/maplibre-gl-style-spec": "^24.2.0", "@maplibre/vt-pbf": "^4.0.3", "@types/geojson": "^7946.0.16", "@types/geojson-vt": "3.2.5", "@types/supercluster": "^7.1.3", "earcut": "^3.0.2", "geojson-vt": "^4.0.2", "gl-matrix": "^3.4.4", "kdbush": "^4.0.2", "murmurhash-js": "^1.0.0", "pbf": "^4.0.1", "potpack": "^2.1.0", "quickselect": "^3.0.0", "supercluster": "^8.0.1", "tinyqueue": "^3.0.0" } }, "sha512-YxW9glb/YrDXGDhqy1u+aG113+L86ttAUpTd6sCkGHyUKMXOX8qbGHJQVqxOczy+4CtRKnqcCfSura2MzB0nQA=="], - "marked": ["marked@7.0.4", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ=="], + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "marked": ["marked@15.0.12", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="], "md-to-react-email": ["md-to-react-email@5.0.5", "", { "dependencies": { "marked": "7.0.4" }, "peerDependencies": { "react": "^18.0 || ^19.0" } }, "sha512-OvAXqwq57uOk+WZqFFNCMZz8yDp8BD3WazW1wAKHUrPbbdr89K9DWS6JXY09vd9xNdPNeurI8DU/X4flcfaD8A=="], + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-math": ["mdast-util-math@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "longest-streak": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.1.0", "unist-util-remove-position": "^5.0.0" } }, "sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w=="], + + "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "media-chrome": ["media-chrome@4.14.0", "", { "dependencies": { "ce-la-react": "^0.3.0" } }, "sha512-IEdFb4blyF15vLvQzLIn6USJBv7Kf2ne+TfLQKBYI5Z0f9VEBVZz5MKy4Uhi0iA9lStl2S9ENIujJRuJIa5OiA=="], + + "media-tracks": ["media-tracks@0.3.3", "", {}, "sha512-9P2FuUHnZZ3iji+2RQk7Zkh5AmZTnOG5fODACnjhCVveX1McY3jmCRHofIEI+yTBqplz7LXy48c7fQ3Uigp88w=="], + "memfs": ["memfs@3.5.3", "", { "dependencies": { "fs-monkey": "^1.0.4" } }, "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw=="], "memfs-browser": ["memfs-browser@3.5.10302", "", { "dependencies": { "memfs": "3.5.3" } }, "sha512-JJTc/nh3ig05O0gBBGZjTCPOyydaTxNF0uHYBrcc1gHNnO+KIHIvo0Y1FKCJsaei6FCl8C6xfQomXqu+cuzkIw=="], + "mensch": ["mensch@0.3.4", "", {}, "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g=="], + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-extension-math": ["micromark-extension-math@3.1.0", "", { "dependencies": { "@types/katex": "^0.16.0", "devlop": "^1.0.0", "katex": "^0.16.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg=="], + + "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], + + "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], + + "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], + + "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], + + "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], @@ -1455,7 +1865,7 @@ "motion": ["motion@11.18.2", "", { "dependencies": { "framer-motion": "^11.18.2", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-JLjvFDuFr42NFtcVoMAyC2sEjnpA8xpy6qWPyzQvCloznAyQ8FIXioxWfHiLtgYhoVpfUqSWpn1h9++skj9+Wg=="], - "motion-dom": ["motion-dom@12.23.21", "", { "dependencies": { "motion-utils": "^12.23.6" } }, "sha512-5xDXx/AbhrfgsQmSE7YESMn4Dpo6x5/DTZ4Iyy4xqDvVHWvFVoV+V2Ri2S/ksx+D40wrZ7gPYiMWshkdoqNgNQ=="], + "motion-dom": ["motion-dom@12.23.23", "", { "dependencies": { "motion-utils": "^12.23.6" } }, "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA=="], "motion-utils": ["motion-utils@12.23.6", "", {}, "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ=="], @@ -1465,17 +1875,23 @@ "murmurhash-js": ["murmurhash-js@1.0.0", "", {}, "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw=="], + "mutative": ["mutative@1.1.0", "", {}, "sha512-2PJADREjOusk3iJkD3rXV2YjAxTuaLxdfqtqTEt6vcY07LtEBR1seHuBHXWEIuscqRDGvbauYPs+A4Rj/KTczQ=="], + + "mux-embed": ["mux-embed@5.13.0", "", {}, "sha512-voN+WCsA8S0lRTeu14v7WaWnQMr4f1D6rKzT7Bq1ZtETjnOaIG9EreG7p/SJrHLHHd1WTt0RYtTr4ZqJICcL6Q=="], + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "native-promise-only": ["native-promise-only@0.8.1", "", {}, "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg=="], + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], "next": ["next@15.5.4", "", { "dependencies": { "@next/env": "15.5.4", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.5.4", "@next/swc-darwin-x64": "15.5.4", "@next/swc-linux-arm64-gnu": "15.5.4", "@next/swc-linux-arm64-musl": "15.5.4", "@next/swc-linux-x64-gnu": "15.5.4", "@next/swc-linux-x64-musl": "15.5.4", "@next/swc-win32-arm64-msvc": "15.5.4", "@next/swc-win32-x64-msvc": "15.5.4", "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-xH4Yjhb82sFYQfY3vbkJfgSDgXvBB6a8xPs9i35k6oZJRoQRihZH+4s9Yo2qsWpzBmZ3lPXaJ2KPXLfkvW4LnA=="], - "next-intl": ["next-intl@4.3.11", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.5.4", "negotiator": "^1.0.0", "use-intl": "^4.3.11" }, "peerDependencies": { "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "typescript": "^5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-kyjeGUuLBU1DqDVAzhgoltYxQ8esVqqqkq2BRKPFxTwHPT9r5P5ZHePu3esjc5B3dVeVC/yFf8ebEnaYo68q1g=="], + "next-intl": ["next-intl@4.3.12", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.5.4", "negotiator": "^1.0.0", "use-intl": "^4.3.12" }, "peerDependencies": { "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "typescript": "^5.0.0" }, "optionalPeers": ["typescript"] }, "sha512-yAmrQ3yx0zpNva/knniDvam3jT2d01Lv2aRgRxUIDL9zm9O4AsDjWbDIxX13t5RNf0KVnKkxH+iRcqEAmWecPg=="], "next-themes": ["next-themes@1.0.0-beta.0", "", { "peerDependencies": { "next": "*", "react": "*", "react-dom": "*" } }, "sha512-DitiYQqduW+m/e6WF7LjuIlvh1O8z0tgStGdwGZa27+R47v9xz/4tgq1NH0y6xQqhbm9/ao3yZQS4Hbcy3/OFw=="], @@ -1501,14 +1917,28 @@ "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + "optics-ts": ["optics-ts@2.4.1", "", {}, "sha512-HaYzMHvC80r7U/LqAd4hQyopDezC60PO2qF5GuIwALut2cl5rK1VWHsqTp0oqoJJWjiv6uXKqsO+Q2OO0C3MmQ=="], + "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="], "oslo": ["oslo@1.2.1", "", { "dependencies": { "@node-rs/argon2": "1.7.0", "@node-rs/bcrypt": "1.9.0" } }, "sha512-HfIhB5ruTdQv0XX2XlncWQiJ5SIHZ7NHZhVyHth0CSZ/xzge00etRyYy/3wp/Dsu+PkxMC+6+B2lS/GcKoewkA=="], "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@7.1.0", "", { "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g=="], + + "parse5-parser-stream": ["parse5-parser-stream@7.1.2", "", { "dependencies": { "parse5": "^7.0.0" } }, "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow=="], + "parseley": ["parseley@0.12.1", "", { "dependencies": { "leac": "^0.6.0", "peberminta": "^0.9.0" } }, "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw=="], + "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], @@ -1519,8 +1949,12 @@ "pbf": ["pbf@4.0.1", "", { "dependencies": { "resolve-protobuf-schema": "^2.1.0" }, "bin": { "pbf": "bin/pbf" } }, "sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA=="], + "pdf-lib": ["pdf-lib@1.17.1", "", { "dependencies": { "@pdf-lib/standard-fonts": "^1.0.0", "@pdf-lib/upng": "^1.0.1", "pako": "^1.0.11", "tslib": "^1.11.1" } }, "sha512-V/mpyJAoTsN4cnP31vc0wfNA1+p20evqqnap0KLoRUN0Yk/p3wN52DOEsL4oBFcLdb76hlpKPtzJIgo67j/XLw=="], + "peberminta": ["peberminta@0.9.0", "", {}, "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ=="], + "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="], + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], @@ -1531,6 +1965,10 @@ "pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + "platejs": ["platejs@49.2.21", "", { "dependencies": { "@platejs/core": "49.2.21", "@platejs/slate": "49.2.21", "@platejs/utils": "49.2.21", "@udecode/react-hotkeys": "37.0.0", "@udecode/react-utils": "49.0.15", "@udecode/utils": "47.2.7" }, "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-JK3W4WxEGOW7W+GHMH1Wro46mVfkbKgFlj0DrajDv4HmmK7FQVu9IkVdeR97IbimM76GafoHglbqlJrLM7CYIw=="], + + "player.style": ["player.style@0.2.0", "", { "dependencies": { "media-chrome": "~4.13.0" } }, "sha512-Ngoaz49TClptMr8HDA2IFmjT3Iq6R27QEUH/C+On33L59RSF3dCLefBYB1Au2RDZQJ6oVFpc1sXaPVpp7fEzzA=="], + "playwright": ["playwright@1.56.0", "", { "dependencies": { "playwright-core": "1.56.0" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA=="], "playwright-core": ["playwright-core@1.56.0", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ=="], @@ -1541,7 +1979,7 @@ "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="], - "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], + "postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="], "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], @@ -1551,7 +1989,7 @@ "postgres": ["postgres@3.4.7", "", {}, "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw=="], - "posthog-js": ["posthog-js@1.274.0", "", { "dependencies": { "@posthog/core": "1.2.3", "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", "web-vitals": "^4.2.4" }, "peerDependencies": { "@rrweb/types": "2.0.0-alpha.17", "rrweb-snapshot": "2.0.0-alpha.17" }, "optionalPeers": ["@rrweb/types", "rrweb-snapshot"] }, "sha512-z3/Hj6svCXNcdkg+hN/jdrRromDX835V2oqyC+nMC3rV85ubNs4XvjjJ9mzeytbpg7KNqo2cHrd9zwfoQwxNvw=="], + "posthog-js": ["posthog-js@1.275.1", "", { "dependencies": { "@posthog/core": "1.2.4", "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", "web-vitals": "^4.2.4" }, "peerDependencies": { "@rrweb/types": "2.0.0-alpha.17", "rrweb-snapshot": "2.0.0-alpha.17" }, "optionalPeers": ["@rrweb/types", "rrweb-snapshot"] }, "sha512-ILglAzeUQl7h7rB3axr5rn5j2wBp53XedzJoUha5IC594BsrScdOD9NjLpkDAqV/Q5IsRKXbYOkr+HKaxgb4FA=="], "potpack": ["potpack@2.1.0", "", {}, "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ=="], @@ -1571,18 +2009,26 @@ "protocol-buffers-schema": ["protocol-buffers-schema@3.6.0", "", {}, "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="], + "proxy-compare": ["proxy-compare@2.6.0", "", {}, "sha512-8xuCeM3l8yqdmbPoYeLbrAXCBWu19XEYc5/F28f5qOaoAIMyfmBUkl5axiK+x9olUvRlcekvnm98AP9RDngOIw=="], + "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], "quickselect": ["quickselect@3.0.0", "", {}, "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g=="], + "raf": ["raf@3.4.1", "", { "dependencies": { "performance-now": "^2.1.0" } }, "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA=="], + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], "react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="], "react-day-picker": ["react-day-picker@9.11.1", "", { "dependencies": { "@date-fns/tz": "^1.4.1", "date-fns": "^4.1.0", "date-fns-jalali": "^4.1.0-0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-l3ub6o8NlchqIjPKrRFUCkTUEq6KwemQlfv3XZzzwpUeGwmDJ+0u0Upmt38hJyd7D/vn2dQoOoLV/qAp0o3uUw=="], + "react-dnd": ["react-dnd@16.0.1", "", { "dependencies": { "@react-dnd/invariant": "^4.0.1", "@react-dnd/shallowequal": "^4.0.1", "dnd-core": "^16.0.1", "fast-deep-equal": "^3.1.3", "hoist-non-react-statics": "^3.3.2" }, "peerDependencies": { "@types/hoist-non-react-statics": ">= 3.3.1", "@types/node": ">= 12", "@types/react": ">= 16", "react": ">= 16.14" }, "optionalPeers": ["@types/hoist-non-react-statics", "@types/node", "@types/react"] }, "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q=="], + + "react-dnd-html5-backend": ["react-dnd-html5-backend@16.0.1", "", { "dependencies": { "dnd-core": "^16.0.1" } }, "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw=="], + "react-dom": ["react-dom@19.2.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ=="], "react-dropzone": ["react-dropzone@14.3.8", "", { "dependencies": { "attr-accept": "^2.2.4", "file-selector": "^2.1.0", "prop-types": "^15.8.1" }, "peerDependencies": { "react": ">= 16.8 || 18.0.0" } }, "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug=="], @@ -1591,10 +2037,14 @@ "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + "react-lite-youtube-embed": ["react-lite-youtube-embed@2.5.6", "", { "peerDependencies": { "react": ">=18.2.0", "react-dom": ">=18.2.0" } }, "sha512-gbV2SCpAqZOJ/p8wsIbXahONtX3ofh7WZfOR9pCK5kXEbDhTh+bFTOT/fyE+v3ZP4loQkZRqfp8H67gEcGz74w=="], + "react-map-gl": ["react-map-gl@8.1.0", "", { "dependencies": { "@vis.gl/react-mapbox": "8.1.0", "@vis.gl/react-maplibre": "8.1.0" }, "peerDependencies": { "mapbox-gl": ">=1.13.0", "maplibre-gl": ">=1.13.0", "react": ">=16.3.0", "react-dom": ">=16.3.0" }, "optionalPeers": ["mapbox-gl", "maplibre-gl"] }, "sha512-vDx/QXR3Tb+8/ap/z6gdMjJQ8ZEyaZf6+uMSPz7jhWF5VZeIsKsGfPvwHVPPwGF43Ryn+YR4bd09uEFNR5OPdg=="], "react-phone-number-input": ["react-phone-number-input@3.4.12", "", { "dependencies": { "classnames": "^2.5.1", "country-flag-icons": "^1.5.17", "input-format": "^0.3.10", "libphonenumber-js": "^1.11.20", "prop-types": "^15.8.1" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-Raob77KdtLGm49iC6nuOX9qy6Mg16idkgC7Y1mHmvG2WBYoauHpzxYNlfmFskQKeiztrJIwPhPzBhjFwjenNCA=="], + "react-player": ["react-player@3.3.3", "", { "dependencies": { "@mux/mux-player-react": "^3.6.0", "cloudflare-video-element": "^1.3.4", "dash-video-element": "^0.2.0", "hls-video-element": "^1.5.8", "spotify-audio-element": "^1.0.3", "tiktok-video-element": "^0.1.1", "twitch-video-element": "^0.1.4", "vimeo-video-element": "^1.5.5", "wistia-video-element": "^1.3.4", "youtube-video-element": "^1.6.2" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18 || ^19", "react": "^17.0.2 || ^18 || ^19", "react-dom": "^17.0.2 || ^18 || ^19" } }, "sha512-6U2ziVohA3WLdKI/WEQ7v27CIive0TCNIro55lJZka06fjB2kC4lJqBrvddG0yBvTDcn1owiUf2hRNaIzHAjIg=="], + "react-promise-suspense": ["react-promise-suspense@0.3.4", "", { "dependencies": { "fast-deep-equal": "^2.0.1" } }, "sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ=="], "react-remove-scroll": ["react-remove-scroll@2.7.1", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA=="], @@ -1605,6 +2055,12 @@ "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + "react-textarea-autosize": ["react-textarea-autosize@8.5.9", "", { "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A=="], + + "react-tracked": ["react-tracked@1.7.14", "", { "dependencies": { "proxy-compare": "2.6.0", "use-context-selector": "1.4.4" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": "*", "react-native": "*", "scheduler": ">=0.19.0" }, "optionalPeers": ["react-dom", "react-native"] }, "sha512-6UMlgQeRAGA+uyYzuQGm7kZB6ZQYFhc7sntgP7Oxwwd6M0Ud/POyb4K3QWT1eXvoifSa80nrAWnXWFGpOvbwkw=="], + + "react-tweet": ["react-tweet@3.2.2", "", { "dependencies": { "@swc/helpers": "^0.5.3", "clsx": "^2.0.0", "swr": "^2.2.4" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-hIkxAVPpN2RqWoDEbo3TTnN/pDcp9/Jb6pTgiA4EbXa9S+m2vHIvvZKHR+eS0PDIsYqe+zTmANRa5k6+/iwGog=="], + "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], @@ -1613,6 +2069,18 @@ "reading-time": ["reading-time@1.5.0", "", {}, "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg=="], + "redux": ["redux@4.2.1", "", { "dependencies": { "@babel/runtime": "^7.9.2" } }, "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w=="], + + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-math": ["remark-math@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-math": "^3.0.0", "micromark-extension-math": "^3.0.0", "unified": "^11.0.0" } }, "sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA=="], + + "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], @@ -1633,10 +2101,16 @@ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], + + "sax": ["sax@1.2.1", "", {}, "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA=="], + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], + "scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="], + "selderee": ["selderee@0.11.0", "", { "dependencies": { "parseley": "^0.12.0" } }, "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA=="], "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -1661,6 +2135,16 @@ "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + "slate": ["slate@0.118.1", "", { "dependencies": { "immer": "^10.0.3", "tiny-warning": "^1.0.3" } }, "sha512-6H1DNgnSwAFhq/pIgf+tLvjNzH912M5XrKKhP9Frmbds2zFXdSJ6L/uFNyVKxQIkPzGWPD0m+wdDfmEuGFH5Tg=="], + + "slate-dom": ["slate-dom@0.118.1", "", { "dependencies": { "@juggle/resize-observer": "^3.4.0", "direction": "^1.0.4", "is-hotkey": "^0.2.0", "is-plain-object": "^5.0.0", "lodash": "^4.17.21", "scroll-into-view-if-needed": "^3.1.0", "tiny-invariant": "1.3.1" }, "peerDependencies": { "slate": ">=0.99.0" } }, "sha512-D6J0DF9qdJrXnRDVhYZfHzzpVxzqKRKFfS0Wcin2q0UC+OnQZ0lbCGJobatVbisOlbSe7dYFHBp9OZ6v1lEcbQ=="], + + "slate-hyperscript": ["slate-hyperscript@0.115.0", "", { "peerDependencies": { "slate": ">=0.114.3" } }, "sha512-aaQ1XSfUhw0Lf4cwVLeNFYnnPsC9iX9aEmKvT5PAaGTNVe1LaBCAXB+CFuqp7YPExPj9hYuS5CsIu8dAh9JX2w=="], + + "slate-react": ["slate-react@0.117.4", "", { "dependencies": { "@juggle/resize-observer": "^3.4.0", "direction": "^1.0.4", "is-hotkey": "^0.2.0", "lodash": "^4.17.21", "scroll-into-view-if-needed": "^3.1.0", "tiny-invariant": "1.3.1" }, "peerDependencies": { "react": ">=18.2.0", "react-dom": ">=18.2.0", "slate": ">=0.114.0", "slate-dom": ">=0.116.0" } }, "sha512-9ckilyUzQS1VHJnstIpgInhcWnTDgv2Cd7m1HOQVl3zasChoapPSMftzT/wl/48grZaZYZIi4xVuzGTcFRUWFg=="], + + "slick": ["slick@1.12.2", "", {}, "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A=="], + "socket.io": ["socket.io@4.8.1", "", { "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" } }, "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg=="], "socket.io-adapter": ["socket.io-adapter@2.5.5", "", { "dependencies": { "debug": "~4.3.4", "ws": "~8.17.1" } }, "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg=="], @@ -1687,6 +2171,8 @@ "split-string": ["split-string@3.1.0", "", { "dependencies": { "extend-shallow": "^3.0.0" } }, "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw=="], + "spotify-audio-element": ["spotify-audio-element@1.0.3", "", {}, "sha512-I1/qD8cg/UnTlCIMiKSdZUJTyYfYhaqFK7LIVElc48eOqUUbVCaw1bqL8I6mJzdMJTh3eoNyF/ewvB7NoS/g9A=="], + "stacktrace-parser": ["stacktrace-parser@0.1.11", "", { "dependencies": { "type-fest": "^0.7.1" } }, "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg=="], "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="], @@ -1697,6 +2183,8 @@ "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1709,6 +2197,8 @@ "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], + "super-media-element": ["super-media-element@1.4.2", "", {}, "sha512-9pP/CVNp4NF2MNlRzLwQkjiTgKKe9WYXrLh9+8QokWmMxz+zt2mf1utkWLco26IuA3AfVcTb//qtlTIjY3VHxA=="], + "supercluster": ["supercluster@8.0.1", "", { "dependencies": { "kdbush": "^4.0.2" } }, "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ=="], "superjson": ["superjson@2.2.2", "", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q=="], @@ -1717,8 +2207,14 @@ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + "swr": ["swr@2.3.6", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw=="], + + "tabbable": ["tabbable@6.2.0", "", {}, "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew=="], + "tailwind-merge": ["tailwind-merge@3.3.1", "", {}, "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g=="], + "tailwind-scrollbar-hide": ["tailwind-scrollbar-hide@4.0.0", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || >= 4.0.0 || >= 4.0.0-beta.8 || >= 4.0.0-alpha.20" } }, "sha512-gobtvVcThB2Dxhy0EeYSS1RKQJ5baDFkamkhwBvzvevwX6L4XQfpZ3me9s25Ss1ecFVT5jPYJ50n+7xTBJG9WQ=="], + "tailwindcss": ["tailwindcss@4.1.14", "", {}, "sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA=="], "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="], @@ -1729,16 +2225,30 @@ "terser-webpack-plugin": ["terser-webpack-plugin@5.3.14", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw=="], + "text-segmentation": ["text-segmentation@1.0.3", "", { "dependencies": { "utrie": "^1.0.2" } }, "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw=="], + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + "tiktok-video-element": ["tiktok-video-element@0.1.1", "", {}, "sha512-BaiVzvNz2UXDKTdSrXzrNf4q6Ecc+/utYUh7zdEu2jzYcJVDoqYbVfUl0bCfMoOeeAqg28vD/yN63Y3E9jOrlA=="], + + "tiny-invariant": ["tiny-invariant@1.3.1", "", {}, "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="], + + "tiny-warning": ["tiny-warning@1.0.3", "", {}, "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="], + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], "tinyqueue": ["tinyqueue@3.0.0", "", {}, "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + "toggle-selection": ["toggle-selection@1.0.6", "", {}, "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "ts-essentials": ["ts-essentials@10.1.0", "", { "peerDependencies": { "typescript": ">=4.5.0" }, "optionalPeers": ["typescript"] }, "sha512-LirrVzbhIpFQ9BdGfqLnM9r7aP9rnyfeoxbP5ZEkdr531IaY21+KdebRSsbvqu28VDJtcDDn+AlGn95t0c52zQ=="], + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="], @@ -1753,6 +2263,8 @@ "tw-clamp-css": ["tw-clamp-css@2.1.1", "", { "peerDependencies": { "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.11" } }, "sha512-jkeirdZSUOp3jYma98h8r1WSrB0RYB6V2vLFAff5SYgBmebaA3x0kfhmTMdIhFR/Wi53rKvjlxz1kEH1DFI6iQ=="], + "twitch-video-element": ["twitch-video-element@0.1.4", "", {}, "sha512-SDpZ4f7sZmwHF6XG5PF0KWuP18pH/kNG04MhTcpqJby7Lk/D3TS/lCYd+RSg0rIAAVi1LDgSIo1yJs9kmHlhgw=="], + "type-fest": ["type-fest@0.7.1", "", {}, "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], @@ -1761,19 +2273,49 @@ "typewise-core": ["typewise-core@1.2.0", "", {}, "sha512-2SCC/WLzj2SbUwzFOzqMCkz5amXLlxtJqDKTICqg30x+2DZxcfZN2MvQZmGfXWKNWaKK9pBPsvkcwv8bF/gxKg=="], + "ua-parser-js": ["ua-parser-js@1.0.41", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-LbBDqdIC5s8iROCUjMbW1f5dJQTEFB1+KO9ogbvlb3nm9n4YHa5p4KTvFPWvh2Hs8gZMBuiB1/8+pdfe/tDPug=="], + + "undici": ["undici@6.22.0", "", {}, "sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw=="], + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + "union-value": ["union-value@1.0.1", "", { "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" } }, "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg=="], + "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], + + "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + "unplugin": ["unplugin@2.1.0", "", { "dependencies": { "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" } }, "sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ=="], "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + "use-composed-ref": ["use-composed-ref@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w=="], + + "use-context-selector": ["use-context-selector@1.4.4", "", { "peerDependencies": { "react": ">=16.8.0", "react-dom": "*", "react-native": "*", "scheduler": ">=0.19.0" }, "optionalPeers": ["react-dom", "react-native"] }, "sha512-pS790zwGxxe59GoBha3QYOwk8AFGp4DN6DOtH+eoqVmgBBRXVx4IlPDhJmmMiNQAgUaLlP+58aqRC3A4rdaSjg=="], + "use-debounce": ["use-debounce@10.0.4", "", { "peerDependencies": { "react": "*" } }, "sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw=="], - "use-intl": ["use-intl@4.3.11", "", { "dependencies": { "@formatjs/fast-memoize": "^2.2.0", "@schummar/icu-type-parser": "1.21.5", "intl-messageformat": "^10.5.14" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-cSOPKwVjaB5Y22vnrVMio5qRolBADe+TYiqsW0/jLqRn6MUNRNBparEDfx12F170ruBWhzcdW6+v6j+MlWGbEQ=="], + "use-deep-compare": ["use-deep-compare@1.3.0", "", { "dependencies": { "dequal": "2.0.3" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-94iG+dEdEP/Sl3WWde+w9StIunlV8Dgj+vkt5wTwMoFQLaijiEZSXXy8KtcStpmEDtIptRJiNeD4ACTtVvnIKA=="], + + "use-file-picker": ["use-file-picker@2.1.2", "", { "dependencies": { "file-selector": "0.2.4" }, "peerDependencies": { "react": ">=16" } }, "sha512-ZEIzRi1wXeIXDWr5i55gRBVER8rTkSGskDUY94bciTTAZJHlBnOTRLL/LDYjgz6d+US3yELHnRvtBhLxFGtB0A=="], + + "use-intl": ["use-intl@4.3.12", "", { "dependencies": { "@formatjs/fast-memoize": "^2.2.0", "@schummar/icu-type-parser": "1.21.5", "intl-messageformat": "^10.5.14" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-RxW2/D17irlDOJOzClKl+kWA7ReGLpo/A8f/LF7w1kIxO6mPKVh422JJ/pDCcvtYFCI4aPtn1AXUfELKbM+7tg=="], + + "use-isomorphic-layout-effect": ["use-isomorphic-layout-effect@1.2.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA=="], + + "use-latest": ["use-latest@1.3.0", "", { "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ=="], "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], @@ -1781,14 +2323,30 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "utrie": ["utrie@1.0.2", "", { "dependencies": { "base64-arraybuffer": "^1.0.2" } }, "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw=="], + + "valid-data-url": ["valid-data-url@3.0.1", "", {}, "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA=="], + + "validator": ["validator@13.15.15", "", {}, "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A=="], + "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], "vaul": ["vaul@1.1.2", "", { "dependencies": { "@radix-ui/react-dialog": "^1.1.1" }, "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA=="], + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "vimeo-video-element": ["vimeo-video-element@1.6.0", "", { "dependencies": { "@vimeo/player": "2.29.0" } }, "sha512-Vs+WWvd6ph6FtY+DqrVO5OHUUS02An87QydUcCUtAsIiXnYhZl0yiDC0XxWiFluo+S6keG38i4xCaQfS1LgeSg=="], + "watchpack": ["watchpack@2.4.4", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA=="], "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="], + "weakmap-polyfill": ["weakmap-polyfill@2.0.4", "", {}, "sha512-ZzxBf288iALJseijWelmECm/1x7ZwQn3sMYIkDr2VvZp7r6SEKuT8D0O9Wiq6L9Nl5mazrOMcmiZE/2NCenaxw=="], + + "web-resource-inliner": ["web-resource-inliner@7.0.0", "", { "dependencies": { "ansi-colors": "^4.1.1", "escape-goat": "^3.0.0", "htmlparser2": "^5.0.0", "mime": "^2.4.6", "valid-data-url": "^3.0.0" } }, "sha512-NlfnGF8MY9ZUwFjyq3vOUBx7KwF8bmE+ywR781SB0nWB6MoMxN4BA8gtgP1KGTZo/O/AyWJz7HZpR704eaj4mg=="], + "web-vitals": ["web-vitals@4.2.4", "", {}, "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw=="], "webpack": ["webpack@5.102.1", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.15.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.26.3", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.3", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.4", "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ=="], @@ -1797,8 +2355,14 @@ "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="], + + "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="], + "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + "wistia-video-element": ["wistia-video-element@1.3.4", "", { "dependencies": { "super-media-element": "~1.4.2" } }, "sha512-2l22oaQe4jUfi3yvsh2m2oCEgvbqTzaSYx6aJnZAvV5hlMUJlyZheFUnaj0JU2wGlHdVGV7xNY+5KpKu+ruLYA=="], + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -1813,8 +2377,16 @@ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], + "youtube-video-element": ["youtube-video-element@1.6.2", "", {}, "sha512-YHDIOAqgRpfl1Ois9HcB8UFtWOxK8KJrV5TXpImj4BKYP1rWT04f/fMM9tQ9SYZlBKukT7NR+9wcI3UpB5BMDQ=="], + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "zustand": ["zustand@5.0.8", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw=="], + + "zustand-x": ["zustand-x@6.1.0", "", { "dependencies": { "immer": "^10.0.3", "lodash.mapvalues": "^4.6.0", "mutative": "1.1.0", "react-tracked": "^1.7.11", "use-sync-external-store": "1.4.0" }, "peerDependencies": { "zustand": ">=5.0.2" } }, "sha512-lW1Fs29bLCrerWDa3lZLPuEn+ZkbSGzXdwdImKLJUtI2OqlDjpcFac5WTzCPs2ul/igwXFnGiKH1mdn+1Pl2mw=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], @@ -1841,25 +2413,13 @@ "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "@mux/mux-data-google-ima/mux-embed": ["mux-embed@5.9.0", "", {}, "sha512-wmunL3uoPhma/tWy8PrDPZkvJpXvSFBwbD3KkC4PG8Ztjfb1X3hRJwGUAQyRz7z99b/ovLm2UTTitrkvStjH4w=="], + "@node-rs/argon2-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@0.45.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w=="], "@node-rs/bcrypt-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@0.45.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w=="], - "@radix-ui/react-alert-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-collection/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-menu/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-popover/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-select/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], - - "@radix-ui/react-slot/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw=="], + "@platejs/core/nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="], "@radix-ui/react-tabs/@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], @@ -1879,7 +2439,7 @@ "@radix-ui/react-toggle-group/@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.4", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-D2ReXCuIueKf5L2f1ks/wTj3bWck1SvK1pjLmEHPbwksS1nOHBsvgY0b9Hypt81FczqBqSyLHQxn/vbsQ0gDHw=="], - "@radix-ui/react-tooltip/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + "@radix-ui/react-toolbar/@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q=="], "@react-email/preview-server/@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.3", "@radix-ui/react-primitive": "2.1.0", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zGFsPcFJNdQa/UNd6MOgF40BS054FIGj32oOWBllixz42f+AkQg3QJ1YT9pw7vs+Ai+EgWkh839h69GEK8oH2A=="], @@ -1919,7 +2479,7 @@ "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.6", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g=="], + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="], "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], @@ -1931,18 +2491,12 @@ "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], - "ajv/fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - - "ajv-keywords/fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], - "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "cmdk/@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.0.5", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-context": "1.0.1", "@radix-ui/react-dismissable-layer": "1.0.5", "@radix-ui/react-focus-guards": "1.0.1", "@radix-ui/react-focus-scope": "1.0.4", "@radix-ui/react-id": "1.0.1", "@radix-ui/react-portal": "1.0.4", "@radix-ui/react-presence": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-slot": "1.0.2", "@radix-ui/react-use-controllable-state": "1.0.1", "aria-hidden": "^1.1.1", "react-remove-scroll": "2.5.5" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q=="], - - "cmdk/@radix-ui/react-primitive": ["@radix-ui/react-primitive@1.0.3", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-slot": "1.0.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g=="], - "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "drizzle-kit/esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="], "engine.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], @@ -1955,10 +2509,20 @@ "gel/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "html-to-text/htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="], + + "htmlparser2/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + "juice/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], + "lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + "md-to-react-email/marked": ["marked@7.0.4", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "motion/framer-motion": ["framer-motion@11.18.2", "", { "dependencies": { "motion-dom": "^11.18.1", "motion-utils": "^11.18.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w=="], @@ -1967,8 +2531,16 @@ "next/sharp": ["sharp@0.34.4", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.0", "semver": "^7.7.2" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.4", "@img/sharp-darwin-x64": "0.34.4", "@img/sharp-libvips-darwin-arm64": "1.2.3", "@img/sharp-libvips-darwin-x64": "1.2.3", "@img/sharp-libvips-linux-arm": "1.2.3", "@img/sharp-libvips-linux-arm64": "1.2.3", "@img/sharp-libvips-linux-ppc64": "1.2.3", "@img/sharp-libvips-linux-s390x": "1.2.3", "@img/sharp-libvips-linux-x64": "1.2.3", "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", "@img/sharp-libvips-linuxmusl-x64": "1.2.3", "@img/sharp-linux-arm": "0.34.4", "@img/sharp-linux-arm64": "0.34.4", "@img/sharp-linux-ppc64": "0.34.4", "@img/sharp-linux-s390x": "0.34.4", "@img/sharp-linux-x64": "0.34.4", "@img/sharp-linuxmusl-arm64": "0.34.4", "@img/sharp-linuxmusl-x64": "0.34.4", "@img/sharp-wasm32": "0.34.4", "@img/sharp-win32-arm64": "0.34.4", "@img/sharp-win32-ia32": "0.34.4", "@img/sharp-win32-x64": "0.34.4" } }, "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA=="], + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + "path-scurry/lru-cache": ["lru-cache@11.2.2", "", {}, "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg=="], + "pdf-lib/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "player.style/media-chrome": ["media-chrome@4.13.1", "", { "dependencies": { "ce-la-react": "^0.3.0" } }, "sha512-jPPwYrFkM4ky27/xNYEeyRPOBC7qvru4Oydy7vQHMHplXLQJmjtcauhlLPvG0O5kkYFEaOBXv5zGYes/UxOoVw=="], + "postcss-load-config/lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], @@ -1979,12 +2551,16 @@ "react-email/ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], - "react-scan/@types/node": ["@types/node@20.19.19", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-pb1Uqj5WJP7wrcbLU7Ru4QtA0+3kAXrkutGiD26wUKzSMgNNaPARTUDQmElUXp64kh3cWdou3Q0C7qwwxqSFmg=="], + "react-promise-suspense/fast-deep-equal": ["fast-deep-equal@2.0.1", "", {}, "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w=="], + + "react-scan/@types/node": ["@types/node@20.19.21", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-CsGG2P3I5y48RPMfprQGfy4JPRZ6csfC3ltBZSRItG3ngggmNY/qs2uZKp4p9VbrpqNNSMzUZNFZKzgOGnd/VA=="], "react-scan/esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + "set-value/is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + "sharp/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], "socket.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], @@ -2009,6 +2585,10 @@ "tsx/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "use-file-picker/file-selector": ["file-selector@0.2.4", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-ZDsQNbrv6qRi1YTDOEWzf5J2KjZ9KMI1Q2SGeTkCJmNNW25Jg4TW4UMcmoqcg4WrAyKRcpBXdbWRxkfrOzVRbA=="], + + "web-resource-inliner/htmlparser2": ["htmlparser2@5.0.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^3.3.0", "domutils": "^2.4.2", "entities": "^2.0.0" } }, "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ=="], + "webpack/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], @@ -2019,6 +2599,8 @@ "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "zustand-x/use-sync-external-store": ["use-sync-external-store@1.4.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw=="], + "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], @@ -2087,6 +2669,8 @@ "@radix-ui/react-toggle/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w=="], + "@radix-ui/react-toolbar/@radix-ui/react-toggle-group/@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ=="], + "@react-email/preview-server/@radix-ui/react-collapsible/@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], "@react-email/preview-server/@radix-ui/react-collapsible/@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA=="], @@ -2157,38 +2741,10 @@ "@react-email/preview-server/tailwindcss/jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], - "@react-email/preview-server/tailwindcss/postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="], - "@vis.gl/react-maplibre/@maplibre/maplibre-gl-style-spec/json-stringify-pretty-compact": ["json-stringify-pretty-compact@3.0.0", "", {}, "sha512-Rc2suX5meI0S3bfdZuA7JMFBGkJ875ApfVyq2WHELjBiiG22My/l7/8zPpH/CfFVQHuVLd8NLR0nv6vi0BYYKA=="], "accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - "cmdk/@radix-ui/react-dialog/@radix-ui/primitive": ["@radix-ui/primitive@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10" } }, "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-context": ["@radix-ui/react-context@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.0.5", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/primitive": "1.0.1", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-use-callback-ref": "1.0.1", "@radix-ui/react-use-escape-keydown": "1.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.0.4", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-primitive": "1.0.3", "@radix-ui/react-use-callback-ref": "1.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-id": ["@radix-ui/react-id@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-layout-effect": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-portal": ["@radix-ui/react-portal@1.0.4", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-primitive": "1.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-presence": ["@radix-ui/react-presence@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1", "@radix-ui/react-use-layout-effect": "1.0.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-slot": ["@radix-ui/react-slot@1.0.2", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-callback-ref": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA=="], - - "cmdk/@radix-ui/react-dialog/react-remove-scroll": ["react-remove-scroll@2.5.5", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.3", "react-style-singleton": "^2.2.1", "tslib": "^2.1.0", "use-callback-ref": "^1.3.0", "use-sidecar": "^1.1.2" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw=="], - - "cmdk/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.0.2", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-compose-refs": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg=="], - "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "drizzle-kit/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="], @@ -2237,6 +2793,8 @@ "drizzle-kit/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="], + "html-to-text/htmlparser2/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "motion/framer-motion/motion-dom": ["motion-dom@11.18.1", "", { "dependencies": { "motion-utils": "^11.18.1" } }, "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw=="], "motion/framer-motion/motion-utils": ["motion-utils@11.18.1", "", {}, "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA=="], @@ -2355,6 +2913,12 @@ "sucrase/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + "web-resource-inliner/htmlparser2/domhandler": ["domhandler@3.3.0", "", { "dependencies": { "domelementtype": "^2.0.1" } }, "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA=="], + + "web-resource-inliner/htmlparser2/domutils": ["domutils@2.8.0", "", { "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", "domhandler": "^4.2.0" } }, "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A=="], + + "web-resource-inliner/htmlparser2/entities": ["entities@2.2.0", "", {}, "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="], + "webpack/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -2441,30 +3005,20 @@ "@react-email/preview-server/tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], - "@react-email/preview-server/tailwindcss/postcss-load-config/lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-dismissable-layer/@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-dismissable-layer/@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.0.3", "", { "dependencies": { "@babel/runtime": "^7.13.10", "@radix-ui/react-use-callback-ref": "1.0.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-focus-scope/@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-id/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-presence/@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ=="], - - "cmdk/@radix-ui/react-dialog/@radix-ui/react-use-controllable-state/@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ=="], - - "cmdk/@radix-ui/react-primitive/@radix-ui/react-slot/@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.0.1", "", { "dependencies": { "@babel/runtime": "^7.13.10" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0" }, "optionalPeers": ["@types/react"] }, "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw=="], - "react-email/ora/cli-cursor/restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "react-email/ora/log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], "react-email/ora/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "split-string/extend-shallow/is-extendable/is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + "sucrase/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + "web-resource-inliner/htmlparser2/domutils/dom-serializer": ["dom-serializer@1.4.1", "", { "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", "entities": "^2.0.0" } }, "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag=="], + + "web-resource-inliner/htmlparser2/domutils/domhandler": ["domhandler@4.3.1", "", { "dependencies": { "domelementtype": "^2.2.0" } }, "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ=="], + "@react-email/preview-server/@radix-ui/react-dropdown-menu/@radix-ui/react-menu/@radix-ui/react-popper/@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.4", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-qz+fxrqgNxG0dYew5l7qR3c7wdgRu1XVUHGnGYX7rg5HM4p9SWaRmJwfgR3J0SgyUKayLmzQIun+N6rWRgiRKw=="], "@react-email/preview-server/tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], diff --git a/messages/en-GB.json b/messages/en-GB.json index 3af1865e..81333726 100644 --- a/messages/en-GB.json +++ b/messages/en-GB.json @@ -17,7 +17,9 @@ "sort": "sort", "photoOf": "Photo of {name}", "skills": "Skills", + "yesterday": "Yesterday", "today": "Today", + "tomorrow": "Tomorrow", "selected": "Selected", "week": "Week", "nextMonth": "Next month", @@ -26,6 +28,7 @@ "selectYear": "Select year", "pickDate": "Pick a date", "dateFormat": "dd/MM/yyyy", + "search": "Search", "searchCountry": "Search country...", "noCountryFound": "No country found", "hidePassword": "Hide password", @@ -34,9 +37,146 @@ "delete": "Delete", "cancel": "Cancel", "save": "Save", + "copy": "Copy", + "done": "Done", + "accept": "Accept", + "duplicate": "Duplicate", + "redo": "Redo", + "undo": "Undo", + "clear": "Clear", + "custom": "Custom", "uploadText": "Drop files here or click to upload", "noValidFiles": "No valid files were dropped", - "noChoicesFound": "No choices found" + "noChoicesFound": "No choices found", + "noResults": "No results", + "plate": { + "typeSomething": "Type something...", + "turnInto": "Turn into", + "paragraph": "Paragraph", + "heading1": "Heading 1", + "heading2": "Heading 2", + "heading3": "Heading 3", + "heading4": "Heading 4", + "heading5": "Heading 5", + "heading6": "Heading 6", + "blockquote": "Blockquote", + "indent": "Indent", + "outdent": "Outdent", + "align": "Align", + "left": "Left", + "center": "Center", + "right": "Right", + "dragToMove": "Drag to move", + "dragToMoveColumn": "Drag to move column", + "searchLanguages": "Search languages...", + "noLanguageFound": "No language found", + "addEquation": "Add a Tex equation", + "newEquation": "New equation", + "markAsEquation": "Mark as equation", + "export": "Export", + "exportAsHtml": "Export as HTML", + "exportAsPdf": "Export as PDF", + "exportAsImage": "Export as Image", + "exportAsMarkdown": "Export as Markdown", + "import": "Import", + "importFromHtml": "Import from HTML", + "importFromMarkdown": "Import from Markdown", + "bold": "Bold (⌘+B)", + "italic": "Italic (⌘+I)", + "underline": "Underline (⌘+U)", + "strikethrough": "Strikethrough (⌘+⇧+M)", + "code": "Code (⌘+E)", + "textColor": "Text color", + "backgroundColor": "Background color", + "basicBlocks": "Basic blocks", + "text": "Text", + "table": "Table", + "quote": "Quote", + "divider": "Divider", + "lists": "Lists", + "bulletedList": "Bulleted list", + "numberedList": "Numbered list", + "todo": "To-do", + "todoList": "To-do list", + "expandableList": "Expandable list", + "media": "Media", + "image": "Image", + "embed": "Embed", + "advancedBlocks": "Advanced blocks", + "tableOfContents": "Table of contents", + "threeColumns": "Three columns", + "equation": "Equation", + "inline": "Inline", + "link": "Link", + "pasteLink": "Paste link", + "date": "Date", + "inlineEquation": "Inline equation", + "lineHeight": "Line height", + "textToDisplay": "Text to display", + "editLink": "Edit link", + "default": "Default", + "circle": "Circle", + "square": "Square", + "decimal": "Decimal", + "lowerAlpha": "Lower Alpha", + "upperAlpha": "Upper Alpha", + "lowerRoman": "Lower Roman", + "upperRoman": "Upper Roman", + "caption": "Caption", + "writeACaption": "Write a caption...", + "pasteEmbedLink": "Paste the embed link...", + "audio": "Audio", + "insertAudio": "Insert Audio", + "file": "File", + "video": "Video", + "insert": "Insert", + "insertFile": "Insert File", + "insertImage": "Insert Image", + "insertVideo": "Insert Video", + "uploadFromComputer": "Upload from Computer", + "insertViaUrl": "Insert via URL", + "invalidUrl": "Invalid URL", + "invalidFileSize": "The size of files {files} is invalid", + "invalidFileType": "The type of files {files} is invalid", + "tooLargeFiles": "The size of files {files} is too large. Max: {max}", + "tooFewFiles": "The minimum number of files is {min} for {type}", + "tooManyFiles": "The maximum number of files is {max} for {type}", + "editing": "Editing", + "viewing": "Viewing", + "suggestion": "Suggestion", + "editingMode": "Editing mode", + "viewingMode": "Viewing mode", + "keyboardInput": "Keyboard input", + "superscript": "Superscript", + "subscript": "Subscript", + "expandable": "Expandable", + "callout": "Callout", + "calloutDescription": "Insert a highlighted block.", + "cell": "Cell", + "mergeCells": "Merge cells", + "splitCell": "Split cell", + "cellBorders": "Cell borders", + "deleteTable": "Delete table", + "row": "Row", + "insertRowBefore": "Insert row before", + "insertRowAfter": "Insert row after", + "deleteRow": "Delete row", + "column": "Column", + "insertColumnBefore": "Insert column before", + "insertColumnAfter": "Insert column after", + "deleteColumn": "Delete column", + "topBorder": "Top border", + "bottomBorder": "Bottom border", + "leftBorder": "Left border", + "rightBorder": "Right border", + "noBorder": "No border", + "outerBorders": "Outer borders", + "colors": "Colors", + "customColors": "Custom Colors", + "defaultColors": "Default Colors", + "createHeading": "Create a heading to display the table of contents.", + "pickADate": "Pick a date" + } }, "error": { "notFound": "404 - Page not found", @@ -47,7 +187,10 @@ "tooManyRequestsDescription": "Please wait a moment before trying again.", "goToHomepage": "Return to homepage", "tryAgain": "Try again", - "invalidLocale": "Invalid locale: {locale}" + "invalidLocale": "Invalid locale: {locale}", + "failedToExportPDF": "Failed to export PDF", + "failedToExportImage": "Failed to export image", + "uploadFailed": "Failed to upload file" }, "auth": { "welcome": "Welcome!", @@ -764,12 +907,10 @@ }, "descriptionNorwegian": { "label": "Description (Norwegian)", - "placeholder": "Beskrivelse av arrangementet", "required": "Event description is required" }, "descriptionEnglish": { "label": "Description (English)", - "placeholder": "Description of the event", "required": "Event description is required" }, "locationNorwegian": { @@ -918,8 +1059,6 @@ "content": { "labelNorwegian": "Rule content (Norwegian)", "labelEnglish": "Rule content (English)", - "placeholderNorwegian": "Disse reglene gjelder for alle som bruker verkstedet. Rydd opp etter deg. Bruk verneutstyr når det er påkrevd...", - "placeholderEnglish": "These rules apply to everyone using the workshop. Clean up after yourself. Use protective equipment when required...", "required": "Rule content is required" }, "internal": { @@ -1228,7 +1367,9 @@ "notAuthenticated": "Not authenticated", "notAuthorized": "Not authorized", "noFileFound": "No file found", - "unableToUpdateMatrix": "Unable to update on Matrix" + "fileUploadFailed": "Failed to upload file", + "unableToUpdateMatrix": "Unable to update on Matrix", + "fileDeleteFailed": "Failed to delete file" }, "reservations": { "title": "Reservations", diff --git a/messages/nb-NO.json b/messages/nb-NO.json index ca7e65e3..98f3f541 100644 --- a/messages/nb-NO.json +++ b/messages/nb-NO.json @@ -17,7 +17,9 @@ "sort": "sortering", "photoOf": "Bilde av {name}", "skills": "Ferdigheter", + "yesterday": "I går", "today": "I dag", + "tomorrow": "I morgen", "selected": "Valgt", "week": "Uke", "nextMonth": "Neste måned", @@ -26,6 +28,7 @@ "selectYear": "Velg år", "pickDate": "Velg en dato", "dateFormat": "dd.MM.yyyy", + "search": "Søk", "searchCountry": "Søk etter land...", "noCountryFound": "Ingen land funnet", "hidePassword": "Gjem passord", @@ -34,9 +37,146 @@ "delete": "Slett", "cancel": "Avbryt", "save": "Lagre", + "copy": "Kopier", + "done": "Ferdig", + "accept": "Godta", + "duplicate": "Dupliser", + "redo": "Gjør på nytt", + "undo": "Angre", + "clear": "Tøm", + "custom": "Egendefinert", "uploadText": "Slipp filer her eller klikk for å laste opp", "noValidFiles": "Ingen gyldige filer ble sluppet", - "noChoicesFound": "Ingen valg funnet" + "noChoicesFound": "Ingen valg funnet", + "noResults": "Ingen resultater", + "plate": { + "typeSomething": "Skriv noe...", + "turnInto": "Gjør om til", + "paragraph": "Avsnitt", + "heading1": "Overskrift 1", + "heading2": "Overskrift 2", + "heading3": "Overskrift 3", + "heading4": "Overskrift 4", + "heading5": "Overskrift 5", + "heading6": "Overskrift 6", + "blockquote": "Blokksitat", + "indent": "Innrykk", + "outdent": "Fjern innrykk", + "align": "Justering", + "left": "Venstre", + "center": "Senter", + "right": "Høyre", + "dragToMove": "Dra for å flytte", + "dragToMoveColumn": "Dra for å flytte kolonne", + "searchLanguages": "Søk etter språk...", + "noLanguageFound": "Ingen språk funnet", + "addEquation": "Legg til en Tex-likning", + "newEquation": "Ny likning", + "markAsEquation": "Marker som likning", + "export": "Eksporter", + "exportAsHtml": "Eksporter som HTML", + "exportAsPdf": "Eksporter som PDF", + "exportAsImage": "Eksporter som bilde", + "exportAsMarkdown": "Eksporter som Markdown", + "import": "Importer", + "importFromHtml": "Importer fra HTML", + "importFromMarkdown": "Importer fra Markdown", + "bold": "Fet (⌘+B)", + "italic": "Kursiv (⌘+I)", + "underline": "Understreking (⌘+U)", + "strikethrough": "Gjennomstreking (⌘+⇧+M)", + "code": "Kode (⌘+E)", + "textColor": "Tekstfarge", + "backgroundColor": "Bakgrunnsfarge", + "basicBlocks": "Grunnleggende blokker", + "text": "Tekst", + "table": "Tabell", + "quote": "Sitat", + "divider": "Skillelinje", + "lists": "Lister", + "bulletedList": "Punktliste", + "numberedList": "Nummerert liste", + "todo": "Gjøremål", + "todoList": "Gjøremålsliste", + "expandableList": "Utvidbar liste", + "media": "Media", + "image": "Bilde", + "embed": "Embed", + "advancedBlocks": "Avanserte blokker", + "tableOfContents": "Innholdsfortegnelse", + "threeColumns": "Tre kolonner", + "equation": "Likning", + "inline": "Inline", + "link": "Lenke", + "pasteLink": "Lim inn lenke", + "date": "Dato", + "inlineEquation": "Inline-likning", + "lineHeight": "Linjehøyde", + "textToDisplay": "Tekst som vises", + "editLink": "Rediger lenke", + "default": "Standard", + "circle": "Sirkel", + "square": "Firkant", + "decimal": "Desimal", + "lowerAlpha": "Små bokstaver", + "upperAlpha": "Store bokstaver", + "lowerRoman": "Små romertall", + "upperRoman": "Store romertall", + "caption": "Beskrivelse", + "writeACaption": "Skriv en beskrivelse...", + "pasteEmbedLink": "Lim inn embedlenke...", + "audio": "Lyd", + "insertAudio": "Sett inn lyd", + "file": "Fil", + "video": "Video", + "insert": "Sett inn", + "insertFile": "Sett inn fil", + "insertImage": "Sett inn bilde", + "insertVideo": "Sett inn video", + "uploadFromComputer": "Last opp fra datamaskin", + "insertViaUrl": "Sett inn via URL", + "invalidUrl": "Ugyldig URL", + "invalidFileSize": "Størrelsen på filene {files} er ugyldig", + "invalidFileType": "Filtypen til filene {files} er ugyldig", + "tooLargeFiles": "Størrelsen på filene {files} er for stor. Maks: {max}", + "tooFewFiles": "Minimum antall filer er {min} for {type}", + "tooManyFiles": "Maksimalt antall filer er {max} for {type}", + "editing": "Redigering", + "viewing": "Visning", + "suggestion": "Forslag", + "editingMode": "Redigeringsmodus", + "viewingMode": "Visningsmodus", + "keyboardInput": "Tastaturknapp", + "superscript": "Hevet skrift", + "subscript": "Senket skrift", + "expandable": "Utvidbar", + "callout": "Callout", + "calloutDescription": "Sett inn en uthevet blokk.", + "cell": "Celle", + "mergeCells": "Slå sammen celler", + "splitCell": "Del celle", + "cellBorders": "Cellekanter", + "deleteTable": "Slett tabell", + "row": "Rad", + "insertRowBefore": "Sett inn rad før", + "insertRowAfter": "Sett inn rad etter", + "deleteRow": "Slett rad", + "column": "Kolonne", + "insertColumnBefore": "Sett inn kolonne før", + "insertColumnAfter": "Sett inn kolonne etter", + "deleteColumn": "Slett kolonne", + "topBorder": "Øverste kant", + "bottomBorder": "Nederste kant", + "leftBorder": "Venstre kant", + "rightBorder": "Høyre kant", + "noBorder": "Ingen kant", + "outerBorders": "Ytre kanter", + "colors": "Farger", + "customColors": "Egendefinerte farger", + "defaultColors": "Standardfarger", + "createHeading": "Lag en overskrift for å vise innholdsfortegnelsen.", + "pickADate": "Velg en dato" + } }, "error": { "notFound": "404 - Siden ble ikke funnet", @@ -47,7 +187,10 @@ "tooManyRequestsDescription": "Vennligst vent litt og prøv igjen.", "goToHomepage": "Gå tilbake til hjemmesiden", "tryAgain": "Prøv igjen", - "invalidLocale": "Ugyldig språk: {locale}" + "invalidLocale": "Ugyldig språk: {locale}", + "failedToExportPDF": "Kunne ikke eksportere PDF", + "failedToExportImage": "Kunne ikke eksportere bilde", + "uploadFailed": "Kunne ikke laste opp fil" }, "auth": { "welcome": "Velkommen!", @@ -764,12 +907,10 @@ }, "descriptionNorwegian": { "label": "Beskrivelse (norsk)", - "placeholder": "Beskrivelse av arrangementet", "required": "Beskrivelse er påkrevd" }, "descriptionEnglish": { "label": "Beskrivelse (engelsk)", - "placeholder": "Description of the event", "required": "Beskrivelse er påkrevd" }, "locationNorwegian": { @@ -918,8 +1059,6 @@ "content": { "labelNorwegian": "Regelinnhold (norsk)", "labelEnglish": "Regelinnhold (engelsk)", - "placeholderNorwegian": "Disse reglene gjelder for alle som bruker verkstedet. Rydd opp etter deg. Bruk verneutstyr når det er påkrevd...", - "placeholderEnglish": "These rules apply to everyone using the workshop. Clean up after yourself. Use protective equipment when required...", "required": "Regelinnhold er påkrevd" }, "internal": { @@ -1228,7 +1367,9 @@ "notAuthenticated": "Ikke autentisert", "notAuthorized": "Ikke autorisert", "noFileFound": "Ingen fil funnet", - "unableToUpdateMatrix": "Kunne ikke oppdatere på Matrix" + "fileUploadFailed": "Kunne ikke laste opp filen", + "unableToUpdateMatrix": "Kunne ikke oppdatere på Matrix", + "fileDeleteFailed": "Kunne ikke slette filen" }, "reservations": { "title": "Reservasjoner", diff --git a/package.json b/package.json index d90a4bdd..0b748b43 100644 --- a/package.json +++ b/package.json @@ -37,8 +37,10 @@ "email:dev": "bun run email dev --dir src/emails --port 3080" }, "dependencies": { + "@ariakit/react": "^0.4.17", "@aws-sdk/client-s3": "^3.806.0", "@aws-sdk/s3-request-presigner": "^3.806.0", + "@emoji-mart/data": "1.2.1", "@fullcalendar/core": "^6.1.15", "@fullcalendar/daygrid": "^6.1.15", "@fullcalendar/interaction": "^6.1.15", @@ -46,21 +48,50 @@ "@fullcalendar/timegrid": "^6.1.15", "@oslojs/crypto": "^1.0.1", "@oslojs/encoding": "^1.1.0", + "@platejs/autoformat": "^49.0.0", + "@platejs/basic-nodes": "^49.0.0", + "@platejs/basic-styles": "^49.0.0", + "@platejs/callout": "^49.0.0", + "@platejs/caption": "^49.0.0", + "@platejs/code-block": "^49.0.0", + "@platejs/combobox": "^49.0.0", + "@platejs/date": "^49.0.2", + "@platejs/dnd": "^49.2.7", + "@platejs/docx": "^49.0.0", + "@platejs/emoji": "^49.0.0", + "@platejs/floating": "^49.0.0", + "@platejs/indent": "^49.0.0", + "@platejs/juice": "^49.0.0", + "@platejs/layout": "^49.2.1", + "@platejs/link": "^49.1.1", + "@platejs/list": "^49.2.0", + "@platejs/markdown": "^49.2.1", + "@platejs/math": "^49.0.0", + "@platejs/media": "^49.0.0", + "@platejs/mention": "^49.0.0", + "@platejs/resizable": "^49.0.0", + "@platejs/selection": "^49.2.4", + "@platejs/slash-command": "^49.0.0", + "@platejs/table": "^49.1.13", + "@platejs/toc": "^49.0.0", + "@platejs/toggle": "^49.0.0", "@radix-ui/react-accordion": "^1.2.11", - "@radix-ui/react-alert-dialog": "^1.1.13", - "@radix-ui/react-avatar": "^1.1.9", - "@radix-ui/react-checkbox": "^1.3.1", + "@radix-ui/react-alert-dialog": "^1.1.14", + "@radix-ui/react-avatar": "^1.1.10", + "@radix-ui/react-checkbox": "^1.3.2", "@radix-ui/react-collapsible": "^1.1.10", - "@radix-ui/react-dialog": "^1.1.13", - "@radix-ui/react-dropdown-menu": "^2.1.14", + "@radix-ui/react-context-menu": "^2.2.16", + "@radix-ui/react-dialog": "^1.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.15", "@radix-ui/react-label": "^2.1.6", - "@radix-ui/react-popover": "^1.1.13", + "@radix-ui/react-popover": "^1.1.14", "@radix-ui/react-radio-group": "^1.3.6", "@radix-ui/react-scroll-area": "^1.2.8", "@radix-ui/react-select": "^2.2.4", - "@radix-ui/react-separator": "^1.1.6", - "@radix-ui/react-slot": "1.1.2", - "@radix-ui/react-tooltip": "^1.2.6", + "@radix-ui/react-separator": "^1.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@radix-ui/react-toolbar": "^1.1.10", + "@radix-ui/react-tooltip": "^1.2.7", "@react-email/components": "0.5.1", "@t3-oss/env-nextjs": "^0.12.0", "@tanstack/react-form": "^1.11.0", @@ -71,16 +102,21 @@ "@trpc/server": "^11.1.2", "@tsparticles/react": "^3.0.0", "@types/lodash.debounce": "^4.0.9", - "cmdk": "1.0.0", + "@udecode/cn": "^49.0.15", + "cmdk": "^1.1.1", "country-flag-icons": "^1.5.19", + "csstype": "^3.1.3", "cva": "^1.0.0-beta.3", "date-fns": "^4.1.0", "drizzle-orm": "^0.41.0", "drizzle-zod": "^0.7.1", + "html2canvas-pro": "^1.5.11", "input-otp": "^1.4.2", "libphonenumber-js": "^1.12.8", + "lodash": "^4.17.21", "lodash.debounce": "^4.0.8", - "lucide-react": "^0.486.0", + "lowlight": "^3.3.0", + "lucide-react": "^0.536.0", "maplibre-gl": "^5.5.0", "motion": "^11.18.2", "next": "^15.3.2", @@ -89,20 +125,30 @@ "nodemailer": "^6.10.1", "nuqs": "^2.4.3", "oslo": "^1.2.1", + "pdf-lib": "^1.17.1", + "platejs": "^49.2.6", "postgres": "^3.4.5", "posthog-js": "^1.240.5", "react": "^19.1.0", - "react-day-picker": "^9.6.7", + "react-day-picker": "^9.8.1", "react-dom": "^19.1.0", "react-dropzone": "^14.3.8", + "react-lite-youtube-embed": "^2.5.2", "react-map-gl": "^8.0.4", "react-phone-number-input": "^3.4.12", + "react-player": "^3.3.1", + "react-textarea-autosize": "^8.5.9", + "react-tweet": "^3.2.2", "reading-time": "^1.5.0", + "remark-gfm": "^4.0.1", + "remark-math": "^6.0.0", "run-script-os": "^1.1.6", - "sonner": "^2.0.3", + "sonner": "^2.0.7", "superjson": "^2.2.2", - "tailwind-merge": "^3.2.0", + "tailwind-merge": "^3.3.1", + "tailwind-scrollbar-hide": "^4.0.0", "tsparticles": "^3.8.1", + "use-file-picker": "2.1.2", "vaul": "^1.1.2", "zod": "^3.24.4" }, @@ -125,7 +171,7 @@ "react-scan": "^0.2.14", "server-only": "^0.0.1", "tailwindcss": "^4.1.6", - "tw-animate-css": "^1.2.9", + "tw-animate-css": "^1.3.6", "tw-clamp-css": "^2.0.0", "typescript": "^5.8.3" }, diff --git a/src/app/[locale]/(default)/about/group/[name]/edit/page.tsx b/src/app/[locale]/(default)/about/group/[name]/edit/page.tsx index 28ee386b..6803f9a2 100644 --- a/src/app/[locale]/(default)/about/group/[name]/edit/page.tsx +++ b/src/app/[locale]/(default)/about/group/[name]/edit/page.tsx @@ -50,7 +50,7 @@ export default async function EditGroupPage({ return notFound(); } - const { about, groups, ui } = await getMessages(); + const { about, groups, ui, error } = await getMessages(); return ( <> @@ -68,7 +68,10 @@ export default async function EditGroupPage({ + { about, groups, ui, error } as Pick< + Messages, + 'about' | 'groups' | 'ui' | 'error' + > } >
diff --git a/src/app/[locale]/(default)/about/group/[name]/page.tsx b/src/app/[locale]/(default)/about/group/[name]/page.tsx index ffe9eb39..dbc33bde 100644 --- a/src/app/[locale]/(default)/about/group/[name]/page.tsx +++ b/src/app/[locale]/(default)/about/group/[name]/page.tsx @@ -9,6 +9,7 @@ import { notFound } from 'next/navigation'; import type { Locale } from 'next-intl'; import { getTranslations, setRequestLocale } from 'next-intl/server'; import { Link } from '@/components/ui/Link'; +import { PlateEditorView } from '@/components/ui/plate/PlateEditorView'; import { api } from '@/lib/api/server'; import type { SelectUser } from '@/server/db/tables'; @@ -114,7 +115,7 @@ export default async function GroupPage({ />
)} -

{groupLocalization.description}

+ {members.length === 0 && (
diff --git a/src/app/[locale]/(default)/about/group/new/page.tsx b/src/app/[locale]/(default)/about/group/new/page.tsx index 3c35bc17..bbe0e606 100644 --- a/src/app/[locale]/(default)/about/group/new/page.tsx +++ b/src/app/[locale]/(default)/about/group/new/page.tsx @@ -27,7 +27,7 @@ export default async function NewGroupPage({ const { user } = await api.auth.state(); const t = await getTranslations('groups'); - const { about, groups, ui } = await getMessages(); + const { about, groups, ui, error } = await getMessages(); if ( !user?.groups.some((g) => ['labops', 'leadership', 'admin'].includes(g)) @@ -52,7 +52,10 @@ export default async function NewGroupPage({
+ { about, groups, ui, error } as Pick< + Messages, + 'about' | 'groups' | 'ui' | 'error' + > } >
diff --git a/src/app/[locale]/(default)/events/[eventId]/edit/page.tsx b/src/app/[locale]/(default)/events/[eventId]/edit/page.tsx index db9795cb..4267bd36 100644 --- a/src/app/[locale]/(default)/events/[eventId]/edit/page.tsx +++ b/src/app/[locale]/(default)/events/[eventId]/edit/page.tsx @@ -28,7 +28,7 @@ export default async function EditEventPage({ setRequestLocale(locale as Locale); const t = await getTranslations('events'); - const { ui, events } = await getMessages(); + const { ui, error, events } = await getMessages(); const skills = await api.skills.fetchAllSkills(); const { user } = await api.auth.state(); @@ -62,7 +62,9 @@ export default async function EditEventPage({

{t('edit.title')}

} + messages={ + { ui, error, events } as Pick + } >
diff --git a/src/app/[locale]/(default)/events/[eventId]/page.tsx b/src/app/[locale]/(default)/events/[eventId]/page.tsx index 210205de..7a926810 100644 --- a/src/app/[locale]/(default)/events/[eventId]/page.tsx +++ b/src/app/[locale]/(default)/events/[eventId]/page.tsx @@ -21,6 +21,7 @@ import { SkillIcon } from '@/components/skills/SkillIcon'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/Avatar'; import { Badge } from '@/components/ui/Badge'; import { ExternalLink, Link } from '@/components/ui/Link'; +import { PlateEditorView } from '@/components/ui/plate/PlateEditorView'; import { Separator } from '@/components/ui/Separator'; import { api } from '@/lib/api/server'; import { db } from '@/server/db'; @@ -163,7 +164,7 @@ export default async function EventDetailsPage({ >
-

{localization.description}

+

{t('title')}

} + messages={ + { ui, error, events } as Pick + } >
diff --git a/src/app/[locale]/(default)/news/[articleId]/edit/page.tsx b/src/app/[locale]/(default)/news/[articleId]/edit/page.tsx index 11403d74..edd9dfa4 100644 --- a/src/app/[locale]/(default)/news/[articleId]/edit/page.tsx +++ b/src/app/[locale]/(default)/news/[articleId]/edit/page.tsx @@ -28,7 +28,7 @@ export default async function EditArticlePage({ const { user } = await api.auth.state(); const t = await getTranslations('news'); - const { news, ui } = await getMessages(); + const { news, ui, error } = await getMessages(); if (Number.isNaN(Number(articleId))) return notFound(); @@ -58,7 +58,9 @@ export default async function EditArticlePage({

{t('updateArticle')}

} + messages={ + { news, ui, error } as Pick + } >
diff --git a/src/app/[locale]/(default)/news/[articleId]/page.tsx b/src/app/[locale]/(default)/news/[articleId]/page.tsx index 5d092994..e9783534 100644 --- a/src/app/[locale]/(default)/news/[articleId]/page.tsx +++ b/src/app/[locale]/(default)/news/[articleId]/page.tsx @@ -10,9 +10,10 @@ import { import readingTime from 'reading-time'; import { HackerspaceLogo } from '@/components/assets/logos'; import { AvatarIcon } from '@/components/profile/AvatarIcon'; -import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/Avatar'; +import { Avatar, AvatarFallback } from '@/components/ui/Avatar'; import { Badge } from '@/components/ui/Badge'; import { Link } from '@/components/ui/Link'; +import { PlateEditorView } from '@/components/ui/plate/PlateEditorView'; import { api } from '@/lib/api/server'; import { getFileUrl } from '@/server/services/files'; @@ -49,7 +50,7 @@ export default async function ArticlePage({ return notFound(); } - const { minutes } = readingTime(article.localization.content); + const { minutes } = readingTime(JSON.stringify(article.localization.content)); const { user } = await api.auth.state(); @@ -138,7 +139,9 @@ export default async function ArticlePage({
{`${article.views} ${t('views')}`} -
{article.localization.content}
+
+ +
); } diff --git a/src/app/[locale]/(default)/news/new/page.tsx b/src/app/[locale]/(default)/news/new/page.tsx index 32bb9f1b..bfff7652 100644 --- a/src/app/[locale]/(default)/news/new/page.tsx +++ b/src/app/[locale]/(default)/news/new/page.tsx @@ -27,7 +27,7 @@ export default async function NewArticlePage({ const { user } = await api.auth.state(); const t = await getTranslations('news'); - const { news, ui } = await getMessages(); + const { news, ui, error } = await getMessages(); if ( !user?.groups.some((g) => ['labops', 'leadership', 'admin'].includes(g)) @@ -51,7 +51,9 @@ export default async function NewArticlePage({

{t('newArticle')}

} + messages={ + { news, ui, error } as Pick + } >
diff --git a/src/app/[locale]/(default)/rules/(main)/new/page.tsx b/src/app/[locale]/(default)/rules/(main)/new/page.tsx index d3d07597..1bfaae14 100644 --- a/src/app/[locale]/(default)/rules/(main)/new/page.tsx +++ b/src/app/[locale]/(default)/rules/(main)/new/page.tsx @@ -27,7 +27,7 @@ export default async function NewRulePage({ const { user } = await api.auth.state(); const t = await getTranslations('rules'); - const { rules, ui } = await getMessages(); + const { rules, ui, error } = await getMessages(); if ( !user?.groups.some((g) => ['labops', 'leadership', 'admin'].includes(g)) @@ -51,7 +51,9 @@ export default async function NewRulePage({

{t('new.title')}

} + messages={ + { rules, ui, error } as Pick + } >
diff --git a/src/app/[locale]/(default)/rules/[subsetId]/edit/page.tsx b/src/app/[locale]/(default)/rules/[subsetId]/edit/page.tsx index fb057e55..348a7fbc 100644 --- a/src/app/[locale]/(default)/rules/[subsetId]/edit/page.tsx +++ b/src/app/[locale]/(default)/rules/[subsetId]/edit/page.tsx @@ -50,7 +50,7 @@ export default async function EditRulePage({ return notFound(); } - const { about, rules, ui } = await getMessages(); + const { about, rules, ui, error } = await getMessages(); return ( <> @@ -71,7 +71,10 @@ export default async function EditRulePage({
+ { about, rules, ui, error } as Pick< + Messages, + 'about' | 'rules' | 'ui' | 'error' + > } >
diff --git a/src/app/[locale]/(default)/rules/[subsetId]/page.tsx b/src/app/[locale]/(default)/rules/[subsetId]/page.tsx index b4663463..f1350598 100644 --- a/src/app/[locale]/(default)/rules/[subsetId]/page.tsx +++ b/src/app/[locale]/(default)/rules/[subsetId]/page.tsx @@ -3,6 +3,7 @@ import { notFound } from 'next/navigation'; import type { Locale } from 'next-intl'; import { getTranslations, setRequestLocale } from 'next-intl/server'; import { Link } from '@/components/ui/Link'; +import { PlateEditorView } from '@/components/ui/plate/PlateEditorView'; import { api } from '@/lib/api/server'; export async function generateMetadata({ @@ -81,7 +82,7 @@ export default async function RuleSubsetPage({ )}
-

{rule.localization.content}

+ ); } diff --git a/src/components/events/EditEventForm.tsx b/src/components/events/EditEventForm.tsx index deae4a7b..01ebf800 100644 --- a/src/components/events/EditEventForm.tsx +++ b/src/components/events/EditEventForm.tsx @@ -26,7 +26,7 @@ import { Spinner } from '@/components/ui/Spinner'; import { toast } from '@/components/ui/Toaster'; import { api } from '@/lib/api/client'; import { useRouter } from '@/lib/locale/navigation'; -import { fileToBase64String } from '@/lib/utils/files'; +import { deleteUnusedEditorFiles, fileToBase64String } from '@/lib/utils/files'; import type { RouterOutput } from '@/server/api'; import { createEventSchema } from '@/validations/events/createEventSchema'; import { editEventWithoutIdSchema } from '@/validations/events/editEventWithoutIdSchema'; @@ -96,6 +96,8 @@ function EditEventForm({ }, }); + const deleteFile = api.utils.deleteFile.useMutation(); + const form = useAppForm({ validators: { onChange: schema, @@ -106,8 +108,8 @@ function EditEventForm({ nameEnglish: english?.name ?? '', summaryNorwegian: norwegian?.summary ?? '', summaryEnglish: english?.summary ?? '', - descriptionNorwegian: norwegian?.description ?? '', - descriptionEnglish: english?.description ?? '', + descriptionNorwegian: norwegian?.description ?? [], + descriptionEnglish: english?.description ?? [], locationEnglish: english?.location ?? '', locationNorwegian: norwegian?.location ?? '', startTime: event?.startTime ?? addDays(new Date(), 1), @@ -118,8 +120,18 @@ function EditEventForm({ internal: event?.internal ?? false, skill: event?.skill?.identifier ?? '', }, - onSubmit: ({ value }) => { + onSubmit: async ({ value }) => { if (event) { + await deleteUnusedEditorFiles( + english?.description ?? [], + value.descriptionEnglish, + deleteFile.mutateAsync, + ); + await deleteUnusedEditorFiles( + norwegian?.description ?? [], + value.descriptionNorwegian, + deleteFile.mutateAsync, + ); return editEvent.mutate({ id: event.id, ...value }); } createEvent.mutate(value); @@ -236,19 +248,11 @@ function EditEventForm({ {(field) => ( - + )} - {(field) => ( - - )} + {(field) => } {(field) => ( diff --git a/src/components/events/EditEventFormSkeleton.tsx b/src/components/events/EditEventFormSkeleton.tsx index dded93aa..e788ddc6 100644 --- a/src/components/events/EditEventFormSkeleton.tsx +++ b/src/components/events/EditEventFormSkeleton.tsx @@ -29,9 +29,9 @@ async function EditEventFormSkeleton() { - + - + diff --git a/src/components/events/EventCard.tsx b/src/components/events/EventCard.tsx index 7ee66a5a..bd54fbce 100644 --- a/src/components/events/EventCard.tsx +++ b/src/components/events/EventCard.tsx @@ -7,7 +7,6 @@ import { Badge } from '@/components/ui/Badge'; import { Card, CardContent, - CardDescription, CardFooter, CardHeader, CardTitle, @@ -82,7 +81,6 @@ function EventCard({ > {event.localization.name} - {event.localization.summary} {event.internal && ( {t.internal} @@ -92,7 +90,7 @@ function EventCard({

- {event.localization.description} + {event.localization.summary}

{event.skill && ( diff --git a/src/components/groups/GroupForm.tsx b/src/components/groups/GroupForm.tsx index 263b9dbc..deb997a7 100644 --- a/src/components/groups/GroupForm.tsx +++ b/src/components/groups/GroupForm.tsx @@ -19,6 +19,7 @@ import { Spinner } from '@/components/ui/Spinner'; import { toast } from '@/components/ui/Toaster'; import { api } from '@/lib/api/client'; import { useRouter } from '@/lib/locale/navigation'; +import { deleteUnusedEditorFiles } from '@/lib/utils/files'; import type { RouterOutput } from '@/server/api'; import { groupSchema } from '@/validations/groups/groupSchema'; @@ -57,6 +58,7 @@ function GroupForm({ router.push('/about'); }, }); + const deleteFile = api.utils.deleteFile.useMutation(); const english = group ? group.localizations.find( @@ -80,14 +82,24 @@ function GroupForm({ nameEnglish: english?.name ?? '', summaryNorwegian: norwegian?.summary ?? '', summaryEnglish: english?.summary ?? '', - descriptionNorwegian: norwegian?.description ?? '', - descriptionEnglish: english?.description ?? '', + descriptionNorwegian: norwegian?.description ?? [], + descriptionEnglish: english?.description ?? [], identifier: group?.identifier ?? '', internal: group?.internal ?? false, openForApplications: group?.openForApplications ?? false, }, - onSubmit: ({ value }) => { + onSubmit: async ({ value }) => { if (group) { + await deleteUnusedEditorFiles( + english?.description ?? [], + value.descriptionEnglish, + deleteFile.mutateAsync, + ); + await deleteUnusedEditorFiles( + norwegian?.description ?? [], + value.descriptionNorwegian, + deleteFile.mutateAsync, + ); return editGroup.mutate({ ...value, previousIdentifier: group.identifier, @@ -190,12 +202,12 @@ function GroupForm({ {(field) => ( - + )} {(field) => ( - + )} diff --git a/src/components/groups/GroupFormSkeleton.tsx b/src/components/groups/GroupFormSkeleton.tsx index 5a36515f..5e0a607f 100644 --- a/src/components/groups/GroupFormSkeleton.tsx +++ b/src/components/groups/GroupFormSkeleton.tsx @@ -15,27 +15,27 @@ async function GroupFormSkeleton() {
- + - + - + - + - + - +

{t('identifier.description')}

- +
- +

@@ -44,7 +44,7 @@ async function GroupFormSkeleton() {

- +

diff --git a/src/components/news/ArticleForm.tsx b/src/components/news/ArticleForm.tsx index 2faccf67..cc96ddcc 100644 --- a/src/components/news/ArticleForm.tsx +++ b/src/components/news/ArticleForm.tsx @@ -19,6 +19,7 @@ import { Spinner } from '@/components/ui/Spinner'; import { toast } from '@/components/ui/Toaster'; import { api } from '@/lib/api/client'; import { useRouter } from '@/lib/locale/navigation'; +import { deleteUnusedEditorFiles } from '@/lib/utils/files'; import type { RouterOutput } from '@/server/api'; import { newsArticleSchema } from '@/validations/news/newsArticleSchema'; @@ -56,6 +57,7 @@ function ArticleForm({ router.push('/news'); }, }); + const deleteFile = api.utils.deleteFile.useMutation(); const english = article?.localizations.find((loc) => loc.locale === 'en-GB'); @@ -71,12 +73,22 @@ function ArticleForm({ image: null as string | null, titleNorwegian: norwegian?.title ?? '', titleEnglish: english?.title ?? '', - contentNorwegian: norwegian?.content ?? '', - contentEnglish: english?.content ?? '', + contentNorwegian: norwegian?.content ?? [], + contentEnglish: english?.content ?? [], internal: article?.internal ?? false, }, - onSubmit: ({ value }) => { + onSubmit: async ({ value }) => { if (article) { + await deleteUnusedEditorFiles( + english?.content ?? [], + value.contentEnglish, + deleteFile.mutateAsync, + ); + await deleteUnusedEditorFiles( + norwegian?.content ?? [], + value.contentNorwegian, + deleteFile.mutateAsync, + ); return updateArticle.mutate({ ...value, id: article.id, @@ -152,12 +164,10 @@ function ArticleForm({ {(field) => } - {(field) => ( - - )} + {(field) => } - {(field) => } + {(field) => } {(field) => ( diff --git a/src/components/news/ArticleFormSkeleton.tsx b/src/components/news/ArticleFormSkeleton.tsx index a4614420..fd6d0549 100644 --- a/src/components/news/ArticleFormSkeleton.tsx +++ b/src/components/news/ArticleFormSkeleton.tsx @@ -15,16 +15,16 @@ async function ArticleFormSkeleton() {

- + - + - + - +
- +

diff --git a/src/components/rules/RuleForm.tsx b/src/components/rules/RuleForm.tsx index d6e15dd2..e6a70101 100644 --- a/src/components/rules/RuleForm.tsx +++ b/src/components/rules/RuleForm.tsx @@ -19,6 +19,7 @@ import { Spinner } from '@/components/ui/Spinner'; import { toast } from '@/components/ui/Toaster'; import { api } from '@/lib/api/client'; import { useRouter } from '@/lib/locale/navigation'; +import { deleteUnusedEditorFiles } from '@/lib/utils/files'; import type { RouterOutput } from '@/server/api'; import { ruleSchema } from '@/validations/rules/ruleSchema'; @@ -59,6 +60,7 @@ function RuleForm({ rule }: { rule?: RouterOutput['rules']['fetchRule'] }) { router.push('/rules'); }, }); + const deleteFile = api.utils.deleteFile.useMutation(); const norwegian = rule?.localizations.find((loc) => loc.locale === 'nb-NO'); const english = rule?.localizations.find((loc) => loc.locale === 'en-GB'); @@ -71,12 +73,22 @@ function RuleForm({ rule }: { rule?: RouterOutput['rules']['fetchRule'] }) { image: null as string | null, nameNorwegian: norwegian?.name ?? '', nameEnglish: english?.name ?? '', - contentNorwegian: norwegian?.content ?? '', - contentEnglish: english?.content ?? '', + contentNorwegian: norwegian?.content ?? [], + contentEnglish: english?.content ?? [], internal: rule?.internal ?? false, }, - onSubmit: ({ value }) => { + onSubmit: async ({ value }) => { if (rule) { + await deleteUnusedEditorFiles( + english?.content ?? [], + value.contentEnglish, + deleteFile.mutateAsync, + ); + await deleteUnusedEditorFiles( + norwegian?.content ?? [], + value.contentNorwegian, + deleteFile.mutateAsync, + ); return editRule.mutate({ ...value, id: rule.id, @@ -161,20 +173,10 @@ function RuleForm({ rule }: { rule?: RouterOutput['rules']['fetchRule'] }) { )} - {(field) => ( - - )} + {(field) => } - {(field) => ( - - )} + {(field) => } {(field) => ( diff --git a/src/components/rules/RuleFormSkeleton.tsx b/src/components/rules/RuleFormSkeleton.tsx index 39f558b6..44b63523 100644 --- a/src/components/rules/RuleFormSkeleton.tsx +++ b/src/components/rules/RuleFormSkeleton.tsx @@ -15,16 +15,16 @@ function RuleFormSkeleton() {

- + - + - + - +
- +

diff --git a/src/components/ui/ContextMenu.tsx b/src/components/ui/ContextMenu.tsx new file mode 100644 index 00000000..b68de48b --- /dev/null +++ b/src/components/ui/ContextMenu.tsx @@ -0,0 +1,252 @@ +'use client'; + +import * as ContextMenuPrimitive from '@radix-ui/react-context-menu'; +import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react'; +import type * as React from 'react'; + +import { cx } from '@/lib/utils'; + +function ContextMenu({ + ...props +}: React.ComponentPropsWithRef) { + return ; +} + +function ContextMenuTrigger({ + ...props +}: React.ComponentPropsWithRef) { + return ( + + ); +} + +function ContextMenuGroup({ + ...props +}: React.ComponentPropsWithRef) { + return ( + + ); +} + +function ContextMenuPortal({ + ...props +}: React.ComponentPropsWithRef) { + return ( + + ); +} + +function ContextMenuSub({ + ...props +}: React.ComponentPropsWithRef) { + return ; +} + +function ContextMenuRadioGroup({ + ...props +}: React.ComponentPropsWithRef) { + return ( + + ); +} + +function ContextMenuSubTrigger({ + className, + inset, + children, + ...props +}: React.ComponentPropsWithRef & { + inset?: boolean; +}) { + return ( + + {children} + + + ); +} + +function ContextMenuSubContent({ + className, + ...props +}: React.ComponentPropsWithRef) { + return ( + + ); +} + +function ContextMenuContent({ + className, + ...props +}: React.ComponentPropsWithRef) { + return ( + + + + ); +} + +function ContextMenuItem({ + className, + inset, + variant = 'default', + ...props +}: React.ComponentPropsWithRef & { + inset?: boolean; + variant?: 'default' | 'destructive'; +}) { + return ( + + ); +} + +function ContextMenuCheckboxItem({ + className, + children, + checked, + ...props +}: React.ComponentPropsWithRef) { + return ( + + + + + + + {children} + + ); +} + +function ContextMenuRadioItem({ + className, + children, + ...props +}: React.ComponentPropsWithRef) { + return ( + + + + + + + {children} + + ); +} + +function ContextMenuLabel({ + className, + inset, + ...props +}: React.ComponentPropsWithRef & { + inset?: boolean; +}) { + return ( + + ); +} + +function ContextMenuSeparator({ + className, + ...props +}: React.ComponentPropsWithRef) { + return ( + + ); +} + +function ContextMenuShortcut({ + className, + ...props +}: React.ComponentPropsWithRef<'span'>) { + return ( + + ); +} + +export { + ContextMenu, + ContextMenuTrigger, + ContextMenuContent, + ContextMenuItem, + ContextMenuCheckboxItem, + ContextMenuRadioItem, + ContextMenuLabel, + ContextMenuSeparator, + ContextMenuShortcut, + ContextMenuGroup, + ContextMenuPortal, + ContextMenuSub, + ContextMenuSubContent, + ContextMenuSubTrigger, + ContextMenuRadioGroup, +}; diff --git a/src/components/ui/DateTimePicker.tsx b/src/components/ui/DateTimePicker.tsx index f309cdec..8a4e07f9 100644 --- a/src/components/ui/DateTimePicker.tsx +++ b/src/components/ui/DateTimePicker.tsx @@ -7,8 +7,13 @@ import { Clock, } from 'lucide-react'; import { useTranslations } from 'next-intl'; -import * as React from 'react'; -import { useImperativeHandle, useRef } from 'react'; +import { + useEffect, + useImperativeHandle, + useMemo, + useRef, + useState, +} from 'react'; import { DayPicker, type DayPickerProps } from 'react-day-picker'; import { Button, buttonVariants } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; @@ -254,7 +259,7 @@ function Calendar({ yearRange = 50, ...props }: DayPickerProps & { yearRange?: number }) { - const MONTHS = React.useMemo(() => { + const MONTHS = useMemo(() => { let locale: Pick = enGB; const { options, localize, formatLong } = props.locale || {}; if (options && localize && formatLong) { @@ -267,7 +272,7 @@ function Calendar({ return genMonths(locale); }, [props.locale]); - const YEARS = React.useMemo(() => genYears(yearRange), [yearRange]); + const YEARS = useMemo(() => genYears(yearRange), [yearRange]); const disableLeftNavigation = () => { const today = new Date(); const startDate = new Date(today.getFullYear() - yearRange, 0, 1); @@ -492,14 +497,14 @@ function TimePickerInput({ ref, ...props }: TimePickerInputProps) { - const [flag, setFlag] = React.useState(false); - const [prevIntKey, setPrevIntKey] = React.useState('0'); + const [flag, setFlag] = useState(false); + const [prevIntKey, setPrevIntKey] = useState('0'); /** * allow the user to enter the second digit within 2 seconds * otherwise start again with entering first digit */ - React.useEffect(() => { + useEffect(() => { if (flag) { const timer = setTimeout(() => { setFlag(false); @@ -509,7 +514,7 @@ function TimePickerInput({ } }, [flag]); - const calculatedValue = React.useMemo(() => { + const calculatedValue = useMemo(() => { return getDateByType(date, picker); }, [date, picker]); @@ -601,11 +606,11 @@ function TimePicker({ granularity = 'second', ref, }: TimePickerProps) { - const minuteRef = React.useRef(null); - const hourRef = React.useRef(null); - const secondRef = React.useRef(null); - const periodRef = React.useRef(null); - const [period, setPeriod] = React.useState( + const minuteRef = useRef(null); + const hourRef = useRef(null); + const secondRef = useRef(null); + const periodRef = useRef(null); + const [period, setPeriod] = useState( date && date.getHours() >= 12 ? 'PM' : 'AM', ); @@ -741,9 +746,9 @@ function DateTimePicker({ ref, ...props }: DateTimePickerProps) { - const [month, setMonth] = React.useState(value ?? defaultPopupValue); + const [month, setMonth] = useState(value ?? defaultPopupValue); const buttonRef = useRef(null); - const [displayDate, setDisplayDate] = React.useState( + const [displayDate, setDisplayDate] = useState( value ?? undefined, ); const t = useTranslations('ui'); @@ -754,7 +759,7 @@ function DateTimePicker({ * Makes sure display date updates when value change on * parent component */ - React.useEffect(() => { + useEffect(() => { setDisplayDate(value); }, [value]); diff --git a/src/components/ui/Form.tsx b/src/components/ui/Form.tsx index 20005f79..7b78d6c1 100644 --- a/src/components/ui/Form.tsx +++ b/src/components/ui/Form.tsx @@ -3,6 +3,9 @@ import { Slot } from '@radix-ui/react-slot'; import { createFormHook, createFormHookContexts } from '@tanstack/react-form'; import { MapPinIcon, XIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import type { Value } from 'platejs'; +import { Plate, usePlateEditor } from 'platejs/react'; import type React from 'react'; import { Fragment, @@ -35,6 +38,9 @@ import { InputOtpSlot, } from '@/components/ui/InputOtp'; import { Label } from '@/components/ui/Label'; +import { Editor, EditorContainer } from '@/components/ui/plate/Editor'; +import { EditorKit } from '@/components/ui/plate/kits/EditorKit'; +import type { PlateEditor } from '@/components/ui/plate/PlateEditor'; import { RadioGroup, RadioGroupItem } from '@/components/ui/RadioGroup'; import { Select, @@ -45,6 +51,7 @@ import { } from '@/components/ui/Select'; import { Spinner } from '@/components/ui/Spinner'; import { Textarea } from '@/components/ui/Textarea'; +import { useDebounceCallback } from '@/lib/hooks/useDebounceCallback'; import { cx, type VariantProps } from '@/lib/utils'; import { fileToBase64String } from '@/lib/utils/files'; @@ -1019,6 +1026,63 @@ function CalendarField({ ); } +type EditorFieldProps = Omit< + React.ComponentProps, + 'value' | 'onChange' | 'onBlur' +> & { + className?: string; + label: string; + labelVisible?: boolean; + labelSibling?: React.ReactNode; + description?: string; +}; + +function EditorField({ + className, + label, + labelVisible, + labelSibling, + description, + ...props +}: EditorFieldProps) { + const field = useFieldContext(); + const editor = usePlateEditor({ + plugins: EditorKit(useTranslations()), + value: field.state.value, + ...props.initOptions, + }); + const debouncedOnChange = useDebounceCallback( + (value: Value) => field.handleChange(value), + 500, + ); + + return ( + + debouncedOnChange(value)} + {...props.plateOptions} + > + + + + + + ); +} + type SubmitButtonProps = Omit, 'type'> & VariantProps & { spinnerClassName?: string; @@ -1088,6 +1152,7 @@ const { useAppForm } = createFormHook({ FileUploadField, CurrencyField, CalendarField, + EditorField, }, formComponents: { SubmitButton, diff --git a/src/components/ui/Popover.tsx b/src/components/ui/Popover.tsx index a5d8c1a3..5195259f 100644 --- a/src/components/ui/Popover.tsx +++ b/src/components/ui/Popover.tsx @@ -36,4 +36,10 @@ function PopoverContent({ ); } -export { Popover, PopoverTrigger, PopoverContent }; +function PopoverAnchor({ + ...props +}: React.ComponentPropsWithRef) { + return ; +} + +export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }; diff --git a/src/components/ui/plate/AlignToolbarButton.tsx b/src/components/ui/plate/AlignToolbarButton.tsx new file mode 100644 index 00000000..dab91d6f --- /dev/null +++ b/src/components/ui/plate/AlignToolbarButton.tsx @@ -0,0 +1,87 @@ +'use client'; + +import type { Alignment } from '@platejs/basic-styles'; +import { TextAlignPlugin } from '@platejs/basic-styles/react'; +import type { DropdownMenuProps } from '@radix-ui/react-dropdown-menu'; +import { + AlignCenterIcon, + AlignJustifyIcon, + AlignLeftIcon, + AlignRightIcon, +} from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { useEditorPlugin, useSelectionFragmentProp } from 'platejs/react'; +import { useState } from 'react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuTrigger, +} from '@/components/ui/DropdownMenu'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; + +const items = [ + { + icon: AlignLeftIcon, + value: 'left', + }, + { + icon: AlignCenterIcon, + value: 'center', + }, + { + icon: AlignRightIcon, + value: 'right', + }, + { + icon: AlignJustifyIcon, + value: 'justify', + }, +]; + +function AlignToolbarButton(props: DropdownMenuProps) { + const { editor, tf } = useEditorPlugin(TextAlignPlugin); + const value = + useSelectionFragmentProp({ + defaultValue: 'start', + getProp: (node) => node.align, + }) ?? 'left'; + const t = useTranslations('ui.plate'); + + const [open, setOpen] = useState(false); + const IconValue = + items.find((item) => item.value === value)?.icon ?? AlignLeftIcon; + + return ( + + + + + + + + + { + tf.textAlign.setNodes(value as Alignment); + editor.tf.focus(); + }} + > + {items.map(({ icon: Icon, value: itemValue }) => ( + + + + ))} + + + + ); +} + +export { AlignToolbarButton }; diff --git a/src/components/ui/plate/BlockContextMenu.tsx b/src/components/ui/plate/BlockContextMenu.tsx new file mode 100644 index 00000000..f31caa8c --- /dev/null +++ b/src/components/ui/plate/BlockContextMenu.tsx @@ -0,0 +1,182 @@ +'use client'; + +import { + BLOCK_CONTEXT_MENU_ID, + BlockMenuPlugin, + BlockSelectionPlugin, +} from '@platejs/selection/react'; +import { useTranslations } from 'next-intl'; +import { KEYS } from 'platejs'; +import { useEditorPlugin, usePlateState } from 'platejs/react'; +import { useCallback } from 'react'; +import { + ContextMenu, + ContextMenuContent, + ContextMenuGroup, + ContextMenuItem, + ContextMenuSub, + ContextMenuSubContent, + ContextMenuSubTrigger, + ContextMenuTrigger, +} from '@/components/ui/ContextMenu'; +import { useIsTouchDevice } from '@/lib/hooks/useIsTouchDevice'; + +function BlockContextMenu({ children }: { children: React.ReactNode }) { + const { api, editor } = useEditorPlugin(BlockMenuPlugin); + const isTouch = useIsTouchDevice(); + const [readOnly] = usePlateState('readOnly'); + const t = useTranslations('ui'); + + const handleTurnInto = useCallback( + (type: string) => { + editor + .getApi(BlockSelectionPlugin) + .blockSelection.getNodes() + .forEach(([node, path]) => { + if (node[KEYS.listType]) { + editor.tf.unsetNodes([KEYS.listType, 'indent'], { + at: path, + }); + } + + editor.tf.toggleBlock(type, { at: path }); + }); + }, + [editor], + ); + + const handleAlign = useCallback( + (align: 'center' | 'left' | 'right') => { + editor + .getTransforms(BlockSelectionPlugin) + .blockSelection.setNodes({ align }); + }, + [editor], + ); + + if (isTouch) { + return children; + } + + return ( + { + if (!open) { + // prevent unselect the block selection + setTimeout(() => { + api.blockMenu.hide(); + }, 0); + } + }} + modal={false} + > + { + const dataset = (event.target as HTMLElement).dataset; + const disabled = + dataset?.slateEditor === 'true' || + readOnly || + dataset?.plateOpenContextMenu === 'false'; + + if (disabled) return event.preventDefault(); + + api.blockMenu.show(BLOCK_CONTEXT_MENU_ID, { + x: event.clientX, + y: event.clientY, + }); + }} + > +

{children}
+ + { + e.preventDefault(); + editor.getApi(BlockSelectionPlugin).blockSelection.focus(); + }} + > + + { + editor + .getTransforms(BlockSelectionPlugin) + .blockSelection.removeNodes(); + editor.tf.focus(); + }} + > + {t('delete')} + + { + editor + .getTransforms(BlockSelectionPlugin) + .blockSelection.duplicate(); + }} + > + {t('duplicate')} + {/* ⌘ + D */} + + + {t('plate.turnInto')} + + handleTurnInto(KEYS.p)}> + {t('plate.paragraph')} + + + handleTurnInto(KEYS.h1)}> + {t('plate.heading1')} + + handleTurnInto(KEYS.h2)}> + {t('plate.heading2')} + + handleTurnInto(KEYS.h3)}> + {t('plate.heading3')} + + handleTurnInto(KEYS.blockquote)}> + {t('plate.blockquote')} + + + + + + + + editor + .getTransforms(BlockSelectionPlugin) + .blockSelection.setIndent(1) + } + > + {t('plate.indent')} + + + editor + .getTransforms(BlockSelectionPlugin) + .blockSelection.setIndent(-1) + } + > + {t('plate.outdent')} + + + {t('plate.align')} + + handleAlign('left')}> + {t('plate.left')} + + handleAlign('center')}> + {t('plate.center')} + + handleAlign('right')}> + {t('plate.right')} + + + + + + + ); +} + +export { BlockContextMenu }; diff --git a/src/components/ui/plate/BlockDraggable.tsx b/src/components/ui/plate/BlockDraggable.tsx new file mode 100644 index 00000000..23161fba --- /dev/null +++ b/src/components/ui/plate/BlockDraggable.tsx @@ -0,0 +1,538 @@ +'use client'; + +import { DndPlugin, useDraggable, useDropLine } from '@platejs/dnd'; +import { expandListItemsWithChildren } from '@platejs/list'; +import { BlockSelectionPlugin } from '@platejs/selection/react'; +import { GripVertical } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { getPluginByType, isType, KEYS, type TElement } from 'platejs'; +import { + MemoizedChildren, + type PlateEditor, + type PlateElementProps, + type RenderNodeWrapper, + useEditorRef, + useElement, + usePluginOption, + useSelected, +} from 'platejs/react'; +import { memo, useEffect, useMemo, useState } from 'react'; +import { Button } from '@/components/ui/Button'; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/Tooltip'; +import { cx } from '@/lib/utils'; + +const UNDRAGGABLE_KEYS = [KEYS.column, KEYS.tr, KEYS.td]; + +const BlockDraggable: RenderNodeWrapper = (props) => { + const { editor, element, path } = props; + + const enabled = useMemo(() => { + if (editor.dom.readOnly) return false; + + if (path.length === 1 && !isType(editor, element, UNDRAGGABLE_KEYS)) { + return true; + } + if (path.length === 3 && !isType(editor, element, UNDRAGGABLE_KEYS)) { + const block = editor.api.some({ + at: path, + match: { + type: editor.getType(KEYS.column), + }, + }); + + if (block) { + return true; + } + } + if (path.length === 4 && !isType(editor, element, UNDRAGGABLE_KEYS)) { + const block = editor.api.some({ + at: path, + match: { + type: editor.getType(KEYS.table), + }, + }); + + if (block) { + return true; + } + } + + return false; + }, [editor, element, path]); + + if (!enabled) return; + + return (props) => ; +}; + +function Draggable(props: PlateElementProps) { + const { children, editor, element, path } = props; + const blockSelectionApi = editor.getApi(BlockSelectionPlugin).blockSelection; + + const { isAboutToDrag, isDragging, nodeRef, previewRef, handleRef } = + useDraggable({ + element, + onDropHandler: (_, { dragItem }) => { + const id = (dragItem as { id: string[] | string }).id; + + if (blockSelectionApi) { + blockSelectionApi.add(id); + } + resetPreview(); + }, + }); + + const isInColumn = path.length === 3; + const isInTable = path.length === 4; + + const [previewTop, setPreviewTop] = useState(0); + + const resetPreview = () => { + if (previewRef.current) { + previewRef.current.replaceChildren(); + previewRef.current?.classList.add('hidden'); + } + }; + + // clear up virtual multiple preview when drag end + // biome-ignore lint/correctness/useExhaustiveDependencies: off + useEffect(() => { + if (!isDragging) { + resetPreview(); + } + }, [isDragging]); + + // biome-ignore lint/correctness/useExhaustiveDependencies: off + useEffect(() => { + if (isAboutToDrag) { + previewRef.current?.classList.remove('opacity-0'); + } + }, [isAboutToDrag]); + + const [dragButtonTop, setDragButtonTop] = useState(0); + + return ( + // biome-ignore lint/a11y/noStaticElementInteractions: Side effects only +
{ + if (isDragging) return; + const newValue = calcDragButtonTop(editor, element); + newValue && setDragButtonTop(newValue); + }} + > + {!isInTable && ( + +
+
+ +
+
+
+ )} + + + ); +} + +function Gutter({ + children, + className, + ...props +}: React.ComponentProps<'div'>) { + const editor = useEditorRef(); + const element = useElement(); + const isSelectionAreaVisible = usePluginOption( + BlockSelectionPlugin, + 'isSelectionAreaVisible', + ); + const selected = useSelected(); + + return ( +
+ {children} +
+ ); +} + +const DragHandle = memo(function DragHandle({ + isDragging, + previewRef, + resetPreview, + setPreviewTop, +}: { + isDragging: boolean; + previewRef: React.RefObject; + resetPreview: () => void; + setPreviewTop: (top: number) => void; +}) { + const editor = useEditorRef(); + const element = useElement(); + const t = useTranslations('ui.plate'); + + return ( + + + {/* biome-ignore lint/a11y/useKeyWithClickEvents: Mouse is required for dragging */} + {/* biome-ignore lint/a11y/useFocusableInteractive: Mouse is required for dragging */} +
{ + e.preventDefault(); + editor.getApi(BlockSelectionPlugin).blockSelection.focus(); + }} + onMouseDown={(e) => { + resetPreview(); + + if (e.button !== 0 || e.shiftKey) return; + + const blockSelection = editor + .getApi(BlockSelectionPlugin) + .blockSelection.getNodes({ sort: true }); + + let selectionNodes = + blockSelection.length > 0 + ? blockSelection + : editor.api.blocks({ mode: 'highest' }); + + // If current block is not in selection, use it as the starting point + if (!selectionNodes.some(([node]) => node.id === element.id)) { + const path = editor.api.findPath(element); + if (path) { + selectionNodes = [[element, path]]; + } + } + + // Process selection nodes to include list children + const blocks = expandListItemsWithChildren( + editor, + selectionNodes, + ).map(([node]) => node); + + if (blockSelection.length === 0) { + editor.tf.blur(); + editor.tf.collapse(); + } + + const elements = createDragPreviewElements(editor, blocks); + previewRef.current?.append(...elements); + previewRef.current?.classList.remove('hidden'); + previewRef.current?.classList.add('opacity-0'); + editor.setOption(DndPlugin, 'multiplePreviewRef', previewRef); + + editor + .getApi(BlockSelectionPlugin) + .blockSelection.set(blocks.map((block) => block.id as string)); + }} + onMouseEnter={() => { + if (isDragging) return; + + const blockSelection = editor + .getApi(BlockSelectionPlugin) + .blockSelection.getNodes({ sort: true }); + + let selectedBlocks = + blockSelection.length > 0 + ? blockSelection + : editor.api.blocks({ mode: 'highest' }); + + // If current block is not in selection, use it as the starting point + if (!selectedBlocks.some(([node]) => node.id === element.id)) { + const path = editor.api.findPath(element); + if (path) { + selectedBlocks = [[element, path]]; + } + } + + // Process selection to include list children + const processedBlocks = expandListItemsWithChildren( + editor, + selectedBlocks, + ); + + const ids = processedBlocks.map((block) => block[0].id as string); + + if (ids.length > 1 && ids.includes(element.id as string)) { + const previewTop = calculatePreviewTop(editor, { + blocks: processedBlocks.map((block) => block[0]), + element, + }); + previewTop && setPreviewTop(previewTop); + } else { + setPreviewTop(0); + } + }} + onMouseUp={() => { + resetPreview(); + }} + data-plate-prevent-deselect + role='button' + > + +
+
+ {t('dragToMove')} +
+ ); +}); + +const DropLine = memo(function DropLine({ + className, + ...props +}: React.ComponentProps<'div'>) { + const { dropLine } = useDropLine(); + + if (!dropLine) return null; + + return ( +
+ ); +}); + +const createDragPreviewElements = ( + editor: PlateEditor, + blocks: TElement[], +): HTMLElement[] => { + const elements: HTMLElement[] = []; + const ids: string[] = []; + + /** + * Remove data attributes from the element to avoid recognized as slate + * elements incorrectly. + */ + const removeDataAttributes = (element: HTMLElement) => { + Array.from(element.attributes).forEach((attr) => { + if ( + attr.name.startsWith('data-slate') || + attr.name.startsWith('data-block-id') + ) { + element.removeAttribute(attr.name); + } + }); + + Array.from(element.children).forEach((child) => { + removeDataAttributes(child as HTMLElement); + }); + }; + + const resolveElement = (node: TElement, index: number) => { + const domNode = editor.api.toDOMNode(node); + const newDomNode = domNode?.cloneNode(true) as HTMLElement; + + if (!domNode) return null; + + // Apply visual compensation for horizontal scroll + const applyScrollCompensation = ( + original: Element, + cloned: HTMLElement, + ) => { + const scrollLeft = original.scrollLeft; + + if (scrollLeft > 0) { + // Create a wrapper to handle the scroll offset + const scrollWrapper = document.createElement('div'); + scrollWrapper.style.overflow = 'hidden'; + scrollWrapper.style.width = `${original.clientWidth}px`; + + // Create inner container with the full content + const innerContainer = document.createElement('div'); + innerContainer.style.transform = `translateX(-${scrollLeft}px)`; + innerContainer.style.width = `${original.scrollWidth}px`; + + // Move all children to the inner container + while (cloned.firstChild) { + innerContainer.append(cloned.firstChild); + } + + // Apply the original element's styles to maintain appearance + const originalStyles = window.getComputedStyle(original); + cloned.style.padding = '0'; + innerContainer.style.padding = originalStyles.padding; + + scrollWrapper.append(innerContainer); + cloned.append(scrollWrapper); + } + }; + + applyScrollCompensation(domNode, newDomNode); + + ids.push(node.id as string); + const wrapper = document.createElement('div'); + wrapper.append(newDomNode); + wrapper.style.display = 'flow-root'; + + const lastDomNode = blocks[index - 1]; + + if (lastDomNode) { + const lastDomNodeRect = editor.api + ?.toDOMNode(lastDomNode) + ?.parentElement?.getBoundingClientRect(); + + const domNodeRect = domNode.parentElement?.getBoundingClientRect(); + + if (lastDomNodeRect && domNodeRect) { + const distance = domNodeRect.top - lastDomNodeRect.bottom; + + // Check if the two elements are adjacent (touching each other) + if (distance > 15) { + wrapper.style.marginTop = `${distance}px`; + } + } + } + + removeDataAttributes(newDomNode); + elements.push(wrapper); + }; + + blocks.forEach((node, index) => resolveElement(node, index)); + + editor.setOption(DndPlugin, 'draggingId', ids); + + return elements; +}; + +const calculatePreviewTop = ( + editor: PlateEditor, + { + blocks, + element, + }: { + blocks: TElement[]; + element: TElement; + }, +): number | null => { + const child = editor.api.toDOMNode(element); + const editable = editor.api.toDOMNode(editor); + const firstSelectedChild = blocks[0]; + + if (!child || !editable || !firstSelectedChild) return null; + + const firstDomNode = editor.api.toDOMNode(firstSelectedChild); + // Get editor's top padding + const editorPaddingTop = Number( + window.getComputedStyle(editable).paddingTop.replace('px', ''), + ); + + if (!firstDomNode) return null; + + // Calculate distance from first selected node to editor top + const firstNodeToEditorDistance = + firstDomNode.getBoundingClientRect().top - + editable.getBoundingClientRect().top - + editorPaddingTop; + + // Get margin top of first selected node + const firstMarginTopString = window.getComputedStyle(firstDomNode).marginTop; + const marginTop = Number(firstMarginTopString.replace('px', '')); + + // Calculate distance from current node to editor top + const currentToEditorDistance = + child.getBoundingClientRect().top - + editable.getBoundingClientRect().top - + editorPaddingTop; + + const currentMarginTopString = window.getComputedStyle(child).marginTop; + const currentMarginTop = Number(currentMarginTopString.replace('px', '')); + + const previewElementsTopDistance = + currentToEditorDistance - + firstNodeToEditorDistance + + marginTop - + currentMarginTop; + + return previewElementsTopDistance; +}; + +const calcDragButtonTop = ( + editor: PlateEditor, + element: TElement, +): number | null => { + const child = editor.api.toDOMNode(element); + + if (!child) return null; + + const currentMarginTopString = window.getComputedStyle(child).marginTop; + const currentMarginTop = Number(currentMarginTopString.replace('px', '')); + + return currentMarginTop; +}; + +export { BlockDraggable }; diff --git a/src/components/ui/plate/BlockList.tsx b/src/components/ui/plate/BlockList.tsx new file mode 100644 index 00000000..67236edd --- /dev/null +++ b/src/components/ui/plate/BlockList.tsx @@ -0,0 +1,87 @@ +'use client'; + +import { isOrderedList } from '@platejs/list'; +import { + useTodoListElement, + useTodoListElementState, +} from '@platejs/list/react'; +import type { TListElement } from 'platejs'; +import { + type PlateElementProps, + type RenderNodeWrapper, + useReadOnly, +} from 'platejs/react'; +import type React from 'react'; + +import { Checkbox } from '@/components/ui/Checkbox'; +import { cx } from '@/lib/utils/index'; + +const config: Record< + string, + { + Li: React.FC; + Marker: React.FC; + } +> = { + todo: { + Li: TodoLi, + Marker: TodoMarker, + }, +}; + +const BlockList: RenderNodeWrapper = (props) => { + if (!props.element.listStyleType) return; + + return (props) => ; +}; + +function List(props: PlateElementProps) { + const { listStart, listStyleType } = props.element as TListElement; + const { Li, Marker } = config[listStyleType] ?? {}; + const List = isOrderedList(props.element) ? 'ol' : 'ul'; + + return ( + + {Marker && } + {Li ?
  • :
  • {props.children}
  • } +
    + ); +} + +function TodoMarker(props: PlateElementProps) { + const state = useTodoListElementState({ element: props.element }); + const { checkboxProps } = useTodoListElement(state); + const readOnly = useReadOnly(); + + return ( +
    + +
    + ); +} + +function TodoLi(props: PlateElementProps) { + return ( +
  • + {props.children} +
  • + ); +} + +export { BlockList }; diff --git a/src/components/ui/plate/BlockListStatic.tsx b/src/components/ui/plate/BlockListStatic.tsx new file mode 100644 index 00000000..dc5c27c8 --- /dev/null +++ b/src/components/ui/plate/BlockListStatic.tsx @@ -0,0 +1,83 @@ +import { isOrderedList } from '@platejs/list'; +import { CheckIcon } from 'lucide-react'; +import type { + RenderStaticNodeWrapper, + SlateRenderElementProps, + TListElement, +} from 'platejs'; +import type * as React from 'react'; + +import { cx } from '@/lib/utils/index'; + +const config: Record< + string, + { + Li: React.FC; + Marker: React.FC; + } +> = { + todo: { + Li: TodoLiStatic, + Marker: TodoMarkerStatic, + }, +}; + +const BlockListStatic: RenderStaticNodeWrapper = (props) => { + if (!props.element.listStyleType) return; + + return (props) => ; +}; + +function List(props: SlateRenderElementProps) { + const { listStart, listStyleType } = props.element as TListElement; + const { Li, Marker } = config[listStyleType] ?? {}; + const List = isOrderedList(props.element) ? 'ol' : 'ul'; + + return ( + + {Marker && } + {Li ?
  • :
  • {props.children}
  • } +
    + ); +} + +function TodoMarkerStatic(props: SlateRenderElementProps) { + const checked = props.element.checked as boolean; + + return ( +
    + +
    + ); +} + +function TodoLiStatic(props: SlateRenderElementProps) { + return ( +
  • + {props.children} +
  • + ); +} + +export { BlockListStatic }; diff --git a/src/components/ui/plate/BlockSelection.tsx b/src/components/ui/plate/BlockSelection.tsx new file mode 100644 index 00000000..d1c35c8d --- /dev/null +++ b/src/components/ui/plate/BlockSelection.tsx @@ -0,0 +1,42 @@ +'use client'; + +import { DndPlugin } from '@platejs/dnd'; +import { useBlockSelected } from '@platejs/selection/react'; +import { cva } from 'cva'; +import { type PlateElementProps, usePluginOption } from 'platejs/react'; + +const blockSelectionVariants = cva({ + base: 'pointer-events-none absolute inset-0 z-1 bg-brand/[.13] transition-opacity', + defaultVariants: { + active: true, + }, + variants: { + active: { + false: 'opacity-0', + true: 'opacity-100', + }, + }, +}); + +function BlockSelection(props: PlateElementProps) { + const isBlockSelected = useBlockSelected(); + const isDragging = usePluginOption(DndPlugin, 'isDragging'); + + if ( + !isBlockSelected || + props.plugin.key === 'tr' || + props.plugin.key === 'table' + ) + return null; + + return ( +
    + ); +} + +export { blockSelectionVariants, BlockSelection }; diff --git a/src/components/ui/plate/BlockquoteNode.tsx b/src/components/ui/plate/BlockquoteNode.tsx new file mode 100644 index 00000000..1103cac6 --- /dev/null +++ b/src/components/ui/plate/BlockquoteNode.tsx @@ -0,0 +1,15 @@ +'use client'; + +import { PlateElement, type PlateElementProps } from 'platejs/react'; + +function BlockquoteElement(props: PlateElementProps) { + return ( + + ); +} + +export { BlockquoteElement }; diff --git a/src/components/ui/plate/BlockquoteNodeStatic.tsx b/src/components/ui/plate/BlockquoteNodeStatic.tsx new file mode 100644 index 00000000..510778fb --- /dev/null +++ b/src/components/ui/plate/BlockquoteNodeStatic.tsx @@ -0,0 +1,13 @@ +import { SlateElement, type SlateElementProps } from 'platejs'; + +function BlockquoteElementStatic(props: SlateElementProps) { + return ( + + ); +} + +export { BlockquoteElementStatic }; diff --git a/src/components/ui/plate/CalloutNode.tsx b/src/components/ui/plate/CalloutNode.tsx new file mode 100644 index 00000000..199c565b --- /dev/null +++ b/src/components/ui/plate/CalloutNode.tsx @@ -0,0 +1,73 @@ +'use client'; + +import { useCalloutEmojiPicker } from '@platejs/callout/react'; +import { useEmojiDropdownMenuState } from '@platejs/emoji/react'; +import type * as CSS from 'csstype'; +import { PlateElement } from 'platejs/react'; +import type * as React from 'react'; +import { Button } from '@/components/ui/Button'; +import { + EmojiPicker, + EmojiPopover, +} from '@/components/ui/plate/EmojiToolbarButton'; +import { cx } from '@/lib/utils/index'; + +function CalloutElement({ + attributes, + children, + className, + ...props +}: React.ComponentProps & { + element: { + backgroundColor: CSS.Property.BackgroundColor; + icon: React.ReactNode; + }; +}) { + const { emojiPickerState, isOpen, setIsOpen } = useEmojiDropdownMenuState({ + closeOnSelect: true, + }); + + const { emojiToolbarDropdownProps, props: calloutProps } = + useCalloutEmojiPicker({ + isOpen, + setIsOpen, + }); + + return ( + +
    + + {props.element.icon || '💡'} + + } + > + + +
    {children}
    +
    +
    + ); +} + +export { CalloutElement }; diff --git a/src/components/ui/plate/CalloutNodeStatic.tsx b/src/components/ui/plate/CalloutNodeStatic.tsx new file mode 100644 index 00000000..f89b9f41 --- /dev/null +++ b/src/components/ui/plate/CalloutNodeStatic.tsx @@ -0,0 +1,42 @@ +import type * as CSS from 'csstype'; +import type { SlateElementProps } from 'platejs'; +import { SlateElement } from 'platejs'; +import { cx } from '@/lib/utils/index'; + +function CalloutElementStatic({ + children, + className, + ...props +}: SlateElementProps & { + element: { + backgroundColor: CSS.Property.BackgroundColor; + icon: React.ReactNode; + }; +}) { + return ( + +
    +
    + + {props.element.icon || '💡'} + +
    +
    {children}
    +
    +
    + ); +} + +export { CalloutElementStatic }; diff --git a/src/components/ui/plate/Caption.tsx b/src/components/ui/plate/Caption.tsx new file mode 100644 index 00000000..d36fa318 --- /dev/null +++ b/src/components/ui/plate/Caption.tsx @@ -0,0 +1,64 @@ +'use client'; + +import { + Caption as CaptionPrimitive, + CaptionTextarea as CaptionTextareaPrimitive, + useCaptionButton, + useCaptionButtonState, +} from '@platejs/caption/react'; +import { createPrimitiveComponent } from '@udecode/cn'; +import { cva, type VariantProps } from 'cva'; +import type * as React from 'react'; +import { Button } from '@/components/ui/Button'; +import { cx } from '@/lib/utils/index'; + +const captionVariants = cva({ + base: 'max-w-full', + defaultVariants: { + align: 'center', + }, + variants: { + align: { + center: 'mx-auto', + left: 'mr-auto', + right: 'ml-auto', + }, + }, +}); + +function Caption({ + align, + className, + ...props +}: React.ComponentProps & + VariantProps) { + return ( + + ); +} + +function CaptionTextarea( + props: React.ComponentProps, +) { + return ( + + ); +} + +const CaptionButton = createPrimitiveComponent(Button)({ + propsHook: useCaptionButton, + stateHook: useCaptionButtonState, +}); + +export { Caption, CaptionTextarea, CaptionButton }; diff --git a/src/components/ui/plate/CodeBlockNode.tsx b/src/components/ui/plate/CodeBlockNode.tsx new file mode 100644 index 00000000..b2397516 --- /dev/null +++ b/src/components/ui/plate/CodeBlockNode.tsx @@ -0,0 +1,295 @@ +'use client'; + +import { formatCodeBlock, isLangSupported } from '@platejs/code-block'; +import { BracesIcon, Check, CheckIcon, CopyIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { NodeApi, type TCodeBlockElement, type TCodeSyntaxLeaf } from 'platejs'; +import { + PlateElement, + type PlateElementProps, + PlateLeaf, + type PlateLeafProps, + useEditorRef, + useElement, + useReadOnly, +} from 'platejs/react'; +import { useEffect, useMemo, useState } from 'react'; +import { Button } from '@/components/ui/Button'; +import { + Command, + CommandEmpty, + CommandGroup, + CommandInput, + CommandItem, + CommandList, +} from '@/components/ui/Command'; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/Popover'; +import { cx } from '@/lib/utils/index'; + +function CodeBlockElement(props: PlateElementProps) { + const { editor, element } = props; + + return ( + +
    +
    +          {props.children}
    +        
    + +
    + {isLangSupported(element.lang) && ( + + )} + + + + NodeApi.string(element)} + /> +
    +
    +
    + ); +} + +function CodeBlockCombobox() { + const [open, setOpen] = useState(false); + const readOnly = useReadOnly(); + const editor = useEditorRef(); + const element = useElement(); + const value = element.lang || 'plaintext'; + const [searchValue, setSearchValue] = useState(''); + const t = useTranslations('ui.plate'); + + const items = useMemo( + () => + languages.filter( + (language) => + !searchValue || + language.label.toLowerCase().includes(searchValue.toLowerCase()), + ), + [searchValue], + ); + + if (readOnly) return null; + + return ( + + + + + setSearchValue('')} + > + + setSearchValue(value)} + placeholder={t('searchLanguages')} + /> + {t('noLanguageFound')} + + + + {items.map((language) => ( + { + editor.tf.setNodes( + { lang: value }, + { at: element }, + ); + setSearchValue(value); + setOpen(false); + }} + > + + {language.label} + + ))} + + + + + + ); +} + +function CopyButton({ + value, + ...props +}: { value: (() => string) | string } & Omit< + React.ComponentProps, + 'value' +>) { + const [hasCopied, setHasCopied] = useState(false); + const t = useTranslations('ui'); + + // biome-ignore lint/correctness/useExhaustiveDependencies: off + useEffect(() => { + setTimeout(() => { + setHasCopied(false); + }, 2000); + }, [hasCopied]); + + return ( + + ); +} + +function CodeLineElement(props: PlateElementProps) { + return ; +} + +function CodeSyntaxLeaf(props: PlateLeafProps) { + const tokenClassName = props.leaf.className as string; + + return ; +} + +const languages: { label: string; value: string }[] = [ + { label: 'Auto', value: 'auto' }, + { label: 'Plain Text', value: 'plaintext' }, + { label: 'ABAP', value: 'abap' }, + { label: 'Agda', value: 'agda' }, + { label: 'Arduino', value: 'arduino' }, + { label: 'ASCII Art', value: 'ascii' }, + { label: 'Assembly', value: 'x86asm' }, + { label: 'Bash', value: 'bash' }, + { label: 'BASIC', value: 'basic' }, + { label: 'BNF', value: 'bnf' }, + { label: 'C', value: 'c' }, + { label: 'C#', value: 'csharp' }, + { label: 'C++', value: 'cpp' }, + { label: 'Clojure', value: 'clojure' }, + { label: 'CoffeeScript', value: 'coffeescript' }, + { label: 'Coq', value: 'coq' }, + { label: 'CSS', value: 'css' }, + { label: 'Dart', value: 'dart' }, + { label: 'Dhall', value: 'dhall' }, + { label: 'Diff', value: 'diff' }, + { label: 'Docker', value: 'dockerfile' }, + { label: 'EBNF', value: 'ebnf' }, + { label: 'Elixir', value: 'elixir' }, + { label: 'Elm', value: 'elm' }, + { label: 'Erlang', value: 'erlang' }, + { label: 'F#', value: 'fsharp' }, + { label: 'Flow', value: 'flow' }, + { label: 'Fortran', value: 'fortran' }, + { label: 'Gherkin', value: 'gherkin' }, + { label: 'GLSL', value: 'glsl' }, + { label: 'Go', value: 'go' }, + { label: 'GraphQL', value: 'graphql' }, + { label: 'Groovy', value: 'groovy' }, + { label: 'Haskell', value: 'haskell' }, + { label: 'HCL', value: 'hcl' }, + { label: 'HTML', value: 'html' }, + { label: 'Idris', value: 'idris' }, + { label: 'Java', value: 'java' }, + { label: 'JavaScript', value: 'javascript' }, + { label: 'JSON', value: 'json' }, + { label: 'Julia', value: 'julia' }, + { label: 'Kotlin', value: 'kotlin' }, + { label: 'LaTeX', value: 'latex' }, + { label: 'Less', value: 'less' }, + { label: 'Lisp', value: 'lisp' }, + { label: 'LiveScript', value: 'livescript' }, + { label: 'LLVM IR', value: 'llvm' }, + { label: 'Lua', value: 'lua' }, + { label: 'Makefile', value: 'makefile' }, + { label: 'Markdown', value: 'markdown' }, + { label: 'Markup', value: 'markup' }, + { label: 'MATLAB', value: 'matlab' }, + { label: 'Mathematica', value: 'mathematica' }, + { label: 'Mermaid', value: 'mermaid' }, + { label: 'Nix', value: 'nix' }, + { label: 'Notion Formula', value: 'notion' }, + { label: 'Objective-C', value: 'objectivec' }, + { label: 'OCaml', value: 'ocaml' }, + { label: 'Pascal', value: 'pascal' }, + { label: 'Perl', value: 'perl' }, + { label: 'PHP', value: 'php' }, + { label: 'PowerShell', value: 'powershell' }, + { label: 'Prolog', value: 'prolog' }, + { label: 'Protocol Buffers', value: 'protobuf' }, + { label: 'PureScript', value: 'purescript' }, + { label: 'Python', value: 'python' }, + { label: 'R', value: 'r' }, + { label: 'Racket', value: 'racket' }, + { label: 'Reason', value: 'reasonml' }, + { label: 'Ruby', value: 'ruby' }, + { label: 'Rust', value: 'rust' }, + { label: 'Sass', value: 'scss' }, + { label: 'Scala', value: 'scala' }, + { label: 'Scheme', value: 'scheme' }, + { label: 'SCSS', value: 'scss' }, + { label: 'Shell', value: 'shell' }, + { label: 'Smalltalk', value: 'smalltalk' }, + { label: 'Solidity', value: 'solidity' }, + { label: 'SQL', value: 'sql' }, + { label: 'Swift', value: 'swift' }, + { label: 'TOML', value: 'toml' }, + { label: 'TypeScript', value: 'typescript' }, + { label: 'VB.Net', value: 'vbnet' }, + { label: 'Verilog', value: 'verilog' }, + { label: 'VHDL', value: 'vhdl' }, + { label: 'Visual Basic', value: 'vbnet' }, + { label: 'WebAssembly', value: 'wasm' }, + { label: 'XML', value: 'xml' }, + { label: 'YAML', value: 'yaml' }, +]; + +export { CodeBlockElement, CodeLineElement, CodeSyntaxLeaf }; diff --git a/src/components/ui/plate/CodeBlockNodeStatic.tsx b/src/components/ui/plate/CodeBlockNodeStatic.tsx new file mode 100644 index 00000000..c20680f4 --- /dev/null +++ b/src/components/ui/plate/CodeBlockNodeStatic.tsx @@ -0,0 +1,34 @@ +import { + SlateElement, + type SlateElementProps, + SlateLeaf, + type SlateLeafProps, + type TCodeBlockElement, +} from 'platejs'; + +function CodeBlockElementStatic(props: SlateElementProps) { + return ( + +
    +
    +          {props.children}
    +        
    +
    +
    + ); +} + +function CodeLineElementStatic(props: SlateElementProps) { + return ; +} + +function CodeSyntaxLeafStatic(props: SlateLeafProps) { + const tokenClassName = props.leaf.className as string; + + return ; +} + +export { CodeBlockElementStatic, CodeLineElementStatic, CodeSyntaxLeafStatic }; diff --git a/src/components/ui/plate/CodeNode.tsx b/src/components/ui/plate/CodeNode.tsx new file mode 100644 index 00000000..7d667416 --- /dev/null +++ b/src/components/ui/plate/CodeNode.tsx @@ -0,0 +1,18 @@ +'use client'; + +import type { PlateLeafProps } from 'platejs/react'; +import { PlateLeaf } from 'platejs/react'; + +function CodeLeaf(props: PlateLeafProps) { + return ( + + {props.children} + + ); +} + +export { CodeLeaf }; diff --git a/src/components/ui/plate/CodeNodeStatic.tsx b/src/components/ui/plate/CodeNodeStatic.tsx new file mode 100644 index 00000000..d17fc55e --- /dev/null +++ b/src/components/ui/plate/CodeNodeStatic.tsx @@ -0,0 +1,16 @@ +import type { SlateLeafProps } from 'platejs'; +import { SlateLeaf } from 'platejs'; + +function CodeLeafStatic(props: SlateLeafProps) { + return ( + + {props.children} + + ); +} + +export { CodeLeafStatic }; diff --git a/src/components/ui/plate/ColumnNode.tsx b/src/components/ui/plate/ColumnNode.tsx new file mode 100644 index 00000000..a1c08360 --- /dev/null +++ b/src/components/ui/plate/ColumnNode.tsx @@ -0,0 +1,325 @@ +'use client'; + +import { useDraggable, useDropLine } from '@platejs/dnd'; +import { setColumns } from '@platejs/layout'; +import { ResizableProvider } from '@platejs/resizable'; +import { BlockSelectionPlugin } from '@platejs/selection/react'; +import { useComposedRef } from '@udecode/cn'; +import { GripHorizontal, type LucideProps, Trash2Icon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import type { TColumnElement } from 'platejs'; +import { PathApi } from 'platejs'; +import type { PlateElementProps } from 'platejs/react'; +import { + PlateElement, + useEditorRef, + useEditorSelector, + useElement, + useFocusedLast, + usePluginOption, + useReadOnly, + useRemoveNodeButton, + useSelected, + withHOC, +} from 'platejs/react'; +import { memo } from 'react'; +import { Button } from '@/components/ui/Button'; +import { + Popover, + PopoverAnchor, + PopoverContent, +} from '@/components/ui/Popover'; +import { Separator } from '@/components/ui/Separator'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@/components/ui/Tooltip'; +import { cx } from '@/lib/utils/index'; + +const ColumnElement = withHOC( + ResizableProvider, + function ColumnElement(props: PlateElementProps) { + const { width } = props.element; + const readOnly = useReadOnly(); + const isSelectionAreaVisible = usePluginOption( + BlockSelectionPlugin, + 'isSelectionAreaVisible', + ); + + const { isDragging, previewRef, handleRef } = useDraggable({ + element: props.element, + orientation: 'horizontal', + type: 'column', + canDropNode: ({ dragEntry, dropEntry }) => + PathApi.equals( + PathApi.parent(dragEntry[1]), + PathApi.parent(dropEntry[1]), + ), + }); + + return ( +
    + {!readOnly && !isSelectionAreaVisible && ( +
    + +
    + )} + + +
    + {props.children} + + {!readOnly && !isSelectionAreaVisible && } +
    +
    +
    + ); + }, +); + +const ColumnDragHandle = memo(function ColumnDragHandle() { + const t = useTranslations('ui.plate'); + + return ( + + + + + + + {t('dragToMoveColumn')} + + + ); +}); + +function DropLine() { + const { dropLine } = useDropLine({ orientation: 'horizontal' }); + + if (!dropLine) return null; + + return ( +
    + ); +} + +function ColumnGroupElement(props: PlateElementProps) { + return ( + + +
    {props.children}
    +
    +
    + ); +} + +function ColumnFloatingToolbar({ children }: React.PropsWithChildren) { + const editor = useEditorRef(); + const readOnly = useReadOnly(); + const element = useElement(); + const { props: buttonProps } = useRemoveNodeButton({ element }); + const selected = useSelected(); + const isCollapsed = useEditorSelector( + (editor) => editor.api.isCollapsed(), + [], + ); + const isFocusedLast = useFocusedLast(); + + const open = isFocusedLast && !readOnly && selected && isCollapsed; + + const onColumnChange = (widths: string[]) => { + setColumns(editor, { + at: element, + widths, + }); + }; + + return ( + + {children} + e.preventDefault()} + align='center' + side='top' + sideOffset={10} + > +
    + + + + + + + + +
    +
    +
    + ); +} + +const DoubleColumnOutlined = (props: LucideProps) => ( + +); + +const ThreeColumnOutlined = (props: LucideProps) => ( + +); + +const RightSideDoubleColumnOutlined = (props: LucideProps) => ( + +); + +const LeftSideDoubleColumnOutlined = (props: LucideProps) => ( + +); + +const DoubleSideDoubleColumnOutlined = (props: LucideProps) => ( + +); + +export { ColumnElement, ColumnGroupElement }; diff --git a/src/components/ui/plate/ColumnNodeStatic.tsx b/src/components/ui/plate/ColumnNodeStatic.tsx new file mode 100644 index 00000000..d1dd29e1 --- /dev/null +++ b/src/components/ui/plate/ColumnNodeStatic.tsx @@ -0,0 +1,29 @@ +import type { SlateElementProps, TColumnElement } from 'platejs'; +import { SlateElement } from 'platejs'; + +function ColumnElementStatic(props: SlateElementProps) { + const { width } = props.element; + + return ( +
    + +
    + {props.children} +
    +
    +
    + ); +} + +function ColumnGroupElementStatic(props: SlateElementProps) { + return ( + +
    {props.children}
    +
    + ); +} + +export { ColumnElementStatic, ColumnGroupElementStatic }; diff --git a/src/components/ui/plate/CursorOverlay.tsx b/src/components/ui/plate/CursorOverlay.tsx new file mode 100644 index 00000000..41ab8c6e --- /dev/null +++ b/src/components/ui/plate/CursorOverlay.tsx @@ -0,0 +1,69 @@ +'use client'; + +import { + type CursorData, + type CursorOverlayState, + useCursorOverlay, +} from '@platejs/selection/react'; +import { RangeApi } from 'platejs'; +import { cx } from '@/lib/utils'; + +function CursorOverlay() { + const { cursors } = useCursorOverlay(); + + return ( + <> + {cursors.map((cursor) => ( + + ))} + + ); +} + +function Cursor({ + id, + caretPosition, + data, + selection, + selectionRects, +}: CursorOverlayState) { + // const streaming = usePluginOption(AIChatPlugin, 'streaming'); + const streaming = false; + const { style, selectionStyle = style } = data ?? ({} as CursorData); + const isCursor = RangeApi.isCollapsed(selection); + + if (streaming) return null; + + return ( + <> + {selectionRects.map((position, i) => { + return ( +
    + ); + })} + {caretPosition && ( +
    + )} + + ); +} + +export { CursorOverlay }; diff --git a/src/components/ui/plate/DateNode.tsx b/src/components/ui/plate/DateNode.tsx new file mode 100644 index 00000000..6bdcacc9 --- /dev/null +++ b/src/components/ui/plate/DateNode.tsx @@ -0,0 +1,97 @@ +'use client'; + +import { useTranslations } from 'next-intl'; +import type { TDateElement } from 'platejs'; +import type { PlateElementProps } from 'platejs/react'; +import { PlateElement, useReadOnly } from 'platejs/react'; +import { Calendar } from '@/components/ui/Calendar'; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/Popover'; +import { cx } from '@/lib/utils/index'; + +function DateElement(props: PlateElementProps) { + const { editor, element } = props; + + const readOnly = useReadOnly(); + const t = useTranslations('ui'); + + const trigger = ( + + {element.date ? ( + (() => { + const today = new Date(); + const elementDate = new Date(element.date); + const isToday = + elementDate.getDate() === today.getDate() && + elementDate.getMonth() === today.getMonth() && + elementDate.getFullYear() === today.getFullYear(); + + const isYesterday = + new Date(today.setDate(today.getDate() - 1)).toDateString() === + elementDate.toDateString(); + const isTomorrow = + new Date(today.setDate(today.getDate() + 2)).toDateString() === + elementDate.toDateString(); + + if (isToday) return t('today'); + if (isYesterday) return t('yesterday'); + if (isTomorrow) return t('tomorrow'); + + return elementDate.toLocaleDateString(undefined, { + day: 'numeric', + month: 'long', + year: 'numeric', + }); + })() + ) : ( + {t('pickDate')} + )} + + ); + + if (readOnly) { + return trigger; + } + + return ( + + + {trigger} + + { + if (!date) return; + + editor.tf.setNodes( + { date: date.toDateString() }, + { at: element }, + ); + }} + mode='single' + autoFocus + /> + + + {props.children} + + ); +} + +export { DateElement }; diff --git a/src/components/ui/plate/DateNodeStatic.tsx b/src/components/ui/plate/DateNodeStatic.tsx new file mode 100644 index 00000000..676e2485 --- /dev/null +++ b/src/components/ui/plate/DateNodeStatic.tsx @@ -0,0 +1,48 @@ +import type { SlateElementProps, TDateElement } from 'platejs'; +import { SlateElement } from 'platejs'; + +// Cannot be translated, as next-intl context is unavailable, +// and the component must be rendered synchronously to work with Plate.js +// HTML serialization. The lack of translations only affects exported files. +function DateElementStatic(props: SlateElementProps) { + const { element } = props; + + return ( + + + {element.date ? ( + (() => { + const today = new Date(); + const elementDate = new Date(element.date); + const isToday = + elementDate.getDate() === today.getDate() && + elementDate.getMonth() === today.getMonth() && + elementDate.getFullYear() === today.getFullYear(); + + const isYesterday = + new Date(today.setDate(today.getDate() - 1)).toDateString() === + elementDate.toDateString(); + const isTomorrow = + new Date(today.setDate(today.getDate() + 2)).toDateString() === + elementDate.toDateString(); + + if (isToday) return 'Today'; + if (isYesterday) return 'Yesterday'; + if (isTomorrow) return 'Tomorrow'; + + return elementDate.toLocaleDateString(undefined, { + day: 'numeric', + month: 'long', + year: 'numeric', + }); + })() + ) : ( + Pick a date + )} + + {props.children} + + ); +} + +export { DateElementStatic }; diff --git a/src/components/ui/plate/Editor.tsx b/src/components/ui/plate/Editor.tsx new file mode 100644 index 00000000..a727b616 --- /dev/null +++ b/src/components/ui/plate/Editor.tsx @@ -0,0 +1,125 @@ +'use client'; + +import { cva, type VariantProps } from 'cva'; +import type { PlateContentProps, PlateViewProps } from 'platejs/react'; +import { PlateContainer, PlateContent, PlateView } from 'platejs/react'; +import { forwardRef } from 'react'; +import { TooltipProvider } from '@/components/ui/Tooltip'; +import { cx } from '@/lib/utils/index'; + +const editorContainerVariants = cva({ + base: 'relative w-full cursor-text select-text overflow-y-auto caret-primary selection:bg-brand/25 focus-visible:outline-none [&_.slate-selection-area]:z-50 [&_.slate-selection-area]:border [&_.slate-selection-area]:border-brand/25 [&_.slate-selection-area]:bg-brand/15', + defaultVariants: { + variant: 'default', + }, + variants: { + variant: { + comment: cx( + 'flex flex-wrap justify-between gap-1 px-1 py-0.5 text-sm', + 'rounded-md border-[1.5px] border-transparent bg-transparent', + 'has-[[data-slate-editor]:focus]:border-brand/50 has-[[data-slate-editor]:focus]:ring-2 has-[[data-slate-editor]:focus]:ring-brand/30', + 'has-aria-disabled:border-input has-aria-disabled:bg-muted', + ), + default: 'h-full', + demo: 'h-[650px]', + select: cx( + 'group rounded-md border border-input ring-offset-background focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2', + 'has-data-readonly:w-fit has-data-readonly:cursor-default has-data-readonly:border-transparent has-data-readonly:focus-within:[box-shadow:none]', + ), + }, + }, +}); + +function EditorContainer({ + className, + variant, + ...props +}: React.ComponentProps<'div'> & VariantProps) { + return ( + + ); +} + +const editorVariants = cva({ + base: cx( + 'group/editor', + 'relative w-full cursor-text select-text overflow-x-hidden whitespace-pre-wrap break-words', + 'rounded-md ring-offset-background focus-visible:outline-none', + '**:data-slate-placeholder:!top-1/2 **:data-slate-placeholder:-translate-y-1/2 placeholder:text-muted-foreground/80 **:data-slate-placeholder:text-muted-foreground/80 **:data-slate-placeholder:opacity-100!', + '[&_strong]:font-bold', + ), + defaultVariants: { + variant: 'default', + }, + variants: { + disabled: { + true: 'cursor-not-allowed opacity-50', + }, + focused: { + true: 'ring-2 ring-ring ring-offset-2', + }, + variant: { + ai: 'w-full px-0 text-base md:text-sm', + aiChat: + 'max-h-[min(70vh,320px)] w-full max-w-[700px] overflow-y-auto px-3 py-2 text-base md:text-sm', + comment: cx('rounded-none border-none bg-transparent text-sm'), + default: + 'size-full px-16 pt-4 pb-72 text-base sm:px-[max(64px,calc(50%-350px))]', + demo: 'size-full px-16 pt-4 pb-72 text-base sm:px-[max(64px,calc(50%-350px))]', + fullWidth: 'size-full px-16 pt-4 pb-72 text-base sm:px-24', + none: '', + select: 'px-3 py-2 text-base data-readonly:w-fit', + }, + }, +}); + +type EditorProps = PlateContentProps & VariantProps; + +const Editor = forwardRef( + ({ className, disabled, focused, variant, ...props }, ref) => { + return ( + + + + ); + }, +); + +Editor.displayName = 'Editor'; + +function EditorView({ + className, + variant, + ...props +}: PlateViewProps & VariantProps) { + return ( + + ); +} + +EditorView.displayName = 'EditorView'; + +export { EditorContainer, Editor, EditorView, type EditorProps }; diff --git a/src/components/ui/plate/EditorStatic.tsx b/src/components/ui/plate/EditorStatic.tsx new file mode 100644 index 00000000..99210778 --- /dev/null +++ b/src/components/ui/plate/EditorStatic.tsx @@ -0,0 +1,50 @@ +import { cva, type VariantProps } from 'cva'; +import { PlateStatic, type PlateStaticProps } from 'platejs'; +import { cx } from '@/lib/utils/index'; + +const editorVariants = cva({ + base: cx( + 'group/editor', + 'relative w-full cursor-text select-text overflow-x-hidden whitespace-pre-wrap break-words', + 'rounded-md ring-offset-background focus-visible:outline-none', + 'placeholder:text-muted-foreground/80 **:data-slate-placeholder:top-[auto_!important] **:data-slate-placeholder:text-muted-foreground/80 **:data-slate-placeholder:opacity-100!', + '[&_strong]:font-bold', + ), + defaultVariants: { + variant: 'none', + }, + variants: { + disabled: { + true: 'cursor-not-allowed opacity-50', + }, + focused: { + true: 'ring-2 ring-ring ring-offset-2', + }, + variant: { + ai: 'w-full px-0 text-base md:text-sm', + aiChat: + 'max-h-[min(70vh,320px)] w-full max-w-[700px] overflow-y-auto px-5 py-3 text-base md:text-sm', + default: + 'size-full px-16 pt-4 pb-72 text-base sm:px-[max(64px,calc(50%-350px))]', + demo: 'size-full px-16 pt-4 pb-72 text-base sm:px-[max(64px,calc(50%-350px))]', + fullWidth: 'size-full px-16 pt-4 pb-72 text-base sm:px-24', + none: '', + select: 'px-3 py-2 text-base data-readonly:w-fit', + }, + }, +}); + +function EditorStatic({ + className, + variant, + ...props +}: PlateStaticProps & VariantProps) { + return ( + + ); +} + +export { editorVariants, EditorStatic }; diff --git a/src/components/ui/plate/EmojiNode.tsx b/src/components/ui/plate/EmojiNode.tsx new file mode 100644 index 00000000..b6d5870f --- /dev/null +++ b/src/components/ui/plate/EmojiNode.tsx @@ -0,0 +1,68 @@ +'use client'; + +import { EmojiInlineIndexSearch, insertEmoji } from '@platejs/emoji'; +import { EmojiPlugin } from '@platejs/emoji/react'; +import { useTranslations } from 'next-intl'; +import type { PlateElementProps } from 'platejs/react'; +import { PlateElement, usePluginOption } from 'platejs/react'; +import { useMemo, useState } from 'react'; +import { + InlineCombobox, + InlineComboboxContent, + InlineComboboxEmpty, + InlineComboboxGroup, + InlineComboboxInput, + InlineComboboxItem, +} from '@/components/ui/plate/InlineCombobox'; +import { useDebounceCallback } from '@/lib/hooks/useDebounceCallback'; + +function EmojiInputElement(props: PlateElementProps) { + const { children, editor, element } = props; + const data = usePluginOption(EmojiPlugin, 'data'); + const [value, setValue] = useState(''); + const debouncedSetValue = useDebounceCallback(setValue, 100); + const t = useTranslations('ui'); + + const filteredEmojis = useMemo(() => { + if (value.trim().length === 0) return []; + + return EmojiInlineIndexSearch.getInstance(data) + .search(value.replace(/:$/, '')) + .get(); + }, [data, value]); + + return ( + + + + + + {t('noResults')} + + + {filteredEmojis.map((emoji) => ( + insertEmoji(editor, emoji)} + > + {emoji.skins[0]?.native} {emoji.name} + + ))} + + + + + {children} + + ); +} + +export { EmojiInputElement }; diff --git a/src/components/ui/plate/EmojiToolbarButton.tsx b/src/components/ui/plate/EmojiToolbarButton.tsx new file mode 100644 index 00000000..ae99e68f --- /dev/null +++ b/src/components/ui/plate/EmojiToolbarButton.tsx @@ -0,0 +1,631 @@ +'use client'; + +import type { Emoji } from '@emoji-mart/data'; +import { + type EmojiCategoryList, + type EmojiIconList, + EmojiSettings, + type GridRow, +} from '@platejs/emoji'; +import { + type EmojiDropdownMenuOptions, + type UseEmojiPickerType, + useEmojiDropdownMenuState, +} from '@platejs/emoji/react'; +import * as Popover from '@radix-ui/react-popover'; +import { + AppleIcon, + ClockIcon, + CompassIcon, + FlagIcon, + LeafIcon, + LightbulbIcon, + MusicIcon, + SearchIcon, + SmileIcon, + StarIcon, + XIcon, +} from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { memo, useCallback } from 'react'; +import { Button } from '@/components/ui/Button'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@/components/ui/Tooltip'; +import { cx } from '@/lib/utils/index'; + +function EmojiToolbarButton({ + options, + ...props +}: { + options?: EmojiDropdownMenuOptions; +} & React.ComponentPropsWithoutRef) { + const { emojiPickerState, isOpen, setIsOpen } = + useEmojiDropdownMenuState(options); + + return ( + + + + } + isOpen={isOpen} + setIsOpen={setIsOpen} + > + + + ); +} + +function EmojiPopover({ + children, + control, + isOpen, + setIsOpen, +}: { + children: React.ReactNode; + control: React.ReactNode; + isOpen: boolean; + setIsOpen: (open: boolean) => void; +}) { + return ( + + {control} + + + {children} + + + ); +} + +function EmojiPicker({ + clearSearch, + emoji, + emojiLibrary, + focusedCategory, + hasFound, + i18n, + icons = { + categories: emojiCategoryIcons, + search: emojiSearchIcons, + }, + isSearching, + refs, + searchResult, + searchValue, + setSearch, + settings = EmojiSettings, + visibleCategories, + handleCategoryClick, + onMouseOver, + onSelectEmoji, +}: Omit & { + icons?: EmojiIconList; +}) { + return ( +
    + + + + + + +
    + ); +} + +const EmojiButton = memo(function EmojiButton({ + emoji, + index, + onMouseOver, + onSelect, +}: { + emoji: Emoji; + index: number; + onMouseOver: (emoji?: Emoji) => void; + onSelect: (emoji: Emoji) => void; +}) { + return ( + + ); +}); + +const RowOfButtons = memo(function RowOfButtons({ + emojiLibrary, + row, + onMouseOver, + onSelectEmoji, +}: { + row: GridRow; +} & Pick< + UseEmojiPickerType, + 'emojiLibrary' | 'onMouseOver' | 'onSelectEmoji' +>) { + return ( +
    + {row.elements.map((emojiId, index) => ( + + ))} +
    + ); +}); + +function EmojiPickerContent({ + emojiLibrary, + i18n, + isSearching = false, + refs, + searchResult, + settings = EmojiSettings, + visibleCategories, + onMouseOver, + onSelectEmoji, +}: Pick< + UseEmojiPickerType, + | 'emojiLibrary' + | 'i18n' + | 'isSearching' + | 'onMouseOver' + | 'onSelectEmoji' + | 'refs' + | 'searchResult' + | 'settings' + | 'visibleCategories' +>) { + const getRowWidth = settings.perLine.value * settings.buttonSize.value; + + const isCategoryVisible = useCallback( + (categoryId: EmojiCategoryList) => { + return visibleCategories.has(categoryId) + ? visibleCategories.get(categoryId) + : false; + }, + [visibleCategories], + ); + + const EmojiList = useCallback(() => { + return emojiLibrary + .getGrid() + .sections() + .map(({ id: categoryId }) => { + const section = emojiLibrary.getGrid().section(categoryId); + const { buttonSize } = settings; + + return ( +
    +
    + {i18n.categories[categoryId]} +
    +
    + {isCategoryVisible(categoryId) && + section + .getRows() + .map((row: GridRow) => ( + + ))} +
    +
    + ); + }); + }, [ + emojiLibrary, + getRowWidth, + i18n.categories, + isCategoryVisible, + onSelectEmoji, + onMouseOver, + settings, + ]); + + const SearchList = useCallback(() => { + return ( +
    +
    + {i18n.searchResult} +
    +
    + {searchResult.map((emoji: Emoji, index: number) => ( + + ))} +
    +
    + ); + }, [ + emojiLibrary, + getRowWidth, + i18n.searchResult, + searchResult, + onSelectEmoji, + onMouseOver, + ]); + + return ( +
    +
    + {isSearching ? SearchList() : EmojiList()} +
    +
    + ); +} + +function EmojiPickerSearchBar({ + children, + i18n, + searchValue, + setSearch, +}: { + children: React.ReactNode; +} & Pick) { + const t = useTranslations('ui'); + return ( +
    +
    + setSearch(event.target.value)} + placeholder={i18n.search} + aria-label={t('search')} + autoComplete='off' + type='text' + // biome-ignore lint/a11y/noAutofocus: *Obviously* expected to interact immediately + autoFocus + /> + {children} +
    +
    + ); +} + +function EmojiPickerSearchAndClear({ + clearSearch, + i18n, + searchValue, +}: Pick) { + const t = useTranslations('ui'); + + return ( +
    +
    + {emojiSearchIcons.loupe} +
    + {searchValue && ( + + )} +
    + ); +} + +function EmojiPreview({ emoji }: Pick) { + return ( +
    +
    + {emoji?.skins[0]?.native} +
    +
    +
    {emoji?.name}
    +
    {`:${emoji?.id}:`}
    +
    +
    + ); +} + +function NoEmoji({ i18n }: Pick) { + return ( +
    +
    😢
    +
    +
    + {i18n.searchNoResultsTitle} +
    +
    {i18n.searchNoResultsSubtitle}
    +
    +
    + ); +} + +function PickAnEmoji({ i18n }: Pick) { + return ( +
    +
    ☝️
    +
    +
    {i18n.pick}
    +
    +
    + ); +} + +function EmojiPickerPreview({ + emoji, + hasFound = true, + i18n, + isSearching = false, + ...props +}: Pick) { + const showPickEmoji = !emoji && (!isSearching || hasFound); + const showNoEmoji = isSearching && !hasFound; + const showPreview = emoji && !showNoEmoji && !showNoEmoji; + + return ( + <> + {showPreview && } + {showPickEmoji && } + {showNoEmoji && } + + ); +} + +function EmojiPickerNavigation({ + emojiLibrary, + focusedCategory, + i18n, + icons, + onClick, +}: { + onClick: (id: EmojiCategoryList) => void; +} & Pick< + UseEmojiPickerType, + 'emojiLibrary' | 'focusedCategory' | 'i18n' | 'icons' +>) { + return ( + + + + ); +} + +const emojiCategoryIcons: Record< + EmojiCategoryList, + { + outline: React.ReactElement; + solid: React.ReactElement; // Needed to add another solid variant - outline will be used for now + } +> = { + activity: { + outline: ( + + ), + solid: ( + + ), + }, + + custom: { + outline: , + solid: , + }, + + flags: { + outline: , + solid: , + }, + + foods: { + outline: , + solid: , + }, + + frequent: { + outline: , + solid: , + }, + + nature: { + outline: , + solid: , + }, + + objects: { + outline: , + solid: , + }, + + people: { + outline: , + solid: , + }, + + places: { + outline: , + solid: , + }, + + symbols: { + outline: , + solid: , + }, +}; + +const emojiSearchIcons = { + delete: , + loupe: , +}; + +export { EmojiToolbarButton, EmojiPopover, EmojiPicker }; diff --git a/src/components/ui/plate/EquationNode.tsx b/src/components/ui/plate/EquationNode.tsx new file mode 100644 index 00000000..179ac171 --- /dev/null +++ b/src/components/ui/plate/EquationNode.tsx @@ -0,0 +1,237 @@ +'use client'; + +import { useEquationElement, useEquationInput } from '@platejs/math/react'; +import { BlockSelectionPlugin } from '@platejs/selection/react'; +import { CornerDownLeftIcon, RadicalIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import type { TEquationElement } from 'platejs'; +import type { PlateElementProps } from 'platejs/react'; +import { + createPrimitiveComponent, + PlateElement, + useEditorRef, + useEditorSelector, + useElement, + useReadOnly, + useSelected, +} from 'platejs/react'; +import { useEffect, useRef, useState } from 'react'; +import TextareaAutosize, { + type TextareaAutosizeProps, +} from 'react-textarea-autosize'; +import { Button } from '@/components/ui/Button'; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/Popover'; +import { cx } from '@/lib/utils/index'; + +function EquationElement(props: PlateElementProps) { + const selected = useSelected(); + const [open, setOpen] = useState(selected); + const katexRef = useRef(null); + const t = useTranslations('ui.plate'); + + useEquationElement({ + element: props.element, + katexRef: katexRef, + options: { + displayMode: true, + errorColor: '#cc0000', + fleqn: false, + leqno: false, + macros: { '\\f': '#1f(#2)' }, + output: 'htmlAndMathml', + strict: 'warn', + throwOnError: false, + trust: false, + }, + }); + + return ( + + + +
    + {props.element.texExpression.length > 0 ? ( + + ) : ( +
    + +
    {t('addEquation')}
    +
    + )} +
    +
    + + 0 \\\\\n 0, &\\quad x = 0 \\\\\n -x^2, &\\quad x < 0\n\\end{cases}' + } + isInline={false} + setOpen={setOpen} + /> +
    + + {props.children} +
    + ); +} + +function InlineEquationElement(props: PlateElementProps) { + const element = props.element; + const katexRef = useRef(null); + const selected = useSelected(); + const isCollapsed = useEditorSelector( + (editor) => editor.api.isCollapsed(), + [], + ); + const [open, setOpen] = useState(selected && isCollapsed); + const t = useTranslations('ui.plate'); + + useEffect(() => { + if (selected && isCollapsed) { + setOpen(true); + } + }, [selected, isCollapsed]); + + useEquationElement({ + element, + katexRef: katexRef, + options: { + displayMode: true, + errorColor: '#cc0000', + fleqn: false, + leqno: false, + macros: { '\\f': '#1f(#2)' }, + output: 'htmlAndMathml', + strict: 'warn', + throwOnError: false, + trust: false, + }, + }); + + return ( + + + +
    0 && open) || selected) && + 'after:bg-brand/15', + element.texExpression.length === 0 && + 'text-muted-foreground after:bg-neutral-500/10', + )} + contentEditable={false} + > + + {element.texExpression.length === 0 && ( + + + {t('newEquation')} + + )} +
    +
    + + +
    + + {props.children} +
    + ); +} + +const EquationInput = createPrimitiveComponent(TextareaAutosize)({ + propsHook: useEquationInput, +}); + +const EquationPopoverContent = ({ + className, + isInline, + open, + setOpen, + ...props +}: { + isInline: boolean; + open: boolean; + setOpen: (open: boolean) => void; +} & TextareaAutosizeProps) => { + const editor = useEditorRef(); + const readOnly = useReadOnly(); + const element = useElement(); + const t = useTranslations('ui'); + + useEffect(() => { + if (isInline && open) { + setOpen(true); + } + }, [isInline, open, setOpen]); + + if (readOnly) return null; + + const onClose = () => { + setOpen(false); + + if (isInline) { + editor.tf.select(element, { focus: true, next: true }); + } else { + editor + .getApi(BlockSelectionPlugin) + .blockSelection.set(element.id as string); + } + }; + + return ( + { + e.preventDefault(); + }} + contentEditable={false} + > + + + + + ); +}; + +export { EquationElement, InlineEquationElement }; diff --git a/src/components/ui/plate/EquationNodeStatic.tsx b/src/components/ui/plate/EquationNodeStatic.tsx new file mode 100644 index 00000000..01ea9004 --- /dev/null +++ b/src/components/ui/plate/EquationNodeStatic.tsx @@ -0,0 +1,102 @@ +import { getEquationHtml } from '@platejs/math'; +import { RadicalIcon } from 'lucide-react'; +import type { SlateElementProps, TEquationElement } from 'platejs'; +import { SlateElement } from 'platejs'; +import { cx } from '@/lib/utils/index'; + +// Cannot be translated, as next-intl context is unavailable, +// and the component must be rendered synchronously to work with Plate.js +// HTML serialization. The lack of translations only affects exported files. +function EquationElementStatic(props: SlateElementProps) { + const { element } = props; + + const html = getEquationHtml({ + element, + options: { + displayMode: true, + errorColor: '#cc0000', + fleqn: false, + leqno: false, + macros: { '\\f': '#1f(#2)' }, + output: 'htmlAndMathml', + strict: 'warn', + throwOnError: false, + trust: false, + }, + }); + + return ( + +
    + {element.texExpression.length > 0 ? ( + + ) : ( +
    + +
    Add a Tex equation
    +
    + )} +
    + {props.children} +
    + ); +} + +function InlineEquationElementStatic( + props: SlateElementProps, +) { + const html = getEquationHtml({ + element: props.element, + options: { + displayMode: true, + errorColor: '#cc0000', + fleqn: false, + leqno: false, + macros: { '\\f': '#1f(#2)' }, + output: 'htmlAndMathml', + strict: 'warn', + throwOnError: false, + trust: false, + }, + }); + + return ( + +
    + +
    + {props.children} +
    + ); +} + +export { EquationElementStatic, InlineEquationElementStatic }; diff --git a/src/components/ui/plate/EquationToolbarButton.tsx b/src/components/ui/plate/EquationToolbarButton.tsx new file mode 100644 index 00000000..d18ae7fa --- /dev/null +++ b/src/components/ui/plate/EquationToolbarButton.tsx @@ -0,0 +1,29 @@ +'use client'; + +import { insertInlineEquation } from '@platejs/math'; +import { RadicalIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { useEditorRef } from 'platejs/react'; +import type * as React from 'react'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; + +function InlineEquationToolbarButton( + props: React.ComponentProps, +) { + const editor = useEditorRef(); + const t = useTranslations('ui.plate'); + + return ( + { + insertInlineEquation(editor); + }} + tooltip={t('markAsEquation')} + > + + + ); +} + +export { InlineEquationToolbarButton }; diff --git a/src/components/ui/plate/ExportToolbarButton.tsx b/src/components/ui/plate/ExportToolbarButton.tsx new file mode 100644 index 00000000..7b03f0c5 --- /dev/null +++ b/src/components/ui/plate/ExportToolbarButton.tsx @@ -0,0 +1,187 @@ +'use client'; + +import { MarkdownPlugin } from '@platejs/markdown'; + +import type { DropdownMenuProps } from '@radix-ui/react-dropdown-menu'; +import { ArrowDownToLineIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { createSlateEditor, serializeHtml } from 'platejs'; +import { useEditorRef } from 'platejs/react'; +import { useState } from 'react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/DropdownMenu'; +import { BaseEditorKit } from '@/components/ui/plate/base-kits/EditorBaseKit'; +import { EditorStatic } from '@/components/ui/plate/EditorStatic'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; +import { toast } from '@/components/ui/Toaster'; + +const siteUrl = 'https://platejs.org'; + +function ExportToolbarButton(props: DropdownMenuProps) { + const editor = useEditorRef(); + const tError = useTranslations('error'); + const t = useTranslations('ui.plate'); + const [open, setOpen] = useState(false); + + const getCanvas = async () => { + const { default: html2canvas } = await import('html2canvas-pro'); + + const style = document.createElement('style'); + document.head.append(style); + + const editorDOMNode = editor.api.toDOMNode(editor); + + if (!editorDOMNode) return null; + + const canvas = await html2canvas(editorDOMNode, { + onclone: (document: Document) => { + const editorElement = document.querySelector( + '[contenteditable="true"]', + ); + if (editorElement) { + Array.from(editorElement.querySelectorAll('*')).forEach((element) => { + const existingStyle = element.getAttribute('style') || ''; + element.setAttribute( + 'style', + `${existingStyle}; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif !important`, + ); + }); + } + }, + }); + style.remove(); + + return canvas; + }; + + const downloadFile = async (url: string, filename: string) => { + const response = await fetch(url); + + const blob = await response.blob(); + const blobUrl = window.URL.createObjectURL(blob); + + const link = document.createElement('a'); + link.href = blobUrl; + link.download = filename; + document.body.append(link); + link.click(); + link.remove(); + + // Clean up the blob URL + window.URL.revokeObjectURL(blobUrl); + }; + + const exportToPdf = async () => { + const canvas = await getCanvas(); + + if (!canvas) return toast.error(tError('failedToExportPDF')); + + const PDFLib = await import('pdf-lib'); + const pdfDoc = await PDFLib.PDFDocument.create(); + const page = pdfDoc.addPage([canvas.width, canvas.height]); + const imageEmbed = await pdfDoc.embedPng(canvas.toDataURL('PNG')); + const { height, width } = imageEmbed.scale(1); + page.drawImage(imageEmbed, { + height, + width, + x: 0, + y: 0, + }); + const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true }); + + await downloadFile(pdfBase64, 'plate.pdf'); + }; + + const exportToImage = async () => { + const canvas = await getCanvas(); + + if (!canvas) return toast.error(tError('failedToExportImage')); + + await downloadFile(canvas.toDataURL('image/png'), 'plate.png'); + }; + + const exportToHtml = async () => { + const editorStatic = createSlateEditor({ + plugins: BaseEditorKit, + value: editor.children, + }); + + const editorHtml = await serializeHtml(editorStatic, { + editorComponent: EditorStatic, + props: { style: { padding: '0 calc(50% - 350px)', paddingBottom: '' } }, + }); + + const tailwindCss = ``; + const katexCss = ``; + + const html = ` + + + + + + + + + ${tailwindCss} + ${katexCss} + + + + ${editorHtml} + + `; + + const url = `data:text/html;charset=utf-8,${encodeURIComponent(html)}`; + + await downloadFile(url, 'plate.html'); + }; + + const exportToMarkdown = async () => { + const md = editor.getApi(MarkdownPlugin).markdown.serialize(); + const url = `data:text/markdown;charset=utf-8,${encodeURIComponent(md)}`; + await downloadFile(url, 'plate.md'); + }; + + return ( + + + + + + + + + + + {t('exportAsHtml')} + + + {t('exportAsPdf')} + + + {t('exportAsImage')} + + + {t('exportAsMarkdown')} + + + + + ); +} + +export { ExportToolbarButton }; diff --git a/src/components/ui/plate/FixedToolbar.tsx b/src/components/ui/plate/FixedToolbar.tsx new file mode 100644 index 00000000..4a2e14c0 --- /dev/null +++ b/src/components/ui/plate/FixedToolbar.tsx @@ -0,0 +1,18 @@ +'use client'; + +import { Toolbar } from '@/components/ui/plate/Toolbar'; +import { cx } from '@/lib/utils/index'; + +function FixedToolbar(props: React.ComponentProps) { + return ( + + ); +} + +export { FixedToolbar }; diff --git a/src/components/ui/plate/FixedToolbarButtons.tsx b/src/components/ui/plate/FixedToolbarButtons.tsx new file mode 100644 index 00000000..eff95473 --- /dev/null +++ b/src/components/ui/plate/FixedToolbarButtons.tsx @@ -0,0 +1,159 @@ +'use client'; + +import { + ArrowUpToLineIcon, + BaselineIcon, + BoldIcon, + Code2Icon, + ItalicIcon, + PaintBucketIcon, + StrikethroughIcon, + UnderlineIcon, +} from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { KEYS } from 'platejs'; +import { useEditorReadOnly } from 'platejs/react'; +import { AlignToolbarButton } from '@/components/ui/plate/AlignToolbarButton'; +import { EmojiToolbarButton } from '@/components/ui/plate/EmojiToolbarButton'; +import { ExportToolbarButton } from '@/components/ui/plate/ExportToolbarButton'; +import { FontColorToolbarButton } from '@/components/ui/plate/FontColorToolbarButton'; +import { FontSizeToolbarButton } from '@/components/ui/plate/FontSizeToolbarButton'; +import { + RedoToolbarButton, + UndoToolbarButton, +} from '@/components/ui/plate/HistoryToolbarButton'; +import { ImportToolbarButton } from '@/components/ui/plate/ImportToolbarButton'; +import { + IndentToolbarButton, + OutdentToolbarButton, +} from '@/components/ui/plate/IndentToolbarButton'; +import { InsertToolbarButton } from '@/components/ui/plate/InsertToolbarButton'; +import { LineHeightToolbarButton } from '@/components/ui/plate/LineHeightToolbarButton'; +import { LinkToolbarButton } from '@/components/ui/plate/LinkToolbarButton'; +import { + BulletedListToolbarButton, + NumberedListToolbarButton, + TodoListToolbarButton, +} from '@/components/ui/plate/ListToolbarButton'; +import { MarkToolbarButton } from '@/components/ui/plate/MarkToolbarButton'; +import { MediaToolbarButton } from '@/components/ui/plate/MediaToolbarButton'; +import { ModeToolbarButton } from '@/components/ui/plate/ModeToolbarButton'; +import { MoreToolbarButton } from '@/components/ui/plate/MoreToolbarButton'; +import { TableToolbarButton } from '@/components/ui/plate/TableToolbarButton'; +import { ToggleToolbarButton } from '@/components/ui/plate/ToggleToolbarButton'; +import { ToolbarGroup } from '@/components/ui/plate/Toolbar'; +import { TurnIntoToolbarButton } from '@/components/ui/plate/TurnIntoToolbarButton'; + +function FixedToolbarButtons() { + const readOnly = useEditorReadOnly(); + const t = useTranslations('ui.plate'); + + return ( +
    + {!readOnly && ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )} + +
    + + + + +
    + ); +} + +export { FixedToolbarButtons }; diff --git a/src/components/ui/plate/FloatingToolbar.tsx b/src/components/ui/plate/FloatingToolbar.tsx new file mode 100644 index 00000000..163c164e --- /dev/null +++ b/src/components/ui/plate/FloatingToolbar.tsx @@ -0,0 +1,86 @@ +'use client'; + +import { + type FloatingToolbarState, + flip, + offset, + useFloatingToolbar, + useFloatingToolbarState, +} from '@platejs/floating'; +import { useComposedRef } from '@udecode/cn'; +import { KEYS } from 'platejs'; +import { + useEditorId, + useEventEditorValue, + usePluginOption, +} from 'platejs/react'; +import type * as React from 'react'; +import { Toolbar } from '@/components/ui/plate/Toolbar'; +import { cx } from '@/lib/utils/index'; + +function FloatingToolbar({ + children, + className, + state, + ...props +}: React.ComponentProps & { + state?: FloatingToolbarState; +}) { + const editorId = useEditorId(); + const focusedEditorId = useEventEditorValue('focus'); + const isFloatingLinkOpen = !!usePluginOption({ key: KEYS.link }, 'mode'); + const isAIChatOpen = usePluginOption({ key: KEYS.aiChat }, 'open'); + + const floatingToolbarState = useFloatingToolbarState({ + editorId, + focusedEditorId, + hideToolbar: isFloatingLinkOpen || isAIChatOpen, + ...state, + floatingOptions: { + middleware: [ + offset(12), + flip({ + fallbackPlacements: [ + 'top-start', + 'top-end', + 'bottom-start', + 'bottom-end', + ], + padding: 12, + }), + ], + placement: 'top', + ...state?.floatingOptions, + }, + }); + + const { + clickOutsideRef, + hidden, + props: rootProps, + ref: floatingRef, + } = useFloatingToolbar(floatingToolbarState); + + const ref = useComposedRef(props.ref, floatingRef); + + if (hidden) return null; + + return ( +
    + + {children} + +
    + ); +} + +export { FloatingToolbar }; diff --git a/src/components/ui/plate/FloatingToolbarButtons.tsx b/src/components/ui/plate/FloatingToolbarButtons.tsx new file mode 100644 index 00000000..dfceda55 --- /dev/null +++ b/src/components/ui/plate/FloatingToolbarButtons.tsx @@ -0,0 +1,63 @@ +'use client'; + +import { + BoldIcon, + Code2Icon, + ItalicIcon, + StrikethroughIcon, + UnderlineIcon, +} from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { KEYS } from 'platejs'; +import { useEditorReadOnly } from 'platejs/react'; +import { InlineEquationToolbarButton } from '@/components/ui/plate/EquationToolbarButton'; +import { LinkToolbarButton } from '@/components/ui/plate/LinkToolbarButton'; +import { MarkToolbarButton } from '@/components/ui/plate/MarkToolbarButton'; +import { MoreToolbarButton } from '@/components/ui/plate/MoreToolbarButton'; +import { ToolbarGroup } from '@/components/ui/plate/Toolbar'; +import { TurnIntoToolbarButton } from '@/components/ui/plate/TurnIntoToolbarButton'; + +function FloatingToolbarButtons() { + const readOnly = useEditorReadOnly(); + const t = useTranslations('ui.plate'); + + return ( + <> + {!readOnly && ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + )} + {!readOnly && } + + ); +} + +export { FloatingToolbarButtons }; diff --git a/src/components/ui/plate/FontColorToolbarButton.tsx b/src/components/ui/plate/FontColorToolbarButton.tsx new file mode 100644 index 00000000..96acb354 --- /dev/null +++ b/src/components/ui/plate/FontColorToolbarButton.tsx @@ -0,0 +1,840 @@ +'use client'; + +import type { + DropdownMenuItemProps, + DropdownMenuProps, +} from '@radix-ui/react-dropdown-menu'; +import { useComposedRef } from '@udecode/cn'; +import debounce from 'lodash/debounce.js'; +import { EraserIcon, PlusIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { useEditorRef, useEditorSelector } from 'platejs/react'; +import React, { + cloneElement, + memo, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { buttonVariants } from '@/components/ui/Button'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/DropdownMenu'; +import { ToolbarButton, ToolbarMenuGroup } from '@/components/ui/plate/Toolbar'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@/components/ui/Tooltip'; +import { cx } from '@/lib/utils/index'; + +function FontColorToolbarButton({ + children, + nodeType, + tooltip, +}: { + nodeType: string; + tooltip?: string; +} & DropdownMenuProps) { + const editor = useEditorRef(); + + const selectionDefined = useEditorSelector( + (editor) => !!editor.selection, + [], + ); + + const color = useEditorSelector( + (editor) => editor.api.mark(nodeType) as string, + [nodeType], + ); + + const [selectedColor, setSelectedColor] = useState(); + const [open, setOpen] = useState(false); + + // biome-ignore lint/correctness/useExhaustiveDependencies: off + const onToggle = useCallback( + (value = !open) => { + setOpen(value); + }, + [open, setOpen], + ); + + const updateColor = useCallback( + (value: string) => { + if (editor.selection) { + setSelectedColor(value); + + editor.tf.select(editor.selection); + editor.tf.focus(); + + editor.tf.addMarks({ [nodeType]: value }); + } + }, + [editor, nodeType], + ); + + const updateColorAndClose = useCallback( + (value: string) => { + updateColor(value); + onToggle(); + }, + [onToggle, updateColor], + ); + + const clearColor = useCallback(() => { + if (editor.selection) { + editor.tf.select(editor.selection); + editor.tf.focus(); + + if (selectedColor) { + editor.tf.removeMarks(nodeType); + } + + onToggle(); + } + }, [editor, selectedColor, onToggle, nodeType]); + + useEffect(() => { + if (selectionDefined) { + setSelectedColor(color); + } + }, [color, selectionDefined]); + + return ( + { + setOpen(value); + }} + modal={false} + > + + + {children} + + + + + + + + ); +} + +function PureColorPicker({ + className, + clearColor, + color, + colors, + customColors, + updateColor, + updateCustomColor, + ...props +}: React.ComponentProps<'div'> & { + colors: TColor[]; + customColors: TColor[]; + clearColor: () => void; + updateColor: (color: string) => void; + updateCustomColor: (color: string) => void; + color?: string; +}) { + const t = useTranslations('ui'); + return ( +
    + + + + + + + {color && ( + + + + {t('clear')} + + + )} +
    + ); +} + +const ColorPicker = memo( + PureColorPicker, + (prev, next) => + prev.color === next.color && + prev.colors === next.colors && + prev.customColors === next.customColors, +); + +function ColorCustom({ + className, + color, + colors, + customColors, + updateColor, + updateCustomColor, + ...props +}: { + colors: TColor[]; + customColors: TColor[]; + updateColor: (color: string) => void; + updateCustomColor: (color: string) => void; + color?: string; +} & React.ComponentPropsWithoutRef<'div'>) { + const [customColor, setCustomColor] = useState(); + const [value, setValue] = useState(color || '#000000'); + const t = useTranslations('ui'); + + useEffect(() => { + if ( + !color || + customColors.some((c) => c.value === color) || + colors.some((c) => c.value === color) + ) { + return; + } + + setCustomColor(color); + }, [color, colors, customColors]); + + const computedColors = useMemo( + () => + customColor + ? [ + ...customColors, + { + isBrightColor: false, + name: '', + value: customColor, + }, + ] + : customColors, + [customColor, customColors], + ); + + // biome-ignore lint/correctness/useExhaustiveDependencies: off + const updateCustomColorDebounced = useCallback( + debounce(updateCustomColor, 100), + [updateCustomColor], + ); + + return ( +
    + + { + setValue(e.target.value); + updateCustomColorDebounced(e.target.value); + }} + > + { + e.preventDefault(); + }} + > + {t('custom')} + + + + +
    + ); +} + +function ColorInput({ + children, + className, + value = '#000000', + ...props +}: React.ComponentProps<'input'>) { + const inputRef = useRef(null); + + return ( +
    + {React.Children.map(children, (child) => { + if (!child) return child; + + return cloneElement( + child as React.ReactElement<{ + onClick: () => void; + }>, + { + onClick: () => inputRef.current?.click(), + }, + ); + })} + +
    + ); +} + +type TColor = { + isBrightColor: boolean; + name: string; + value: string; +}; + +function ColorDropdownMenuItem({ + className, + isBrightColor, + isSelected, + name, + updateColor, + value, + ...props +}: { + isBrightColor: boolean; + isSelected: boolean; + value: string; + updateColor: (color: string) => void; + name?: string; +} & DropdownMenuItemProps) { + const content = ( + { + e.preventDefault(); + updateColor(value); + }} + {...props} + /> + ); + + return name ? ( + + {content} + {name} + + ) : ( + content + ); +} + +function ColorDropdownMenuItems({ + className, + color, + colors, + updateColor, + ...props +}: { + colors: TColor[]; + updateColor: (color: string) => void; + color?: string; +} & React.ComponentProps<'div'>) { + return ( +
    + + {colors.map(({ isBrightColor, name, value }) => ( + + ))} + {props.children} + +
    + ); +} + +const DEFAULT_COLORS = [ + { + isBrightColor: false, + name: 'black', + value: '#000000', + }, + { + isBrightColor: false, + name: 'dark grey 4', + value: '#434343', + }, + { + isBrightColor: false, + name: 'dark grey 3', + value: '#666666', + }, + { + isBrightColor: false, + name: 'dark grey 2', + value: '#999999', + }, + { + isBrightColor: false, + name: 'dark grey 1', + value: '#B7B7B7', + }, + { + isBrightColor: false, + name: 'grey', + value: '#CCCCCC', + }, + { + isBrightColor: false, + name: 'light grey 1', + value: '#D9D9D9', + }, + { + isBrightColor: true, + name: 'light grey 2', + value: '#EFEFEF', + }, + { + isBrightColor: true, + name: 'light grey 3', + value: '#F3F3F3', + }, + { + isBrightColor: true, + name: 'white', + value: '#FFFFFF', + }, + { + isBrightColor: false, + name: 'red berry', + value: '#980100', + }, + { + isBrightColor: false, + name: 'red', + value: '#FE0000', + }, + { + isBrightColor: false, + name: 'orange', + value: '#FE9900', + }, + { + isBrightColor: true, + name: 'yellow', + value: '#FEFF00', + }, + { + isBrightColor: false, + name: 'green', + value: '#00FF00', + }, + { + isBrightColor: false, + name: 'cyan', + value: '#00FFFF', + }, + { + isBrightColor: false, + name: 'cornflower blue', + value: '#4B85E8', + }, + { + isBrightColor: false, + name: 'blue', + value: '#1300FF', + }, + { + isBrightColor: false, + name: 'purple', + value: '#9900FF', + }, + { + isBrightColor: false, + name: 'magenta', + value: '#FF00FF', + }, + + { + isBrightColor: false, + name: 'light red berry 3', + value: '#E6B8AF', + }, + { + isBrightColor: false, + name: 'light red 3', + value: '#F4CCCC', + }, + { + isBrightColor: true, + name: 'light orange 3', + value: '#FCE4CD', + }, + { + isBrightColor: true, + name: 'light yellow 3', + value: '#FFF2CC', + }, + { + isBrightColor: true, + name: 'light green 3', + value: '#D9EAD3', + }, + { + isBrightColor: false, + name: 'light cyan 3', + value: '#D0DFE3', + }, + { + isBrightColor: false, + name: 'light cornflower blue 3', + value: '#C9DAF8', + }, + { + isBrightColor: true, + name: 'light blue 3', + value: '#CFE1F3', + }, + { + isBrightColor: true, + name: 'light purple 3', + value: '#D9D2E9', + }, + { + isBrightColor: true, + name: 'light magenta 3', + value: '#EAD1DB', + }, + + { + isBrightColor: false, + name: 'light red berry 2', + value: '#DC7E6B', + }, + { + isBrightColor: false, + name: 'light red 2', + value: '#EA9999', + }, + { + isBrightColor: false, + name: 'light orange 2', + value: '#F9CB9C', + }, + { + isBrightColor: true, + name: 'light yellow 2', + value: '#FFE598', + }, + { + isBrightColor: false, + name: 'light green 2', + value: '#B7D6A8', + }, + { + isBrightColor: false, + name: 'light cyan 2', + value: '#A1C4C9', + }, + { + isBrightColor: false, + name: 'light cornflower blue 2', + value: '#A4C2F4', + }, + { + isBrightColor: false, + name: 'light blue 2', + value: '#9FC5E8', + }, + { + isBrightColor: false, + name: 'light purple 2', + value: '#B5A7D5', + }, + { + isBrightColor: false, + name: 'light magenta 2', + value: '#D5A6BD', + }, + + { + isBrightColor: false, + name: 'light red berry 1', + value: '#CC4125', + }, + { + isBrightColor: false, + name: 'light red 1', + value: '#E06666', + }, + { + isBrightColor: false, + name: 'light orange 1', + value: '#F6B26B', + }, + { + isBrightColor: false, + name: 'light yellow 1', + value: '#FFD966', + }, + { + isBrightColor: false, + name: 'light green 1', + value: '#93C47D', + }, + { + isBrightColor: false, + name: 'light cyan 1', + value: '#76A5AE', + }, + { + isBrightColor: false, + name: 'light cornflower blue 1', + value: '#6C9EEB', + }, + { + isBrightColor: false, + name: 'light blue 1', + value: '#6FA8DC', + }, + { + isBrightColor: false, + name: 'light purple 1', + value: '#8D7CC3', + }, + { + isBrightColor: false, + name: 'light magenta 1', + value: '#C27BA0', + }, + + { + isBrightColor: false, + name: 'dark red berry 1', + value: '#A61B00', + }, + { + isBrightColor: false, + name: 'dark red 1', + value: '#CC0000', + }, + { + isBrightColor: false, + name: 'dark orange 1', + value: '#E59138', + }, + { + isBrightColor: false, + name: 'dark yellow 1', + value: '#F1C231', + }, + { + isBrightColor: false, + name: 'dark green 1', + value: '#6AA74F', + }, + { + isBrightColor: false, + name: 'dark cyan 1', + value: '#45818E', + }, + { + isBrightColor: false, + name: 'dark cornflower blue 1', + value: '#3B78D8', + }, + { + isBrightColor: false, + name: 'dark blue 1', + value: '#3E84C6', + }, + { + isBrightColor: false, + name: 'dark purple 1', + value: '#664EA6', + }, + { + isBrightColor: false, + name: 'dark magenta 1', + value: '#A64D78', + }, + + { + isBrightColor: false, + name: 'dark red berry 2', + value: '#84200D', + }, + { + isBrightColor: false, + name: 'dark red 2', + value: '#990001', + }, + { + isBrightColor: false, + name: 'dark orange 2', + value: '#B45F05', + }, + { + isBrightColor: false, + name: 'dark yellow 2', + value: '#BF9002', + }, + { + isBrightColor: false, + name: 'dark green 2', + value: '#38761D', + }, + { + isBrightColor: false, + name: 'dark cyan 2', + value: '#124F5C', + }, + { + isBrightColor: false, + name: 'dark cornflower blue 2', + value: '#1155CB', + }, + { + isBrightColor: false, + name: 'dark blue 2', + value: '#0C5394', + }, + { + isBrightColor: false, + name: 'dark purple 2', + value: '#351C75', + }, + { + isBrightColor: false, + name: 'dark magenta 2', + value: '#741B47', + }, + + { + isBrightColor: false, + name: 'dark red berry 3', + value: '#5B0F00', + }, + { + isBrightColor: false, + name: 'dark red 3', + value: '#660000', + }, + { + isBrightColor: false, + name: 'dark orange 3', + value: '#783F04', + }, + { + isBrightColor: false, + name: 'dark yellow 3', + value: '#7E6000', + }, + { + isBrightColor: false, + name: 'dark green 3', + value: '#274E12', + }, + { + isBrightColor: false, + name: 'dark cyan 3', + value: '#0D343D', + }, + { + isBrightColor: false, + name: 'dark cornflower blue 3', + value: '#1B4487', + }, + { + isBrightColor: false, + name: 'dark blue 3', + value: '#083763', + }, + { + isBrightColor: false, + name: 'dark purple 3', + value: '#1F124D', + }, + { + isBrightColor: false, + name: 'dark magenta 3', + value: '#4C1130', + }, +]; + +const DEFAULT_CUSTOM_COLORS = [ + { + isBrightColor: false, + name: 'dark orange 3', + value: '#783F04', + }, + { + isBrightColor: false, + name: 'dark grey 3', + value: '#666666', + }, + { + isBrightColor: false, + name: 'dark grey 2', + value: '#999999', + }, + { + isBrightColor: false, + name: 'light cornflower blue 1', + value: '#6C9EEB', + }, + { + isBrightColor: false, + name: 'dark magenta 3', + value: '#4C1130', + }, +]; + +export { FontColorToolbarButton, ColorDropdownMenuItems, DEFAULT_COLORS }; diff --git a/src/components/ui/plate/FontSizeToolbarButton.tsx b/src/components/ui/plate/FontSizeToolbarButton.tsx new file mode 100644 index 00000000..65ff1365 --- /dev/null +++ b/src/components/ui/plate/FontSizeToolbarButton.tsx @@ -0,0 +1,149 @@ +'use client'; + +import { toUnitLess } from '@platejs/basic-styles'; +import { FontSizePlugin } from '@platejs/basic-styles/react'; +import { Minus, Plus } from 'lucide-react'; +import type { TElement } from 'platejs'; +import { KEYS } from 'platejs'; +import { useEditorPlugin, useEditorSelector } from 'platejs/react'; +import { useState } from 'react'; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/Popover'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; +import { cx } from '@/lib/utils/index'; + +const DEFAULT_FONT_SIZE = '16'; + +const FONT_SIZE_MAP = { + h1: '36', + h2: '24', + h3: '20', +} as const; + +const FONT_SIZES = [ + '8', + '9', + '10', + '12', + '14', + '16', + '18', + '24', + '30', + '36', + '48', + '60', + '72', + '96', +] as const; + +function FontSizeToolbarButton() { + const [inputValue, setInputValue] = useState(DEFAULT_FONT_SIZE); + const [isFocused, setIsFocused] = useState(false); + const { editor, tf } = useEditorPlugin(FontSizePlugin); + + const cursorFontSize = useEditorSelector((editor) => { + const fontSize = editor.api.marks()?.[KEYS.fontSize]; + + if (fontSize) { + return toUnitLess(fontSize as string); + } + + const [block] = editor.api.block() || []; + + if (!block?.type) return DEFAULT_FONT_SIZE; + + return block.type in FONT_SIZE_MAP + ? FONT_SIZE_MAP[block.type as keyof typeof FONT_SIZE_MAP] + : DEFAULT_FONT_SIZE; + }, []); + + const handleInputChange = () => { + const newSize = toUnitLess(inputValue); + + if (Number.parseInt(newSize) < 1 || Number.parseInt(newSize) > 100) { + editor.tf.focus(); + + return; + } + if (newSize !== toUnitLess(cursorFontSize)) { + tf.fontSize.addMark(`${newSize}px`); + } + + editor.tf.focus(); + }; + + const handleFontSizeChange = (delta: number) => { + const newSize = Number(displayValue) + delta; + tf.fontSize.addMark(`${newSize}px`); + editor.tf.focus(); + }; + + const displayValue = isFocused ? inputValue : cursorFontSize; + + return ( +
    + handleFontSizeChange(-1)}> + + + + + + { + setIsFocused(false); + handleInputChange(); + }} + onChange={(e) => setInputValue(e.target.value)} + onFocus={() => { + setIsFocused(true); + setInputValue(toUnitLess(cursorFontSize)); + }} + onKeyDown={(e) => { + if (e.key === 'Enter') { + e.preventDefault(); + handleInputChange(); + } + }} + data-plate-focus='true' + type='text' + /> + + e.preventDefault()} + > + {FONT_SIZES.map((size) => ( + + ))} + + + + handleFontSizeChange(1)}> + + +
    + ); +} + +export { FontSizeToolbarButton }; diff --git a/src/components/ui/plate/HeadingNode.tsx b/src/components/ui/plate/HeadingNode.tsx new file mode 100644 index 00000000..3e07fd83 --- /dev/null +++ b/src/components/ui/plate/HeadingNode.tsx @@ -0,0 +1,68 @@ +'use client'; + +import { cva, type VariantProps } from 'cva'; +import type { PlateElementProps } from 'platejs/react'; +import { PlateElement } from 'platejs/react'; + +const headingVariants = cva({ + base: 'relative mb-1', + variants: { + variant: { + h1: 'mt-[1.6em] pb-1 font-bold font-heading text-4xl', + h2: 'mt-[1.4em] pb-px font-heading font-semibold text-2xl tracking-tight', + h3: 'mt-[1em] pb-px font-heading font-semibold text-xl tracking-tight', + h4: 'mt-[0.75em] font-heading font-semibold text-lg tracking-tight', + h5: 'mt-[0.75em] font-semibold text-lg tracking-tight', + h6: 'mt-[0.75em] font-semibold text-base tracking-tight', + }, + }, +}); + +function HeadingElement({ + variant = 'h1', + ...props +}: PlateElementProps & VariantProps) { + return ( + + {props.children} + + ); +} + +function H1Element(props: PlateElementProps) { + return ; +} + +function H2Element(props: PlateElementProps) { + return ; +} + +function H3Element(props: PlateElementProps) { + return ; +} + +function H4Element(props: PlateElementProps) { + return ; +} + +function H5Element(props: PlateElementProps) { + return ; +} + +function H6Element(props: PlateElementProps) { + return ; +} + +export { + HeadingElement, + H1Element, + H2Element, + H3Element, + H4Element, + H5Element, + H6Element, +}; diff --git a/src/components/ui/plate/HeadingNodeStatic.tsx b/src/components/ui/plate/HeadingNodeStatic.tsx new file mode 100644 index 00000000..efb42ba2 --- /dev/null +++ b/src/components/ui/plate/HeadingNodeStatic.tsx @@ -0,0 +1,77 @@ +import { cva, type VariantProps } from 'cva'; +import type { SlateElementProps } from 'platejs'; +import { SlateElement } from 'platejs'; +import type * as React from 'react'; + +const headingVariants = cva({ + base: 'relative mb-1', + variants: { + variant: { + h1: 'mt-[1.6em] pb-1 font-bold font-heading text-4xl', + h2: 'mt-[1.4em] pb-px font-heading font-semibold text-2xl tracking-tight', + h3: 'mt-[1em] pb-px font-heading font-semibold text-xl tracking-tight', + h4: 'mt-[0.75em] font-heading font-semibold text-lg tracking-tight', + h5: 'mt-[0.75em] font-semibold text-lg tracking-tight', + h6: 'mt-[0.75em] font-semibold text-base tracking-tight', + }, + }, +}); + +function HeadingElementStatic({ + variant = 'h1', + ...props +}: SlateElementProps & VariantProps) { + return ( + + {props.children} + + ); +} + +function H1ElementStatic(props: SlateElementProps) { + return ; +} + +function H2ElementStatic( + props: React.ComponentProps, +) { + return ; +} + +function H3ElementStatic( + props: React.ComponentProps, +) { + return ; +} + +function H4ElementStatic( + props: React.ComponentProps, +) { + return ; +} + +function H5ElementStatic( + props: React.ComponentProps, +) { + return ; +} + +function H6ElementStatic( + props: React.ComponentProps, +) { + return ; +} + +export { + HeadingElementStatic, + H1ElementStatic, + H2ElementStatic, + H3ElementStatic, + H4ElementStatic, + H5ElementStatic, + H6ElementStatic, +}; diff --git a/src/components/ui/plate/HighlightNode.tsx b/src/components/ui/plate/HighlightNode.tsx new file mode 100644 index 00000000..210fdf8d --- /dev/null +++ b/src/components/ui/plate/HighlightNode.tsx @@ -0,0 +1,14 @@ +'use client'; + +import type { PlateLeafProps } from 'platejs/react'; +import { PlateLeaf } from 'platejs/react'; + +function HighlightLeaf(props: PlateLeafProps) { + return ( + + {props.children} + + ); +} + +export { HighlightLeaf }; diff --git a/src/components/ui/plate/HighlightNodeStatic.tsx b/src/components/ui/plate/HighlightNodeStatic.tsx new file mode 100644 index 00000000..e9d004f6 --- /dev/null +++ b/src/components/ui/plate/HighlightNodeStatic.tsx @@ -0,0 +1,12 @@ +import type { SlateLeafProps } from 'platejs'; +import { SlateLeaf } from 'platejs'; + +function HighlightLeafStatic(props: SlateLeafProps) { + return ( + + {props.children} + + ); +} + +export { HighlightLeafStatic }; diff --git a/src/components/ui/plate/HistoryToolbarButton.tsx b/src/components/ui/plate/HistoryToolbarButton.tsx new file mode 100644 index 00000000..1308a5ab --- /dev/null +++ b/src/components/ui/plate/HistoryToolbarButton.tsx @@ -0,0 +1,51 @@ +'use client'; + +import { Redo2Icon, Undo2Icon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { useEditorRef, useEditorSelector } from 'platejs/react'; +import type * as React from 'react'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; + +function RedoToolbarButton(props: React.ComponentProps) { + const editor = useEditorRef(); + const disabled = useEditorSelector( + (editor) => editor.history.redos.length === 0, + [], + ); + const t = useTranslations('ui'); + + return ( + editor.redo()} + onMouseDown={(e) => e.preventDefault()} + tooltip={t('redo')} + > + + + ); +} + +function UndoToolbarButton(props: React.ComponentProps) { + const editor = useEditorRef(); + const disabled = useEditorSelector( + (editor) => editor.history.undos.length === 0, + [], + ); + const t = useTranslations('ui'); + + return ( + editor.undo()} + onMouseDown={(e) => e.preventDefault()} + tooltip={t('undo')} + > + + + ); +} + +export { RedoToolbarButton, UndoToolbarButton }; diff --git a/src/components/ui/plate/HrNode.tsx b/src/components/ui/plate/HrNode.tsx new file mode 100644 index 00000000..2438664d --- /dev/null +++ b/src/components/ui/plate/HrNode.tsx @@ -0,0 +1,33 @@ +'use client'; + +import type { PlateElementProps } from 'platejs/react'; +import { + PlateElement, + useFocused, + useReadOnly, + useSelected, +} from 'platejs/react'; +import { cx } from '@/lib/utils/index'; + +function HrElement(props: PlateElementProps) { + const readOnly = useReadOnly(); + const selected = useSelected(); + const focused = useFocused(); + + return ( + +
    +
    +
    + {props.children} +
    + ); +} + +export { HrElement }; diff --git a/src/components/ui/plate/HrNodeStatic.tsx b/src/components/ui/plate/HrNodeStatic.tsx new file mode 100644 index 00000000..47e1aaf6 --- /dev/null +++ b/src/components/ui/plate/HrNodeStatic.tsx @@ -0,0 +1,20 @@ +import type { SlateElementProps } from 'platejs'; +import { SlateElement } from 'platejs'; +import { cx } from '@/lib/utils/index'; + +function HrElementStatic(props: SlateElementProps) { + return ( + +
    +
    +
    + {props.children} +
    + ); +} + +export { HrElementStatic }; diff --git a/src/components/ui/plate/ImportToolbarButton.tsx b/src/components/ui/plate/ImportToolbarButton.tsx new file mode 100644 index 00000000..48e5a705 --- /dev/null +++ b/src/components/ui/plate/ImportToolbarButton.tsx @@ -0,0 +1,99 @@ +'use client'; + +import { MarkdownPlugin } from '@platejs/markdown'; +import type { DropdownMenuProps } from '@radix-ui/react-dropdown-menu'; +import { ArrowUpToLineIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { getEditorDOMFromHtmlString } from 'platejs'; +import { useEditorRef } from 'platejs/react'; +import { useState } from 'react'; +import { useFilePicker } from 'use-file-picker'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/DropdownMenu'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; + +type ImportType = 'html' | 'markdown'; + +function ImportToolbarButton(props: DropdownMenuProps) { + const editor = useEditorRef(); + const [open, setOpen] = useState(false); + const t = useTranslations('ui.plate'); + + const getFileNodes = (text: string, type: ImportType) => { + if (type === 'html') { + const editorNode = getEditorDOMFromHtmlString(text); + const nodes = editor.api.html.deserialize({ + element: editorNode, + }); + + return nodes; + } + + if (type === 'markdown') { + return editor.getApi(MarkdownPlugin).markdown.deserialize(text); + } + + return []; + }; + + const { openFilePicker: openMdFilePicker } = useFilePicker({ + accept: ['.md', '.mdx'], + multiple: false, + onFilesSelected: async ({ plainFiles }) => { + const text = await plainFiles[0].text(); + + const nodes = getFileNodes(text, 'markdown'); + + editor.tf.insertNodes(nodes); + }, + }); + + const { openFilePicker: openHtmlFilePicker } = useFilePicker({ + accept: ['text/html'], + multiple: false, + onFilesSelected: async ({ plainFiles }) => { + const text = await plainFiles[0].text(); + + const nodes = getFileNodes(text, 'html'); + + editor.tf.insertNodes(nodes); + }, + }); + + return ( + + + + + + + + + + { + openHtmlFilePicker(); + }} + > + {t('importFromHtml')} + + + { + openMdFilePicker(); + }} + > + {t('importFromMarkdown')} + + + + + ); +} + +export { ImportToolbarButton }; diff --git a/src/components/ui/plate/IndentToolbarButton.tsx b/src/components/ui/plate/IndentToolbarButton.tsx new file mode 100644 index 00000000..c6af55ac --- /dev/null +++ b/src/components/ui/plate/IndentToolbarButton.tsx @@ -0,0 +1,35 @@ +'use client'; + +import { useIndentButton, useOutdentButton } from '@platejs/indent/react'; +import { IndentIcon, OutdentIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import type * as React from 'react'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; + +function IndentToolbarButton( + props: React.ComponentProps, +) { + const { props: buttonProps } = useIndentButton(); + const t = useTranslations('ui.plate'); + + return ( + + + + ); +} + +function OutdentToolbarButton( + props: React.ComponentProps, +) { + const { props: buttonProps } = useOutdentButton(); + const t = useTranslations('ui.plate'); + + return ( + + + + ); +} + +export { IndentToolbarButton, OutdentToolbarButton }; diff --git a/src/components/ui/plate/InlineCombobox.tsx b/src/components/ui/plate/InlineCombobox.tsx new file mode 100644 index 00000000..e556536f --- /dev/null +++ b/src/components/ui/plate/InlineCombobox.tsx @@ -0,0 +1,407 @@ +'use client'; + +import { + Combobox, + ComboboxGroup, + ComboboxGroupLabel, + ComboboxItem, + type ComboboxItemProps, + ComboboxPopover, + ComboboxProvider, + ComboboxRow, + Portal, + useComboboxContext, + useComboboxStore, + useStoreState, +} from '@ariakit/react'; +import { filterWords } from '@platejs/combobox'; +import { + type UseComboboxInputResult, + useComboboxInput, + useHTMLInputCursorState, +} from '@platejs/combobox/react'; +import { cva } from 'cva'; +import type { Point, TElement } from 'platejs'; +import { useComposedRef, useEditorRef } from 'platejs/react'; +import { + createContext, + forwardRef, + startTransition, + useCallback, + useContext, + useEffect, + useMemo, + useRef, + useState, +} from 'react'; +import { cx } from '@/lib/utils/index'; + +type FilterFn = ( + item: { value: string; group?: string; keywords?: string[]; label?: string }, + search: string, +) => boolean; + +interface InlineComboboxContextValue { + filter: FilterFn | false; + inputProps: UseComboboxInputResult['props']; + inputRef: React.RefObject; + removeInput: UseComboboxInputResult['removeInput']; + showTrigger: boolean; + trigger: string; + setHasEmpty: (hasEmpty: boolean) => void; +} + +const InlineComboboxContext = createContext( + null as unknown as InlineComboboxContextValue, +); + +const defaultFilter: FilterFn = ( + { group, keywords = [], label, value }, + search, +) => { + const uniqueTerms = new Set( + [value, ...keywords, group, label].filter(Boolean), + ) as Set; + + return Array.from(uniqueTerms).some((keyword) => + filterWords(keyword, search), + ); +}; + +interface InlineComboboxProps { + children: React.ReactNode; + element: TElement; + trigger: string; + filter?: FilterFn | false; + hideWhenNoValue?: boolean; + showTrigger?: boolean; + value?: string; + setValue?: (value: string) => void; +} + +const InlineCombobox = ({ + children, + element, + filter = defaultFilter, + hideWhenNoValue = false, + setValue: setValueProp, + showTrigger = true, + trigger, + value: valueProp, +}: InlineComboboxProps) => { + const editor = useEditorRef(); + const inputRef = useRef(null); + const cursorState = useHTMLInputCursorState(inputRef); + + const [valueState, setValueState] = useState(''); + const hasValueProp = valueProp !== undefined; + const value = hasValueProp ? valueProp : valueState; + + const setValue = useCallback( + (newValue: string) => { + setValueProp?.(newValue); + + if (!hasValueProp) { + setValueState(newValue); + } + }, + [setValueProp, hasValueProp], + ); + + /** + * Track the point just before the input element so we know where to + * insertText if the combobox closes due to a selection change. + */ + const insertPoint = useRef(null); + + useEffect(() => { + const path = editor.api.findPath(element); + + if (!path) return; + + const point = editor.api.before(path); + + if (!point) return; + + const pointRef = editor.api.pointRef(point); + insertPoint.current = pointRef.current; + + return () => { + pointRef.unref(); + }; + }, [editor, element]); + + const { props: inputProps, removeInput } = useComboboxInput({ + cancelInputOnBlur: true, + cursorState, + ref: inputRef, + onCancelInput: (cause) => { + if (cause !== 'backspace') { + editor.tf.insertText(trigger + value, { + at: insertPoint?.current ?? undefined, + }); + } + if (cause === 'arrowLeft' || cause === 'arrowRight') { + editor.tf.move({ + distance: 1, + reverse: cause === 'arrowLeft', + }); + } + }, + }); + + const [hasEmpty, setHasEmpty] = useState(false); + + // biome-ignore lint/correctness/useExhaustiveDependencies: off + const contextValue: InlineComboboxContextValue = useMemo( + () => ({ + filter, + inputProps, + inputRef, + removeInput, + setHasEmpty, + showTrigger, + trigger, + }), + [ + trigger, + showTrigger, + filter, + inputRef, + inputProps, + removeInput, + setHasEmpty, + ], + ); + + const store = useComboboxStore({ + // open: , + setValue: (newValue) => startTransition(() => setValue(newValue)), + }); + + const items = useStoreState(store, 'items'); + + /** + * If there is no active ID and the list of items changes, select the first + * item. + */ + // biome-ignore lint/correctness/useExhaustiveDependencies: off + useEffect(() => { + if (!store.getState().activeId) { + store.setActiveId(store.first()); + } + }, [items, store]); + + return ( + + 0 || hasEmpty) && + (!hideWhenNoValue || value.length > 0) + } + store={store} + > + + {children} + + + + ); +}; + +const InlineComboboxInput = forwardRef< + HTMLInputElement, + React.HTMLAttributes +>(({ className, ...props }, propRef) => { + const { + inputProps, + inputRef: contextRef, + showTrigger, + trigger, + } = useContext(InlineComboboxContext); + + const store = useComboboxContext(); + const value = useStoreState(store, 'value'); + + const ref = useComposedRef(propRef, contextRef); + + /** + * To create an auto-resizing input, we render a visually hidden span + * containing the input value and position the input element on top of it. + * This works well for all cases except when input exceeds the width of the + * container. + */ + + return ( + <> + {showTrigger && trigger} + + + + + + + + ); +}); + +InlineComboboxInput.displayName = 'InlineComboboxInput'; + +const InlineComboboxContent: typeof ComboboxPopover = ({ + className, + ...props +}) => { + // Portal prevents CSS from leaking into popover + return ( + + + + ); +}; + +const comboboxItemVariants = cva({ + base: 'relative mx-1 flex h-[28px] select-none items-center rounded-sm px-2 text-foreground text-sm outline-none [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', + defaultVariants: { + interactive: true, + }, + variants: { + interactive: { + false: '', + true: 'cursor-pointer transition-colors hover:bg-accent hover:text-accent-foreground data-[active-item=true]:bg-accent data-[active-item=true]:text-accent-foreground', + }, + }, +}); + +const InlineComboboxItem = ({ + className, + focusEditor = true, + group, + keywords, + label, + onClick, + ...props +}: { + focusEditor?: boolean; + group?: string; + keywords?: string[]; + label?: string; +} & ComboboxItemProps & + Required>) => { + const { value } = props; + + const { filter, removeInput } = useContext(InlineComboboxContext); + + const store = useComboboxContext(); + + const search = useStoreState(store, 'value'); + + const visible = useMemo( + () => + !filter || filter({ group, keywords, label, value }, search as string), + [filter, group, keywords, label, value, search], + ); + + if (!visible) return null; + + return ( + { + removeInput(focusEditor); + onClick?.(event); + }} + {...props} + /> + ); +}; + +const InlineComboboxEmpty = ({ + children, + className, +}: React.HTMLAttributes) => { + const { setHasEmpty } = useContext(InlineComboboxContext); + const store = useComboboxContext(); + const items = useStoreState(store, 'items'); + + useEffect(() => { + setHasEmpty(true); + + return () => { + setHasEmpty(false); + }; + }, [setHasEmpty]); + + if (items && items.length > 0) return null; + + return ( +
    + {children} +
    + ); +}; + +const InlineComboboxRow = ComboboxRow; + +function InlineComboboxGroup({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function InlineComboboxGroupLabel({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +export { + InlineCombobox, + InlineComboboxContent, + InlineComboboxEmpty, + InlineComboboxGroup, + InlineComboboxGroupLabel, + InlineComboboxInput, + InlineComboboxItem, + InlineComboboxRow, +}; diff --git a/src/components/ui/plate/InsertToolbarButton.tsx b/src/components/ui/plate/InsertToolbarButton.tsx new file mode 100644 index 00000000..b118131e --- /dev/null +++ b/src/components/ui/plate/InsertToolbarButton.tsx @@ -0,0 +1,254 @@ +'use client'; + +import type { DropdownMenuProps } from '@radix-ui/react-dropdown-menu'; +import { + CalendarIcon, + ChevronRightIcon, + Columns3Icon, + FileCodeIcon, + FilmIcon, + Heading1Icon, + Heading2Icon, + Heading3Icon, + ImageIcon, + Link2Icon, + ListIcon, + ListOrderedIcon, + MinusIcon, + PilcrowIcon, + PlusIcon, + QuoteIcon, + RadicalIcon, + SquareIcon, + TableIcon, + TableOfContentsIcon, +} from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { KEYS } from 'platejs'; +import { type PlateEditor, useEditorRef } from 'platejs/react'; +import { useState } from 'react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/DropdownMenu'; +import { + insertBlock, + insertInlineElement, +} from '@/components/ui/plate/kits/transforms'; +import { ToolbarButton, ToolbarMenuGroup } from '@/components/ui/plate/Toolbar'; +import type { Translations } from '@/lib/locale'; + +type Group = { + group: string; + items: Item[]; +}; + +interface Item { + icon: React.ReactNode; + value: string; + onSelect: (editor: PlateEditor, value: string) => void; + focusEditor?: boolean; + label?: string; +} + +function getGroups(t: Translations): Group[] { + return [ + { + group: t('ui.plate.basicBlocks'), + items: [ + { + icon: , + label: t('ui.plate.paragraph'), + value: KEYS.p, + }, + { + icon: , + label: t('ui.plate.heading1'), + value: 'h1', + }, + { + icon: , + label: t('ui.plate.heading2'), + value: 'h2', + }, + { + icon: , + label: t('ui.plate.heading3'), + value: 'h3', + }, + { + icon: , + label: t('ui.plate.table'), + value: KEYS.table, + }, + { + icon: , + label: t('ui.plate.code'), + value: KEYS.codeBlock, + }, + { + icon: , + label: t('ui.plate.quote'), + value: KEYS.blockquote, + }, + { + icon: , + label: t('ui.plate.divider'), + value: KEYS.hr, + }, + ].map((item) => ({ + ...item, + onSelect: (editor, value) => { + insertBlock(editor, value); + }, + })), + }, + { + group: t('ui.plate.lists'), + items: [ + { + icon: , + label: t('ui.plate.bulletedList'), + value: KEYS.ul, + }, + { + icon: , + label: t('ui.plate.numberedList'), + value: KEYS.ol, + }, + { + icon: , + label: t('ui.plate.todoList'), + value: KEYS.listTodo, + }, + { + icon: , + label: t('ui.plate.expandableList'), + value: KEYS.toggle, + }, + ].map((item) => ({ + ...item, + onSelect: (editor, value) => { + insertBlock(editor, value); + }, + })), + }, + { + group: t('ui.plate.media'), + items: [ + { + icon: , + label: t('ui.plate.image'), + value: KEYS.img, + }, + { + icon: , + label: t('ui.plate.embed'), + value: KEYS.mediaEmbed, + }, + ].map((item) => ({ + ...item, + onSelect: (editor, value) => { + insertBlock(editor, value); + }, + })), + }, + { + group: t('ui.plate.advancedBlocks'), + items: [ + { + icon: , + label: t('ui.plate.tableOfContents'), + value: KEYS.toc, + }, + { + icon: , + label: t('ui.plate.threeColumns'), + value: 'action_three_columns', + }, + { + focusEditor: false, + icon: , + label: t('ui.plate.equation'), + value: KEYS.equation, + }, + ].map((item) => ({ + ...item, + onSelect: (editor, value) => { + insertBlock(editor, value); + }, + })), + }, + { + group: t('ui.plate.inline'), + items: [ + { + icon: , + label: t('ui.plate.link'), + value: KEYS.link, + }, + { + focusEditor: true, + icon: , + label: t('ui.plate.date'), + value: KEYS.date, + }, + { + focusEditor: false, + icon: , + label: t('ui.plate.inlineEquation'), + value: KEYS.inlineEquation, + }, + ].map((item) => ({ + ...item, + onSelect: (editor, value) => { + insertInlineElement(editor, value); + }, + })), + }, + ]; +} + +function InsertToolbarButton(props: DropdownMenuProps) { + const editor = useEditorRef(); + const [open, setOpen] = useState(false); + const t = useTranslations(); + const groups = getGroups(t); + + return ( + + + + + + + + + {groups.map(({ group, items: nestedItems }) => ( + + {nestedItems.map(({ icon, label, value, onSelect }) => ( + { + onSelect(editor, value); + editor.tf.focus(); + }} + > + {icon} + {label} + + ))} + + ))} + + + ); +} + +export { InsertToolbarButton }; diff --git a/src/components/ui/plate/KbdNode.tsx b/src/components/ui/plate/KbdNode.tsx new file mode 100644 index 00000000..d941699f --- /dev/null +++ b/src/components/ui/plate/KbdNode.tsx @@ -0,0 +1,18 @@ +'use client'; + +import type { PlateLeafProps } from 'platejs/react'; +import { PlateLeaf } from 'platejs/react'; + +function KbdLeaf(props: PlateLeafProps) { + return ( + + {props.children} + + ); +} + +export { KbdLeaf }; diff --git a/src/components/ui/plate/KbdNodeStatic.tsx b/src/components/ui/plate/KbdNodeStatic.tsx new file mode 100644 index 00000000..2127767d --- /dev/null +++ b/src/components/ui/plate/KbdNodeStatic.tsx @@ -0,0 +1,16 @@ +import type { SlateLeafProps } from 'platejs'; +import { SlateLeaf } from 'platejs'; + +function KbdLeafStatic(props: SlateLeafProps) { + return ( + + {props.children} + + ); +} + +export { KbdLeafStatic }; diff --git a/src/components/ui/plate/LineHeightToolbarButton.tsx b/src/components/ui/plate/LineHeightToolbarButton.tsx new file mode 100644 index 00000000..a7382514 --- /dev/null +++ b/src/components/ui/plate/LineHeightToolbarButton.tsx @@ -0,0 +1,70 @@ +'use client'; + +import { LineHeightPlugin } from '@platejs/basic-styles/react'; +import type { DropdownMenuProps } from '@radix-ui/react-dropdown-menu'; +import { DropdownMenuItemIndicator } from '@radix-ui/react-dropdown-menu'; +import { CheckIcon, WrapText } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { useEditorRef, useSelectionFragmentProp } from 'platejs/react'; +import { useState } from 'react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuTrigger, +} from '@/components/ui/DropdownMenu'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; + +function LineHeightToolbarButton(props: DropdownMenuProps) { + const editor = useEditorRef(); + const { defaultNodeValue, validNodeValues: values = [] } = + editor.getInjectProps(LineHeightPlugin); + const t = useTranslations('ui.plate'); + + const value = useSelectionFragmentProp({ + defaultValue: defaultNodeValue, + getProp: (node) => node.lineHeight, + }); + + const [open, setOpen] = useState(false); + + return ( + + + + + + + + + { + editor + .getTransforms(LineHeightPlugin) + .lineHeight.setNodes(Number(newValue)); + editor.tf.focus(); + }} + > + {values.map((value) => ( + + + + + + + {value} + + ))} + + + + ); +} + +export { LineHeightToolbarButton }; diff --git a/src/components/ui/plate/LinkNode.tsx b/src/components/ui/plate/LinkNode.tsx new file mode 100644 index 00000000..a91030c3 --- /dev/null +++ b/src/components/ui/plate/LinkNode.tsx @@ -0,0 +1,27 @@ +'use client'; + +import { getLinkAttributes } from '@platejs/link'; +import type { TLinkElement } from 'platejs'; +import type { PlateElementProps } from 'platejs/react'; +import { PlateElement } from 'platejs/react'; + +function LinkElement(props: PlateElementProps) { + return ( + { + e.stopPropagation(); + }, + }} + > + {props.children} + + ); +} + +export { LinkElement }; diff --git a/src/components/ui/plate/LinkNodeStatic.tsx b/src/components/ui/plate/LinkNodeStatic.tsx new file mode 100644 index 00000000..d0f663fa --- /dev/null +++ b/src/components/ui/plate/LinkNodeStatic.tsx @@ -0,0 +1,21 @@ +import { getLinkAttributes } from '@platejs/link'; +import type { SlateElementProps, TLinkElement } from 'platejs'; +import { SlateElement } from 'platejs'; + +function LinkElementStatic(props: SlateElementProps) { + return ( + + {props.children} + + ); +} + +export { LinkElementStatic }; diff --git a/src/components/ui/plate/LinkToolbar.tsx b/src/components/ui/plate/LinkToolbar.tsx new file mode 100644 index 00000000..c61ceccf --- /dev/null +++ b/src/components/ui/plate/LinkToolbar.tsx @@ -0,0 +1,203 @@ +'use client'; + +import { + flip, + offset, + type UseVirtualFloatingOptions, +} from '@platejs/floating'; +import { getLinkAttributes } from '@platejs/link'; +import { + FloatingLinkUrlInput, + type LinkFloatingToolbarState, + useFloatingLinkEdit, + useFloatingLinkEditState, + useFloatingLinkInsert, + useFloatingLinkInsertState, +} from '@platejs/link/react'; +import { cva } from 'cva'; +import { ExternalLink, Link, Text, Unlink } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import type { TLinkElement } from 'platejs'; +import { KEYS } from 'platejs'; +import { + useEditorRef, + useEditorSelection, + useFormInputProps, + usePluginOption, +} from 'platejs/react'; +import { useMemo } from 'react'; +import { buttonVariants } from '@/components/ui/Button'; +import { Separator } from '@/components/ui/Separator'; + +const popoverVariants = cva({ + base: 'z-50 w-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md outline-hidden', +}); + +const inputVariants = cva({ + base: 'flex h-[28px] w-full rounded-md border-none bg-transparent px-1.5 py-1 text-base placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-transparent md:text-sm', +}); + +function LinkFloatingToolbar({ state }: { state?: LinkFloatingToolbarState }) { + const activeCommentId = usePluginOption({ key: KEYS.comment }, 'activeId'); + const activeSuggestionId = usePluginOption( + { key: KEYS.suggestion }, + 'activeId', + ); + + const floatingOptions: UseVirtualFloatingOptions = useMemo(() => { + return { + middleware: [ + offset(8), + flip({ + fallbackPlacements: ['bottom-end', 'top-start', 'top-end'], + padding: 12, + }), + ], + placement: + activeSuggestionId || activeCommentId ? 'top-start' : 'bottom-start', + }; + }, [activeCommentId, activeSuggestionId]); + + const insertState = useFloatingLinkInsertState({ + ...state, + floatingOptions: { + ...floatingOptions, + ...state?.floatingOptions, + }, + }); + const { + hidden, + props: insertProps, + ref: insertRef, + textInputProps, + } = useFloatingLinkInsert(insertState); + + const editState = useFloatingLinkEditState({ + ...state, + floatingOptions: { + ...floatingOptions, + ...state?.floatingOptions, + }, + }); + const { + editButtonProps, + props: editProps, + ref: editRef, + unlinkButtonProps, + } = useFloatingLinkEdit(editState); + const inputProps = useFormInputProps({ + preventDefaultOnEnterKeydown: true, + }); + + const t = useTranslations('ui.plate'); + + if (hidden) return null; + + const input = ( +
    +
    +
    + +
    + + +
    + +
    +
    + +
    + +
    +
    + ); + + const editContent = editState.isEditing ? ( + input + ) : ( +
    + + + + + + + + + +
    + ); + + return ( + <> +
    + {input} +
    + +
    + {editContent} +
    + + ); +} + +function LinkOpenButton() { + const editor = useEditorRef(); + const selection = useEditorSelection(); + + // biome-ignore lint/correctness/useExhaustiveDependencies: off + const attributes = useMemo(() => { + const entry = editor.api.node({ + match: { type: editor.getType(KEYS.link) }, + }); + if (!entry) { + return {}; + } + const [element] = entry; + return getLinkAttributes(editor, element); + }, [editor, selection]); + + return ( + // biome-ignore lint/a11y/noStaticElementInteractions: Side effects only + // biome-ignore lint/a11y/useKeyWithMouseEvents: Not tabbable by design + { + e.stopPropagation(); + }} + target='_blank' + > + + + ); +} + +export { LinkFloatingToolbar }; diff --git a/src/components/ui/plate/LinkToolbarButton.tsx b/src/components/ui/plate/LinkToolbarButton.tsx new file mode 100644 index 00000000..732d4bb2 --- /dev/null +++ b/src/components/ui/plate/LinkToolbarButton.tsx @@ -0,0 +1,29 @@ +'use client'; + +import { + useLinkToolbarButton, + useLinkToolbarButtonState, +} from '@platejs/link/react'; +import { Link } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import type * as React from 'react'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; + +function LinkToolbarButton(props: React.ComponentProps) { + const state = useLinkToolbarButtonState(); + const { props: buttonProps } = useLinkToolbarButton(state); + const t = useTranslations('ui.plate'); + + return ( + + + + ); +} + +export { LinkToolbarButton }; diff --git a/src/components/ui/plate/ListToolbarButton.tsx b/src/components/ui/plate/ListToolbarButton.tsx new file mode 100644 index 00000000..955ba684 --- /dev/null +++ b/src/components/ui/plate/ListToolbarButton.tsx @@ -0,0 +1,213 @@ +'use client'; + +import { ListStyleType, someList, toggleList } from '@platejs/list'; +import { + useIndentTodoToolBarButton, + useIndentTodoToolBarButtonState, +} from '@platejs/list/react'; +import { List, ListOrdered, ListTodoIcon } from 'lucide-react'; +import { useTranslations } from 'next-intl'; +import { useEditorRef, useEditorSelector } from 'platejs/react'; +import { useState } from 'react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuTrigger, +} from '@/components/ui/DropdownMenu'; +import { + ToolbarButton, + ToolbarSplitButton, + ToolbarSplitButtonPrimary, + ToolbarSplitButtonSecondary, +} from '@/components/ui/plate/Toolbar'; + +function BulletedListToolbarButton() { + const editor = useEditorRef(); + const [open, setOpen] = useState(false); + const t = useTranslations('ui.plate'); + + const pressed = useEditorSelector( + (editor) => + someList(editor, [ + ListStyleType.Disc, + ListStyleType.Circle, + ListStyleType.Square, + ]), + [], + ); + + return ( + + { + toggleList(editor, { + listStyleType: ListStyleType.Disc, + }); + }} + data-state={pressed ? 'on' : 'off'} + > + + + + + + + + + + + + toggleList(editor, { + listStyleType: ListStyleType.Disc, + }) + } + > +
    +
    + {t('default')} +
    + + + toggleList(editor, { + listStyleType: ListStyleType.Circle, + }) + } + > +
    +
    + {t('circle')} +
    + + + toggleList(editor, { + listStyleType: ListStyleType.Square, + }) + } + > +
    +
    + {t('square')} +
    + + + + + + ); +} + +function NumberedListToolbarButton() { + const editor = useEditorRef(); + const [open, setOpen] = useState(false); + const t = useTranslations('ui.plate'); + + const pressed = useEditorSelector( + (editor) => + someList(editor, [ + ListStyleType.Decimal, + ListStyleType.LowerAlpha, + ListStyleType.UpperAlpha, + ListStyleType.LowerRoman, + ListStyleType.UpperRoman, + ]), + [], + ); + + return ( + + + toggleList(editor, { + listStyleType: ListStyleType.Decimal, + }) + } + data-state={pressed ? 'on' : 'off'} + > + + + + + + + + + + + + toggleList(editor, { + listStyleType: ListStyleType.Decimal, + }) + } + > + {t('decimal')} (1, 2, 3) + + + toggleList(editor, { + listStyleType: ListStyleType.LowerAlpha, + }) + } + > + {t('lowerAlpha')} (a, b, c) + + + toggleList(editor, { + listStyleType: ListStyleType.UpperAlpha, + }) + } + > + {t('upperAlpha')} (A, B, C) + + + toggleList(editor, { + listStyleType: ListStyleType.LowerRoman, + }) + } + > + {t('lowerRoman')} (i, ii, iii) + + + toggleList(editor, { + listStyleType: ListStyleType.UpperRoman, + }) + } + > + {t('upperRoman')} (I, II, III) + + + + + + ); +} + +function TodoListToolbarButton( + props: React.ComponentProps, +) { + const state = useIndentTodoToolBarButtonState({ nodeType: 'todo' }); + const { props: buttonProps } = useIndentTodoToolBarButton(state); + const t = useTranslations('ui.plate'); + + return ( + + + + ); +} + +export { + BulletedListToolbarButton, + NumberedListToolbarButton, + TodoListToolbarButton, +}; diff --git a/src/components/ui/plate/MarkToolbarButton.tsx b/src/components/ui/plate/MarkToolbarButton.tsx new file mode 100644 index 00000000..80075f46 --- /dev/null +++ b/src/components/ui/plate/MarkToolbarButton.tsx @@ -0,0 +1,21 @@ +'use client'; + +import { useMarkToolbarButton, useMarkToolbarButtonState } from 'platejs/react'; +import type * as React from 'react'; +import { ToolbarButton } from '@/components/ui/plate/Toolbar'; + +function MarkToolbarButton({ + clear, + nodeType, + ...props +}: React.ComponentProps & { + nodeType: string; + clear?: string[] | string; +}) { + const state = useMarkToolbarButtonState({ clear, nodeType }); + const { props: buttonProps } = useMarkToolbarButton(state); + + return ; +} + +export { MarkToolbarButton }; diff --git a/src/components/ui/plate/MediaAudioNode.tsx b/src/components/ui/plate/MediaAudioNode.tsx new file mode 100644 index 00000000..d54c60f9 --- /dev/null +++ b/src/components/ui/plate/MediaAudioNode.tsx @@ -0,0 +1,49 @@ +'use client'; + +import { useMediaState } from '@platejs/media/react'; +import { ResizableProvider } from '@platejs/resizable'; +import { useTranslations } from 'next-intl'; +import type { TAudioElement } from 'platejs'; +import type { PlateElementProps } from 'platejs/react'; +import { PlateElement, withHOC } from 'platejs/react'; +import { Caption, CaptionTextarea } from '@/components/ui/plate/Caption'; +import { api } from '@/lib/api/client'; + +const AudioElement = withHOC( + ResizableProvider, + function AudioElement(props: PlateElementProps) { + const { align = 'center', readOnly, unsafeUrl } = useMediaState(); + const t = useTranslations('ui.plate'); + + // Elements with a custom fileId need to fetch their S3 URL + const url = api.utils.getFileUrl.useQuery( + { fileId: Number(props.element.fileId as string) }, + { enabled: !!props.element.fileId }, + ); + + return ( + +
    +
    + {/** biome-ignore lint/a11y/useMediaCaption: Captions unavailable */} +
    + + + + +
    + {props.children} +
    + ); + }, +); + +export { AudioElement }; diff --git a/src/components/ui/plate/MediaAudioNodeStatic.tsx b/src/components/ui/plate/MediaAudioNodeStatic.tsx new file mode 100644 index 00000000..67104f1d --- /dev/null +++ b/src/components/ui/plate/MediaAudioNodeStatic.tsx @@ -0,0 +1,18 @@ +import type { SlateElementProps, TAudioElement } from 'platejs'; +import { SlateElement } from 'platejs'; + +function AudioElementStatic(props: SlateElementProps) { + return ( + +
    +
    + {/* biome-ignore lint/a11y/useMediaCaption: Captions unavailable */} +
    +
    + {props.children} +
    + ); +} + +export { AudioElementStatic }; diff --git a/src/components/ui/plate/MediaEmbedNode.tsx b/src/components/ui/plate/MediaEmbedNode.tsx new file mode 100644 index 00000000..c5570814 --- /dev/null +++ b/src/components/ui/plate/MediaEmbedNode.tsx @@ -0,0 +1,139 @@ +'use client'; + +import { parseTwitterUrl, parseVideoUrl } from '@platejs/media'; +import { MediaEmbedPlugin, useMediaState } from '@platejs/media/react'; +import { ResizableProvider, useResizableValue } from '@platejs/resizable'; +import { useTranslations } from 'next-intl'; +import type { TMediaEmbedElement } from 'platejs'; +import type { PlateElementProps } from 'platejs/react'; +import { PlateElement, withHOC } from 'platejs/react'; +import LiteYouTubeEmbed from 'react-lite-youtube-embed'; +import { Tweet } from 'react-tweet'; +import { Caption, CaptionTextarea } from '@/components/ui/plate/Caption'; +import { MediaToolbar } from '@/components/ui/plate/MediaToolbar'; +import { + mediaResizeHandleVariants, + Resizable, + ResizeHandle, +} from '@/components/ui/plate/ResizeHandle'; +import { cx } from '@/lib/utils'; + +const MediaEmbedElement = withHOC( + ResizableProvider, + function MediaEmbedElement(props: PlateElementProps) { + const { + align = 'center', + embed, + focused, + isTweet, + isVideo, + isYoutube, + readOnly, + selected, + } = useMediaState({ + urlParsers: [parseTwitterUrl, parseVideoUrl], + }); + const width = useResizableValue('width'); + const provider = embed?.provider; + const t = useTranslations('ui.plate'); + + if (!embed?.id) return null; + + return ( + + +
    + + + + {isVideo ? ( + isYoutube ? ( + _iframe]:absolute [&_>_iframe]:top-0 [&_>_iframe]:left-0 [&_>_iframe]:size-full', + '[&_>_.lty-playbtn]:z-1 [&_>_.lty-playbtn]:h-[46px] [&_>_.lty-playbtn]:w-[70px] [&_>_.lty-playbtn]:rounded-[14%] [&_>_.lty-playbtn]:bg-[#212121] [&_>_.lty-playbtn]:opacity-80 [&_>_.lty-playbtn]:[transition:all_0.2s_cubic-bezier(0,_0,_0.2,_1)]', + '[&:hover_>_.lty-playbtn]:bg-[red] [&:hover_>_.lty-playbtn]:opacity-100', + '[&_>_.lty-playbtn]:before:border-[transparent_transparent_transparent_#fff] [&_>_.lty-playbtn]:before:border-y-[11px] [&_>_.lty-playbtn]:before:border-r-0 [&_>_.lty-playbtn]:before:border-l-[19px] [&_>_.lty-playbtn]:before:content-[""]', + '[&_>_.lty-playbtn]:absolute [&_>_.lty-playbtn]:top-1/2 [&_>_.lty-playbtn]:left-1/2 [&_>_.lty-playbtn]:[transform:translate3d(-50%,-50%,0)]', + '[&_>_.lty-playbtn]:before:absolute [&_>_.lty-playbtn]:before:top-1/2 [&_>_.lty-playbtn]:before:left-1/2 [&_>_.lty-playbtn]:before:[transform:translate3d(-50%,-50%,0)]', + '[&.lyt-activated]:cursor-[unset]', + '[&.lyt-activated]:before:pointer-events-none [&.lyt-activated]:before:opacity-0', + '[&.lyt-activated_>_.lty-playbtn]:pointer-events-none [&.lyt-activated_>_.lty-playbtn]:opacity-0!', + )} + /> + ) : ( +
    +