From bedc227bb0361df66574bb7398728bacad4516b6 Mon Sep 17 00:00:00 2001 From: Charles-Henri Arnould Date: Tue, 30 Jun 2026 07:35:59 +0200 Subject: [PATCH 1/3] chore: update dependencies to latest version (+ run `oxfmt` on codebase) --- bun.lock | 128 ++++++++++++++++++++++------------ package.json | 4 +- server/utils/update-pierre.ts | 3 +- 3 files changed, 88 insertions(+), 47 deletions(-) diff --git a/bun.lock b/bun.lock index b74153a6..5189a93f 100644 --- a/bun.lock +++ b/bun.lock @@ -6,8 +6,8 @@ "name": "pierre", "devDependencies": { "markdown-toc": "^1.2.0", - "oxfmt": "^0.55.0", - "oxlint": "^1.70.0", + "oxfmt": "^0.57.0", + "oxlint": "^1.72.0", "typescript": "^6.0.3", }, }, @@ -16,7 +16,7 @@ }, "desktop": { "name": "@pierre/desktop", - "version": "0.40.0", + "version": "0.40.6", "dependencies": { "@base-ui/react": "^1.6.0", "@dnd-kit/core": "^6.3.1", @@ -83,7 +83,7 @@ }, "server": { "name": "@pierre/server", - "version": "0.40.0", + "version": "0.40.6", "dependencies": { "@date-fns/tz": "^1.5.0", "@observablehq/plot": "^0.6.17", @@ -501,81 +501,81 @@ "@oxc-project/types": ["@oxc-project/types@0.133.0", "", {}, "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA=="], - "@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.55.0", "", { "os": "android", "cpu": "arm" }, "sha512-+rFDOqQe5LOWgxrAJaZgLRudr6GQm0wGI6gtu7vVkrdLGjNMUSGbAlaCr8j7F2H2Er97vYQCU8WDb30onqMM1g=="], + "@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.57.0", "", { "os": "android", "cpu": "arm" }, "sha512-qVBsEO+KugOsCmUHcO8iqNnqc65p7PCKpCs8M66mPZ+Ri+CWbcpoQOEJBg2OTu03+0qu++NK1jj6IzvQVs0Sig=="], - "@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.55.0", "", { "os": "android", "cpu": "arm64" }, "sha512-ctulLq8s3x8Zmvw6+iccB09TIKERAklRSmbJ10gk8mlAn05qZxoyo52dj3Hi9IJcmDSwF54fQaTVh2CbL6PInw=="], + "@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.57.0", "", { "os": "android", "cpu": "arm64" }, "sha512-mp6PibWbao3aizijcheOeHQaYEhcUAt8pwLniYbtLfHxL/psFF0BykAwCj+s3c6qIpa8yN8keZICWrqtZ70w8g=="], - "@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.55.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xDQczLH9pw/RBk1h/GH0qcGMm8hQtmtVHBNLSH3lk1gEIR09hZ4L+mJQl4VqiVAvPK9VG9PYrWWuSQLt7xTbiA=="], + "@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.57.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-T+0stuCBqmUVY+aMIvrgXhzGhHO3sD5tNiiEcYqgSdPsnukskQqn2u5qOVD0sv1l7RLdFS5Z/f5Wi9Ktyjr3Eg=="], - "@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.55.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-JaNoFCkF2CJdGgpPSMbuO9HVyXyoNGIhMHPvp6NYAjeVKw9XEYc0HcUWJLPQa3Q69WV5wMa9m5jPMJPtbLtcRg=="], + "@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.57.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-O+3JbqWs/mCI2oi4xfhRO2IVPFJNDDEBV8Odo+ZpmsUOeKJfjXoNH7nDmBEQcDgK7NfjDIyE7kRgYSZcTLDO0A=="], - "@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.55.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-DNbszhpg6S2MIzax5azdHFTTBIVkR5xr8yyRZuA4yoDAwOkzIp3tmldgKZM2+VlT+hJIG0xUksA+elISzMEAfA=="], + "@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.57.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-pxwhxVC+JkLX9twOQ/8C/vbuOQcMZyKIDmiRDZfO7yITuVcIdZCiLRqqf4QOxb2+8FWrRXzQpm+1DBKcMpHSSQ=="], - "@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.55.0", "", { "os": "linux", "cpu": "arm" }, "sha512-2snoaoRfFFyGnbOcKUK36rREBYxe/Xgz3uHbiA5zbCB/s6R4DQj4mHqYAaWWhgizCUSDxV8cE9zAZ0XleNpKGw=="], + "@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.57.0", "", { "os": "linux", "cpu": "arm" }, "sha512-pxBU4zH2imB/MDBfth2rOMeVxXUMjRQLCazagwLARIFH3hVlxZJBlM4nSnHXaIHJK4/qezoFCIORN6AY8Mra4A=="], - "@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.55.0", "", { "os": "linux", "cpu": "arm" }, "sha512-q1aktHF/WRpSK81BX1dE/9vWrS2jGw1Nax2kb4DBLGAewubCLcoNyp4Zl/NSMgbv3vUS46Z33wIQkBVYOP3PYg=="], + "@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.57.0", "", { "os": "linux", "cpu": "arm" }, "sha512-JAprOzt8tycYou36ZgEw14DlRHTiN8qdtKANdV3VZIRIvTI/lh/cX13c9pJ/EnDk2GT3FASH7KvCgQ2AufAifQ=="], - "@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.55.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-VD0y36aENezl/3tsclA/4G53Cc7iV+7Uoh7gz4yvcOTaEYBtJpQsE6PKDGTtUtOvGS4kv51ybfXY/nWZejO5IA=="], + "@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.57.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-ajtjaxSaj9xl4BW7REt+Cef/ttzbAq00Bq4z7JUDZEfgFXdwSjH8K9bF+IcIJzZB9lKqMfQ4eHuSFOvvlvtqOg=="], - "@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.55.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-r8xlKJFcsRmn0H5jZrdORae6RX9jDBrZVvOoxF+bCQtampQJClv80aZEHsv+NsLsp2KCE5ql79O7DpPVzYWpXA=="], + "@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.57.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-p4Y/+RYk9Bk5WO+zHSUXAClRmZ2fbJCejMuCAsU2HhyME4jqf6Ftt/mJYEwIah1wGCBDYOB7wEGV1x5bCEZ6hA=="], - "@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.55.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-GRKv/HXHcwIVld/WU61rF0g0R16hl5EJ+ScKdpjevT57lnLnagj/U2YUbXf2mT+2Pg1uCzWC+mvGicPV3CDdLQ=="], + "@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.57.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-By6tRALAZsno0F4zedmtG+wdMvJiJmJoXM4d3+A9zHE4HRXLqXITwRH8mgrlcXc5yJM2g2W3riRPwTYdgemZLQ=="], - "@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.55.0", "", { "os": "linux", "cpu": "none" }, "sha512-rdv57enTiPtpSYRMKfAiEbQb0Puw5t9N7isVinDoo5qeLDScro2gznmZqSgSWbVZRzLisTeCTW8Qwgw0bOHv3A=="], + "@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.57.0", "", { "os": "linux", "cpu": "none" }, "sha512-skYeG+RgvyzspqVEBsEprL90OYYZfoVNqB3HcCNR6QDJyXKOzfDRT3zncnHmUaFluIlBHuY23mU1b5WGgR98hA=="], - "@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.55.0", "", { "os": "linux", "cpu": "none" }, "sha512-7v1nNrlD43VY6+sYQ6efYyb3lE6QY182304PD/768ZxTjOmFd/3dQa3u/nGBUAXYdGSWOQc5N3PnS0QzUXyEIA=="], + "@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.57.0", "", { "os": "linux", "cpu": "none" }, "sha512-FFgACrZOXAXUh5KQh2mt1CDOVOZmn+QzHP71wM9QobNwyQvoFfyAeefVUltW83g3sm7LTiH3yfFqLLVUpA5ZFQ=="], - "@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.55.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-f4lJLUSPOgScjFl9LiflKCTocyNRwE25JmTMbN4XQdDjoZzEHjqf3wA3VESF1/csg7i8m7+EQLbrZyYDqe10UQ=="], + "@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.57.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-Nm/BAOfQeFiiKd502mZn/GAVKJwtd0RdCg17G3Wz/WSOIQmDi3+7/SZH4BHn1Ye5KvTVH3ua8WvfwLLycNIuvA=="], - "@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.55.0", "", { "os": "linux", "cpu": "x64" }, "sha512-MihqiPziJNoWy4MqNSV+jVA1g+07iQDjZiR0vaCaDoPgFEiJpCMsxamktzLV07cEeQsSJ04vQaU4CzCQwIvtDA=="], + "@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.57.0", "", { "os": "linux", "cpu": "x64" }, "sha512-BiSy5Ku3mQqyxS6YIqAJgd403wEUWvI7kerfzPxc2l/txZVmZM0pSj7oDM+4bGBExowxOi7o73jEam1W0EDTZg=="], - "@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.55.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Yqghym7KYAVjP9MmSrNZiDeerMuoejNjo0r3ox5H3GDKk8eAfl8VyJm9i+pWCLDCTnAbcTUMMN2ZKjUYXH1v3g=="], + "@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.57.0", "", { "os": "linux", "cpu": "x64" }, "sha512-BCRkJiotz5s9afLYD2LuMvzAoDYx9H17E/YbDyu4xK7l4zHDPeny9ErSXL//i/nJyaOwRk08x4b8cgJC00+JDg=="], - "@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.55.0", "", { "os": "none", "cpu": "arm64" }, "sha512-s5SDvVVSbyQl1V5UU3Yl12M+XLUQ3rl5SglNqgAA2K4PXUtQhyNSS00wivONPEnNo5W01rCou8WkDNyvI/RGHg=="], + "@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.57.0", "", { "os": "none", "cpu": "arm64" }, "sha512-4Oaxe1qrGgXfpCJ1C/ERJ2iCtV2rN1R79ga9fsfyVHfSQRu/hVW780u2KDqZWFZ/iGTHODJji0JemxqFZ63eIQ=="], - "@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.55.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-7p9FB5R32tw2KyyNX3wpQrR2WHwEHvMEiBlGXxeTCaRMCVNx3UtFMAUbaQ/pRNWIrEUZmYhJ6tcUH52uPTRYjQ=="], + "@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.57.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-MYLAsDnhdNsSGheLYhWgbk0vfIrlS84iQYun/y21fX6u0jj8iBtYtbpZMdiqYeuf8U12eVPUjVY2xE2NrCfJ0g=="], - "@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.55.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-ZYqj3fDnOT1IaVGMP5kpmkQl4F3tQIm2ZyAxvqkJYmI0xgWWak4ss4XYwv3VDfM+TWXeC9K4uQ/wW5jm/5XABA=="], + "@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.57.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-PBwdzZALJY/jcCx2E6is0yu+cuVXeySTDmwuseD+9j0mHqlRNxwlKgsyRTBed/woPeqfVfuXfWjoq4Cx2Zt3Eg=="], - "@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.55.0", "", { "os": "win32", "cpu": "x64" }, "sha512-eEYT5tivGnGbPHuOHuQpi6CGLObhh0re/5jcNQHihD2GRYkTM85dyi5a19zjP8Q00t1uqAx+/QGLUGdHeqzWyg=="], + "@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.57.0", "", { "os": "win32", "cpu": "x64" }, "sha512-bQJdH9i4RRfw55jm7+8/xS7GzHLLTbHx4huhrrDxQJaJtbSDbsyOnODvP1ftT7EG0KFKAYO2S+q6AcioXODx8w=="], - "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.70.0", "", { "os": "android", "cpu": "arm" }, "sha512-zFh0P4cswmRvw6nkyb89dr18rRanuaCPAsEXsFDoQY8WdaquI8Pt4NWFjaMJg6L23cy5NeN8J9cBnREbWzZhaw=="], + "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.72.0", "", { "os": "android", "cpu": "arm" }, "sha512-zhCmvn+1Mj3UchAc/90i99S0t7jJUsHmFVSPg4UWrjO8b8eaSGwscgO6QAUtvHBstkjQwBttQNswEnAF1mIQdA=="], - "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.70.0", "", { "os": "android", "cpu": "arm64" }, "sha512-qI8o4HZjeGiBrWv+pJv4lH0Yi2Gl/JSp/EumBUApezJprIKa5PS4nU0lQsQngtky8k+SplQIOjv6hwu0SSxeyg=="], + "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.72.0", "", { "os": "android", "cpu": "arm64" }, "sha512-mtH+aY/ozv1eZoCUC2owjFAtyNBKHpJHygKeEu9zXXnQGW1Q2/qOpvx+I+Lf23+TvTz66F4iiXUbl2cGvoLPCQ=="], - "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.70.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-8KjgVVHI5F9nVwHCRwwA78Ty7zNKP4Wd9OeN5PSv3iu/F/u1RVXoOCgLhWqust6HmwQG6xc8c+RCyaWENy24+w=="], + "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.72.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-EvnajNPDtfknB3ZieeOOyDTwJn9QXDiwfnF4ZDQqART6RG6hjY4WigQcZdGoK2dkB3e1vrmEzN9aYbQCUkh/gQ=="], - "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.70.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-WVydssv5PSUBXFJTdNBWlmGkbNmvPGaFt/2SUT/EZRB6bq6bEOHmMlbnupZD5jmlEvi9+mZJHi8TCw15lyfSfQ=="], + "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.72.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZkCdEa/G80A7vEHfeCDz/+L3m33DE73v32mDKhgOIgz8Uwf0DFcK7+uu6qC+7LEhmz5fpOe1osWKyjSNMydFIQ=="], - "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.70.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-hJucmUf8OlinHNb1R7fI4Fw6WsAstOz7i8nmkWQfiHoZXtbufNm+MxiDTIMk1ggh2Ro4vLzgQ+bKvRY54MZoRA=="], + "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.72.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-NroXv2vh+sxVY1uya/rM5pjhx1hm8BzlYpx9q67QP0Xhw5MH2bf5GJylpvLEC+781p1Xli/317EoV9AlGwViag=="], - "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.70.0", "", { "os": "linux", "cpu": "arm" }, "sha512-1BnS7wbCYDSXwWzJJ+mc3NURoha6m6m6RT5c6vgAY3oz7C3OVXP+S0awo2mRq97arrJkVvO3qRQfyAHL+76xtQ=="], + "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.72.0", "", { "os": "linux", "cpu": "arm" }, "sha512-0NDywYgfj279Ou/BcQuCYSj7NJwBfmWn5qc5uGO/Ny7fUWmXyIpvawqX/8acQlWG6IXelJsJhj+JAy6sjsKj0A=="], - "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.70.0", "", { "os": "linux", "cpu": "arm" }, "sha512-yKy/UdbR55+M2yEcuiV5DCNC/gdQAjr/GioUy50QwBzSrKm8ueWADqyRLS9Xk+qjNeCYGg6A8FvUBds56ttfqg=="], + "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.72.0", "", { "os": "linux", "cpu": "arm" }, "sha512-4vpXB06h65Ezsy4hRyrGjGrfa1SkVPii09yaajiYhmVpgsFiLD+KNxIx/BNAY+XiO+i1yqp9HHdwqM8VTqa5XQ=="], - "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.70.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0A5XJ4alvmqFUFP/4oYSyaO+qLto/HrKEWTSaegiVl+HOufFngK2BjYw9x4RbwBt/du5QG6l5q1zeWiJYYG5yg=="], + "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.72.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-immaN4g2ZGFiOkKrvRX9LvzZdd2GkQM5wR+UyzYyUuyhUTXGQ4HKUJH18xp4G8OfhCVaVAJfKZxwE1r8+4hhaQ=="], - "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.70.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-JiylyurlB0CLSedNtx1gzv3FvfWPF1h/2Y3BJszPLNt5XQFlBsH5ke0Jle3iJb3uqu5m2e7A/DwzpuCAHdiU+A=="], + "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.72.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-JGHS9Mnr7iWyyLDxgCv1MhzVpAckgptg00F2gnxt/GD7lQ2SW1BRcxHqhSTaSdDpjWRrBkBxMMh4+Hn3aVtExg=="], - "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.70.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-J8VPG7I3/HmgaU4u8pNU2kFx2+0U+vPLS1dXFxXOaR/2TQ0f8AC7DRz0SRGRI1bfphnX2hVYTTtLuhL4nYKL+Q=="], + "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.72.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-AOYgBZqxNshrg83P9v0RYv+m8s10Cqkj4/PxXFDhcS3k7FqsIG5+CxErshZCIN7G8iy4Y+VGfAsuEdar8AcbBg=="], - "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.70.0", "", { "os": "linux", "cpu": "none" }, "sha512-N2+4lV2KLN+oXTIIIwmWDhwkrnvqf5oX7Hw0zPjk+RuIVgiBQSOlJWF7uQoFx2siEYX0ZQ5cfSbEAHm+J3t7Wg=="], + "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.72.0", "", { "os": "linux", "cpu": "none" }, "sha512-QMybPS5ij3/vrKG67mqzHwW++91sYxK/PPUVi6SBtNCEzW4niS52fVBdXbQ6nou0wWbUPEpx8Sl/ZjtgE3clXA=="], - "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.70.0", "", { "os": "linux", "cpu": "none" }, "sha512-1e2L7cFCvx9QDzq6NPP+0tABKb5z6nWHyddWTNKprEsjO9xNrAtPowuCGpjNXxkTdsMiZ4jc8YQ5SstZd4XK6g=="], + "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.72.0", "", { "os": "linux", "cpu": "none" }, "sha512-gOc3W7JV0PXRpIL7stUlLe3Wa9Gp0Kdlup87IT3gHDvPKck2xNgMIl/Gs2lldYY2lyXZDC4rWi3hmoLUobkgbQ=="], - "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.70.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-Kwu/l/8GcYibCWA9m9N5pRXMIKVSsL/YbgpLzYkqDhWTiqdRfnNJ/+nqIKRKQiFbHWsdlHEhzMwruJK+qcEruA=="], + "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.72.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-rpGxph+FjjHcYI5q6uxB3Az+tnfmEnDbSA8+PK9ZE/VzyUAkvBOMeuY7ZQMhu5mpZH7YQDsTdW6Cx4kV/msc6w=="], - "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.70.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tap04CsHYOl0nSAQJfPNIuBxqEPB2HnhQqwaOXLg1jnp2XfRo8Fa814dA4QC4zpvTWXCjAAaCY1W5LOORkEQuQ=="], + "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.72.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WND+uhf/Ko13SLqQMWQUgsZuLvYYEvL0ZKgg0tgGYfLqxG7l8Ju123fHDMJyYSDl5E3bUbpFUuii/OvMreFQzw=="], - "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.70.0", "", { "os": "linux", "cpu": "x64" }, "sha512-hzJa/WgvtJpbBD9rgfy0qe+MjbxOXNUT0bfR1S6EQQzfTtBFA9xg5q8KSwRrQ2QfSS+TaP4j+4mVPQrfNc6UNg=="], + "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.72.0", "", { "os": "linux", "cpu": "x64" }, "sha512-SrpbrUL70nG9vh6zP4/oKHWgLuHquwsr7MW9XOn0olBVgh10Uqr8qscKhQoBGEn6olK/IUpn5GSKcdQ5AjUhGA=="], - "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.70.0", "", { "os": "none", "cpu": "arm64" }, "sha512-xbsaNSNzVSnaJACCUYr1HQMyY/Q/Q1LkePmHG3UvZPvGCYGNxrsZp9OmtA6ick8xH47ltRRbRrPCM1YXYcyC+A=="], + "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.72.0", "", { "os": "none", "cpu": "arm64" }, "sha512-qkrsEn6NmgFKr7U/QnezQMb+q/vzAy0Dd9Y95gQGQTyjzDLN+HRZMuM5u70iyH4nBLCfKBzhjMsYCehKay2jyg=="], - "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.70.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-icAEsUI7JbW1TMRdEXV83mVAInhRVQYuuAlPpxdGwJ95chNdnCzjloRW8GglT0WvzOEZSio6fnYSk2DJ2Hv7LQ=="], + "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.72.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-LWR6ZlFZph+KPjXv8opgZsXRDCdrdQe8VL8Cg9zxCoBS73h6znzZpydVgmdnwj8mB9AuSM5jxEgDJDpQkjboeg=="], - "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.70.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-FHMSWbVsPVs/f+Jcl04ws4JJ2wUnauyTzlpxWRG/lSO/8GpX08Fo2gQZqdA6CrRFI+zvkxl+N/KwJGWfUwYVZA=="], + "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.72.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-yt6HEh7IsHvtjRWtmeZRX134eaXKHq5Gnqlf1xBJdJl1JtdoRUEJw3nAxpZoUDS860cX/foKbztO441anVBtVQ=="], - "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.70.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ptOlKwCz7n4AKs5VweMqG6DAg677FmKOK+vBkkL9DMNgFATIQ+upqUYBTOEwRQyRAx1ncGlPlXleV2hIcm3z4g=="], + "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.72.0", "", { "os": "win32", "cpu": "x64" }, "sha512-b2eKFD2hX7tIwmo/cyH6TDq8vzWRZ2qNHrzoGntUTmq0h3zQh/uX3eTSHCwI8OB/ADQfJCRelLItK8BsxuucDA=="], "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], @@ -2021,9 +2021,9 @@ "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="], - "oxfmt": ["oxfmt@0.55.0", "", { "dependencies": { "tinypool": "2.1.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.55.0", "@oxfmt/binding-android-arm64": "0.55.0", "@oxfmt/binding-darwin-arm64": "0.55.0", "@oxfmt/binding-darwin-x64": "0.55.0", "@oxfmt/binding-freebsd-x64": "0.55.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.55.0", "@oxfmt/binding-linux-arm-musleabihf": "0.55.0", "@oxfmt/binding-linux-arm64-gnu": "0.55.0", "@oxfmt/binding-linux-arm64-musl": "0.55.0", "@oxfmt/binding-linux-ppc64-gnu": "0.55.0", "@oxfmt/binding-linux-riscv64-gnu": "0.55.0", "@oxfmt/binding-linux-riscv64-musl": "0.55.0", "@oxfmt/binding-linux-s390x-gnu": "0.55.0", "@oxfmt/binding-linux-x64-gnu": "0.55.0", "@oxfmt/binding-linux-x64-musl": "0.55.0", "@oxfmt/binding-openharmony-arm64": "0.55.0", "@oxfmt/binding-win32-arm64-msvc": "0.55.0", "@oxfmt/binding-win32-ia32-msvc": "0.55.0", "@oxfmt/binding-win32-x64-msvc": "0.55.0" }, "peerDependencies": { "svelte": "^5.0.0", "vite-plus": "*" }, "optionalPeers": ["svelte", "vite-plus"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-jSj2wCTakwgPMxkfiVZX0jf+nX+Nz6xlyAZjqNE0qXTFdCBPYlP6JAN+ODjmealw7DXBjOzYbdsqwBMAZnPZ6A=="], + "oxfmt": ["oxfmt@0.57.0", "", { "dependencies": { "tinypool": "2.1.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.57.0", "@oxfmt/binding-android-arm64": "0.57.0", "@oxfmt/binding-darwin-arm64": "0.57.0", "@oxfmt/binding-darwin-x64": "0.57.0", "@oxfmt/binding-freebsd-x64": "0.57.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.57.0", "@oxfmt/binding-linux-arm-musleabihf": "0.57.0", "@oxfmt/binding-linux-arm64-gnu": "0.57.0", "@oxfmt/binding-linux-arm64-musl": "0.57.0", "@oxfmt/binding-linux-ppc64-gnu": "0.57.0", "@oxfmt/binding-linux-riscv64-gnu": "0.57.0", "@oxfmt/binding-linux-riscv64-musl": "0.57.0", "@oxfmt/binding-linux-s390x-gnu": "0.57.0", "@oxfmt/binding-linux-x64-gnu": "0.57.0", "@oxfmt/binding-linux-x64-musl": "0.57.0", "@oxfmt/binding-openharmony-arm64": "0.57.0", "@oxfmt/binding-win32-arm64-msvc": "0.57.0", "@oxfmt/binding-win32-ia32-msvc": "0.57.0", "@oxfmt/binding-win32-x64-msvc": "0.57.0" }, "peerDependencies": { "svelte": "^5.0.0", "vite-plus": "*" }, "optionalPeers": ["svelte", "vite-plus"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-ZB7Bi+rGDSqmVIo9jwcLyFgjxXvQhDdU+jx+ZrVy6VRiVXK2+CHc4hO3J4dUQjHe7V0ymHB+MDuv5z+NhK07HA=="], - "oxlint": ["oxlint@1.70.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.70.0", "@oxlint/binding-android-arm64": "1.70.0", "@oxlint/binding-darwin-arm64": "1.70.0", "@oxlint/binding-darwin-x64": "1.70.0", "@oxlint/binding-freebsd-x64": "1.70.0", "@oxlint/binding-linux-arm-gnueabihf": "1.70.0", "@oxlint/binding-linux-arm-musleabihf": "1.70.0", "@oxlint/binding-linux-arm64-gnu": "1.70.0", "@oxlint/binding-linux-arm64-musl": "1.70.0", "@oxlint/binding-linux-ppc64-gnu": "1.70.0", "@oxlint/binding-linux-riscv64-gnu": "1.70.0", "@oxlint/binding-linux-riscv64-musl": "1.70.0", "@oxlint/binding-linux-s390x-gnu": "1.70.0", "@oxlint/binding-linux-x64-gnu": "1.70.0", "@oxlint/binding-linux-x64-musl": "1.70.0", "@oxlint/binding-openharmony-arm64": "1.70.0", "@oxlint/binding-win32-arm64-msvc": "1.70.0", "@oxlint/binding-win32-ia32-msvc": "1.70.0", "@oxlint/binding-win32-x64-msvc": "1.70.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.22.1", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-D6JgHtzkhRwvEC+A0Nw5AEc5bk8x5i1pHzvZIEf/a0C4hOzmAACNGtkDGPyFaxxX3ZVGxCPeig3P3rMM8XU3/g=="], + "oxlint": ["oxlint@1.72.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.72.0", "@oxlint/binding-android-arm64": "1.72.0", "@oxlint/binding-darwin-arm64": "1.72.0", "@oxlint/binding-darwin-x64": "1.72.0", "@oxlint/binding-freebsd-x64": "1.72.0", "@oxlint/binding-linux-arm-gnueabihf": "1.72.0", "@oxlint/binding-linux-arm-musleabihf": "1.72.0", "@oxlint/binding-linux-arm64-gnu": "1.72.0", "@oxlint/binding-linux-arm64-musl": "1.72.0", "@oxlint/binding-linux-ppc64-gnu": "1.72.0", "@oxlint/binding-linux-riscv64-gnu": "1.72.0", "@oxlint/binding-linux-riscv64-musl": "1.72.0", "@oxlint/binding-linux-s390x-gnu": "1.72.0", "@oxlint/binding-linux-x64-gnu": "1.72.0", "@oxlint/binding-linux-x64-musl": "1.72.0", "@oxlint/binding-openharmony-arm64": "1.72.0", "@oxlint/binding-win32-arm64-msvc": "1.72.0", "@oxlint/binding-win32-ia32-msvc": "1.72.0", "@oxlint/binding-win32-x64-msvc": "1.72.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.22.1", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-1rhdZIP/EvoI91ABIwNU5Q8+bWf8mjrS5UzIOZld4d4bXxJvtlUhlQvaoTogIGin/qdErMOrwaIJvCSIAKTLhA=="], "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], @@ -2663,6 +2663,8 @@ "@parcel/watcher/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + "@pierre/server/oxfmt": ["oxfmt@0.55.0", "", { "dependencies": { "tinypool": "2.1.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.55.0", "@oxfmt/binding-android-arm64": "0.55.0", "@oxfmt/binding-darwin-arm64": "0.55.0", "@oxfmt/binding-darwin-x64": "0.55.0", "@oxfmt/binding-freebsd-x64": "0.55.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.55.0", "@oxfmt/binding-linux-arm-musleabihf": "0.55.0", "@oxfmt/binding-linux-arm64-gnu": "0.55.0", "@oxfmt/binding-linux-arm64-musl": "0.55.0", "@oxfmt/binding-linux-ppc64-gnu": "0.55.0", "@oxfmt/binding-linux-riscv64-gnu": "0.55.0", "@oxfmt/binding-linux-riscv64-musl": "0.55.0", "@oxfmt/binding-linux-s390x-gnu": "0.55.0", "@oxfmt/binding-linux-x64-gnu": "0.55.0", "@oxfmt/binding-linux-x64-musl": "0.55.0", "@oxfmt/binding-openharmony-arm64": "0.55.0", "@oxfmt/binding-win32-arm64-msvc": "0.55.0", "@oxfmt/binding-win32-ia32-msvc": "0.55.0", "@oxfmt/binding-win32-x64-msvc": "0.55.0" }, "peerDependencies": { "svelte": "^5.0.0", "vite-plus": "*" }, "optionalPeers": ["svelte", "vite-plus"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-jSj2wCTakwgPMxkfiVZX0jf+nX+Nz6xlyAZjqNE0qXTFdCBPYlP6JAN+ODjmealw7DXBjOzYbdsqwBMAZnPZ6A=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], @@ -2973,6 +2975,44 @@ "@octokit/request/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="], + "@pierre/server/oxfmt/@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.55.0", "", { "os": "android", "cpu": "arm" }, "sha512-+rFDOqQe5LOWgxrAJaZgLRudr6GQm0wGI6gtu7vVkrdLGjNMUSGbAlaCr8j7F2H2Er97vYQCU8WDb30onqMM1g=="], + + "@pierre/server/oxfmt/@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.55.0", "", { "os": "android", "cpu": "arm64" }, "sha512-ctulLq8s3x8Zmvw6+iccB09TIKERAklRSmbJ10gk8mlAn05qZxoyo52dj3Hi9IJcmDSwF54fQaTVh2CbL6PInw=="], + + "@pierre/server/oxfmt/@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.55.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xDQczLH9pw/RBk1h/GH0qcGMm8hQtmtVHBNLSH3lk1gEIR09hZ4L+mJQl4VqiVAvPK9VG9PYrWWuSQLt7xTbiA=="], + + "@pierre/server/oxfmt/@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.55.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-JaNoFCkF2CJdGgpPSMbuO9HVyXyoNGIhMHPvp6NYAjeVKw9XEYc0HcUWJLPQa3Q69WV5wMa9m5jPMJPtbLtcRg=="], + + "@pierre/server/oxfmt/@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.55.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-DNbszhpg6S2MIzax5azdHFTTBIVkR5xr8yyRZuA4yoDAwOkzIp3tmldgKZM2+VlT+hJIG0xUksA+elISzMEAfA=="], + + "@pierre/server/oxfmt/@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.55.0", "", { "os": "linux", "cpu": "arm" }, "sha512-2snoaoRfFFyGnbOcKUK36rREBYxe/Xgz3uHbiA5zbCB/s6R4DQj4mHqYAaWWhgizCUSDxV8cE9zAZ0XleNpKGw=="], + + "@pierre/server/oxfmt/@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.55.0", "", { "os": "linux", "cpu": "arm" }, "sha512-q1aktHF/WRpSK81BX1dE/9vWrS2jGw1Nax2kb4DBLGAewubCLcoNyp4Zl/NSMgbv3vUS46Z33wIQkBVYOP3PYg=="], + + "@pierre/server/oxfmt/@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.55.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-VD0y36aENezl/3tsclA/4G53Cc7iV+7Uoh7gz4yvcOTaEYBtJpQsE6PKDGTtUtOvGS4kv51ybfXY/nWZejO5IA=="], + + "@pierre/server/oxfmt/@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.55.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-r8xlKJFcsRmn0H5jZrdORae6RX9jDBrZVvOoxF+bCQtampQJClv80aZEHsv+NsLsp2KCE5ql79O7DpPVzYWpXA=="], + + "@pierre/server/oxfmt/@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.55.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-GRKv/HXHcwIVld/WU61rF0g0R16hl5EJ+ScKdpjevT57lnLnagj/U2YUbXf2mT+2Pg1uCzWC+mvGicPV3CDdLQ=="], + + "@pierre/server/oxfmt/@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.55.0", "", { "os": "linux", "cpu": "none" }, "sha512-rdv57enTiPtpSYRMKfAiEbQb0Puw5t9N7isVinDoo5qeLDScro2gznmZqSgSWbVZRzLisTeCTW8Qwgw0bOHv3A=="], + + "@pierre/server/oxfmt/@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.55.0", "", { "os": "linux", "cpu": "none" }, "sha512-7v1nNrlD43VY6+sYQ6efYyb3lE6QY182304PD/768ZxTjOmFd/3dQa3u/nGBUAXYdGSWOQc5N3PnS0QzUXyEIA=="], + + "@pierre/server/oxfmt/@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.55.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-f4lJLUSPOgScjFl9LiflKCTocyNRwE25JmTMbN4XQdDjoZzEHjqf3wA3VESF1/csg7i8m7+EQLbrZyYDqe10UQ=="], + + "@pierre/server/oxfmt/@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.55.0", "", { "os": "linux", "cpu": "x64" }, "sha512-MihqiPziJNoWy4MqNSV+jVA1g+07iQDjZiR0vaCaDoPgFEiJpCMsxamktzLV07cEeQsSJ04vQaU4CzCQwIvtDA=="], + + "@pierre/server/oxfmt/@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.55.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Yqghym7KYAVjP9MmSrNZiDeerMuoejNjo0r3ox5H3GDKk8eAfl8VyJm9i+pWCLDCTnAbcTUMMN2ZKjUYXH1v3g=="], + + "@pierre/server/oxfmt/@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.55.0", "", { "os": "none", "cpu": "arm64" }, "sha512-s5SDvVVSbyQl1V5UU3Yl12M+XLUQ3rl5SglNqgAA2K4PXUtQhyNSS00wivONPEnNo5W01rCou8WkDNyvI/RGHg=="], + + "@pierre/server/oxfmt/@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.55.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-7p9FB5R32tw2KyyNX3wpQrR2WHwEHvMEiBlGXxeTCaRMCVNx3UtFMAUbaQ/pRNWIrEUZmYhJ6tcUH52uPTRYjQ=="], + + "@pierre/server/oxfmt/@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.55.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-ZYqj3fDnOT1IaVGMP5kpmkQl4F3tQIm2ZyAxvqkJYmI0xgWWak4ss4XYwv3VDfM+TWXeC9K4uQ/wW5jm/5XABA=="], + + "@pierre/server/oxfmt/@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.55.0", "", { "os": "win32", "cpu": "x64" }, "sha512-eEYT5tivGnGbPHuOHuQpi6CGLObhh0re/5jcNQHihD2GRYkTM85dyi5a19zjP8Q00t1uqAx+/QGLUGdHeqzWyg=="], + "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "@types/appdmg/@types/node/undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], diff --git a/package.json b/package.json index d01843f9..4c8a1ed5 100644 --- a/package.json +++ b/package.json @@ -30,8 +30,8 @@ }, "devDependencies": { "markdown-toc": "^1.2.0", - "oxfmt": "^0.55.0", - "oxlint": "^1.70.0", + "oxfmt": "^0.57.0", + "oxlint": "^1.72.0", "typescript": "^6.0.3" } } diff --git a/server/utils/update-pierre.ts b/server/utils/update-pierre.ts index 11d085ec..3c88e320 100644 --- a/server/utils/update-pierre.ts +++ b/server/utils/update-pierre.ts @@ -1,7 +1,8 @@ -import { $ } from 'bun' import { readFileSync } from 'node:fs' import { join } from 'node:path' +import { $ } from 'bun' + const rootPkg = JSON.parse( readFileSync(join(import.meta.dirname, '..', '..', 'package.json'), 'utf8') ) as { version?: string } From cce744eae893abb84fce1eb3800998dde70ce0d6 Mon Sep 17 00:00:00 2001 From: Charles-Henri Arnould Date: Tue, 30 Jun 2026 10:39:46 +0200 Subject: [PATCH 2/3] fix(widget): split the widget into host and embed bundles to avoid CSS/DOM injection into the host page --- .gitignore | 1 - README.md | 40 +- config/build-server.ts | 70 +- docs/assets/widget.js | 1 - docs/index.html | 19 +- server/app.ts | 14 +- server/assets/embed/pierre-embed-frame.css | 11 + .../pierre-embed-modal.css} | 63 +- server/assets/embed/pierre-embed.ts | 419 +++++++++++ server/assets/host/pierre.ts | 461 ++++++++++++ server/assets/scripts/widget.ts | 684 ------------------ server/controllers/embed/get.ts | 8 + server/package.json | 2 +- server/tests/e2e/_open-modal.html | 235 ------ server/tests/e2e/host-demo.html | 195 +++++ server/views/embed.index.ts | 14 + 16 files changed, 1205 insertions(+), 1032 deletions(-) delete mode 100644 docs/assets/widget.js create mode 100644 server/assets/embed/pierre-embed-frame.css rename server/assets/{scripts/widget.css => embed/pierre-embed-modal.css} (70%) create mode 100644 server/assets/embed/pierre-embed.ts create mode 100644 server/assets/host/pierre.ts delete mode 100644 server/assets/scripts/widget.ts create mode 100644 server/controllers/embed/get.ts delete mode 100644 server/tests/e2e/_open-modal.html create mode 100644 server/tests/e2e/host-demo.html create mode 100644 server/views/embed.index.ts diff --git a/.gitignore b/.gitignore index a80c4939..e18e0346 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ desktop/dist/ desktop/out server/datastores/ server/temp/ -server/assets/scripts/widget.styles.gen.ts .env .env.production diff --git a/README.md b/README.md index 9502d774..76cd8763 100644 --- a/README.md +++ b/README.md @@ -422,35 +422,31 @@ Pour que l'agent IA cite systématiquement ses sources dans ses réponses, ajout ### Via une fenêtre modale +Le bouton launcher est **vôtre** (HTML + CSS). PIERRE injecte automatiquement l'iframe modale — aucune feuille de style sur votre page (hors un effet d'animation à l'apparition de la fenêtre modale). + ```html - -

+ + ``` avec : -- `iA?` : le nom d'affichage du bouton (libre à vous de le modifier) -- `style` : le style CSS du bouton (libre à vous de le modifier) -- `180.81.82.83` dans l'URL du script le domaine/IP du serveur où le script est accessible -- `data-url` : le domaine/IP (sans slash de fin) du serveur où PIERRE est accessible -- `data-configuration` : `default` ou le nom du répertoire que vous avez créé plus tôt dans `./customization/chatbot` (_cf._ supra). +- `src` : URL absolue du serveur PIERRE (`/assets/dist/js/pierre.js`) +- `data-pierre-config` : `default` ou nom du répertoire dans `./customization/chatbot` si l'on souhaite afficher un différent profil. +- `data-pierre-open` : marque le bouton qui ouvre la modale (obligatoire) +- `style` sur le bouton : entièrement libre et à votre main ### Via une iframe diff --git a/config/build-server.ts b/config/build-server.ts index 823ba1f5..c2d9659e 100644 --- a/config/build-server.ts +++ b/config/build-server.ts @@ -6,11 +6,13 @@ import toc from 'markdown-toc' const ROOT = import.meta.dir.replace(/\/config$/, '') const SERVER = join(ROOT, 'server') -const WIDGET_SCRIPTS = join(SERVER, 'assets/scripts') +const PIERRE_HOST = join(SERVER, 'assets/host') +const PIERRE_EMBED = join(SERVER, 'assets/embed') -const WIDGET_SHELL_RADIUS = '12px' -const WIDGET_SHADOW_REST = '0 2px 8px rgba(0, 0, 0, 0.04), 0 16px 48px -12px rgba(15, 23, 42, 0.18)' -const WIDGET_NOISE_BG = `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.78' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")` +const PIERRE_MODAL_SHELL_RADIUS = '12px' +const PIERRE_MODAL_SHADOW_REST = + '0 2px 8px rgba(0, 0, 0, 0.04), 0 16px 48px -12px rgba(15, 23, 42, 0.18)' +const PIERRE_MODAL_NOISE_BG = `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.78' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")` function minifyCss(css: string): string { return css @@ -21,22 +23,23 @@ function minifyCss(css: string): string { .trim() } -async function generateWidgetStyles(): Promise { - const css = await Bun.file(join(WIDGET_SCRIPTS, 'widget.css')).text() - const minified = minifyCss(css) - .replaceAll('__NOISE_BG__', WIDGET_NOISE_BG) - .replaceAll('__SHELL_RADIUS__', WIDGET_SHELL_RADIUS) - .replaceAll('__SHADOW_REST__', WIDGET_SHADOW_REST) +async function buildPierreEmbedModalCss(): Promise { + const css = await Bun.file(join(PIERRE_EMBED, 'pierre-embed-modal.css')).text() + return minifyCss(css) + .replaceAll('__NOISE_BG__', PIERRE_MODAL_NOISE_BG) + .replaceAll('__SHELL_RADIUS__', PIERRE_MODAL_SHELL_RADIUS) + .replaceAll('__SHADOW_REST__', PIERRE_MODAL_SHADOW_REST) +} - await Bun.write( - join(WIDGET_SCRIPTS, 'widget.styles.gen.ts'), - `export const WIDGET_CSS = ${JSON.stringify(minified)}\n` - ) +function assertPierreHostMinified(pierrePath: string, pierre: string): void { + if (pierre.includes('pierre_is_open') || pierre.includes('pierre-embed-modal')) { + throw new Error(`${pierrePath} was not minified — check oxfmt/format-on-save`) + } } -function assertWidgetMinified(widgetPath: string, widget: string): void { - if (widget.includes('pierre_is_open') || widget.includes('\n.pierre-ia,\n')) { - throw new Error(`${widgetPath} was not minified — check oxfmt/format-on-save`) +function assertPierreEmbedMinified(pierreEmbedPath: string, pierreEmbed: string): void { + if (pierreEmbed.includes('\nconst MODAL_ID')) { + throw new Error(`${pierreEmbedPath} was not minified — check oxfmt/format-on-save`) } } @@ -46,6 +49,7 @@ const timestamp = Date.now() // Remove old files await $`rm -rf ${SERVER}/assets/dist/css` await $`rm -rf ${SERVER}/assets/dist/js` +await $`rm -f ${ROOT}/docs/assets/pierre.js` await $`rm -f ${ROOT}/docs/assets/widget.js` await $`find ${ROOT} -name ".DS_Store" -type f -delete` @@ -75,17 +79,28 @@ for (const mdRoot of mdRoots) { await $`bun lint` await $`bun format` -await generateWidgetStyles() - // Compile production CSS file await $`bunx @tailwindcss/cli@latest -i ${SERVER}/assets/tailwind/style.css -o ${SERVER}/assets/dist/css/style.${timestamp}.css --minify` +const embed_frame_css = minifyCss( + await Bun.file(join(PIERRE_EMBED, 'pierre-embed-frame.css')).text() +) +await Bun.write(join(SERVER, 'assets/dist/css/pierre-embed-frame.css'), embed_frame_css) +await Bun.write( + join(SERVER, 'assets/dist/css/pierre-embed-modal.css'), + await buildPierreEmbedModalCss() +) + // Transpile and minify .ts/.tsx scripts into .js to work in browser. -await $`bun build --entrypoints ${SERVER}/assets/scripts/ai.tsx ${SERVER}/assets/scripts/widget.ts --outdir ${SERVER}/assets/dist/js --minify --target browser` -await $`mv ${SERVER}/assets/dist/js/ai.js ${SERVER}/assets/dist/js/ai.${timestamp}.js` +await $`bun build ${SERVER}/assets/scripts/ai.tsx --outfile ${SERVER}/assets/dist/js/ai.${timestamp}.js --minify --target browser` +await $`bun build ${PIERRE_HOST}/pierre.ts --outfile ${SERVER}/assets/dist/js/pierre.js --minify --target browser` +await $`bun build ${PIERRE_EMBED}/pierre-embed.ts --outfile ${SERVER}/assets/dist/js/pierre-embed.js --minify --target browser` + +const pierreDistPath = join(SERVER, 'assets/dist/js/pierre.js') +assertPierreHostMinified(pierreDistPath, await Bun.file(pierreDistPath).text()) -const widgetDistPath = join(SERVER, 'assets/dist/js/widget.js') -assertWidgetMinified(widgetDistPath, await Bun.file(widgetDistPath).text()) +const pierreEmbedDistPath = join(SERVER, 'assets/dist/js/pierre-embed.js') +assertPierreEmbedMinified(pierreEmbedDistPath, await Bun.file(pierreEmbedDistPath).text()) // Update "timestamped filepath" in all Views const views = await readdir(join(SERVER, 'views')) @@ -105,12 +120,7 @@ for (const view of views) { ) } -// Copy transpiled/minified widget.js in `docs` folder, aka PIERRE website -await $`cp ${SERVER}/assets/dist/js/widget.js ${ROOT}/docs/assets` - -assertWidgetMinified( - join(ROOT, 'docs/assets/widget.js'), - await Bun.file(join(ROOT, 'docs/assets/widget.js')).text() -) +// Copy pierre.js for the PIERRE website (docs) +await $`cp ${SERVER}/assets/dist/js/pierre.js ${ROOT}/docs/assets` console.log(`✅ BUILD DONE!`) diff --git a/docs/assets/widget.js b/docs/assets/widget.js deleted file mode 100644 index 0f616666..00000000 --- a/docs/assets/widget.js +++ /dev/null @@ -1 +0,0 @@ -var K=Object.create;var{getPrototypeOf:q,defineProperty:M,getOwnPropertyNames:G}=Object;var W=Object.prototype.hasOwnProperty;function U(e){return this[e]}var Y,j,xe=(e,t,r)=>{var n=e!=null&&typeof e==="object";if(n){var i=t?Y??=new WeakMap:j??=new WeakMap,a=i.get(e);if(a)return a}r=e!=null?K(q(e)):{};let o=t||!e||!e.__esModule?M(r,"default",{value:e,enumerable:!0}):r;for(let c of G(e))if(!W.call(o,c))M(o,c,{get:U.bind(e,c),enumerable:!0});if(n)i.set(e,o);return o};var ve=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var V=(e)=>e;function X(e,t){this[e]=V.bind(null,t)}var Le=(e,t)=>{for(var r in t)M(e,r,{get:t[r],enumerable:!0,configurable:!0,set:X.bind(t,r)})};var Te=(e,t)=>()=>(e&&(t=e(e=0)),t);var H=".pierre-ia,#pierre-ia{margin:0;z-index:9997;cursor:pointer;font-family:system-ui,Segoe UI,Roboto,Ubuntu,Helvetica Neue,sans-serif;transition:transform 0.2s cubic-bezier(0.215,0.61,0.355,1),opacity 0.2s ease;position:fixed;bottom:24px;right:24px;touch-action:manipulation}.pierre-ia:focus-visible,#pierre-ia:focus-visible{outline:2px solid rgba(0,122,255,0.85);outline-offset:3px}.pierre-ia.pierre-ia--disabled,#pierre-ia.pierre-ia--disabled{pointer-events:none}#pierre-wrapper{z-index:9998;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:fixed;inset:0;opacity:0;isolation:isolate;background:radial-gradient( ellipse 95% 85% at 50% 45%,rgba(8,12,20,0.1) 0%,rgba(8,12,20,0.42) 100% ),rgba(10,14,22,0.26);backdrop-filter:blur(18px) brightness(0.65) saturate(0.72);-webkit-backdrop-filter:blur(18px) brightness(0.65) saturate(0.72)}@supports not (backdrop-filter:blur(1px)){#pierre-wrapper{background:rgba(10,14,22,0.55)}}#pierre-wrapper::before{content:'';position:absolute;inset:0;z-index:0;opacity:0.06;pointer-events:none;mix-blend-mode:soft-light;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.78' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E\");background-size:220px 220px}#pierre-iframe-container{position:relative;z-index:1;overflow:hidden;border-radius:12px;background:#fff;box-shadow:0 2px 8px rgba(0, 0, 0, 0.04), 0 16px 48px -12px rgba(15, 23, 42, 0.18);max-width:calc(100vw - 32px);max-height:90dvh}#pierre-iframe-content{opacity:0;line-height:0}#pierre-iframe{display:block;z-index:9999;width:min(600px,calc(100vw - 32px));border:none;height:min(700px,90dvh);background:#fff}#pierre-close{display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;margin:0;border:none;border-radius:50%;background:rgba(255,255,255,0.72);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);color:rgba(0,0,0,0.55);font-size:16px;line-height:1;cursor:pointer;z-index:10000;position:absolute;top:12px;right:12px;opacity:0;outline:none;box-shadow:none;transition:background 0.15s ease,opacity 0.15s ease,color 0.15s ease}#pierre-close:focus,#pierre-close:focus-visible{outline:none;box-shadow:none}#pierre-close:hover{background:rgba(255,255,255,0.92);color:rgba(0,0,0,0.78);opacity:1}@media (max-width:600px){#pierre-iframe-container{box-shadow:none;border-radius:0;max-width:100vw;max-height:100dvh}#pierre-iframe{width:100vw;height:100dvh}#pierre-close{top:max(12px,env(safe-area-inset-top));right:max(12px,env(safe-area-inset-right))}}@media (prefers-reduced-motion:reduce){#pierre-wrapper{backdrop-filter:none;-webkit-backdrop-filter:none;background:rgba(10,14,22,0.52)}#pierre-wrapper::before{display:none}.pierre-ia,#pierre-ia{transition:opacity 0.15s ease}}";var l=!1,s=!1,w=null,h=null,D="",A="",x=[],m=[],C,_,u="cubic-bezier(0.34, 1.28, 0.64, 1)",f="cubic-bezier(0.4, 0, 0.2, 1)",v=150,B={open:{scrim:300,shell:400,shellDelay:0,launcher:160,launcherDelay:40,content:180,contentDelay:200,close:160,closeDelay:160},close:{scrim:220,shell:280,shellDelay:0,launcher:180,launcherDelay:0,content:100,contentDelay:0,close:100,closeDelay:0}},J=0.97,Q=2,Z=12,d=()=>window.matchMedia("(prefers-reduced-motion: reduce)").matches,ee=()=>window.matchMedia("(max-width: 600px)").matches,p=(e)=>e.finished.catch(()=>{return}),te=()=>new Promise((e)=>requestAnimationFrame(()=>requestAnimationFrame(()=>e()))),b=(e)=>e.closest(".pierre-ia")??e.closest("#pierre-ia"),re=(e)=>{let t=e.style.transform;if(t&&t!=="none")return t;let r=getComputedStyle(e).transform;return r!=="none"?r:""},g=(e,t)=>{let r=`scale(${t})`;if(!e||e==="none")return r;return`${e} ${r}`},L=(e)=>{if(!e.dataset.pierreBaseTransform)e.dataset.pierreBaseTransform=re(e)},T=(e,t)=>{if(s)return;L(e);let r=e.dataset.pierreBaseTransform??"";if(t==="hidden"){e.style.opacity="0",e.style.transform=g(r,0.92);return}e.style.opacity="";let n=t==="pressed"?0.96:t==="hover"?1.08:1;e.style.transform=n===1?r:g(r,n)},ne=(e)=>{e.style.opacity="",e.style.transform=e.dataset.pierreBaseTransform??"",e.style.pointerEvents="",e.classList.remove("pierre-ia--disabled"),e.removeAttribute("aria-hidden")},S=()=>document.querySelectorAll(".pierre-ia, #pierre-ia"),ie=(e)=>{S().forEach((t)=>{if(t===e)return;t.style.opacity="0",t.style.pointerEvents="none",t.setAttribute("aria-hidden","true"),t.classList.add("pierre-ia--disabled")})},R=()=>{S().forEach(ne)},ae=(e)=>e>400?1.016:1.022,y=(e,t,r)=>`translate3d(${e}px, ${t}px, 0) scale(${r})`,I=(e,t)=>{let r=e.getBoundingClientRect(),n=r.left+r.width/2,i=r.top+r.height/2,a=t.left+t.width/2,o=t.top+t.height/2,c=n-a,E=i-o;return{tx:c,ty:E,scale:Math.min(r.width/t.width,r.height/t.height),dist:Math.hypot(c,E)}},oe=(e,t)=>{let{tx:r,ty:n,scale:i,dist:a}=e;if(t==="in"){let o=ae(a);return[{transform:y(r,n,i)},{transform:y(0,0,o),offset:0.72},{transform:y(0,0,1)}]}return[{transform:y(0,0,1)},{transform:y(r,n,i)}]},se=(e,t,r,n)=>{let i=t==="in"?u:f;return e.animate(t==="in"?[{opacity:0},{opacity:1}]:[{opacity:1},{opacity:0}],{duration:d()?v:r,delay:n,easing:d()?"ease":i,fill:"forwards"})},O=(e,t)=>{if(e===t||e.id==="pierre-iframe")return!0;let r=e;return r.classList.contains("pierre-ia")||r.id==="pierre-ia"},le=(e)=>{for(let t of document.body.children){if(O(t,e))continue;if(m.push(t),m.length>=Z)break}},ce=async(e,t,r)=>{if(d()||m.length===0)return;let n=e==="in"?u:f,i=`scale(${J})`,a=`blur(${Q}px)`,o=ee();await Promise.all(m.map((c)=>{c.style.transformOrigin="center center",c.style.willChange=o?"transform":"transform, filter";let E=e==="in"?o?[{transform:"scale(1)"},{transform:i}]:[{transform:"scale(1)",filter:"blur(0px)"},{transform:i,filter:a}]:o?[{transform:i},{transform:"scale(1)"}]:[{transform:i,filter:a},{transform:"scale(1)",filter:"blur(0px)"}];return p(c.animate(E,{duration:t,delay:r,easing:n,fill:"forwards"}))}))},de=()=>{for(let e of m)e.style.willChange=""},z=()=>{for(let e of m)e.style.transform="",e.style.filter="",e.style.transformOrigin="",e.style.willChange="";m.length=0},me=(e,t,r,n,i)=>{let a=r==="in"?u:f;if(e.style.transformOrigin="center center",e.style.willChange="transform",d())return e.animate(r==="in"?[{opacity:0},{opacity:1}]:[{opacity:1},{opacity:0}],{duration:v,easing:"ease",fill:"forwards"});return e.animate(oe(t,r),{duration:n,delay:i,easing:a,fill:"forwards"})},pe=(e,t,r,n)=>{L(e);let i=e.dataset.pierreBaseTransform??"",a=t==="in"?u:f;if(d())return e.animate([],{duration:0});if(t==="in")return e.animate([{opacity:1,transform:i||"none"},{opacity:0,transform:g(i,0.92),offset:0.7},{opacity:0,transform:g(i,0.92)}],{duration:r,delay:n,easing:a,fill:"forwards"});return e.animate([{opacity:0,transform:g(i,0.92)},{opacity:1,transform:i||"none"}],{duration:r,delay:n,easing:a,fill:"forwards"})},ue=(e,t,r,n)=>{let i=t==="in"?u:f;if(d())return e.animate(t==="in"?[{opacity:0},{opacity:1}]:[{opacity:1},{opacity:0}],{duration:v,delay:n,easing:"ease",fill:"forwards"});return e.animate(t==="in"?[{opacity:0,transform:"translateY(8px)"},{opacity:1,transform:"translateY(0)"}]:[{opacity:1,transform:"translateY(0)"},{opacity:0,transform:"translateY(8px)"}],{duration:r,delay:n,easing:i,fill:"forwards"})},fe=(e,t,r,n)=>{let i=t==="in"?u:f;if(d())return e.animate(t==="in"?[{opacity:0},{opacity:1}]:[{opacity:1},{opacity:0}],{duration:v,delay:n,easing:"ease",fill:"forwards"});return e.animate(t==="in"?[{opacity:0,transform:"scale(0.88)"},{opacity:1,transform:"scale(1)"}]:[{opacity:1,transform:"scale(1)"},{opacity:0,transform:"scale(0.88)"}],{duration:r,delay:n,easing:i,fill:"forwards"})},$=async(e,t)=>{let r=t==="in"?B.open:B.close;await Promise.all([p(se(e.wrapper,t,r.scrim,t==="in"?0:0)),ce(t,r.scrim,0),p(me(e.container,e.metrics,t,r.shell,r.shellDelay)),p(pe(e.launcher,t,r.launcher,r.launcherDelay)),p(ue(e.content,t,r.content,r.contentDelay)),p(fe(e.close,t,r.close,r.closeDelay))])},ye=()=>{let e=window.innerWidth-document.documentElement.clientWidth;if(D=document.body.style.paddingRight,A=document.documentElement.style.overscrollBehavior,document.body.style.overflow="hidden",document.documentElement.style.overscrollBehavior="none",e>0)document.body.style.paddingRight=`${e}px`},F=()=>{document.body.style.overflow="",document.body.style.paddingRight=D,document.documentElement.style.overscrollBehavior=A},he=(e)=>{for(let t of document.body.children){if(O(t,e))continue;if("inert"in t)t.inert=!0,x.push(t);else t.setAttribute("aria-hidden","true"),x.push(t)}},N=()=>{for(let e of x)if("inert"in e)e.inert=!1;else e.removeAttribute("aria-hidden");x.length=0},ge=(e)=>{let t=()=>{let r=e.querySelector("#pierre-close");return r?[r]:[]};h=(r)=>{if(r.key!=="Tab")return;let n=t();if(!n.length)return;let i=n[0],a=n[n.length-1];if(r.shiftKey&&document.activeElement===i)r.preventDefault(),a.focus();else if(!r.shiftKey&&document.activeElement===a)r.preventDefault(),i.focus()},e.addEventListener("keydown",h)},P=(e)=>{if(h)e.removeEventListener("keydown",h),h=null},be=()=>{if(d())return;if("vibrate"in navigator)navigator.vibrate(5)},Ee=()=>{document.querySelectorAll(".pierre-ia, #pierre-ia").forEach(L)},we=async(e)=>{if(l||s)return;let t=document.getElementById("pierre-iframe");if(!t)return;s=!0,w=e,L(e),e.classList.add("pierre-ia--disabled");let r=document.createElement("div");r.id="pierre-wrapper",r.setAttribute("role","dialog"),r.setAttribute("aria-modal","true"),r.setAttribute("aria-label","Assistant PIERRE");let n=document.createElement("div");n.id="pierre-iframe-container";let i=document.createElement("div");i.id="pierre-iframe-content",t.style.display="block",i.appendChild(t);let a=document.createElement("button");a.type="button",a.id="pierre-close",a.setAttribute("aria-label","Fermer"),a.innerHTML='',n.append(a,i),r.appendChild(n),document.body.appendChild(r),ye(),le(r),he(r),ie(e),ge(r),be();try{await te();let o=I(e,n.getBoundingClientRect());await $({wrapper:r,container:n,content:i,close:a,launcher:e,metrics:o},"in"),n.style.willChange="",de(),a.focus(),l=!0}catch{P(r),N(),z(),F(),R(),t.style.display="none",document.body.appendChild(t),r.remove(),w=null}finally{s=!1}},k=async()=>{if(!l||s)return;s=!0;let e=document.getElementById("pierre-wrapper"),t=document.getElementById("pierre-iframe-container"),r=document.getElementById("pierre-iframe-content"),n=document.getElementById("pierre-close"),i=document.getElementById("pierre-iframe"),a=w;if(!e||!t||!r||!n||!i||!a){s=!1;return}let o=I(a,t.getBoundingClientRect());await $({wrapper:e,container:t,content:r,close:n,launcher:a,metrics:o},"out"),P(e),N(),z(),F(),i.style.display="none",document.body.appendChild(i),t.style.transform="",t.style.opacity="",t.style.borderRadius="",t.style.boxShadow="",t.style.transformOrigin="",t.style.willChange="",r.style.opacity="",r.style.transform="",n.style.opacity="",n.style.transform="",R(),a.focus(),e.remove(),w=null,l=!1,s=!1};document.addEventListener("DOMContentLoaded",()=>{let e=document.createElement("style");e.innerText=H,document.head.appendChild(e);let t=document.querySelector(".pierre-ia, #pierre-ia");C=t?.dataset.configuration??"default",_=t?.dataset.url??"https://assistant.pierre-ia.org";let r=document.createElement("iframe");r.src=`${_}/?config=${C}`,r.style.display="none",r.id="pierre-iframe",document.body.appendChild(r),Ee()});document.addEventListener("pointerover",(e)=>{let t=b(e.target);if(!t||l||s)return;T(t,"hover")},!0);document.addEventListener("pointerout",(e)=>{let t=b(e.target);if(!t||l||s)return;let r=e.relatedTarget;if(r&&t.contains(r))return;T(t,"rest")},!0);document.addEventListener("pointerdown",(e)=>{let t=b(e.target);if(!t||l||s)return;T(t,"pressed")},!0);document.addEventListener("pointerup",(e)=>{let t=b(e.target);if(!t||l||s)return;T(t,"hover")},!0);document.addEventListener("click",(e)=>{let t=e.target,r=b(t);if(r&&!l&&!s){we(r);return}if(!l||s)return;if(t.id==="pierre-wrapper"&&!t.closest("#pierre-iframe-container")){k();return}if(t.closest("#pierre-close"))k()});document.addEventListener("keydown",(e)=>{if(l&&!s&&e.key==="Escape")k()}); diff --git a/docs/index.html b/docs/index.html index c4f9ef83..0966e152 100644 --- a/docs/index.html +++ b/docs/index.html @@ -44,17 +44,23 @@ PIERRE — Une intelligence artificielle open source, plurilingue et agentique au service du mouvement HLM, de ses candidats, locataires et collaborateurs. + - -

iA? -

+
diff --git a/server/app.ts b/server/app.ts index 7e183cae..1636738f 100644 --- a/server/app.ts +++ b/server/app.ts @@ -25,6 +25,7 @@ import { controller as get_desktop_tickets_drafts } from './controllers/desktop/ import { controller as get_desktop_tickets_facets } from './controllers/desktop/tickets/get.facets' import { controller as put_desktop_tickets } from './controllers/desktop/tickets/put' import { controller as put_desktop_tickets_drafts } from './controllers/desktop/tickets/put.draft' +import { controller as get_embed } from './controllers/embed/get' import { controller as post_telemetry } from './controllers/telemetry/post' // import { topicize, score } from "./utils/analyze-conversation"; import { authenticate } from './utils/authenticate-user' @@ -75,7 +76,7 @@ app.get('/customization/:path{.+}/AGENTS.md', (c) => c.notFound()) // Serve desktop config.ts as plain JSON app.get('/customization/desktop/config.json', (c) => c.json(desktop_config)) -// Serve widget assets (with CORS for cross-origin embedding) and customization files +// Serve PIERRE assets (with CORS for cross-origin embedding) and customization files app.use('/assets/*', cors()) app.use('/assets/*', serveStatic({ root: SERVER_ROOT })) app.use('/customization/*', serveStatic({ root: CUSTOMIZATION_STATIC_ROOT })) @@ -110,12 +111,17 @@ app.post('/a/conversations', authenticate, post_admin_conversations) app.get('/up', (c) => c.text('ok')) app.post('/telemetry', post_telemetry) +// PIERRE embed shell (modal isolated from host page CSS/DOM) +app.get('/embed', get_embed) + // Catch-all route that redirects to a new conversation -app.notFound(async (c) => - c.redirect( +app.notFound(async (c) => { + if (c.req.path.startsWith('/assets/')) return c.text('Not Found', 404) + + return c.redirect( `/c?config=${c.req.query('config')}&data=${c.req.query('data')}${c.req.query('compact') !== undefined ? '&compact' : ''}` ) -) +}) // Handle errors by returning a 404 response app.onError((_err, c) => c.notFound()) diff --git a/server/assets/embed/pierre-embed-frame.css b/server/assets/embed/pierre-embed-frame.css new file mode 100644 index 00000000..00c22ef1 --- /dev/null +++ b/server/assets/embed/pierre-embed-frame.css @@ -0,0 +1,11 @@ +html, +body { + margin: 0; + background: transparent; + pointer-events: none; +} + +#pierre-embed-modal, +#pierre-embed-modal * { + pointer-events: auto; +} diff --git a/server/assets/scripts/widget.css b/server/assets/embed/pierre-embed-modal.css similarity index 70% rename from server/assets/scripts/widget.css rename to server/assets/embed/pierre-embed-modal.css index 2c432c36..4b3315c7 100644 --- a/server/assets/scripts/widget.css +++ b/server/assets/embed/pierre-embed-modal.css @@ -1,33 +1,4 @@ -.pierre-ia, -#pierre-ia { - margin: 0; - z-index: 9997; - cursor: pointer; - font-family: - system-ui, - Segoe UI, - Roboto, - Ubuntu, - Helvetica Neue, - sans-serif; - transition: - transform 0.2s cubic-bezier(0.215, 0.61, 0.355, 1), - opacity 0.2s ease; - position: fixed; - bottom: 24px; - right: 24px; - touch-action: manipulation; -} -.pierre-ia:focus-visible, -#pierre-ia:focus-visible { - outline: 2px solid rgba(0, 122, 255, 0.85); - outline-offset: 3px; -} -.pierre-ia.pierre-ia--disabled, -#pierre-ia.pierre-ia--disabled { - pointer-events: none; -} -#pierre-wrapper { +#pierre-embed-modal { z-index: 9998; justify-content: center; align-items: center; @@ -49,11 +20,11 @@ -webkit-backdrop-filter: blur(18px) brightness(0.65) saturate(0.72); } @supports not (backdrop-filter: blur(1px)) { - #pierre-wrapper { + #pierre-embed-modal { background: rgba(10, 14, 22, 0.55); } } -#pierre-wrapper::before { +#pierre-embed-modal::before { content: ''; position: absolute; inset: 0; @@ -64,7 +35,7 @@ background-image: __NOISE_BG__; background-size: 220px 220px; } -#pierre-iframe-container { +#pierre-embed-modal-shell { position: relative; z-index: 1; overflow: hidden; @@ -74,11 +45,11 @@ max-width: calc(100vw - 32px); max-height: 90dvh; } -#pierre-iframe-content { +#pierre-embed-modal-body { opacity: 0; line-height: 0; } -#pierre-iframe { +#pierre-embed-modal-chat { display: block; z-index: 9999; width: min(600px, calc(100vw - 32px)); @@ -86,7 +57,7 @@ height: min(700px, 90dvh); background: #fff; } -#pierre-close { +#pierre-embed-modal-close { display: flex; align-items: center; justify-content: center; @@ -115,43 +86,39 @@ opacity 0.15s ease, color 0.15s ease; } -#pierre-close:focus, -#pierre-close:focus-visible { +#pierre-embed-modal-close:focus, +#pierre-embed-modal-close:focus-visible { outline: none; box-shadow: none; } -#pierre-close:hover { +#pierre-embed-modal-close:hover { background: rgba(255, 255, 255, 0.92); color: rgba(0, 0, 0, 0.78); opacity: 1; } @media (max-width: 600px) { - #pierre-iframe-container { + #pierre-embed-modal-shell { box-shadow: none; border-radius: 0; max-width: 100vw; max-height: 100dvh; } - #pierre-iframe { + #pierre-embed-modal-chat { width: 100vw; height: 100dvh; } - #pierre-close { + #pierre-embed-modal-close { top: max(12px, env(safe-area-inset-top)); right: max(12px, env(safe-area-inset-right)); } } @media (prefers-reduced-motion: reduce) { - #pierre-wrapper { + #pierre-embed-modal { backdrop-filter: none; -webkit-backdrop-filter: none; background: rgba(10, 14, 22, 0.52); } - #pierre-wrapper::before { + #pierre-embed-modal::before { display: none; } - .pierre-ia, - #pierre-ia { - transition: opacity 0.15s ease; - } } diff --git a/server/assets/embed/pierre-embed.ts b/server/assets/embed/pierre-embed.ts new file mode 100644 index 00000000..25b8f7f1 --- /dev/null +++ b/server/assets/embed/pierre-embed.ts @@ -0,0 +1,419 @@ +type HostRect = { + top: number + left: number + width: number + height: number + bottom: number + right: number +} + +const MODAL_ID = 'pierre-embed-modal' +const MODAL_SHELL_ID = 'pierre-embed-modal-shell' +const MODAL_BODY_ID = 'pierre-embed-modal-body' +const MODAL_CHAT_ID = 'pierre-embed-modal-chat' +const MODAL_CLOSE_ID = 'pierre-embed-modal-close' + +const HOST_INBOUND_TYPES = new Set(['pierre:probe', 'pierre:open']) + +let pierre_is_open = false +let pierre_is_animating = false +let active_host_rect: HostRect | null = null +let focus_trap_handler: ((event: KeyboardEvent) => void) | null = null +let configuration: string +let url: string +let host_origin = '' + +const EASING_OPEN = 'cubic-bezier(0.34, 1.28, 0.64, 1)' +const EASING_CLOSE = 'cubic-bezier(0.4, 0, 0.2, 1)' +const REDUCED_MOTION_MS = 150 + +const TIMING = { + open: { + scrim: 300, + shell: 400, + shellDelay: 0, + content: 180, + contentDelay: 200, + close: 160, + closeDelay: 160 + }, + close: { + scrim: 220, + shell: 280, + shellDelay: 0, + content: 100, + contentDelay: 0, + close: 100, + closeDelay: 0 + } +} as const + +type DockMetrics = { tx: number; ty: number; scale: number; dist: number } + +type TimelineElements = { + wrapper: HTMLElement + container: HTMLElement + content: HTMLElement + close: HTMLButtonElement + metrics: DockMetrics +} + +const prefers_reduced_motion = () => window.matchMedia('(prefers-reduced-motion: reduce)').matches +const waitAnimation = (animation: Animation) => animation.finished.catch(() => undefined) +const afterLayout = () => + new Promise((resolve) => + requestAnimationFrame(() => requestAnimationFrame(() => resolve())) + ) + +const overshootFor = (dist: number) => (dist > 400 ? 1.016 : 1.022) +const shellTransform = (tx: number, ty: number, scale: number) => + `translate3d(${tx}px, ${ty}px, 0) scale(${scale})` + +const measureDockFlipFromRect = (rect: DOMRect, container: DOMRect): DockMetrics => { + const btn_cx = rect.left + rect.width / 2 + const btn_cy = rect.top + rect.height / 2 + const box_cx = container.left + container.width / 2 + const box_cy = container.top + container.height / 2 + const tx = btn_cx - box_cx + const ty = btn_cy - box_cy + return { + tx, + ty, + scale: Math.min(rect.width / container.width, rect.height / container.height), + dist: Math.hypot(tx, ty) + } +} + +const buildShellKeyframes = (metrics: DockMetrics, direction: 'in' | 'out') => { + const { tx, ty, scale, dist } = metrics + if (direction === 'in') { + const peak = overshootFor(dist) + return [ + { transform: shellTransform(tx, ty, scale) }, + { transform: shellTransform(0, 0, peak), offset: 0.72 }, + { transform: shellTransform(0, 0, 1) } + ] + } + return [{ transform: shellTransform(0, 0, 1) }, { transform: shellTransform(tx, ty, scale) }] +} + +const animateScrim = ( + wrapper: HTMLElement, + direction: 'in' | 'out', + duration: number, + delay: number +): Animation => { + const easing = direction === 'in' ? EASING_OPEN : EASING_CLOSE + return wrapper.animate( + direction === 'in' ? [{ opacity: 0 }, { opacity: 1 }] : [{ opacity: 1 }, { opacity: 0 }], + { + duration: prefers_reduced_motion() ? REDUCED_MOTION_MS : duration, + delay, + easing: prefers_reduced_motion() ? 'ease' : easing, + fill: 'forwards' + } + ) +} + +const animateShell = ( + container: HTMLElement, + metrics: DockMetrics, + direction: 'in' | 'out', + duration: number, + delay: number +): Animation => { + const easing = direction === 'in' ? EASING_OPEN : EASING_CLOSE + container.style.transformOrigin = 'center center' + container.style.willChange = 'transform' + if (prefers_reduced_motion()) { + return container.animate( + direction === 'in' ? [{ opacity: 0 }, { opacity: 1 }] : [{ opacity: 1 }, { opacity: 0 }], + { duration: REDUCED_MOTION_MS, easing: 'ease', fill: 'forwards' } + ) + } + return container.animate(buildShellKeyframes(metrics, direction), { + duration, + delay, + easing, + fill: 'forwards' + }) +} + +const animateContent = ( + content: HTMLElement, + direction: 'in' | 'out', + duration: number, + delay: number +): Animation => { + const easing = direction === 'in' ? EASING_OPEN : EASING_CLOSE + if (prefers_reduced_motion()) { + return content.animate( + direction === 'in' ? [{ opacity: 0 }, { opacity: 1 }] : [{ opacity: 1 }, { opacity: 0 }], + { duration: REDUCED_MOTION_MS, delay, easing: 'ease', fill: 'forwards' } + ) + } + return content.animate( + direction === 'in' + ? [ + { opacity: 0, transform: 'translateY(8px)' }, + { opacity: 1, transform: 'translateY(0)' } + ] + : [ + { opacity: 1, transform: 'translateY(0)' }, + { opacity: 0, transform: 'translateY(8px)' } + ], + { duration, delay, easing, fill: 'forwards' } + ) +} + +const animateCloseButton = ( + close: HTMLButtonElement, + direction: 'in' | 'out', + duration: number, + delay: number +): Animation => { + const easing = direction === 'in' ? EASING_OPEN : EASING_CLOSE + if (prefers_reduced_motion()) { + return close.animate( + direction === 'in' ? [{ opacity: 0 }, { opacity: 1 }] : [{ opacity: 1 }, { opacity: 0 }], + { duration: REDUCED_MOTION_MS, delay, easing: 'ease', fill: 'forwards' } + ) + } + return close.animate( + direction === 'in' + ? [ + { opacity: 0, transform: 'scale(0.88)' }, + { opacity: 1, transform: 'scale(1)' } + ] + : [ + { opacity: 1, transform: 'scale(1)' }, + { opacity: 0, transform: 'scale(0.88)' } + ], + { duration, delay, easing, fill: 'forwards' } + ) +} + +const animateTimeline = async (elements: TimelineElements, direction: 'in' | 'out') => { + const timing = direction === 'in' ? TIMING.open : TIMING.close + await Promise.all([ + waitAnimation(animateScrim(elements.wrapper, direction, timing.scrim, 0)), + waitAnimation( + animateShell(elements.container, elements.metrics, direction, timing.shell, timing.shellDelay) + ), + waitAnimation(animateContent(elements.content, direction, timing.content, timing.contentDelay)), + waitAnimation(animateCloseButton(elements.close, direction, timing.close, timing.closeDelay)) + ]) +} + +const trapFocus = (wrapper: HTMLElement) => { + const getFocusables = (): HTMLElement[] => { + const close = wrapper.querySelector(`#${MODAL_CLOSE_ID}`) + return close ? [close] : [] + } + + focus_trap_handler = (event: KeyboardEvent) => { + if (event.key !== 'Tab') return + + const focusables = getFocusables() + if (!focusables.length) return + + const first = focusables[0]! + const last = focusables[focusables.length - 1]! + + if (event.shiftKey && document.activeElement === first) { + event.preventDefault() + last.focus() + } else if (!event.shiftKey && document.activeElement === last) { + event.preventDefault() + first.focus() + } + } + wrapper.addEventListener('keydown', focus_trap_handler) +} + +const releaseFocusTrap = (wrapper: HTMLElement) => { + if (focus_trap_handler) { + wrapper.removeEventListener('keydown', focus_trap_handler) + focus_trap_handler = null + } +} + +const parseHostOrigin = (): string => { + const raw = new URLSearchParams(window.location.search).get('host') ?? '' + if (!raw) return '' + try { + const parsed = new URL(raw) + if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return '' + return parsed.origin + } catch { + return '' + } +} + +const isValidHostRect = (rect: unknown): rect is HostRect => { + if (!rect || typeof rect !== 'object') return false + const candidate = rect as Record + return ['top', 'left', 'width', 'height', 'bottom', 'right'].every( + (key) => typeof candidate[key] === 'number' && Number.isFinite(candidate[key]) + ) +} + +const postToHost = (message: object) => { + if (window.parent === window || !host_origin) return + window.parent.postMessage(message, host_origin) +} + +const isTrustedHostMessage = (event: MessageEvent): boolean => { + const type = event.data?.type + return ( + event.source === window.parent && + !!host_origin && + event.origin === host_origin && + typeof type === 'string' && + HOST_INBOUND_TYPES.has(type) + ) +} + +const notifyHostClosed = () => postToHost({ type: 'pierre:closed' }) +const notifyHostClosing = () => postToHost({ type: 'pierre:closing' }) +const notifyHostOpenCancelled = () => postToHost({ type: 'pierre:open-cancelled' }) + +const openModal = async (host_rect: HostRect) => { + if (pierre_is_open || pierre_is_animating) return + + const chat_iframe = document.getElementById(MODAL_CHAT_ID) + if (!chat_iframe) return + + pierre_is_animating = true + active_host_rect = host_rect + + const wrapper = document.createElement('div') + wrapper.id = MODAL_ID + wrapper.setAttribute('role', 'dialog') + wrapper.setAttribute('aria-modal', 'true') + wrapper.setAttribute('aria-label', 'Assistant PIERRE') + + const container = document.createElement('div') + container.id = MODAL_SHELL_ID + + const content = document.createElement('div') + content.id = MODAL_BODY_ID + + chat_iframe.style.display = 'block' + content.appendChild(chat_iframe) + + const close = document.createElement('button') + close.type = 'button' + close.id = MODAL_CLOSE_ID + close.setAttribute('aria-label', 'Fermer') + close.innerHTML = '' + + container.append(close, content) + wrapper.appendChild(container) + document.body.appendChild(wrapper) + trapFocus(wrapper) + + try { + await afterLayout() + const metrics = measureDockFlipFromRect(host_rect, container.getBoundingClientRect()) + await animateTimeline({ wrapper, container, content, close, metrics }, 'in') + container.style.willChange = '' + close.focus() + pierre_is_open = true + } catch { + releaseFocusTrap(wrapper) + chat_iframe.style.display = 'none' + document.body.appendChild(chat_iframe) + wrapper.remove() + active_host_rect = null + notifyHostOpenCancelled() + } finally { + pierre_is_animating = false + } +} + +const close_modal = async () => { + if (!pierre_is_open || pierre_is_animating || !active_host_rect) return + + pierre_is_animating = true + + const wrapper = document.getElementById(MODAL_ID) + const container = document.getElementById(MODAL_SHELL_ID) + const content = document.getElementById(MODAL_BODY_ID) + const close = document.getElementById(MODAL_CLOSE_ID) as HTMLButtonElement | null + const chat_iframe = document.getElementById(MODAL_CHAT_ID) + const host_rect = active_host_rect + + if (!wrapper || !container || !content || !close || !chat_iframe) { + pierre_is_animating = false + return + } + + notifyHostClosing() + + const metrics = measureDockFlipFromRect(host_rect, container.getBoundingClientRect()) + await animateTimeline({ wrapper, container, content, close, metrics }, 'out') + + releaseFocusTrap(wrapper) + + chat_iframe.style.display = 'none' + document.body.appendChild(chat_iframe) + + container.style.transform = '' + container.style.opacity = '' + container.style.borderRadius = '' + container.style.boxShadow = '' + container.style.transformOrigin = '' + container.style.willChange = '' + content.style.opacity = '' + content.style.transform = '' + close.style.opacity = '' + close.style.transform = '' + + wrapper.remove() + active_host_rect = null + pierre_is_open = false + pierre_is_animating = false + notifyHostClosed() +} + +document.addEventListener('DOMContentLoaded', () => { + configuration = document.body.dataset.pierreConfig ?? 'default' + url = window.location.origin + host_origin = parseHostOrigin() + + const preloaded_iframe = document.createElement('iframe') + preloaded_iframe.src = `${url}/c?config=${encodeURIComponent(configuration)}&data=` + preloaded_iframe.style.display = 'none' + preloaded_iframe.id = MODAL_CHAT_ID + document.body.appendChild(preloaded_iframe) + + window.addEventListener('message', (event) => { + if (!isTrustedHostMessage(event)) return + + const type = event.data.type as string + if (type === 'pierre:probe') { + postToHost({ type: 'pierre:ready' }) + return + } + if (type !== 'pierre:open') return + if (!isValidHostRect(event.data.rect)) return + void openModal(event.data.rect) + }) + + if (host_origin) postToHost({ type: 'pierre:ready' }) +}) + +document.addEventListener('click', (event) => { + if (!pierre_is_open || pierre_is_animating) return + const target = event.target as HTMLElement + if (target.id === MODAL_ID && !target.closest(`#${MODAL_SHELL_ID}`)) { + void close_modal() + return + } + if (target.closest(`#${MODAL_CLOSE_ID}`)) void close_modal() +}) + +document.addEventListener('keydown', (event: KeyboardEvent) => { + if (pierre_is_open && !pierre_is_animating && event.key === 'Escape') void close_modal() +}) diff --git a/server/assets/host/pierre.ts b/server/assets/host/pierre.ts new file mode 100644 index 00000000..8ccf55ac --- /dev/null +++ b/server/assets/host/pierre.ts @@ -0,0 +1,461 @@ +type HostRect = { + top: number + left: number + width: number + height: number + bottom: number + right: number +} + +const EMBED_ID = 'pierre-embed' +const EMBED_Z_INDEX_OPEN = '2147483647' +const EMBED_Z_INDEX_CLOSED = '-1' + +const EMBED_OUTBOUND_TYPES = new Set([ + 'pierre:ready', + 'pierre:closing', + 'pierre:closed', + 'pierre:open-cancelled' +]) + +const EASING_OPEN = 'cubic-bezier(0.34, 1.28, 0.64, 1)' +const EASING_CLOSE = 'cubic-bezier(0.4, 0, 0.2, 1)' + +const TIMING = { + open: { + scrim: 300, + launcher: 160, + launcherDelay: 40 + }, + close: { + scrim: 220, + launcher: 180, + launcherDelay: 0 + } +} as const + +const BACKDROP_SCALE = 0.97 +const BACKDROP_BLUR_PX = 2 +const RECEDE_NODE_CAP = 12 + +const host_script = + (document.currentScript as HTMLScriptElement | null) ?? + document.querySelector('script[data-pierre-config]') ?? + document.querySelector('script[src$="/pierre.js"]') + +const settings = (): { url: string; configuration: string } => { + const script_src = host_script?.src ?? '' + const script_url = script_src ? new URL(script_src) : null + + return { + url: script_url?.origin ?? '', + configuration: host_script?.dataset.pierreConfig ?? 'default' + } +} + +const embed_iframe_style = (open: boolean) => + [ + 'position:fixed', + 'inset:0', + 'width:100%', + 'height:100%', + 'border:0', + `z-index:${open ? EMBED_Z_INDEX_OPEN : EMBED_Z_INDEX_CLOSED}`, + 'background:transparent', + `pointer-events:${open ? 'auto' : 'none'}`, + 'color-scheme:normal' + ].join(';') + +let scroll_lock_padding = '' +let scroll_lock_overflow = '' +let overscroll_lock = '' +type InertSnapshot = { + node: Element + hadInert: boolean + inertValue: boolean + hadAriaHidden: boolean + ariaHiddenValue: string | null +} +const inerted_nodes: InertSnapshot[] = [] +const recessed_nodes: HTMLElement[] = [] +const recessed_style_snapshots = new WeakMap< + HTMLElement, + { + transform: string + filter: string + transformOrigin: string + willChange: string + } +>() +let host_close_anim: Promise | null = null + +const prefers_reduced_motion = () => window.matchMedia('(prefers-reduced-motion: reduce)').matches +const is_mobile = () => window.matchMedia('(max-width: 600px)').matches +const waitAnimation = (animation: Animation) => animation.finished.catch(() => undefined) + +const getAllLaunchers = () => document.querySelectorAll('[data-pierre-open]') + +const readLauncherBaseTransform = (button: HTMLElement): string => { + const inline = button.style.transform + if (inline && inline !== 'none') return inline + + const computed = getComputedStyle(button).transform + return computed !== 'none' ? computed : '' +} + +const composeLauncherTransform = (base: string, scale: number): string => { + const suffix = `scale(${scale})` + if (!base || base === 'none') return suffix + return `${base} ${suffix}` +} + +const cacheLauncherBaseTransform = (button: HTMLElement) => { + if (!button.dataset.pierreBaseTransform) { + button.dataset.pierreBaseTransform = readLauncherBaseTransform(button) + } +} + +const resetLauncher = (button: HTMLElement) => { + button.style.opacity = '' + button.style.transform = button.dataset.pierreBaseTransform ?? '' + button.style.pointerEvents = '' + button.removeAttribute('aria-hidden') +} + +const hideInactiveLaunchers = (active: HTMLElement) => { + getAllLaunchers().forEach((launcher) => { + if (launcher === active) return + launcher.style.opacity = '0' + launcher.style.pointerEvents = 'none' + launcher.setAttribute('aria-hidden', 'true') + }) +} + +const restoreAllLaunchers = () => { + getAllLaunchers().forEach(resetLauncher) +} + +const animateLauncherTimeline = ( + button: HTMLElement, + direction: 'in' | 'out', + duration: number, + delay: number +): Animation => { + cacheLauncherBaseTransform(button) + const base = button.dataset.pierreBaseTransform ?? '' + const easing = direction === 'in' ? EASING_OPEN : EASING_CLOSE + + if (prefers_reduced_motion()) return button.animate([], { duration: 0 }) + + if (direction === 'in') { + return button.animate( + [ + { opacity: 1, transform: base || 'none' }, + { opacity: 0, transform: composeLauncherTransform(base, 0.92), offset: 0.7 }, + { opacity: 0, transform: composeLauncherTransform(base, 0.92) } + ], + { duration, delay, easing, fill: 'forwards' } + ) + } + + return button.animate( + [ + { opacity: 0, transform: composeLauncherTransform(base, 0.92) }, + { opacity: 1, transform: base || 'none' } + ], + { duration, delay, easing, fill: 'forwards' } + ) +} + +const isBackgroundExcluded = (element: Element, embed_iframe: HTMLIFrameElement) => { + if (element === embed_iframe) return true + return (element as HTMLElement).matches('[data-pierre-open]') +} + +const setRecedeBackground = (embed_iframe: HTMLIFrameElement) => { + recessed_nodes.length = 0 + for (const child of document.body.children) { + if (isBackgroundExcluded(child, embed_iframe)) continue + const element = child as HTMLElement + recessed_style_snapshots.set(element, { + transform: element.style.transform, + filter: element.style.filter, + transformOrigin: element.style.transformOrigin, + willChange: element.style.willChange + }) + recessed_nodes.push(element) + if (recessed_nodes.length >= RECEDE_NODE_CAP) break + } +} + +const animateRecede = async (direction: 'in' | 'out', duration: number, delay: number) => { + if (prefers_reduced_motion() || recessed_nodes.length === 0) return + + const easing = direction === 'in' ? EASING_OPEN : EASING_CLOSE + const to_scale = `scale(${BACKDROP_SCALE})` + const to_blur = `blur(${BACKDROP_BLUR_PX}px)` + const scale_only = is_mobile() + + await Promise.all( + recessed_nodes.map((element) => { + element.style.transformOrigin = 'center center' + element.style.willChange = scale_only ? 'transform' : 'transform, filter' + + const keyframes = + direction === 'in' + ? scale_only + ? [{ transform: 'scale(1)' }, { transform: to_scale }] + : [ + { transform: 'scale(1)', filter: 'blur(0px)' }, + { transform: to_scale, filter: to_blur } + ] + : scale_only + ? [{ transform: to_scale }, { transform: 'scale(1)' }] + : [ + { transform: to_scale, filter: to_blur }, + { transform: 'scale(1)', filter: 'blur(0px)' } + ] + + return waitAnimation( + element.animate(keyframes, { duration, delay, easing, fill: 'forwards' }) + ) + }) + ) +} + +const clearRecedeWillChange = () => { + for (const element of recessed_nodes) { + element.style.willChange = '' + } +} + +const clearRecedeBackground = () => { + for (const element of recessed_nodes) { + const snapshot = recessed_style_snapshots.get(element) + if (snapshot) { + element.style.transform = snapshot.transform + element.style.filter = snapshot.filter + element.style.transformOrigin = snapshot.transformOrigin + element.style.willChange = snapshot.willChange + recessed_style_snapshots.delete(element) + } else { + element.style.transform = '' + element.style.filter = '' + element.style.transformOrigin = '' + element.style.willChange = '' + } + } + recessed_nodes.length = 0 +} + +const runHostOpenAnimations = async (launcher: HTMLElement) => { + const timing = TIMING.open + await Promise.all([ + animateRecede('in', timing.scrim, 0), + waitAnimation(animateLauncherTimeline(launcher, 'in', timing.launcher, timing.launcherDelay)) + ]) + clearRecedeWillChange() +} + +const runHostCloseAnimations = async (launcher: HTMLElement) => { + const timing = TIMING.close + await Promise.all([ + animateRecede('out', timing.scrim, 0), + waitAnimation(animateLauncherTimeline(launcher, 'out', timing.launcher, timing.launcherDelay)) + ]) + clearRecedeWillChange() +} + +const hapticOpen = () => { + if (prefers_reduced_motion()) return + if ('vibrate' in navigator) navigator.vibrate(5) +} + +const setInertBackground = (embed_iframe: HTMLIFrameElement) => { + inerted_nodes.length = 0 + for (const child of document.body.children) { + if (child === embed_iframe) continue + const snapshot: InertSnapshot = { + node: child, + hadInert: 'inert' in child, + inertValue: 'inert' in child ? (child as HTMLElement).inert : false, + hadAriaHidden: child.hasAttribute('aria-hidden'), + ariaHiddenValue: child.getAttribute('aria-hidden') + } + inerted_nodes.push(snapshot) + + if (snapshot.hadInert) (child as HTMLElement).inert = true + else child.setAttribute('aria-hidden', 'true') + } +} + +const clearInertBackground = () => { + for (const snapshot of inerted_nodes) { + if (snapshot.hadInert) { + ;(snapshot.node as HTMLElement).inert = snapshot.inertValue + } else if (snapshot.hadAriaHidden) { + if (snapshot.ariaHiddenValue === null) snapshot.node.setAttribute('aria-hidden', '') + else snapshot.node.setAttribute('aria-hidden', snapshot.ariaHiddenValue) + } else { + snapshot.node.removeAttribute('aria-hidden') + } + } + inerted_nodes.length = 0 +} + +const lockBodyScroll = () => { + const scrollbar = window.innerWidth - document.documentElement.clientWidth + scroll_lock_padding = document.body.style.paddingRight + scroll_lock_overflow = document.body.style.overflow + overscroll_lock = document.documentElement.style.overscrollBehavior + document.body.style.overflow = 'hidden' + document.documentElement.style.overscrollBehavior = 'none' + if (scrollbar > 0) document.body.style.paddingRight = `${scrollbar}px` +} + +const unlockBodyScroll = () => { + document.body.style.overflow = scroll_lock_overflow + document.body.style.paddingRight = scroll_lock_padding + document.documentElement.style.overscrollBehavior = overscroll_lock +} + +const ensure_embed_iframe = (url: string, config: string): HTMLIFrameElement => { + const selector = host_script?.dataset.pierreEmbedTarget ?? `#${EMBED_ID}` + const existing = document.querySelector(selector) + if (existing) return existing + + const host = encodeURIComponent(window.location.origin) + const iframe = document.createElement('iframe') + iframe.id = EMBED_ID + iframe.title = 'PIERRE — assistant IA' + iframe.src = `${url.replace(/\/$/, '')}/embed?config=${encodeURIComponent(config)}&host=${host}` + iframe.setAttribute( + 'sandbox', + 'allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox allow-forms' + ) + iframe.style.cssText = embed_iframe_style(false) + document.body.appendChild(iframe) + return iframe +} + +const init = () => { + const { url, configuration } = settings() + if (!url) { + console.warn( + '[PIERRE] Impossible de déterminer l’URL du serveur (attribut src manquant sur le - -

- IA ↖ -

- -

- IA ↗ -

- -

- IA ← -

- -

- IA → -

- -

- IA ↙ -

- -

- iA? -

- -

- IA ● -

- -

- ia -

- - diff --git a/server/tests/e2e/host-demo.html b/server/tests/e2e/host-demo.html new file mode 100644 index 00000000..6bd6ce96 --- /dev/null +++ b/server/tests/e2e/host-demo.html @@ -0,0 +1,195 @@ + + + + + + PIERRE — démo modale hôte + + + + +

PIERRE

+

+ Une IA open source et plurilingue au service du mouvement HLM, de ses candidats, locataires et + collaborateurs. +

+

En 30 secondes, PIERRE c'est :

+
    +
  • + Un service-client plurilingue propulsé par IA pour répondre 24/7/365 à toutes les + questions-logements de « premier niveau » des demandeurs et locataires HLM. +
  • +
  • + Un assistant (ou aide de camp) propulsé par IA pour aider au quotidien les collaborateurs du + monde HLM et qui apprend de vos procédures et pratiques. +
  • +
  • + Du temps rendu aux équipes des bailleurs pour se concentrer sur des actions à forte valeur + ajoutée et de la qualité de service en plus pour les locataires. +
  • +
  • + Un chatbot open source, plurilingue et spécialement adapté au secteur HLM que l'on peut + déployer en 10 minutes sur n'importe quel VPS. +
  • +
  • + Un corpus de connaissances en open data pour entraîner une IA à répondre précisément aux + questions des demandeurs ou locataires HLM. +
  • +
+ +

+ Démo modale — cliquez sur un bouton IA (coins, milieu des bords, centre) pour vérifier + l'animation dock depuis n'importe quelle position. Lancer bun run dev:server puis + bun run embed (serve cette page sur http://localhost:3001). + Ne pas ouvrir ce fichier en file:// (CSP iframe). +

+

+ Lien de test (cliquable quand la modale est fermée). +

+ + + + + + + + + + + + + + + + + + diff --git a/server/views/embed.index.ts b/server/views/embed.index.ts new file mode 100644 index 00000000..f5e07801 --- /dev/null +++ b/server/views/embed.index.ts @@ -0,0 +1,14 @@ +import { html } from 'hono/html' + +export const view = (params: { config: string }) => + html` + + + + + + + + + + ` From 426993c9d3a5279fb62f5e39ef324ba59a852ee5 Mon Sep 17 00:00:00 2001 From: Charles-Henri Arnould Date: Tue, 30 Jun 2026 10:41:34 +0200 Subject: [PATCH 3/3] chore: rebuild frontend assets --- docs/assets/pierre.js | 1 + server/assets/dist/css/pierre-embed-frame.css | 1 + server/assets/dist/css/pierre-embed-modal.css | 1 + .../assets/dist/css/style.1782057273517.css | 2 - .../assets/dist/css/style.1782809598817.css | 2 + ...i.1782057273517.js => ai.1782809598817.js} | 130 +++++++++--------- server/assets/dist/js/pierre-embed.js | 1 + server/assets/dist/js/pierre.js | 1 + server/assets/dist/js/widget.js | 1 - server/views/admin.conversations.ts | 2 +- server/views/admin.index.ts | 2 +- server/views/admin.knowledge.ts | 2 +- server/views/admin.login.ts | 2 +- server/views/admin.statistics.ts | 2 +- server/views/admin.users.ts | 2 +- server/views/chat.index.ts | 4 +- 16 files changed, 80 insertions(+), 76 deletions(-) create mode 100644 docs/assets/pierre.js create mode 100644 server/assets/dist/css/pierre-embed-frame.css create mode 100644 server/assets/dist/css/pierre-embed-modal.css delete mode 100644 server/assets/dist/css/style.1782057273517.css create mode 100644 server/assets/dist/css/style.1782809598817.css rename server/assets/dist/js/{ai.1782057273517.js => ai.1782809598817.js} (94%) create mode 100644 server/assets/dist/js/pierre-embed.js create mode 100644 server/assets/dist/js/pierre.js delete mode 100644 server/assets/dist/js/widget.js diff --git a/docs/assets/pierre.js b/docs/assets/pierre.js new file mode 100644 index 00000000..930c9183 --- /dev/null +++ b/docs/assets/pierre.js @@ -0,0 +1 @@ +var $=new Set(["pierre:ready","pierre:closing","pierre:closed","pierre:open-cancelled"]);var I={open:{scrim:300,launcher:160,launcherDelay:40},close:{scrim:220,launcher:180,launcherDelay:0}};var h=document.currentScript??document.querySelector("script[data-pierre-config]")??document.querySelector('script[src$="/pierre.js"]'),U=()=>{let e=h?.src??"";return{url:(e?new URL(e):null)?.origin??"",configuration:h?.dataset.pierreConfig??"default"}},E=(e)=>["position:fixed","inset:0","width:100%","height:100%","border:0",`z-index:${e?"2147483647":"-1"}`,"background:transparent",`pointer-events:${e?"auto":"none"}`,"color-scheme:normal"].join(";"),A="",B="",C="",u=[],c=[],g=new WeakMap,m=null,y=()=>window.matchMedia("(prefers-reduced-motion: reduce)").matches,G=()=>window.matchMedia("(max-width: 600px)").matches,_=(e)=>e.finished.catch(()=>{return}),D=()=>document.querySelectorAll("[data-pierre-open]"),V=(e)=>{let t=e.style.transform;if(t&&t!=="none")return t;let n=getComputedStyle(e).transform;return n!=="none"?n:""},p=(e,t)=>{let n=`scale(${t})`;if(!e||e==="none")return n;return`${e} ${n}`},S=(e)=>{if(!e.dataset.pierreBaseTransform)e.dataset.pierreBaseTransform=V(e)},W=(e)=>{e.style.opacity="",e.style.transform=e.dataset.pierreBaseTransform??"",e.style.pointerEvents="",e.removeAttribute("aria-hidden")},F=(e)=>{D().forEach((t)=>{if(t===e)return;t.style.opacity="0",t.style.pointerEvents="none",t.setAttribute("aria-hidden","true")})},M=()=>{D().forEach(W)},R=(e,t,n,s)=>{S(e);let i=e.dataset.pierreBaseTransform??"",o=t==="in"?"cubic-bezier(0.34, 1.28, 0.64, 1)":"cubic-bezier(0.4, 0, 0.2, 1)";if(y())return e.animate([],{duration:0});if(t==="in")return e.animate([{opacity:1,transform:i||"none"},{opacity:0,transform:p(i,0.92),offset:0.7},{opacity:0,transform:p(i,0.92)}],{duration:n,delay:s,easing:o,fill:"forwards"});return e.animate([{opacity:0,transform:p(i,0.92)},{opacity:1,transform:i||"none"}],{duration:n,delay:s,easing:o,fill:"forwards"})},X=(e,t)=>{if(e===t)return!0;return e.matches("[data-pierre-open]")},q=(e)=>{c.length=0;for(let t of document.body.children){if(X(t,e))continue;let n=t;if(g.set(n,{transform:n.style.transform,filter:n.style.filter,transformOrigin:n.style.transformOrigin,willChange:n.style.willChange}),c.push(n),c.length>=12)break}},v=async(e,t,n)=>{if(y()||c.length===0)return;let s=e==="in"?"cubic-bezier(0.34, 1.28, 0.64, 1)":"cubic-bezier(0.4, 0, 0.2, 1)",i="scale(0.97)",o="blur(2px)",l=G();await Promise.all(c.map((d)=>{d.style.transformOrigin="center center",d.style.willChange=l?"transform":"transform, filter";let f=e==="in"?l?[{transform:"scale(1)"},{transform:i}]:[{transform:"scale(1)",filter:"blur(0px)"},{transform:i,filter:o}]:l?[{transform:i},{transform:"scale(1)"}]:[{transform:i,filter:o},{transform:"scale(1)",filter:"blur(0px)"}];return _(d.animate(f,{duration:t,delay:n,easing:s,fill:"forwards"}))}))},O=()=>{for(let e of c)e.style.willChange=""},T=()=>{for(let e of c){let t=g.get(e);if(t)e.style.transform=t.transform,e.style.filter=t.filter,e.style.transformOrigin=t.transformOrigin,e.style.willChange=t.willChange,g.delete(e);else e.style.transform="",e.style.filter="",e.style.transformOrigin="",e.style.willChange=""}c.length=0},K=async(e)=>{let t=I.open;await Promise.all([v("in",t.scrim,0),_(R(e,"in",t.launcher,t.launcherDelay))]),O()},Z=async(e)=>{let t=I.close;await Promise.all([v("out",t.scrim,0),_(R(e,"out",t.launcher,t.launcherDelay))]),O()},z=()=>{if(y())return;if("vibrate"in navigator)navigator.vibrate(5)},j=(e)=>{u.length=0;for(let t of document.body.children){if(t===e)continue;let n={node:t,hadInert:"inert"in t,inertValue:"inert"in t?t.inert:!1,hadAriaHidden:t.hasAttribute("aria-hidden"),ariaHiddenValue:t.getAttribute("aria-hidden")};if(u.push(n),n.hadInert)t.inert=!0;else t.setAttribute("aria-hidden","true")}},Y=()=>{for(let e of u)if(e.hadInert)e.node.inert=e.inertValue;else if(e.hadAriaHidden)if(e.ariaHiddenValue===null)e.node.setAttribute("aria-hidden","");else e.node.setAttribute("aria-hidden",e.ariaHiddenValue);else e.node.removeAttribute("aria-hidden");u.length=0},J=()=>{let e=window.innerWidth-document.documentElement.clientWidth;if(A=document.body.style.paddingRight,B=document.body.style.overflow,C=document.documentElement.style.overscrollBehavior,document.body.style.overflow="hidden",document.documentElement.style.overscrollBehavior="none",e>0)document.body.style.paddingRight=`${e}px`},Q=()=>{document.body.style.overflow=B,document.body.style.paddingRight=A,document.documentElement.style.overscrollBehavior=C},ee=(e,t)=>{let n=h?.dataset.pierreEmbedTarget??"#pierre-embed",s=document.querySelector(n);if(s)return s;let i=encodeURIComponent(window.location.origin),o=document.createElement("iframe");return o.id="pierre-embed",o.title="PIERRE — assistant IA",o.src=`${e.replace(/\/$/,"")}/embed?config=${encodeURIComponent(t)}&host=${i}`,o.setAttribute("sandbox","allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox allow-forms"),o.style.cssText=E(!1),document.body.appendChild(o),o},H=()=>{let{url:e,configuration:t}=U();if(!e){console.warn("[PIERRE] Impossible de déterminer l’URL du serveur (attribut src manquant sur le ",V=V.removeChild(V.firstChild);break;case"select":V=typeof K.is==="string"?V.createElement("select",{is:K.is}):V.createElement("select"),K.multiple?V.multiple=!0:K.size&&(V.size=K.size);break;default:V=typeof K.is==="string"?V.createElement(w,{is:K.is}):V.createElement(w),w.indexOf("-")===-1&&(w!==w.toLowerCase()&&console.error("<%s /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements.",w),Object.prototype.toString.call(V)!=="[object HTMLUnknownElement]"||O3.call(SP,w)||(SP[w]=!0,console.error("The tag <%s> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter.",w)))}}V[r5]=X,V[W2]=K;H:for(z=X.child;z!==null;){if(z.tag===5||z.tag===6)V.appendChild(z.stateNode);else if(z.tag!==4&&z.tag!==27&&z.child!==null){z.child.return=z,z=z.child;continue}if(z===X)break H;for(;z.sibling===null;){if(z.return===null||z.return===X)break H;z=z.return}z.sibling.return=z.return,z=z.sibling}X.stateNode=V;H:switch(p5(V,w,K),w){case"button":case"input":case"select":case"textarea":K=!!K.autoFocus;break H;case"img":K=!0;break H;default:K=!1}K&&g6(X)}}return p0(X),kK(X,X.type,Z===null?null:Z.memoizedProps,X.pendingProps,J),null;case 6:if(Z&&X.stateNode!=null)Z.memoizedProps!==K&&g6(X);else{if(typeof K!=="string"&&X.stateNode===null)throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");if(Z=g1(O9.current),J=O1(),b7(X)){if(Z=X.stateNode,J=X.memoizedProps,w=!Q6,K=null,V=i5,V!==null)switch(V.tag){case 3:w&&(w=aR(Z,J,K),w!==null&&(U4(X,0).serverProps=w));break;case 27:case 5:K=V.memoizedProps,w&&(w=aR(Z,J,K),w!==null&&(U4(X,0).serverProps=w))}Z[r5]=X,Z=Z.nodeValue===J||K!==null&&K.suppressHydrationWarning===!0||yR(Z.nodeValue,J)?!0:!1,Z||Y9(X,!0)}else w=J.ancestorInfo.current,w!=null&&xX(K,w.tag,J.ancestorInfo.implicitRootScope),Z=$q(Z).createTextNode(K),Z[r5]=X,X.stateNode=Z}return p0(X),null;case 31:if(J=X.memoizedState,Z===null||Z.memoizedState!==null){if(K=b7(X),J!==null){if(Z===null){if(!K)throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.");if(Z=X.memoizedState,Z=Z!==null?Z.dehydrated:null,!Z)throw Error("Expected to have a hydrated activity instance. This error is likely caused by a bug in React. Please file an issue.");Z[r5]=X,p0(X),(X.mode&L0)!==n1&&J!==null&&(Z=X.child,Z!==null&&(X.treeBaseDuration-=Z.treeBaseDuration))}else fY(),B4(),(X.flags&128)===0&&(J=X.memoizedState=null),X.flags|=4,p0(X),(X.mode&L0)!==n1&&J!==null&&(Z=X.child,Z!==null&&(X.treeBaseDuration-=Z.treeBaseDuration));Z=!1}else J=kY(),Z!==null&&Z.memoizedState!==null&&(Z.memoizedState.hydrationErrors=J),Z=!0;if(!Z){if(X.flags&256)return A2(X),X;return A2(X),null}if((X.flags&128)!==0)throw Error("Client rendering an Activity suspended it again. This is a bug in React.")}return p0(X),null;case 13:if(K=X.memoizedState,Z===null||Z.memoizedState!==null&&Z.memoizedState.dehydrated!==null){if(w=K,V=b7(X),w!==null&&w.dehydrated!==null){if(Z===null){if(!V)throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.");if(V=X.memoizedState,V=V!==null?V.dehydrated:null,!V)throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");V[r5]=X,p0(X),(X.mode&L0)!==n1&&w!==null&&(w=X.child,w!==null&&(X.treeBaseDuration-=w.treeBaseDuration))}else fY(),B4(),(X.flags&128)===0&&(w=X.memoizedState=null),X.flags|=4,p0(X),(X.mode&L0)!==n1&&w!==null&&(w=X.child,w!==null&&(X.treeBaseDuration-=w.treeBaseDuration));w=!1}else w=kY(),Z!==null&&Z.memoizedState!==null&&(Z.memoizedState.hydrationErrors=w),w=!0;if(!w){if(X.flags&256)return A2(X),X;return A2(X),null}}if(A2(X),(X.flags&128)!==0)return X.lanes=J,(X.mode&L0)!==n1&&UH(X),X;return J=K!==null,Z=Z!==null&&Z.memoizedState!==null,J&&(K=X.child,w=null,K.alternate!==null&&K.alternate.memoizedState!==null&&K.alternate.memoizedState.cachePool!==null&&(w=K.alternate.memoizedState.cachePool.pool),V=null,K.memoizedState!==null&&K.memoizedState.cachePool!==null&&(V=K.memoizedState.cachePool.pool),V!==w&&(K.flags|=2048)),J!==Z&&J&&(X.child.flags|=8192),zq(X,X.updateQueue),p0(X),(X.mode&L0)!==n1&&J&&(Z=X.child,Z!==null&&(X.treeBaseDuration-=Z.treeBaseDuration)),null;case 4:return W1(X),Z===null&&qW(X.stateNode.containerInfo),p0(X),null;case 10:return $6(X.type,X),p0(X),null;case 19:if(G1(F5,X),K=X.memoizedState,K===null)return p0(X),null;if(w=(X.flags&128)!==0,V=K.rendering,V===null)if(w)CH(K,!1);else{if(Z5!==l6||Z!==null&&(Z.flags&128)!==0)for(Z=X.child;Z!==null;){if(V=tX(Z),V!==null){X.flags|=128,CH(K,!1),Z=V.updateQueue,X.updateQueue=Z,zq(X,Z),X.subtreeFlags=0,Z=J;for(J=X.child;J!==null;)wB(J,Z),J=J.sibling;return w1(F5,F5.current&K8|VZ,X),P0&&b6(X,K.treeForkCount),X.child}Z=Z.sibling}K.tail!==null&&v5()>PJ&&(X.flags|=128,w=!0,CH(K,!1),X.lanes=4194304)}else{if(!w)if(Z=tX(V),Z!==null){if(X.flags|=128,w=!0,Z=Z.updateQueue,X.updateQueue=Z,zq(X,Z),CH(K,!0),K.tail===null&&K.tailMode==="hidden"&&!V.alternate&&!P0)return p0(X),null}else 2*v5()-K.renderingStartTime>PJ&&J!==536870912&&(X.flags|=128,w=!0,CH(K,!1),X.lanes=4194304);K.isBackwards?(V.sibling=X.child,X.child=V):(Z=K.last,Z!==null?Z.sibling=V:X.child=V,K.last=V)}if(K.tail!==null)return Z=K.tail,K.rendering=Z,K.tail=Z.sibling,K.renderingStartTime=v5(),Z.sibling=null,J=F5.current,J=w?J&K8|VZ:J&K8,w1(F5,J,X),P0&&b6(X,K.treeForkCount),Z;return p0(X),null;case 22:case 23:return A2(X),tY(X),K=X.memoizedState!==null,Z!==null?Z.memoizedState!==null!==K&&(X.flags|=8192):K&&(X.flags|=8192),K?(J&536870912)!==0&&(X.flags&128)===0&&(p0(X),X.subtreeFlags&6&&(X.flags|=8192)):p0(X),J=X.updateQueue,J!==null&&zq(X,J.retryQueue),J=null,Z!==null&&Z.memoizedState!==null&&Z.memoizedState.cachePool!==null&&(J=Z.memoizedState.cachePool.pool),K=null,X.memoizedState!==null&&X.memoizedState.cachePool!==null&&(K=X.memoizedState.cachePool.pool),K!==J&&(X.flags|=2048),Z!==null&&G1(h4,X),null;case 24:return J=null,Z!==null&&(J=Z.memoizedState.cache),X.memoizedState.cache!==J&&(X.flags|=2048),$6(j5,X),p0(X),null;case 25:return null;case 30:return null}throw Error("Unknown unit of work tag ("+X.tag+"). This error is likely caused by a bug in React. Please file an issue.")}function Rh(Z,X){switch(uY(X),X.tag){case 1:return Z=X.flags,Z&65536?(X.flags=Z&-65537|128,(X.mode&L0)!==n1&&UH(X),X):null;case 3:return $6(j5,X),W1(X),Z=X.flags,(Z&65536)!==0&&(Z&128)===0?(X.flags=Z&-65537|128,X):null;case 26:case 27:case 5:return c1(X),null;case 31:if(X.memoizedState!==null){if(A2(X),X.alternate===null)throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue.");B4()}return Z=X.flags,Z&65536?(X.flags=Z&-65537|128,(X.mode&L0)!==n1&&UH(X),X):null;case 13:if(A2(X),Z=X.memoizedState,Z!==null&&Z.dehydrated!==null){if(X.alternate===null)throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue.");B4()}return Z=X.flags,Z&65536?(X.flags=Z&-65537|128,(X.mode&L0)!==n1&&UH(X),X):null;case 19:return G1(F5,X),null;case 4:return W1(X),null;case 10:return $6(X.type,X),null;case 22:case 23:return A2(X),tY(X),Z!==null&&G1(h4,X),Z=X.flags,Z&65536?(X.flags=Z&-65537|128,(X.mode&L0)!==n1&&UH(X),X):null;case 24:return $6(j5,X),null;case 25:return null;default:return null}}function Ez(Z,X){switch(uY(X),X.tag){case 3:$6(j5,X),W1(X);break;case 26:case 27:case 5:c1(X);break;case 4:W1(X);break;case 31:X.memoizedState!==null&&A2(X);break;case 13:A2(X);break;case 19:G1(F5,X);break;case 10:$6(X.type,X);break;case 22:case 23:A2(X),tY(X),Z!==null&&G1(h4,X);break;case 24:$6(j5,X)}}function d3(Z){return(Z.mode&L0)!==n1}function xz(Z,X){d3(Z)?(i3(),bH(X,Z),r3()):bH(X,Z)}function fK(Z,X,J){d3(Z)?(i3(),x7(J,Z,X),r3()):x7(J,Z,X)}function bH(Z,X){try{var J=X.updateQueue,K=J!==null?J.lastEffect:null;if(K!==null){var w=K.next;J=w;do{if((J.tag&Z)===Z&&(K=void 0,(Z&F2)!==WJ&&(R8=!0),K=$1(X,uy,J),(Z&F2)!==WJ&&(R8=!1),K!==void 0&&typeof K!=="function")){var V=void 0;V=(J.tag&i2)!==0?"useLayoutEffect":(J.tag&F2)!==0?"useInsertionEffect":"useEffect";var z=void 0;z=K===null?" You returned null. If your effect does not require clean up, return undefined (or nothing).":typeof K.then==="function"?` + `+D:""))}}V=X.stateNode,z=n(J)||"Component",V.render||(J.prototype&&typeof J.prototype.render==="function"?console.error("No `render` method found on the %s instance: did you accidentally return an object from the constructor?",z):console.error("No `render` method found on the %s instance: you may have forgotten to define `render`.",z)),!V.getInitialState||V.getInitialState.isReactClassApproved||V.state||console.error("getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?",z),V.getDefaultProps&&!V.getDefaultProps.isReactClassApproved&&console.error("getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.",z),V.contextType&&console.error("contextType was defined as an instance property on %s. Use a static property to define contextType instead.",z),J.childContextTypes&&!qP.has(J)&&(qP.add(J),console.error("%s uses the legacy childContextTypes API which was removed in React 19. Use React.createContext() instead. (https://react.dev/link/legacy-context)",z)),J.contextTypes&&!XP.has(J)&&(XP.add(J),console.error("%s uses the legacy contextTypes API which was removed in React 19. Use React.createContext() with static contextType instead. (https://react.dev/link/legacy-context)",z)),typeof V.componentShouldUpdate==="function"&&console.error("%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.",z),J.prototype&&J.prototype.isPureReactComponent&&typeof V.shouldComponentUpdate<"u"&&console.error("%s has a method called shouldComponentUpdate(). shouldComponentUpdate should not be used when extending React.PureComponent. Please extend React.Component if shouldComponentUpdate is used.",n(J)||"A pure component"),typeof V.componentDidUnmount==="function"&&console.error("%s has a method called componentDidUnmount(). But there is no such lifecycle method. Did you mean componentWillUnmount()?",z),typeof V.componentDidReceiveProps==="function"&&console.error("%s has a method called componentDidReceiveProps(). But there is no such lifecycle method. If you meant to update the state in response to changing props, use componentWillReceiveProps(). If you meant to fetch data or run side-effects or mutations after React has updated the UI, use componentDidUpdate().",z),typeof V.componentWillRecieveProps==="function"&&console.error("%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?",z),typeof V.UNSAFE_componentWillRecieveProps==="function"&&console.error("%s has a method called UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?",z),N=V.props!==K,V.props!==void 0&&N&&console.error("When calling super() in `%s`, make sure to pass up the same props that your component's constructor was passed.",z),V.defaultProps&&console.error("Setting defaultProps as an instance property on %s is not supported and will be ignored. Instead, define defaultProps as a static property on %s.",z,z),typeof V.getSnapshotBeforeUpdate!=="function"||typeof V.componentDidUpdate==="function"||tO.has(J)||(tO.add(J),console.error("%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). This component defines getSnapshotBeforeUpdate() only.",n(J))),typeof V.getDerivedStateFromProps==="function"&&console.error("%s: getDerivedStateFromProps() is defined as an instance method and will be ignored. Instead, declare it as a static method.",z),typeof V.getDerivedStateFromError==="function"&&console.error("%s: getDerivedStateFromError() is defined as an instance method and will be ignored. Instead, declare it as a static method.",z),typeof J.getSnapshotBeforeUpdate==="function"&&console.error("%s: getSnapshotBeforeUpdate() is defined as a static method and will be ignored. Instead, declare it as an instance method.",z),(N=V.state)&&(typeof N!=="object"||D5(N))&&console.error("%s.state: must be set to an object or null",z),typeof V.getChildContext==="function"&&typeof J.childContextTypes!=="object"&&console.error("%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().",z),V=X.stateNode,V.props=K,V.state=X.memoizedState,V.refs={},sY(X),z=J.contextType,V.context=typeof z==="object"&&z!==null?o0(z):$9,V.state===K&&(z=n(J)||"Component",HP.has(z)||(HP.add(z),console.error("%s: It is not recommended to assign props directly to state because updates to props won't be reflected in state. In most cases, it is better to use props directly.",z))),X.mode&n5&&M3.recordLegacyContextWarning(X,V),M3.recordUnsafeLifecycleWarnings(X,V),V.state=X.memoizedState,z=J.getDerivedStateFromProps,typeof z==="function"&&(gK(X,J,z,K),V.state=X.memoizedState),typeof J.getDerivedStateFromProps==="function"||typeof V.getSnapshotBeforeUpdate==="function"||typeof V.UNSAFE_componentWillMount!=="function"&&typeof V.componentWillMount!=="function"||(z=V.state,typeof V.componentWillMount==="function"&&V.componentWillMount(),typeof V.UNSAFE_componentWillMount==="function"&&V.UNSAFE_componentWillMount(),z!==V.state&&(console.error("%s.componentWillMount(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.",k(X)||"Component"),Mw.enqueueReplaceState(V,V.state,null)),jH(X,K,V,w),RH(),V.state=X.memoizedState),typeof V.componentDidMount==="function"&&(X.flags|=4194308),(X.mode&N3)!==n1&&(X.flags|=134217728),V=!0}else if(Z===null){V=X.stateNode;var i=X.memoizedProps;N=N4(J,i),V.props=N;var d=V.context;D=J.contextType,z=$9,typeof D==="object"&&D!==null&&(z=o0(D)),g=J.getDerivedStateFromProps,D=typeof g==="function"||typeof V.getSnapshotBeforeUpdate==="function",i=X.pendingProps!==i,D||typeof V.UNSAFE_componentWillReceiveProps!=="function"&&typeof V.componentWillReceiveProps!=="function"||(i||d!==z)&&Lz(X,V,K,z),_9=!1;var T=X.memoizedState;V.state=T,jH(X,K,V,w),RH(),d=X.memoizedState,i||T!==d||_9?(typeof g==="function"&&(gK(X,J,g,K),d=X.memoizedState),(N=_9||wz(X,J,N,K,T,d,z))?(D||typeof V.UNSAFE_componentWillMount!=="function"&&typeof V.componentWillMount!=="function"||(typeof V.componentWillMount==="function"&&V.componentWillMount(),typeof V.UNSAFE_componentWillMount==="function"&&V.UNSAFE_componentWillMount()),typeof V.componentDidMount==="function"&&(X.flags|=4194308),(X.mode&N3)!==n1&&(X.flags|=134217728)):(typeof V.componentDidMount==="function"&&(X.flags|=4194308),(X.mode&N3)!==n1&&(X.flags|=134217728),X.memoizedProps=K,X.memoizedState=d),V.props=K,V.state=d,V.context=z,V=N):(typeof V.componentDidMount==="function"&&(X.flags|=4194308),(X.mode&N3)!==n1&&(X.flags|=134217728),V=!1)}else{V=X.stateNode,nY(Z,X),z=X.memoizedProps,D=N4(J,z),V.props=D,g=X.pendingProps,T=V.context,d=J.contextType,N=$9,typeof d==="object"&&d!==null&&(N=o0(d)),i=J.getDerivedStateFromProps,(d=typeof i==="function"||typeof V.getSnapshotBeforeUpdate==="function")||typeof V.UNSAFE_componentWillReceiveProps!=="function"&&typeof V.componentWillReceiveProps!=="function"||(z!==g||T!==N)&&Lz(X,V,K,N),_9=!1,T=X.memoizedState,V.state=T,jH(X,K,V,w),RH();var e=X.memoizedState;z!==g||T!==e||_9||Z!==null&&Z.dependencies!==null&&fX(Z.dependencies)?(typeof i==="function"&&(gK(X,J,i,K),e=X.memoizedState),(D=_9||wz(X,J,D,K,T,e,N)||Z!==null&&Z.dependencies!==null&&fX(Z.dependencies))?(d||typeof V.UNSAFE_componentWillUpdate!=="function"&&typeof V.componentWillUpdate!=="function"||(typeof V.componentWillUpdate==="function"&&V.componentWillUpdate(K,e,N),typeof V.UNSAFE_componentWillUpdate==="function"&&V.UNSAFE_componentWillUpdate(K,e,N)),typeof V.componentDidUpdate==="function"&&(X.flags|=4),typeof V.getSnapshotBeforeUpdate==="function"&&(X.flags|=1024)):(typeof V.componentDidUpdate!=="function"||z===Z.memoizedProps&&T===Z.memoizedState||(X.flags|=4),typeof V.getSnapshotBeforeUpdate!=="function"||z===Z.memoizedProps&&T===Z.memoizedState||(X.flags|=1024),X.memoizedProps=K,X.memoizedState=e),V.props=K,V.state=e,V.context=N,V=D):(typeof V.componentDidUpdate!=="function"||z===Z.memoizedProps&&T===Z.memoizedState||(X.flags|=4),typeof V.getSnapshotBeforeUpdate!=="function"||z===Z.memoizedProps&&T===Z.memoizedState||(X.flags|=1024),V=!1)}if(N=V,Uq(Z,X),z=(X.flags&128)!==0,N||z){if(N=X.stateNode,V5(X),z&&typeof J.getDerivedStateFromError!=="function")J=null,V2=-1;else if(J=DO(N),X.mode&n5){w0(!0);try{DO(N)}finally{w0(!1)}}X.flags|=1,Z!==null&&z?(X.child=I4(X,Z.child,null,w),X.child=I4(X,null,J,w)):l5(Z,X,J,w),X.memoizedState=N.state,Z=X.child}else Z=G6(Z,X,w);return w=X.stateNode,V&&w.props!==K&&(F8||console.error("It looks like %s is reassigning its own `this.props` while rendering. This is not supported and can lead to confusing bugs.",k(X)||"a component"),F8=!0),Z}function bz(Z,X,J,K){return B4(),X.flags|=256,l5(Z,X,J,K),X.child}function yK(Z,X){X&&X.childContextTypes&&console.error(`childContextTypes cannot be defined on a function component. + %s.childContextTypes = ...`,X.displayName||X.name||"Component"),typeof X.getDerivedStateFromProps==="function"&&(Z=n(X)||"Unknown",wP[Z]||(console.error("%s: Function components do not support getDerivedStateFromProps.",Z),wP[Z]=!0)),typeof X.contextType==="object"&&X.contextType!==null&&(X=n(X)||"Unknown",KP[X]||(console.error("%s: Function components do not support contextType.",X),KP[X]=!0))}function IK(Z){return{baseLanes:Z,cachePool:MB()}}function vK(Z,X,J){return Z=Z!==null?Z.childLanes&~J:0,X&&(Z|=E2),Z}function $z(Z,X,J){var K,w=X.pendingProps;F(X)&&(X.flags|=128);var V=!1,z=(X.flags&128)!==0;if((K=z)||(K=Z!==null&&Z.memoizedState===null?!1:(F5.current&VZ)!==0),K&&(V=!0,X.flags&=-129),K=(X.flags&32)!==0,X.flags&=-33,Z===null){if(P0){if(V?V9(X):F9(X),(Z=d0)?(J=iR(Z,q3),J=J!==null&&J.data!==f4?J:null,J!==null&&(K={dehydrated:J,treeContext:FB(),retryLane:536870912,hydrationErrors:null},X.memoizedState=K,K=LB(J),K.return=X,X.child=K,i5=X,d0=null)):J=null,J===null)throw uX(X,Z),Y9(X);return UW(J)?X.lanes=32:X.lanes=536870912,null}var N=w.children;if(w=w.fallback,V){F9(X);var D=X.mode;return N=Bq({mode:"hidden",children:N},D),w=F4(w,D,J,null),N.return=X,w.return=X,N.sibling=w,X.child=N,w=X.child,w.memoizedState=IK(J),w.childLanes=vK(Z,K,J),X.memoizedState=$w,MH(null,w)}return V9(X),SK(X,N)}var g=Z.memoizedState;if(g!==null){var i=g.dehydrated;if(i!==null){if(z)X.flags&256?(V9(X),X.flags&=-257,X=TK(Z,X,J)):X.memoizedState!==null?(F9(X),X.child=Z.child,X.flags|=128,X=null):(F9(X),N=w.fallback,D=X.mode,w=Bq({mode:"visible",children:w.children},D),N=F4(N,D,J,null),N.flags|=2,w.return=X,N.return=X,w.sibling=N,X.child=w,I4(X,Z.child,null,J),w=X.child,w.memoizedState=IK(J),w.childLanes=vK(Z,K,J),X.memoizedState=$w,X=MH(null,w));else if(V9(X),BB(),(J&536870912)!==0&&Pq(X),UW(i)){if(K=i.nextSibling&&i.nextSibling.dataset,K){N=K.dgst;var d=K.msg;D=K.stck;var T=K.cstck}V=d,K=N,w=D,i=T,N=V,D=i,N=N?Error(N):Error("The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering."),N.stack=w||"",N.digest=K,K=D===void 0?null:D,w={value:N,source:null,stack:K},typeof K==="string"&&qw.set(N,w),LH(w),X=TK(Z,X,J)}else if(N5||D7(Z,X,J,!1),K=(J&Z.childLanes)!==0,N5||K){if(K=f0,K!==null&&(w=Q2(K,J),w!==0&&w!==g.retryLane))throw g.retryLane=w,c5(Z,w),q5(K,Z,w),bw;FW(i)||Nq(),X=TK(Z,X,J)}else FW(i)?(X.flags|=192,X.child=Z.child,X=null):(Z=g.treeContext,d0=u2(i.nextSibling),i5=X,P0=!0,D9=null,Q6=!1,p2=null,q3=!1,Z!==null&&UB(X,Z),X=SK(X,w.children),X.flags|=4096);return X}}if(V)return F9(X),N=w.fallback,D=X.mode,T=Z.child,i=T.sibling,w=C6(T,{mode:"hidden",children:w.children}),w.subtreeFlags=T.subtreeFlags&65011712,i!==null?N=C6(i,N):(N=F4(N,D,J,null),N.flags|=2),N.return=X,w.return=X,w.sibling=N,X.child=w,MH(null,w),w=X.child,N=Z.child.memoizedState,N===null?N=IK(J):(D=N.cachePool,D!==null?(T=j5._currentValue,D=D.parent!==T?{parent:T,pool:T}:D):D=MB(),N={baseLanes:N.baseLanes|J,cachePool:D}),w.memoizedState=N,w.childLanes=vK(Z,K,J),X.memoizedState=$w,MH(Z.child,w);return g!==null&&(J&62914560)===J&&(J&Z.lanes)!==0&&Pq(X),V9(X),J=Z.child,Z=J.sibling,J=C6(J,{mode:"visible",children:w.children}),J.return=X,J.sibling=null,Z!==null&&(K=X.deletions,K===null?(X.deletions=[Z],X.flags|=16):K.push(Z)),X.child=J,X.memoizedState=null,J}function SK(Z,X){return X=Bq({mode:"visible",children:X},Z.mode),X.return=Z,Z.child=X}function Bq(Z,X){return Z=C(22,Z,null,X),Z.lanes=0,Z}function TK(Z,X,J){return I4(X,Z.child,null,J),Z=SK(X,X.pendingProps.children),Z.flags|=2,X.memoizedState=null,Z}function Dz(Z,X,J){Z.lanes|=X;var K=Z.alternate;K!==null&&(K.lanes|=X),lY(Z.return,X,J)}function AK(Z,X,J,K,w,V){var z=Z.memoizedState;z===null?Z.memoizedState={isBackwards:X,rendering:null,renderingStartTime:0,last:K,tail:J,tailMode:w,treeForkCount:V}:(z.isBackwards=X,z.rendering=null,z.renderingStartTime=0,z.last=K,z.tail=J,z.tailMode=w,z.treeForkCount=V)}function Gz(Z,X,J){var K=X.pendingProps,w=K.revealOrder,V=K.tail,z=K.children,N=F5.current;if((K=(N&VZ)!==0)?(N=N&W8|VZ,X.flags|=128):N&=W8,w1(F5,N,X),N=w==null?"null":w,w!=="forwards"&&w!=="unstable_legacy-backwards"&&w!=="together"&&w!=="independent"&&!LP[N])if(LP[N]=!0,w==null)console.error('The default for the prop is changing. To be future compatible you must explictly specify either "independent" (the current default), "together", "forwards" or "legacy_unstable-backwards".');else if(w==="backwards")console.error('The rendering order of is changing. To be future compatible you must specify revealOrder="legacy_unstable-backwards" instead.');else if(typeof w==="string")switch(w.toLowerCase()){case"together":case"forwards":case"backwards":case"independent":console.error('"%s" is not a valid value for revealOrder on . Use lowercase "%s" instead.',w,w.toLowerCase());break;case"forward":case"backward":console.error('"%s" is not a valid value for revealOrder on . React uses the -s suffix in the spelling. Use "%ss" instead.',w,w.toLowerCase());break;default:console.error('"%s" is not a supported revealOrder on . Did you mean "independent", "together", "forwards" or "backwards"?',w)}else console.error('%s is not a supported value for revealOrder on . Did you mean "independent", "together", "forwards" or "backwards"?',w);if(N=V==null?"null":V,!FJ[N])if(V==null){if(w==="forwards"||w==="backwards"||w==="unstable_legacy-backwards")FJ[N]=!0,console.error('The default for the prop is changing. To be future compatible you must explictly specify either "visible" (the current default), "collapsed" or "hidden".')}else V!=="visible"&&V!=="collapsed"&&V!=="hidden"?(FJ[N]=!0,console.error('"%s" is not a supported value for tail on . Did you mean "visible", "collapsed" or "hidden"?',V)):w!=="forwards"&&w!=="backwards"&&w!=="unstable_legacy-backwards"&&(FJ[N]=!0,console.error(' is only valid if revealOrder is "forwards" or "backwards". Did you mean to specify revealOrder="forwards"?',V));H:if((w==="forwards"||w==="backwards"||w==="unstable_legacy-backwards")&&z!==void 0&&z!==null&&z!==!1)if(D5(z)){for(N=0;N. This is not useful since it needs multiple rows. Did you mean to pass multiple children or an array?',w);if(l5(Z,X,z,J),P0?(Q9(),z=nH):z=0,!K&&Z!==null&&(Z.flags&128)!==0)H:for(Z=X.child;Z!==null;){if(Z.tag===13)Z.memoizedState!==null&&Dz(Z,J,X);else if(Z.tag===19)Dz(Z,J,X);else if(Z.child!==null){Z.child.return=Z,Z=Z.child;continue}if(Z===X)break H;for(;Z.sibling===null;){if(Z.return===null||Z.return===X)break H;Z=Z.return}Z.sibling.return=Z.return,Z=Z.sibling}switch(w){case"forwards":J=X.child;for(w=null;J!==null;)Z=J.alternate,Z!==null&&tX(Z)===null&&(w=J),J=J.sibling;J=w,J===null?(w=X.child,X.child=null):(w=J.sibling,J.sibling=null),AK(X,!1,w,J,V,z);break;case"backwards":case"unstable_legacy-backwards":J=null,w=X.child;for(X.child=null;w!==null;){if(Z=w.alternate,Z!==null&&tX(Z)===null){X.child=w;break}Z=w.sibling,w.sibling=J,J=w,w=Z}AK(X,!0,J,null,V,z);break;case"together":AK(X,!1,null,null,void 0,z);break;default:X.memoizedState=null}return X.child}function G6(Z,X,J){if(Z!==null&&(X.dependencies=Z.dependencies),V2=-1,v9|=X.lanes,(J&X.childLanes)===0)if(Z!==null){if(D7(Z,X,J,!1),(J&X.childLanes)===0)return null}else return null;if(Z!==null&&X.child!==Z.child)throw Error("Resuming work not yet implemented.");if(X.child!==null){Z=X.child,J=C6(Z,Z.pendingProps),X.child=J;for(J.return=X;Z.sibling!==null;)Z=Z.sibling,J=J.sibling=C6(Z,Z.pendingProps),J.return=X;J.sibling=null}return X.child}function mK(Z,X){if((Z.lanes&X)!==0)return!0;return Z=Z.dependencies,Z!==null&&fX(Z)?!0:!1}function Bh(Z,X,J){switch(X.tag){case 3:J1(X,X.stateNode.containerInfo),K9(X,j5,Z.memoizedState.cache),B4();break;case 27:case 5:f1(X);break;case 4:J1(X,X.stateNode.containerInfo);break;case 10:K9(X,X.type,X.memoizedProps.value);break;case 12:(J&X.childLanes)!==0&&(X.flags|=4),X.flags|=2048;var K=X.stateNode;K.effectDuration=-0,K.passiveEffectDuration=-0;break;case 31:if(X.memoizedState!==null)return X.flags|=128,eY(X),null;break;case 13:if(K=X.memoizedState,K!==null){if(K.dehydrated!==null)return V9(X),X.flags|=128,null;if((J&X.child.childLanes)!==0)return $z(Z,X,J);return V9(X),Z=G6(Z,X,J),Z!==null?Z.sibling:null}V9(X);break;case 19:var w=(Z.flags&128)!==0;if(K=(J&X.childLanes)!==0,K||(D7(Z,X,J,!1),K=(J&X.childLanes)!==0),w){if(K)return Gz(Z,X,J);X.flags|=128}if(w=X.memoizedState,w!==null&&(w.rendering=null,w.tail=null,w.lastEffect=null),w1(F5,F5.current,X),K)break;else return null;case 22:return X.lanes=0,Oz(Z,X,J,X.pendingProps);case 24:K9(X,j5,Z.memoizedState.cache)}return G6(Z,X,J)}function uK(Z,X,J){if(X._debugNeedsRemount&&Z!==null){J=SY(X.type,X.key,X.pendingProps,X._debugOwner||null,X.mode,X.lanes),J._debugStack=X._debugStack,J._debugTask=X._debugTask;var K=X.return;if(K===null)throw Error("Cannot swap the root fiber.");if(Z.alternate=null,X.alternate=null,J.index=X.index,J.sibling=X.sibling,J.return=X.return,J.ref=X.ref,J._debugInfo=X._debugInfo,X===K.child)K.child=J;else{var w=K.child;if(w===null)throw Error("Expected parent to have a child.");for(;w.sibling!==X;)if(w=w.sibling,w===null)throw Error("Expected to find the previous sibling.");w.sibling=J}return X=K.deletions,X===null?(K.deletions=[Z],K.flags|=16):X.push(Z),J.flags|=2,J}if(Z!==null)if(Z.memoizedProps!==X.pendingProps||X.type!==Z.type)N5=!0;else{if(!mK(Z,J)&&(X.flags&128)===0)return N5=!1,Bh(Z,X,J);N5=(Z.flags&131072)!==0?!0:!1}else{if(N5=!1,K=P0)Q9(),K=(X.flags&1048576)!==0;K&&(K=X.index,Q9(),VB(X,nH,K))}switch(X.lanes=0,X.tag){case 16:H:if(K=X.pendingProps,Z=W9(X.elementType),X.type=Z,typeof Z==="function")vY(Z)?(K=N4(Z,K),X.tag=1,X.type=Z=V4(Z),X=Cz(null,X,Z,K,J)):(X.tag=0,yK(X,Z),X.type=Z=V4(Z),X=_K(null,X,Z,K,J));else{if(Z!==void 0&&Z!==null){if(w=Z.$$typeof,w===AH){X.tag=11,X.type=Z=IY(Z),X=zz(null,X,Z,K,J);break H}else if(w===vq){X.tag=14,X=Rz(null,X,Z,K,J);break H}}throw X="",Z!==null&&typeof Z==="object"&&Z.$$typeof===k2&&(X=" Did you wrap a component in React.lazy() more than once?"),J=n(Z)||Z,Error("Element type is invalid. Received a promise that resolves to: "+J+". Lazy element type must resolve to a class or function."+X)}return X;case 0:return _K(Z,X,X.type,X.pendingProps,J);case 1:return K=X.type,w=N4(K,X.pendingProps),Cz(Z,X,K,w,J);case 3:H:{if(J1(X,X.stateNode.containerInfo),Z===null)throw Error("Should have a current fiber. This is a bug in React.");K=X.pendingProps;var V=X.memoizedState;w=V.element,nY(Z,X),jH(X,K,null,J);var z=X.memoizedState;if(K=z.cache,K9(X,j5,K),K!==V.cache&&pY(X,[j5],J,!0),RH(),K=z.element,V.isDehydrated)if(V={element:K,isDehydrated:!1,cache:z.cache},X.updateQueue.baseState=V,X.memoizedState=V,X.flags&256){X=bz(Z,X,K,J);break H}else if(K!==w){w=v2(Error("This root received an early update, before anything was able hydrate. Switched the entire root to client rendering."),X),LH(w),X=bz(Z,X,K,J);break H}else{switch(Z=X.stateNode.containerInfo,Z.nodeType){case 9:Z=Z.body;break;default:Z=Z.nodeName==="HTML"?Z.ownerDocument.body:Z}d0=u2(Z.firstChild),i5=X,P0=!0,D9=null,Q6=!1,p2=null,q3=!0,J=uO(X,null,K,J);for(X.child=J;J;)J.flags=J.flags&-3|4096,J=J.sibling}else{if(B4(),K===w){X=G6(Z,X,J);break H}l5(Z,X,K,J)}X=X.child}return X;case 26:return Uq(Z,X),Z===null?(J=oR(X.type,null,X.pendingProps,null))?X.memoizedState=J:P0||(J=X.type,Z=X.pendingProps,K=g1(O9.current),K=$q(K).createElement(J),K[r5]=X,K[W2]=Z,p5(K,J,Z),p1(K),X.stateNode=K):X.memoizedState=oR(X.type,Z.memoizedProps,X.pendingProps,Z.memoizedState),null;case 27:return f1(X),Z===null&&P0&&(K=g1(O9.current),w=O1(),K=X.stateNode=sR(X.type,X.pendingProps,K,w,!1),Q6||(w=AR(K,X.type,X.pendingProps,w),w!==null&&(U4(X,0).serverProps=w)),i5=X,q3=!0,w=d0,R9(X.type)?(aw=w,d0=u2(K.firstChild)):d0=w),l5(Z,X,X.pendingProps.children,J),Uq(Z,X),Z===null&&(X.flags|=4194304),X.child;case 5:return Z===null&&P0&&(V=O1(),K=DY(X.type,V.ancestorInfo),w=d0,(z=!w)||(z=X_(w,X.type,X.pendingProps,q3),z!==null?(X.stateNode=z,Q6||(V=AR(z,X.type,X.pendingProps,V),V!==null&&(U4(X,0).serverProps=V)),i5=X,d0=u2(z.firstChild),q3=!1,V=!0):V=!1,z=!V),z&&(K&&uX(X,w),Y9(X))),f1(X),w=X.type,V=X.pendingProps,z=Z!==null?Z.memoizedProps:null,K=V.children,LW(w,V)?K=null:z!==null&&LW(w,z)&&(X.flags|=32),X.memoizedState!==null&&(w=ZK(Z,X,Yh,null,null,J),xZ._currentValue=w),Uq(Z,X),l5(Z,X,K,J),X.child;case 6:return Z===null&&P0&&(J=X.pendingProps,Z=O1(),K=Z.ancestorInfo.current,J=K!=null?xX(J,K.tag,Z.ancestorInfo.implicitRootScope):!0,Z=d0,(K=!Z)||(K=q_(Z,X.pendingProps,q3),K!==null?(X.stateNode=K,i5=X,d0=null,K=!0):K=!1,K=!K),K&&(J&&uX(X,Z),Y9(X))),null;case 13:return $z(Z,X,J);case 4:return J1(X,X.stateNode.containerInfo),K=X.pendingProps,Z===null?X.child=I4(X,null,K,J):l5(Z,X,K,J),X.child;case 11:return zz(Z,X,X.type,X.pendingProps,J);case 7:return l5(Z,X,X.pendingProps,J),X.child;case 8:return l5(Z,X,X.pendingProps.children,J),X.child;case 12:return X.flags|=4,X.flags|=2048,K=X.stateNode,K.effectDuration=-0,K.passiveEffectDuration=-0,l5(Z,X,X.pendingProps.children,J),X.child;case 10:return K=X.type,w=X.pendingProps,V=w.value,"value"in w||VP||(VP=!0,console.error("The `value` prop is required for the ``. Did you misspell it or forget to pass it?")),K9(X,K,V),l5(Z,X,w.children,J),X.child;case 9:return w=X.type._context,K=X.pendingProps.children,typeof K!=="function"&&console.error("A context consumer was rendered with multiple children, or a child that isn't a function. A context consumer expects a single child that is a function. If you did pass a function, make sure there is no trailing or leading whitespace around it."),z4(X),w=o0(w),K=Vw(K,w,void 0),X.flags|=1,l5(Z,X,K,J),X.child;case 14:return Rz(Z,X,X.type,X.pendingProps,J);case 15:return jz(Z,X,X.type,X.pendingProps,J);case 19:return Gz(Z,X,J);case 31:return Uh(Z,X,J);case 22:return Oz(Z,X,J,X.pendingProps);case 24:return z4(X),K=o0(j5),Z===null?(w=aY(),w===null&&(w=f0,V=rY(),w.pooledCache=V,R4(V),V!==null&&(w.pooledCacheLanes|=J),w=V),X.memoizedState={parent:K,cache:w},sY(X),K9(X,j5,w)):((Z.lanes&J)!==0&&(nY(Z,X),jH(X,null,null,J),RH()),w=Z.memoizedState,V=X.memoizedState,w.parent!==K?(w={parent:K,cache:K},X.memoizedState=w,X.lanes===0&&(X.memoizedState=X.updateQueue.baseState=w),K9(X,j5,K)):(K=V.cache,K9(X,j5,K),K!==w.cache&&pY(X,[j5],J,!0))),l5(Z,X,X.pendingProps.children,J),X.child;case 29:throw X.pendingProps}throw Error("Unknown unit of work tag ("+X.tag+"). This error is likely caused by a bug in React. Please file an issue.")}function g6(Z){Z.flags|=4}function kK(Z,X,J,K,w){if(X=(Z.mode&vy)!==n1)X=!1;if(X){if(Z.flags|=16777216,(w&335544128)===w)if(Z.stateNode.complete)Z.flags|=8192;else if(QR())Z.flags|=8192;else throw y4=YJ,Uw}else Z.flags&=-16777217}function gz(Z,X){if(X.type!=="stylesheet"||(X.state.loading&W3)!==r4)Z.flags&=-16777217;else if(Z.flags|=16777216,!Xj(X))if(QR())Z.flags|=8192;else throw y4=YJ,Uw}function zq(Z,X){X!==null&&(Z.flags|=4),Z.flags&16384&&(X=Z.tag!==22?Q1():536870912,Z.lanes|=X,m4|=X)}function CH(Z,X){if(!P0)switch(Z.tailMode){case"hidden":X=Z.tail;for(var J=null;X!==null;)X.alternate!==null&&(J=X),X=X.sibling;J===null?Z.tail=null:J.sibling=null;break;case"collapsed":J=Z.tail;for(var K=null;J!==null;)J.alternate!==null&&(K=J),J=J.sibling;K===null?X||Z.tail===null?Z.tail=null:Z.tail.sibling=null:K.sibling=null}}function p0(Z){var X=Z.alternate!==null&&Z.alternate.child===Z.child,J=0,K=0;if(X)if((Z.mode&L0)!==n1){for(var{selfBaseDuration:w,child:V}=Z;V!==null;)J|=V.lanes|V.childLanes,K|=V.subtreeFlags&65011712,K|=V.flags&65011712,w+=V.treeBaseDuration,V=V.sibling;Z.treeBaseDuration=w}else for(w=Z.child;w!==null;)J|=w.lanes|w.childLanes,K|=w.subtreeFlags&65011712,K|=w.flags&65011712,w.return=Z,w=w.sibling;else if((Z.mode&L0)!==n1){w=Z.actualDuration,V=Z.selfBaseDuration;for(var z=Z.child;z!==null;)J|=z.lanes|z.childLanes,K|=z.subtreeFlags,K|=z.flags,w+=z.actualDuration,V+=z.treeBaseDuration,z=z.sibling;Z.actualDuration=w,Z.treeBaseDuration=V}else for(w=Z.child;w!==null;)J|=w.lanes|w.childLanes,K|=w.subtreeFlags,K|=w.flags,w.return=Z,w=w.sibling;return Z.subtreeFlags|=K,Z.childLanes=J,X}function zh(Z,X,J){var K=X.pendingProps;switch(uY(X),X.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return p0(X),null;case 1:return p0(X),null;case 3:if(J=X.stateNode,K=null,Z!==null&&(K=Z.memoizedState.cache),X.memoizedState.cache!==K&&(X.flags|=2048),$6(j5,X),W1(X),J.pendingContext&&(J.context=J.pendingContext,J.pendingContext=null),Z===null||Z.child===null)$7(X)?(fY(),g6(X)):Z===null||Z.memoizedState.isDehydrated&&(X.flags&256)===0||(X.flags|=1024,kY());return p0(X),null;case 26:var{type:w,memoizedState:V}=X;return Z===null?(g6(X),V!==null?(p0(X),gz(X,V)):(p0(X),kK(X,w,null,K,J))):V?V!==Z.memoizedState?(g6(X),p0(X),gz(X,V)):(p0(X),X.flags&=-16777217):(Z=Z.memoizedProps,Z!==K&&g6(X),p0(X),kK(X,w,Z,K,J)),null;case 27:if(c1(X),J=g1(O9.current),w=X.type,Z!==null&&X.stateNode!=null)Z.memoizedProps!==K&&g6(X);else{if(!K){if(X.stateNode===null)throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");return p0(X),null}Z=O1(),$7(X)?zB(X,Z):(Z=sR(w,K,J,Z,!0),X.stateNode=Z,g6(X))}return p0(X),null;case 5:if(c1(X),w=X.type,Z!==null&&X.stateNode!=null)Z.memoizedProps!==K&&g6(X);else{if(!K){if(X.stateNode===null)throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");return p0(X),null}var z=O1();if($7(X))zB(X,z);else{switch(V=g1(O9.current),DY(w,z.ancestorInfo),z=z.context,V=$q(V),z){case N8:V=V.createElementNS(r7,w);break;case yJ:V=V.createElementNS(fq,w);break;default:switch(w){case"svg":V=V.createElementNS(r7,w);break;case"math":V=V.createElementNS(fq,w);break;case"script":V=V.createElement("div"),V.innerHTML="",V=V.removeChild(V.firstChild);break;case"select":V=typeof K.is==="string"?V.createElement("select",{is:K.is}):V.createElement("select"),K.multiple?V.multiple=!0:K.size&&(V.size=K.size);break;default:V=typeof K.is==="string"?V.createElement(w,{is:K.is}):V.createElement(w),w.indexOf("-")===-1&&(w!==w.toLowerCase()&&console.error("<%s /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements.",w),Object.prototype.toString.call(V)!=="[object HTMLUnknownElement]"||O3.call(SP,w)||(SP[w]=!0,console.error("The tag <%s> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter.",w)))}}V[r5]=X,V[W2]=K;H:for(z=X.child;z!==null;){if(z.tag===5||z.tag===6)V.appendChild(z.stateNode);else if(z.tag!==4&&z.tag!==27&&z.child!==null){z.child.return=z,z=z.child;continue}if(z===X)break H;for(;z.sibling===null;){if(z.return===null||z.return===X)break H;z=z.return}z.sibling.return=z.return,z=z.sibling}X.stateNode=V;H:switch(p5(V,w,K),w){case"button":case"input":case"select":case"textarea":K=!!K.autoFocus;break H;case"img":K=!0;break H;default:K=!1}K&&g6(X)}}return p0(X),kK(X,X.type,Z===null?null:Z.memoizedProps,X.pendingProps,J),null;case 6:if(Z&&X.stateNode!=null)Z.memoizedProps!==K&&g6(X);else{if(typeof K!=="string"&&X.stateNode===null)throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");if(Z=g1(O9.current),J=O1(),$7(X)){if(Z=X.stateNode,J=X.memoizedProps,w=!Q6,K=null,V=i5,V!==null)switch(V.tag){case 3:w&&(w=aR(Z,J,K),w!==null&&(U4(X,0).serverProps=w));break;case 27:case 5:K=V.memoizedProps,w&&(w=aR(Z,J,K),w!==null&&(U4(X,0).serverProps=w))}Z[r5]=X,Z=Z.nodeValue===J||K!==null&&K.suppressHydrationWarning===!0||yR(Z.nodeValue,J)?!0:!1,Z||Y9(X,!0)}else w=J.ancestorInfo.current,w!=null&&xX(K,w.tag,J.ancestorInfo.implicitRootScope),Z=$q(Z).createTextNode(K),Z[r5]=X,X.stateNode=Z}return p0(X),null;case 31:if(J=X.memoizedState,Z===null||Z.memoizedState!==null){if(K=$7(X),J!==null){if(Z===null){if(!K)throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.");if(Z=X.memoizedState,Z=Z!==null?Z.dehydrated:null,!Z)throw Error("Expected to have a hydrated activity instance. This error is likely caused by a bug in React. Please file an issue.");Z[r5]=X,p0(X),(X.mode&L0)!==n1&&J!==null&&(Z=X.child,Z!==null&&(X.treeBaseDuration-=Z.treeBaseDuration))}else fY(),B4(),(X.flags&128)===0&&(J=X.memoizedState=null),X.flags|=4,p0(X),(X.mode&L0)!==n1&&J!==null&&(Z=X.child,Z!==null&&(X.treeBaseDuration-=Z.treeBaseDuration));Z=!1}else J=kY(),Z!==null&&Z.memoizedState!==null&&(Z.memoizedState.hydrationErrors=J),Z=!0;if(!Z){if(X.flags&256)return A2(X),X;return A2(X),null}if((X.flags&128)!==0)throw Error("Client rendering an Activity suspended it again. This is a bug in React.")}return p0(X),null;case 13:if(K=X.memoizedState,Z===null||Z.memoizedState!==null&&Z.memoizedState.dehydrated!==null){if(w=K,V=$7(X),w!==null&&w.dehydrated!==null){if(Z===null){if(!V)throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.");if(V=X.memoizedState,V=V!==null?V.dehydrated:null,!V)throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");V[r5]=X,p0(X),(X.mode&L0)!==n1&&w!==null&&(w=X.child,w!==null&&(X.treeBaseDuration-=w.treeBaseDuration))}else fY(),B4(),(X.flags&128)===0&&(w=X.memoizedState=null),X.flags|=4,p0(X),(X.mode&L0)!==n1&&w!==null&&(w=X.child,w!==null&&(X.treeBaseDuration-=w.treeBaseDuration));w=!1}else w=kY(),Z!==null&&Z.memoizedState!==null&&(Z.memoizedState.hydrationErrors=w),w=!0;if(!w){if(X.flags&256)return A2(X),X;return A2(X),null}}if(A2(X),(X.flags&128)!==0)return X.lanes=J,(X.mode&L0)!==n1&&UH(X),X;return J=K!==null,Z=Z!==null&&Z.memoizedState!==null,J&&(K=X.child,w=null,K.alternate!==null&&K.alternate.memoizedState!==null&&K.alternate.memoizedState.cachePool!==null&&(w=K.alternate.memoizedState.cachePool.pool),V=null,K.memoizedState!==null&&K.memoizedState.cachePool!==null&&(V=K.memoizedState.cachePool.pool),V!==w&&(K.flags|=2048)),J!==Z&&J&&(X.child.flags|=8192),zq(X,X.updateQueue),p0(X),(X.mode&L0)!==n1&&J&&(Z=X.child,Z!==null&&(X.treeBaseDuration-=Z.treeBaseDuration)),null;case 4:return W1(X),Z===null&&qW(X.stateNode.containerInfo),p0(X),null;case 10:return $6(X.type,X),p0(X),null;case 19:if(G1(F5,X),K=X.memoizedState,K===null)return p0(X),null;if(w=(X.flags&128)!==0,V=K.rendering,V===null)if(w)CH(K,!1);else{if(Z5!==l6||Z!==null&&(Z.flags&128)!==0)for(Z=X.child;Z!==null;){if(V=tX(Z),V!==null){X.flags|=128,CH(K,!1),Z=V.updateQueue,X.updateQueue=Z,zq(X,Z),X.subtreeFlags=0,Z=J;for(J=X.child;J!==null;)wB(J,Z),J=J.sibling;return w1(F5,F5.current&W8|VZ,X),P0&&b6(X,K.treeForkCount),X.child}Z=Z.sibling}K.tail!==null&&v5()>PJ&&(X.flags|=128,w=!0,CH(K,!1),X.lanes=4194304)}else{if(!w)if(Z=tX(V),Z!==null){if(X.flags|=128,w=!0,Z=Z.updateQueue,X.updateQueue=Z,zq(X,Z),CH(K,!0),K.tail===null&&K.tailMode==="hidden"&&!V.alternate&&!P0)return p0(X),null}else 2*v5()-K.renderingStartTime>PJ&&J!==536870912&&(X.flags|=128,w=!0,CH(K,!1),X.lanes=4194304);K.isBackwards?(V.sibling=X.child,X.child=V):(Z=K.last,Z!==null?Z.sibling=V:X.child=V,K.last=V)}if(K.tail!==null)return Z=K.tail,K.rendering=Z,K.tail=Z.sibling,K.renderingStartTime=v5(),Z.sibling=null,J=F5.current,J=w?J&W8|VZ:J&W8,w1(F5,J,X),P0&&b6(X,K.treeForkCount),Z;return p0(X),null;case 22:case 23:return A2(X),tY(X),K=X.memoizedState!==null,Z!==null?Z.memoizedState!==null!==K&&(X.flags|=8192):K&&(X.flags|=8192),K?(J&536870912)!==0&&(X.flags&128)===0&&(p0(X),X.subtreeFlags&6&&(X.flags|=8192)):p0(X),J=X.updateQueue,J!==null&&zq(X,J.retryQueue),J=null,Z!==null&&Z.memoizedState!==null&&Z.memoizedState.cachePool!==null&&(J=Z.memoizedState.cachePool.pool),K=null,X.memoizedState!==null&&X.memoizedState.cachePool!==null&&(K=X.memoizedState.cachePool.pool),K!==J&&(X.flags|=2048),Z!==null&&G1(h4,X),null;case 24:return J=null,Z!==null&&(J=Z.memoizedState.cache),X.memoizedState.cache!==J&&(X.flags|=2048),$6(j5,X),p0(X),null;case 25:return null;case 30:return null}throw Error("Unknown unit of work tag ("+X.tag+"). This error is likely caused by a bug in React. Please file an issue.")}function Rh(Z,X){switch(uY(X),X.tag){case 1:return Z=X.flags,Z&65536?(X.flags=Z&-65537|128,(X.mode&L0)!==n1&&UH(X),X):null;case 3:return $6(j5,X),W1(X),Z=X.flags,(Z&65536)!==0&&(Z&128)===0?(X.flags=Z&-65537|128,X):null;case 26:case 27:case 5:return c1(X),null;case 31:if(X.memoizedState!==null){if(A2(X),X.alternate===null)throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue.");B4()}return Z=X.flags,Z&65536?(X.flags=Z&-65537|128,(X.mode&L0)!==n1&&UH(X),X):null;case 13:if(A2(X),Z=X.memoizedState,Z!==null&&Z.dehydrated!==null){if(X.alternate===null)throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue.");B4()}return Z=X.flags,Z&65536?(X.flags=Z&-65537|128,(X.mode&L0)!==n1&&UH(X),X):null;case 19:return G1(F5,X),null;case 4:return W1(X),null;case 10:return $6(X.type,X),null;case 22:case 23:return A2(X),tY(X),Z!==null&&G1(h4,X),Z=X.flags,Z&65536?(X.flags=Z&-65537|128,(X.mode&L0)!==n1&&UH(X),X):null;case 24:return $6(j5,X),null;case 25:return null;default:return null}}function Ez(Z,X){switch(uY(X),X.tag){case 3:$6(j5,X),W1(X);break;case 26:case 27:case 5:c1(X);break;case 4:W1(X);break;case 31:X.memoizedState!==null&&A2(X);break;case 13:A2(X);break;case 19:G1(F5,X);break;case 10:$6(X.type,X);break;case 22:case 23:A2(X),tY(X),Z!==null&&G1(h4,X);break;case 24:$6(j5,X)}}function d3(Z){return(Z.mode&L0)!==n1}function xz(Z,X){d3(Z)?(i3(),bH(X,Z),r3()):bH(X,Z)}function fK(Z,X,J){d3(Z)?(i3(),h7(J,Z,X),r3()):h7(J,Z,X)}function bH(Z,X){try{var J=X.updateQueue,K=J!==null?J.lastEffect:null;if(K!==null){var w=K.next;J=w;do{if((J.tag&Z)===Z&&(K=void 0,(Z&F2)!==WJ&&(j8=!0),K=$1(X,uy,J),(Z&F2)!==WJ&&(j8=!1),K!==void 0&&typeof K!=="function")){var V=void 0;V=(J.tag&i2)!==0?"useLayoutEffect":(J.tag&F2)!==0?"useInsertionEffect":"useEffect";var z=void 0;z=K===null?" You returned null. If your effect does not require clean up, return undefined (or nothing).":typeof K.then==="function"?` It looks like you wrote `+V+`(async () => ...) or returned a Promise. Instead, write the async function inside your effect and call it immediately: @@ -150,7 +150,7 @@ It looks like you wrote `+V+`(async () => ...) or returned a Promise. Instead, w fetchData(); }, [someId]); // Or [] if effect doesn't need props or state -Learn more about data fetching with Hooks: https://react.dev/link/hooks-data-fetching`:" You returned: "+K,$1(X,function(N,D){console.error("%s must not return anything besides a function, which is used for clean-up.%s",N,D)},V,z)}J=J.next}while(J!==w)}}catch(N){v0(X,X.return,N)}}function x7(Z,X,J){try{var K=X.updateQueue,w=K!==null?K.lastEffect:null;if(w!==null){var V=w.next;K=V;do{if((K.tag&Z)===Z){var z=K.inst,N=z.destroy;N!==void 0&&(z.destroy=void 0,(Z&F2)!==WJ&&(R8=!0),w=X,$1(w,ky,w,J,N),(Z&F2)!==WJ&&(R8=!1))}K=K.next}while(K!==V)}}catch(D){v0(X,X.return,D)}}function hz(Z,X){d3(Z)?(i3(),bH(X,Z),r3()):bH(X,Z)}function lK(Z,X,J){d3(Z)?(i3(),x7(J,Z,X),r3()):x7(J,Z,X)}function _z(Z){var X=Z.updateQueue;if(X!==null){var J=Z.stateNode;Z.type.defaultProps||"ref"in Z.memoizedProps||V8||(J.props!==Z.memoizedProps&&console.error("Expected %s props to match memoized props before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",k(Z)||"instance"),J.state!==Z.memoizedState&&console.error("Expected %s state to match memoized state before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.",k(Z)||"instance"));try{$1(Z,IB,X,J)}catch(K){v0(Z,Z.return,K)}}}function jh(Z,X,J){return Z.getSnapshotBeforeUpdate(X,J)}function Oh(Z,X){var{memoizedProps:J,memoizedState:K}=X;X=Z.stateNode,Z.type.defaultProps||"ref"in Z.memoizedProps||V8||(X.props!==Z.memoizedProps&&console.error("Expected %s props to match memoized props before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",k(Z)||"instance"),X.state!==Z.memoizedState&&console.error("Expected %s state to match memoized state before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.",k(Z)||"instance"));try{var w=N4(Z.type,J),V=$1(Z,jh,X,w,K);J=FP,V!==void 0||J.has(Z.type)||(J.add(Z.type),$1(Z,function(){console.error("%s.getSnapshotBeforeUpdate(): A snapshot value (or null) must be returned. You have returned undefined.",k(Z))})),X.__reactInternalSnapshotBeforeUpdate=V}catch(z){v0(Z,Z.return,z)}}function yz(Z,X,J){J.props=N4(Z.type,Z.memoizedProps),J.state=Z.memoizedState,d3(Z)?(i3(),$1(Z,_O,Z,X,J),r3()):$1(Z,_O,Z,X,J)}function Ph(Z){var X=Z.ref;if(X!==null){switch(Z.tag){case 26:case 27:case 5:var J=Z.stateNode;break;case 30:J=Z.stateNode;break;default:J=Z.stateNode}if(typeof X==="function")if(d3(Z))try{i3(),Z.refCleanup=X(J)}finally{r3()}else Z.refCleanup=X(J);else typeof X==="string"?console.error("String refs are no longer supported."):X.hasOwnProperty("current")||console.error("Unexpected ref object provided for %s. Use either a ref-setter function or React.createRef().",k(Z)),X.current=J}}function $H(Z,X){try{$1(Z,Ph,Z)}catch(J){v0(Z,X,J)}}function a3(Z,X){var{ref:J,refCleanup:K}=Z;if(J!==null)if(typeof K==="function")try{if(d3(Z))try{i3(),$1(Z,K)}finally{r3(Z)}else $1(Z,K)}catch(w){v0(Z,X,w)}finally{Z.refCleanup=null,Z=Z.alternate,Z!=null&&(Z.refCleanup=null)}else if(typeof J==="function")try{if(d3(Z))try{i3(),$1(Z,J,null)}finally{r3(Z)}else $1(Z,J,null)}catch(w){v0(Z,X,w)}else J.current=null}function Iz(Z,X,J,K){var w=Z.memoizedProps,V=w.id,z=w.onCommit;w=w.onRender,X=X===null?"mount":"update",XJ&&(X="nested-update"),typeof w==="function"&&w(V,X,Z.actualDuration,Z.treeBaseDuration,Z.actualStartTime,J),typeof z==="function"&&z(V,X,K,J)}function Nh(Z,X,J,K){var w=Z.memoizedProps;Z=w.id,w=w.onPostCommit,X=X===null?"mount":"update",XJ&&(X="nested-update"),typeof w==="function"&&w(Z,X,K,J)}function vz(Z){var{type:X,memoizedProps:J,stateNode:K}=Z;try{$1(Z,rh,K,X,J,Z)}catch(w){v0(Z,Z.return,w)}}function pK(Z,X,J){try{$1(Z,dh,Z.stateNode,Z.type,J,X,Z)}catch(K){v0(Z,Z.return,K)}}function Sz(Z){return Z.tag===5||Z.tag===3||Z.tag===26||Z.tag===27&&R9(Z.type)||Z.tag===4}function rK(Z){H:for(;;){for(;Z.sibling===null;){if(Z.return===null||Sz(Z.return))return null;Z=Z.return}Z.sibling.return=Z.return;for(Z=Z.sibling;Z.tag!==5&&Z.tag!==6&&Z.tag!==18;){if(Z.tag===27&&R9(Z.type))continue H;if(Z.flags&2)continue H;if(Z.child===null||Z.tag===4)continue H;else Z.child.return=Z,Z=Z.child}if(!(Z.flags&2))return Z.stateNode}}function iK(Z,X,J){var K=Z.tag;if(K===5||K===6)Z=Z.stateNode,X?(lR(J),(J.nodeType===9?J.body:J.nodeName==="HTML"?J.ownerDocument.body:J).insertBefore(Z,X)):(lR(J),X=J.nodeType===9?J.body:J.nodeName==="HTML"?J.ownerDocument.body:J,X.appendChild(Z),J=J._reactRootContainer,J!==null&&J!==void 0||X.onclick!==null||(X.onclick=M6));else if(K!==4&&(K===27&&R9(Z.type)&&(J=Z.stateNode,X=null),Z=Z.child,Z!==null))for(iK(Z,X,J),Z=Z.sibling;Z!==null;)iK(Z,X,J),Z=Z.sibling}function Rq(Z,X,J){var K=Z.tag;if(K===5||K===6)Z=Z.stateNode,X?J.insertBefore(Z,X):J.appendChild(Z);else if(K!==4&&(K===27&&R9(Z.type)&&(J=Z.stateNode),Z=Z.child,Z!==null))for(Rq(Z,X,J),Z=Z.sibling;Z!==null;)Rq(Z,X,J),Z=Z.sibling}function Mh(Z){for(var X,J=Z.return;J!==null;){if(Sz(J)){X=J;break}J=J.return}if(X==null)throw Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.");switch(X.tag){case 27:X=X.stateNode,J=rK(Z),Rq(Z,J,X);break;case 5:J=X.stateNode,X.flags&32&&(fR(J),X.flags&=-33),X=rK(Z),Rq(Z,X,J);break;case 3:case 4:X=X.stateNode.containerInfo,J=rK(Z),iK(Z,J,X);break;default:throw Error("Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.")}}function Tz(Z){var{stateNode:X,memoizedProps:J}=Z;try{$1(Z,W_,Z.type,J,X,Z)}catch(K){v0(Z,Z.return,K)}}function Az(Z,X){return X.tag===31?(X=X.memoizedState,Z.memoizedState!==null&&X===null):X.tag===13?(Z=Z.memoizedState,X=X.memoizedState,Z!==null&&Z.dehydrated!==null&&(X===null||X.dehydrated===null)):X.tag===3?Z.memoizedState.isDehydrated&&(X.flags&256)===0:!1}function Ch(Z,X){if(Z=Z.containerInfo,rw=TJ,Z=eU(Z),EY(Z)){if("selectionStart"in Z)var J={start:Z.selectionStart,end:Z.selectionEnd};else H:{J=(J=Z.ownerDocument)&&J.defaultView||window;var K=J.getSelection&&J.getSelection();if(K&&K.rangeCount!==0){J=K.anchorNode;var{anchorOffset:w,focusNode:V}=K;K=K.focusOffset;try{J.nodeType,V.nodeType}catch(D1){J=null;break H}var z=0,N=-1,D=-1,g=0,i=0,d=Z,T=null;Z:for(;;){for(var e;;){if(d!==J||w!==0&&d.nodeType!==3||(N=z+w),d!==V||K!==0&&d.nodeType!==3||(D=z+K),d.nodeType===3&&(z+=d.nodeValue.length),(e=d.firstChild)===null)break;T=d,d=e}for(;;){if(d===Z)break Z;if(T===J&&++g===w&&(N=z),T===V&&++i===K&&(D=z),(e=d.nextSibling)!==null)break;d=T,T=d.parentNode}d=e}J=N===-1||D===-1?null:{start:N,end:D}}else J=null}J=J||{start:0,end:0}}else J=null;iw={focusedElem:Z,selectionRange:J},TJ=!1;for(T5=X;T5!==null;)if(X=T5,Z=X.child,(X.subtreeFlags&1028)!==0&&Z!==null)Z.return=X,T5=Z;else for(;T5!==null;){switch(Z=X=T5,J=Z.alternate,w=Z.flags,Z.tag){case 0:if((w&4)!==0&&(Z=Z.updateQueue,Z=Z!==null?Z.events:null,Z!==null))for(J=0;J title"));p5(g,N,z),g[r5]=Z,p1(g),N=g;break H;case"link":var i=Hj("link","href",D).get(N+(z.href||""));if(i){for(var d=0;dK||console.timeStamp("Blocked",ZZ,w,t2,void 0,5>K?"primary-light":10>K?"primary":100>K?"primary-dark":"error"))}}V=(J=!J&&(X&127)===0&&(X&Z.expiredLanes)===0||P6(Z,X))?Gh(Z,X):sK(Z,X,!0);var z=J;do{if(V===l6){B8&&!J&&B9(Z,X,0,!1),X=A0,ZZ=O5(),NO=X;break}else{if(K=v5(),w=Z.current.alternate,z&&!Dh(w)){I2(X),w=S5,V=K,!i0||V<=w||(K5?K5.run(console.timeStamp.bind(console,"Teared Render",w,V,j0,R0,"error")):console.timeStamp("Teared Render",w,V,j0,R0,"error")),C4(X,K),V=sK(Z,X,!1),z=!1;continue}if(V===S4){if(z=X,Z.errorRecoveryDisabledLanes&z)var N=0;else N=Z.pendingLanes&-536870913,N=N!==0?N:N&536870912?536870912:0;if(N!==0){I2(X),_Y(S5,K,X,K5),C4(X,K),X=N;H:{K=Z,V=z,z=NZ;var D=K.current.memoizedState.isDehydrated;if(D&&(I7(K,N).flags|=256),N=sK(K,N,!1),N!==S4){if(Ew&&!D){K.errorRecoveryDisabledLanes|=V,S9|=V,V=y9;break H}K=B2,B2=z,K!==null&&(B2===null?B2=K:B2.push.apply(B2,K))}V=N}if(z=!1,V!==S4)continue;else K=v5()}}if(V===jZ){I2(X),_Y(S5,K,X,K5),C4(X,K),I7(Z,0),B9(Z,X,0,!0);break}H:{switch(J=Z,V){case l6:case jZ:throw Error("Root did not complete. This is a bug in React.");case y9:if((X&4194048)!==X)break;case BJ:I2(X),XB(S5,K,X,K5),C4(X,K),w=X,(w&127)!==0?eq=K:(w&4194048)!==0&&(HJ=K),B9(J,X,E2,!I9);break H;case S4:B2=null;break;case UJ:case BP:break;default:throw Error("Unknown root exit status.")}if(X1.actQueue!==null)nK(J,w,X,B2,MZ,jJ,E2,S9,m4,V,null,null,S5,K);else{if((X&62914560)===X&&(z=OJ+jP-v5(),10w&&(J=w):J=w,0J&&(N=J):N=J,D!==null&&J>N){var T=g?"secondary-light":"warning";K?K.run(console.timeStamp.bind(console,g?"Consecutive":"Event: "+D,N,J,j0,R0,T)):console.timeStamp(g?"Consecutive":"Event: "+D,N,J,j0,R0,T)}w>J&&(N=i?"error":(X&738197653)===X?"tertiary-light":"primary-light",i=d?"Promise Resolved":i?"Cascading Update":5V&&(J=V):J=V,0J&&(w=J):w=J,0w&&(d=w):d=w,w>d&&N!==null&&(T=D?"secondary-light":"warning",K?K.run(console.timeStamp.bind(console,D?"Consecutive":"Event: "+N,d,w,j0,R0,T)):console.timeStamp(D?"Consecutive":"Event: "+N,d,w,j0,R0,T)),J>w&&(K?K.run(console.timeStamp.bind(console,"Action",w,J,j0,R0,"primary-dark")):console.timeStamp("Action",w,J,j0,R0,"primary-dark")),V>J&&(w=g?"Promise Resolved":5r0&&(z=r0,r0=_1,_1=z);var $0=oU(N,_1),S=oU(N,r0);if($0&&S&&(e.rangeCount!==1||e.anchorNode!==$0.node||e.anchorOffset!==$0.offset||e.focusNode!==S.node||e.focusOffset!==S.offset)){var u=d.createRange();u.setStart($0.node,$0.offset),e.removeAllRanges(),_1>r0?(e.addRange(u),e.extend(S.node,S.offset)):(u.setEnd(S.node,S.offset),e.addRange(u))}}}}d=[];for(e=N;e=e.parentNode;)e.nodeType===1&&d.push({element:e,left:e.scrollLeft,top:e.scrollTop});typeof N.focus==="function"&&N.focus();for(N=0;NJ?q6:J;J=X1.T;var w=S0.p;try{S0.p=K,X1.T=null;var V=vw;vw=null,K=m9;var z=$3;if(b5=A9,z8=m9=null,$3=0,(E0&(g5|d2))!==A5)throw Error("Cannot flush passive effects while already rendering.");I2(z),Tw=!0,CJ=!1;var N=0;if(S6=null,N=v5(),D3===PP)wH(v6,N,A6);else{var D=v6,g=N,i=D3===_w;!i0||g<=D||(K5?K5.run(console.timeStamp.bind(console,i?"Waiting for Paint":"Waiting",D,g,j0,R0,"secondary-light")):console.timeStamp(i?"Waiting for Paint":"Waiting",D,g,j0,R0,"secondary-light"))}D=E0,E0|=d2;var d=K.current;rX(),oz(d);var T=K.current;d=Iw,rX(),az(K,T,z,V,d),NR(K),E0=D;var e=v5();if(T=N,d=K5,S6!==null?JB(T,e,S6,!0,d):!i0||e<=T||(d?d.run(console.timeStamp.bind(console,"Remaining Effects",T,e,j0,R0,"secondary-dark")):console.timeStamp("Remaining Effects",T,e,j0,R0,"secondary-dark")),C4(z,e),xH(0,!1),CJ?K===bZ?u4++:(u4=0,bZ=K):u4=0,CJ=Tw=!1,s5&&typeof s5.onPostCommitFiberRoot==="function")try{s5.onPostCommitFiberRoot(f7,K)}catch(_1){Z6||(Z6=!0,console.error("React instrumentation encountered an error: %o",_1))}var D1=K.current.stateNode;return D1.effectDuration=0,D1.passiveEffectDuration=0,!0}finally{S0.p=w,X1.T=J,zR(Z,X)}}function jR(Z,X,J){X=v2(J,X),PB(X),X=EK(Z.stateNode,X,2),Z=L9(Z,X,2),Z!==null&&(y1(Z,2),n3(Z))}function v0(Z,X,J){if(R8=!1,Z.tag===3)jR(Z,Z,J);else{for(;X!==null;){if(X.tag===3){jR(X,Z,J);return}if(X.tag===1){var K=X.stateNode;if(typeof X.type.getDerivedStateFromError==="function"||typeof K.componentDidCatch==="function"&&(T9===null||!T9.has(K))){Z=v2(J,Z),PB(Z),J=xK(2),K=L9(X,J,2),K!==null&&(hK(J,K,X,Z),y1(K,2),n3(K));return}}X=X.return}console.error(`Internal React error: Attempted to capture a commit phase error inside a detached tree. This indicates a bug in React. Potential causes include deleting the same fiber more than once, committing an already-finished tree, or an inconsistent return pointer. +Learn more about data fetching with Hooks: https://react.dev/link/hooks-data-fetching`:" You returned: "+K,$1(X,function(N,D){console.error("%s must not return anything besides a function, which is used for clean-up.%s",N,D)},V,z)}J=J.next}while(J!==w)}}catch(N){v0(X,X.return,N)}}function h7(Z,X,J){try{var K=X.updateQueue,w=K!==null?K.lastEffect:null;if(w!==null){var V=w.next;K=V;do{if((K.tag&Z)===Z){var z=K.inst,N=z.destroy;N!==void 0&&(z.destroy=void 0,(Z&F2)!==WJ&&(j8=!0),w=X,$1(w,ky,w,J,N),(Z&F2)!==WJ&&(j8=!1))}K=K.next}while(K!==V)}}catch(D){v0(X,X.return,D)}}function hz(Z,X){d3(Z)?(i3(),bH(X,Z),r3()):bH(X,Z)}function lK(Z,X,J){d3(Z)?(i3(),h7(J,Z,X),r3()):h7(J,Z,X)}function _z(Z){var X=Z.updateQueue;if(X!==null){var J=Z.stateNode;Z.type.defaultProps||"ref"in Z.memoizedProps||F8||(J.props!==Z.memoizedProps&&console.error("Expected %s props to match memoized props before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",k(Z)||"instance"),J.state!==Z.memoizedState&&console.error("Expected %s state to match memoized state before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.",k(Z)||"instance"));try{$1(Z,IB,X,J)}catch(K){v0(Z,Z.return,K)}}}function jh(Z,X,J){return Z.getSnapshotBeforeUpdate(X,J)}function Oh(Z,X){var{memoizedProps:J,memoizedState:K}=X;X=Z.stateNode,Z.type.defaultProps||"ref"in Z.memoizedProps||F8||(X.props!==Z.memoizedProps&&console.error("Expected %s props to match memoized props before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.",k(Z)||"instance"),X.state!==Z.memoizedState&&console.error("Expected %s state to match memoized state before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.",k(Z)||"instance"));try{var w=N4(Z.type,J),V=$1(Z,jh,X,w,K);J=FP,V!==void 0||J.has(Z.type)||(J.add(Z.type),$1(Z,function(){console.error("%s.getSnapshotBeforeUpdate(): A snapshot value (or null) must be returned. You have returned undefined.",k(Z))})),X.__reactInternalSnapshotBeforeUpdate=V}catch(z){v0(Z,Z.return,z)}}function yz(Z,X,J){J.props=N4(Z.type,Z.memoizedProps),J.state=Z.memoizedState,d3(Z)?(i3(),$1(Z,_O,Z,X,J),r3()):$1(Z,_O,Z,X,J)}function Ph(Z){var X=Z.ref;if(X!==null){switch(Z.tag){case 26:case 27:case 5:var J=Z.stateNode;break;case 30:J=Z.stateNode;break;default:J=Z.stateNode}if(typeof X==="function")if(d3(Z))try{i3(),Z.refCleanup=X(J)}finally{r3()}else Z.refCleanup=X(J);else typeof X==="string"?console.error("String refs are no longer supported."):X.hasOwnProperty("current")||console.error("Unexpected ref object provided for %s. Use either a ref-setter function or React.createRef().",k(Z)),X.current=J}}function $H(Z,X){try{$1(Z,Ph,Z)}catch(J){v0(Z,X,J)}}function a3(Z,X){var{ref:J,refCleanup:K}=Z;if(J!==null)if(typeof K==="function")try{if(d3(Z))try{i3(),$1(Z,K)}finally{r3(Z)}else $1(Z,K)}catch(w){v0(Z,X,w)}finally{Z.refCleanup=null,Z=Z.alternate,Z!=null&&(Z.refCleanup=null)}else if(typeof J==="function")try{if(d3(Z))try{i3(),$1(Z,J,null)}finally{r3(Z)}else $1(Z,J,null)}catch(w){v0(Z,X,w)}else J.current=null}function Iz(Z,X,J,K){var w=Z.memoizedProps,V=w.id,z=w.onCommit;w=w.onRender,X=X===null?"mount":"update",XJ&&(X="nested-update"),typeof w==="function"&&w(V,X,Z.actualDuration,Z.treeBaseDuration,Z.actualStartTime,J),typeof z==="function"&&z(V,X,K,J)}function Nh(Z,X,J,K){var w=Z.memoizedProps;Z=w.id,w=w.onPostCommit,X=X===null?"mount":"update",XJ&&(X="nested-update"),typeof w==="function"&&w(Z,X,K,J)}function vz(Z){var{type:X,memoizedProps:J,stateNode:K}=Z;try{$1(Z,rh,K,X,J,Z)}catch(w){v0(Z,Z.return,w)}}function pK(Z,X,J){try{$1(Z,dh,Z.stateNode,Z.type,J,X,Z)}catch(K){v0(Z,Z.return,K)}}function Sz(Z){return Z.tag===5||Z.tag===3||Z.tag===26||Z.tag===27&&R9(Z.type)||Z.tag===4}function rK(Z){H:for(;;){for(;Z.sibling===null;){if(Z.return===null||Sz(Z.return))return null;Z=Z.return}Z.sibling.return=Z.return;for(Z=Z.sibling;Z.tag!==5&&Z.tag!==6&&Z.tag!==18;){if(Z.tag===27&&R9(Z.type))continue H;if(Z.flags&2)continue H;if(Z.child===null||Z.tag===4)continue H;else Z.child.return=Z,Z=Z.child}if(!(Z.flags&2))return Z.stateNode}}function iK(Z,X,J){var K=Z.tag;if(K===5||K===6)Z=Z.stateNode,X?(lR(J),(J.nodeType===9?J.body:J.nodeName==="HTML"?J.ownerDocument.body:J).insertBefore(Z,X)):(lR(J),X=J.nodeType===9?J.body:J.nodeName==="HTML"?J.ownerDocument.body:J,X.appendChild(Z),J=J._reactRootContainer,J!==null&&J!==void 0||X.onclick!==null||(X.onclick=M6));else if(K!==4&&(K===27&&R9(Z.type)&&(J=Z.stateNode,X=null),Z=Z.child,Z!==null))for(iK(Z,X,J),Z=Z.sibling;Z!==null;)iK(Z,X,J),Z=Z.sibling}function Rq(Z,X,J){var K=Z.tag;if(K===5||K===6)Z=Z.stateNode,X?J.insertBefore(Z,X):J.appendChild(Z);else if(K!==4&&(K===27&&R9(Z.type)&&(J=Z.stateNode),Z=Z.child,Z!==null))for(Rq(Z,X,J),Z=Z.sibling;Z!==null;)Rq(Z,X,J),Z=Z.sibling}function Mh(Z){for(var X,J=Z.return;J!==null;){if(Sz(J)){X=J;break}J=J.return}if(X==null)throw Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.");switch(X.tag){case 27:X=X.stateNode,J=rK(Z),Rq(Z,J,X);break;case 5:J=X.stateNode,X.flags&32&&(fR(J),X.flags&=-33),X=rK(Z),Rq(Z,X,J);break;case 3:case 4:X=X.stateNode.containerInfo,J=rK(Z),iK(Z,J,X);break;default:throw Error("Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.")}}function Tz(Z){var{stateNode:X,memoizedProps:J}=Z;try{$1(Z,W_,Z.type,J,X,Z)}catch(K){v0(Z,Z.return,K)}}function Az(Z,X){return X.tag===31?(X=X.memoizedState,Z.memoizedState!==null&&X===null):X.tag===13?(Z=Z.memoizedState,X=X.memoizedState,Z!==null&&Z.dehydrated!==null&&(X===null||X.dehydrated===null)):X.tag===3?Z.memoizedState.isDehydrated&&(X.flags&256)===0:!1}function Ch(Z,X){if(Z=Z.containerInfo,rw=TJ,Z=eU(Z),EY(Z)){if("selectionStart"in Z)var J={start:Z.selectionStart,end:Z.selectionEnd};else H:{J=(J=Z.ownerDocument)&&J.defaultView||window;var K=J.getSelection&&J.getSelection();if(K&&K.rangeCount!==0){J=K.anchorNode;var{anchorOffset:w,focusNode:V}=K;K=K.focusOffset;try{J.nodeType,V.nodeType}catch(D1){J=null;break H}var z=0,N=-1,D=-1,g=0,i=0,d=Z,T=null;Z:for(;;){for(var e;;){if(d!==J||w!==0&&d.nodeType!==3||(N=z+w),d!==V||K!==0&&d.nodeType!==3||(D=z+K),d.nodeType===3&&(z+=d.nodeValue.length),(e=d.firstChild)===null)break;T=d,d=e}for(;;){if(d===Z)break Z;if(T===J&&++g===w&&(N=z),T===V&&++i===K&&(D=z),(e=d.nextSibling)!==null)break;d=T,T=d.parentNode}d=e}J=N===-1||D===-1?null:{start:N,end:D}}else J=null}J=J||{start:0,end:0}}else J=null;iw={focusedElem:Z,selectionRange:J},TJ=!1;for(T5=X;T5!==null;)if(X=T5,Z=X.child,(X.subtreeFlags&1028)!==0&&Z!==null)Z.return=X,T5=Z;else for(;T5!==null;){switch(Z=X=T5,J=Z.alternate,w=Z.flags,Z.tag){case 0:if((w&4)!==0&&(Z=Z.updateQueue,Z=Z!==null?Z.events:null,Z!==null))for(J=0;J title"));p5(g,N,z),g[r5]=Z,p1(g),N=g;break H;case"link":var i=Hj("link","href",D).get(N+(z.href||""));if(i){for(var d=0;dK||console.timeStamp("Blocked",ZZ,w,t2,void 0,5>K?"primary-light":10>K?"primary":100>K?"primary-dark":"error"))}}V=(J=!J&&(X&127)===0&&(X&Z.expiredLanes)===0||P6(Z,X))?Gh(Z,X):sK(Z,X,!0);var z=J;do{if(V===l6){z8&&!J&&B9(Z,X,0,!1),X=A0,ZZ=O5(),NO=X;break}else{if(K=v5(),w=Z.current.alternate,z&&!Dh(w)){I2(X),w=S5,V=K,!i0||V<=w||(K5?K5.run(console.timeStamp.bind(console,"Teared Render",w,V,j0,R0,"error")):console.timeStamp("Teared Render",w,V,j0,R0,"error")),C4(X,K),V=sK(Z,X,!1),z=!1;continue}if(V===S4){if(z=X,Z.errorRecoveryDisabledLanes&z)var N=0;else N=Z.pendingLanes&-536870913,N=N!==0?N:N&536870912?536870912:0;if(N!==0){I2(X),_Y(S5,K,X,K5),C4(X,K),X=N;H:{K=Z,V=z,z=NZ;var D=K.current.memoizedState.isDehydrated;if(D&&(v7(K,N).flags|=256),N=sK(K,N,!1),N!==S4){if(Ew&&!D){K.errorRecoveryDisabledLanes|=V,S9|=V,V=y9;break H}K=B2,B2=z,K!==null&&(B2===null?B2=K:B2.push.apply(B2,K))}V=N}if(z=!1,V!==S4)continue;else K=v5()}}if(V===jZ){I2(X),_Y(S5,K,X,K5),C4(X,K),v7(Z,0),B9(Z,X,0,!0);break}H:{switch(J=Z,V){case l6:case jZ:throw Error("Root did not complete. This is a bug in React.");case y9:if((X&4194048)!==X)break;case BJ:I2(X),XB(S5,K,X,K5),C4(X,K),w=X,(w&127)!==0?eq=K:(w&4194048)!==0&&(HJ=K),B9(J,X,E2,!I9);break H;case S4:B2=null;break;case UJ:case BP:break;default:throw Error("Unknown root exit status.")}if(X1.actQueue!==null)nK(J,w,X,B2,MZ,jJ,E2,S9,m4,V,null,null,S5,K);else{if((X&62914560)===X&&(z=OJ+jP-v5(),10w&&(J=w):J=w,0J&&(N=J):N=J,D!==null&&J>N){var T=g?"secondary-light":"warning";K?K.run(console.timeStamp.bind(console,g?"Consecutive":"Event: "+D,N,J,j0,R0,T)):console.timeStamp(g?"Consecutive":"Event: "+D,N,J,j0,R0,T)}w>J&&(N=i?"error":(X&738197653)===X?"tertiary-light":"primary-light",i=d?"Promise Resolved":i?"Cascading Update":5V&&(J=V):J=V,0J&&(w=J):w=J,0w&&(d=w):d=w,w>d&&N!==null&&(T=D?"secondary-light":"warning",K?K.run(console.timeStamp.bind(console,D?"Consecutive":"Event: "+N,d,w,j0,R0,T)):console.timeStamp(D?"Consecutive":"Event: "+N,d,w,j0,R0,T)),J>w&&(K?K.run(console.timeStamp.bind(console,"Action",w,J,j0,R0,"primary-dark")):console.timeStamp("Action",w,J,j0,R0,"primary-dark")),V>J&&(w=g?"Promise Resolved":5r0&&(z=r0,r0=_1,_1=z);var $0=oU(N,_1),S=oU(N,r0);if($0&&S&&(e.rangeCount!==1||e.anchorNode!==$0.node||e.anchorOffset!==$0.offset||e.focusNode!==S.node||e.focusOffset!==S.offset)){var u=d.createRange();u.setStart($0.node,$0.offset),e.removeAllRanges(),_1>r0?(e.addRange(u),e.extend(S.node,S.offset)):(u.setEnd(S.node,S.offset),e.addRange(u))}}}}d=[];for(e=N;e=e.parentNode;)e.nodeType===1&&d.push({element:e,left:e.scrollLeft,top:e.scrollTop});typeof N.focus==="function"&&N.focus();for(N=0;NJ?q6:J;J=X1.T;var w=S0.p;try{S0.p=K,X1.T=null;var V=vw;vw=null,K=m9;var z=$3;if(b5=A9,R8=m9=null,$3=0,(E0&(g5|d2))!==A5)throw Error("Cannot flush passive effects while already rendering.");I2(z),Tw=!0,CJ=!1;var N=0;if(S6=null,N=v5(),D3===PP)wH(v6,N,A6);else{var D=v6,g=N,i=D3===_w;!i0||g<=D||(K5?K5.run(console.timeStamp.bind(console,i?"Waiting for Paint":"Waiting",D,g,j0,R0,"secondary-light")):console.timeStamp(i?"Waiting for Paint":"Waiting",D,g,j0,R0,"secondary-light"))}D=E0,E0|=d2;var d=K.current;rX(),oz(d);var T=K.current;d=Iw,rX(),az(K,T,z,V,d),NR(K),E0=D;var e=v5();if(T=N,d=K5,S6!==null?JB(T,e,S6,!0,d):!i0||e<=T||(d?d.run(console.timeStamp.bind(console,"Remaining Effects",T,e,j0,R0,"secondary-dark")):console.timeStamp("Remaining Effects",T,e,j0,R0,"secondary-dark")),C4(z,e),xH(0,!1),CJ?K===bZ?u4++:(u4=0,bZ=K):u4=0,CJ=Tw=!1,s5&&typeof s5.onPostCommitFiberRoot==="function")try{s5.onPostCommitFiberRoot(l7,K)}catch(_1){Z6||(Z6=!0,console.error("React instrumentation encountered an error: %o",_1))}var D1=K.current.stateNode;return D1.effectDuration=0,D1.passiveEffectDuration=0,!0}finally{S0.p=w,X1.T=J,zR(Z,X)}}function jR(Z,X,J){X=v2(J,X),PB(X),X=EK(Z.stateNode,X,2),Z=L9(Z,X,2),Z!==null&&(y1(Z,2),n3(Z))}function v0(Z,X,J){if(j8=!1,Z.tag===3)jR(Z,Z,J);else{for(;X!==null;){if(X.tag===3){jR(X,Z,J);return}if(X.tag===1){var K=X.stateNode;if(typeof X.type.getDerivedStateFromError==="function"||typeof K.componentDidCatch==="function"&&(T9===null||!T9.has(K))){Z=v2(J,Z),PB(Z),J=xK(2),K=L9(X,J,2),K!==null&&(hK(J,K,X,Z),y1(K,2),n3(K));return}}X=X.return}console.error(`Internal React error: Attempted to capture a commit phase error inside a detached tree. This indicates a bug in React. Potential causes include deleting the same fiber more than once, committing an already-finished tree, or an inconsistent return pointer. Error message: @@ -163,7 +163,7 @@ act(() => { }); /* assert on the output */ -This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act`),f0===Z&&(F0&J)===J&&(Z5===y9||Z5===UJ&&(F0&62914560)===F0&&v5()-OJ { }); /* assert on the output */ -This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act`,k(Z))})}function n3(Z){Z!==j8&&Z.next===null&&(j8===null?$J=j8=Z:j8=j8.next=Z),DJ=!0,X1.actQueue!==null?mw||(mw=!0,DR()):Aw||(Aw=!0,DR())}function xH(Z,X){if(!uw&&DJ){uw=!0;do{var J=!1;for(var K=$J;K!==null;){if(!X)if(Z!==0){var w=K.pendingLanes;if(w===0)var V=0;else{var{suspendedLanes:z,pingedLanes:N}=K;V=(1<<31-K2(42|Z)+1)-1,V&=w&~(z&~N),V=V&201326741?V&201326741|1:V?V|2:0}V!==0&&(J=!0,$R(K,V))}else V=F0,V=O6(K,K===f0?V:0,K.cancelPendingCommit!==null||K.timeoutHandle!==p4),(V&3)===0||P6(K,V)||(J=!0,$R(K,V));K=K.next}}while(J);uw=!1}}function Sh(){gZ=window.event,eK()}function eK(){DJ=mw=Aw=!1;var Z=0;u9!==0&&lh()&&(Z=u9);for(var X=v5(),J=null,K=$J;K!==null;){var w=K.next,V=CR(K,X);if(V===0)K.next=null,J===null?$J=w:J.next=w,w===null&&(j8=J);else if(J=K,Z!==0||(V&3)!==0)DJ=!0;K=w}b5!==A9&&b5!==MJ||xH(Z,!1),u9!==0&&(u9=0)}function CR(Z,X){for(var{suspendedLanes:J,pingedLanes:K,expirationTimes:w}=Z,V=Z.pendingLanes&-62914561;0 or