diff --git a/bun.lock b/bun.lock index 57e1f4cff..130db6fe1 100644 --- a/bun.lock +++ b/bun.lock @@ -109,8 +109,8 @@ }, }, "overrides": { - "ws": "8.17.1", "prosemirror-state": "1.4.3", + "ws": "8.17.1", }, "packages": { "@adobe/css-tools": ["@adobe/css-tools@4.4.4", "", {}, "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg=="], @@ -631,49 +631,55 @@ "@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.54.0", "", { "os": "android", "cpu": "arm" }, "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.55.1", "", { "os": "android", "cpu": "arm" }, "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.55.1", "", { "os": "android", "cpu": "arm64" }, "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.55.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.55.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.54.0", "", { "os": "android", "cpu": "arm64" }, "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.55.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.54.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.55.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.54.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.54.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.55.1", "", { "os": "linux", "cpu": "arm" }, "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.54.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.54.0", "", { "os": "linux", "cpu": "arm" }, "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.55.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.54.0", "", { "os": "linux", "cpu": "arm" }, "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.54.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng=="], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.54.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.54.0", "", { "os": "linux", "cpu": "none" }, "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw=="], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.55.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.54.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.54.0", "", { "os": "linux", "cpu": "none" }, "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.55.1", "", { "os": "linux", "cpu": "none" }, "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.54.0", "", { "os": "linux", "cpu": "none" }, "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.55.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.54.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.54.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.55.1", "", { "os": "linux", "cpu": "x64" }, "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.54.0", "", { "os": "linux", "cpu": "x64" }, "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw=="], + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.55.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.54.0", "", { "os": "none", "cpu": "arm64" }, "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.55.1", "", { "os": "none", "cpu": "arm64" }, "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.54.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.55.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.54.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.55.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.54.0", "", { "os": "win32", "cpu": "x64" }, "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ=="], + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.54.0", "", { "os": "win32", "cpu": "x64" }, "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.55.1", "", { "os": "win32", "cpu": "x64" }, "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw=="], "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="], @@ -975,7 +981,7 @@ "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="], - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], "aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], @@ -1115,7 +1121,7 @@ "cssstyle": ["cssstyle@2.3.0", "", { "dependencies": { "cssom": "~0.3.6" } }, "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A=="], - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "data-urls": ["data-urls@3.0.2", "", { "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0" } }, "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ=="], @@ -1175,7 +1181,7 @@ "empathic": ["empathic@2.0.0", "", {}, "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA=="], - "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], @@ -1279,7 +1285,7 @@ "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], - "framer-motion": ["framer-motion@12.23.26", "", { "dependencies": { "motion-dom": "^12.23.23", "motion-utils": "^12.23.6", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-cPcIhgR42xBn1Uj+PzOyheMtZ73H927+uWPDVhUMqxy8UHt6Okavb6xIz9J/phFUHUj0OncR6UvMfJTXoc/LKA=="], + "framer-motion": ["framer-motion@12.23.28", "", { "dependencies": { "motion-dom": "^12.23.28", "motion-utils": "^12.23.28", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-AXLnVEC/HHWp6Va1l9xl6cIM4SgdZAmgPLGy/h9w07NOxg0njva/A+3uBE3QUQ3uooi8c8c8HPn/8Md9ol0glg=="], "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], @@ -1661,11 +1667,11 @@ "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], - "motion": ["motion@12.23.26", "", { "dependencies": { "framer-motion": "^12.23.26", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-Ll8XhVxY8LXMVYTCfme27WH2GjBrCIzY4+ndr5QKxsK+YwCtOi2B/oBi5jcIbik5doXuWT/4KKDOVAZJkeY5VQ=="], + "motion": ["motion@12.23.28", "", { "dependencies": { "framer-motion": "^12.23.28", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-M82p8rtXO6As30R5Pjrg02l0S6r/wkc8iQO5Db7cxxc/Bz3rLFek2AYp2hVeREdREycVD0HFKGVLW7tPVzgmWQ=="], - "motion-dom": ["motion-dom@12.23.23", "", { "dependencies": { "motion-utils": "^12.23.6" } }, "sha512-n5yolOs0TQQBRUFImrRfs/+6X4p3Q4n1dUEqt/H58Vx7OW6RF+foWEgmTVDhIWJIMXOuNNL0apKH2S16en9eiA=="], + "motion-dom": ["motion-dom@12.23.28", "", { "dependencies": { "motion-utils": "^12.23.28" } }, "sha512-XxQ0QDS7nXjug1Q4Z7hwD1DPDM+zJvgteSlQABse1N4F22q6wRLLjBEeMelvJrZNPp9UeS4Q3AVpWzWBLHLmew=="], - "motion-utils": ["motion-utils@12.23.6", "", {}, "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ=="], + "motion-utils": ["motion-utils@12.23.28", "", {}, "sha512-0W6cWd5Okoyf8jmessVK3spOmbyE0yTdNKujHctHH9XdAE4QDuZ1/LjSXC68rrhsJU+TkzXURC5OdSWh9ibOwQ=="], "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], @@ -1763,7 +1769,7 @@ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], @@ -1841,7 +1847,7 @@ "react-dropzone": ["react-dropzone@14.3.8", "", { "dependencies": { "attr-accept": "^2.2.4", "file-selector": "^2.1.0", "prop-types": "^15.8.1" }, "peerDependencies": { "react": ">= 16.8 || 18.0.0" } }, "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug=="], - "react-is": ["react-is@18.2.0", "", {}, "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="], + "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], "react-markdown": ["react-markdown@10.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "peerDependencies": { "@types/react": ">=18", "react": ">=18" } }, "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ=="], @@ -1887,7 +1893,7 @@ "rolldown-plugin-dts": ["rolldown-plugin-dts@0.15.10", "", { "dependencies": { "@babel/generator": "^7.28.3", "@babel/parser": "^7.28.3", "@babel/types": "^7.28.2", "ast-kit": "^2.1.2", "birpc": "^2.5.0", "debug": "^4.4.1", "dts-resolver": "^2.1.2", "get-tsconfig": "^4.10.1" }, "peerDependencies": { "@typescript/native-preview": ">=7.0.0-dev.20250601.1", "rolldown": "^1.0.0-beta.9", "typescript": "^5.0.0", "vue-tsc": "~3.0.3" }, "optionalPeers": ["@typescript/native-preview", "typescript", "vue-tsc"] }, "sha512-8cPVAVQUo9tYAoEpc3jFV9RxSil13hrRRg8cHC9gLXxRMNtWPc1LNMSDXzjyD+5Vny49sDZH77JlXp/vlc4I3g=="], - "rollup": ["rollup@4.54.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.54.0", "@rollup/rollup-android-arm64": "4.54.0", "@rollup/rollup-darwin-arm64": "4.54.0", "@rollup/rollup-darwin-x64": "4.54.0", "@rollup/rollup-freebsd-arm64": "4.54.0", "@rollup/rollup-freebsd-x64": "4.54.0", "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", "@rollup/rollup-linux-arm-musleabihf": "4.54.0", "@rollup/rollup-linux-arm64-gnu": "4.54.0", "@rollup/rollup-linux-arm64-musl": "4.54.0", "@rollup/rollup-linux-loong64-gnu": "4.54.0", "@rollup/rollup-linux-ppc64-gnu": "4.54.0", "@rollup/rollup-linux-riscv64-gnu": "4.54.0", "@rollup/rollup-linux-riscv64-musl": "4.54.0", "@rollup/rollup-linux-s390x-gnu": "4.54.0", "@rollup/rollup-linux-x64-gnu": "4.54.0", "@rollup/rollup-linux-x64-musl": "4.54.0", "@rollup/rollup-openharmony-arm64": "4.54.0", "@rollup/rollup-win32-arm64-msvc": "4.54.0", "@rollup/rollup-win32-ia32-msvc": "4.54.0", "@rollup/rollup-win32-x64-gnu": "4.54.0", "@rollup/rollup-win32-x64-msvc": "4.54.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw=="], + "rollup": ["rollup@4.55.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.55.1", "@rollup/rollup-android-arm64": "4.55.1", "@rollup/rollup-darwin-arm64": "4.55.1", "@rollup/rollup-darwin-x64": "4.55.1", "@rollup/rollup-freebsd-arm64": "4.55.1", "@rollup/rollup-freebsd-x64": "4.55.1", "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", "@rollup/rollup-linux-arm-musleabihf": "4.55.1", "@rollup/rollup-linux-arm64-gnu": "4.55.1", "@rollup/rollup-linux-arm64-musl": "4.55.1", "@rollup/rollup-linux-loong64-gnu": "4.55.1", "@rollup/rollup-linux-loong64-musl": "4.55.1", "@rollup/rollup-linux-ppc64-gnu": "4.55.1", "@rollup/rollup-linux-ppc64-musl": "4.55.1", "@rollup/rollup-linux-riscv64-gnu": "4.55.1", "@rollup/rollup-linux-riscv64-musl": "4.55.1", "@rollup/rollup-linux-s390x-gnu": "4.55.1", "@rollup/rollup-linux-x64-gnu": "4.55.1", "@rollup/rollup-linux-x64-musl": "4.55.1", "@rollup/rollup-openbsd-x64": "4.55.1", "@rollup/rollup-openharmony-arm64": "4.55.1", "@rollup/rollup-win32-arm64-msvc": "4.55.1", "@rollup/rollup-win32-ia32-msvc": "4.55.1", "@rollup/rollup-win32-x64-gnu": "4.55.1", "@rollup/rollup-win32-x64-msvc": "4.55.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A=="], "rope-sequence": ["rope-sequence@1.3.4", "", {}, "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ=="], @@ -2229,11 +2235,9 @@ "@svgr/core/camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], - "@testing-library/jest-dom/dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], - - "@types/react/csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + "@svgr/hast-util-to-babel-ast/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - "@types/styled-components/csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + "@testing-library/jest-dom/dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], @@ -2261,6 +2265,8 @@ "cssstyle/cssom": ["cssom@0.3.8", "", {}, "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="], + "downshift/react-is": ["react-is@18.2.0", "", {}, "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="], + "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "eslint/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], @@ -2285,8 +2291,6 @@ "jest-util/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "jsdom/tough-cookie": ["tough-cookie@4.1.4", "", { "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag=="], "log-symbols/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], @@ -2295,6 +2299,10 @@ "make-dir/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "markdown-it/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "markdown-it/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "merge-source-map/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -2305,12 +2313,8 @@ "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], - "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - "pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], - "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], "react-docgen/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], @@ -2335,14 +2339,16 @@ "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + "styled-components/csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "styled-components/postcss": ["postcss@8.4.49", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA=="], + "styled-components/tslib": ["tslib@2.6.2", "", {}, "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="], "tsdown/semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "vite/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - "vite-plugin-istanbul/espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], @@ -2363,6 +2369,8 @@ "@equinor/eds-data-grid-react/@tanstack/react-virtual/@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.16", "", {}, "sha512-njazUC8mDkrxWmyZmn/3eXrDcP8Msb3chSr4q6a65RmwdSbMlMCdnOphv6/8mLO7O3Fuza5s4M4DclmvAO5w0w=="], + "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], @@ -2383,6 +2391,8 @@ "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "cosmiconfig/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "eslint/find-up/locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], "eslint/find-up/path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], diff --git a/src/atoms/utils/environmentToggle.ts b/src/atoms/utils/environmentToggle.ts index b7b140615..7469b9ee0 100644 --- a/src/atoms/utils/environmentToggle.ts +++ b/src/atoms/utils/environmentToggle.ts @@ -38,15 +38,6 @@ const VARIANT_COLORS: Record = { }, }; -const DEFAULT_COLORS: ColorConfig = { - border: colors.interactive.warning__resting.rgba, - background: colors.interactive.warning__text.rgba, - chipBackground: colors.interactive.warning__resting.rgba, - outline: colors.interactive.warning__resting.rgba, -}; - -export function getVariantColors( - variant: StatusVariant | undefined -): ColorConfig { - return variant ? VARIANT_COLORS[variant] : DEFAULT_COLORS; +export function getVariantColors(variant: StatusVariant): ColorConfig { + return VARIANT_COLORS[variant]; } diff --git a/src/molecules/Banner/Banner.stories.tsx b/src/molecules/Banner/Banner.stories.tsx index 98b5ff20f..f6b06662d 100644 --- a/src/molecules/Banner/Banner.stories.tsx +++ b/src/molecules/Banner/Banner.stories.tsx @@ -89,6 +89,6 @@ export const Compact: Story = { }, play: async ({ canvas, args }) => { const container = canvas.getByText(args.children as string); - await expect(container.parentElement).toHaveStyle('padding: 8px'); + await expect(container.parentElement).toHaveStyle('padding: 4px 8px'); }, }; diff --git a/src/molecules/Select/ComboBox/ComboBox.stories.tsx b/src/molecules/Select/ComboBox/ComboBox.stories.tsx index 49d091e51..3308b5565 100644 --- a/src/molecules/Select/ComboBox/ComboBox.stories.tsx +++ b/src/molecules/Select/ComboBox/ComboBox.stories.tsx @@ -119,7 +119,7 @@ export const BasicComboBox: StoryFn = (args) => { ); }; -export const ComboBoxWithReallyLongName: StoryFn = (args) => { +export const ReallyLongName: StoryFn = (args) => { const [values, setValues] = useState[]>([]); const handleOnSelect = ( @@ -140,7 +140,7 @@ export const ComboBoxWithReallyLongName: StoryFn = (args) => { ); }; -export const ComboBoxWithGroups: StoryFn = (args) => { +export const Groups: StoryFn = (args) => { const [values, setValues] = useState[]>([]); const handleOnSelect = ( @@ -161,7 +161,7 @@ export const ComboBoxWithGroups: StoryFn = (args) => { ); }; -export const ComboBoxParented: StoryFn = (args) => { +export const Parented: StoryFn = (args) => { const [values, setValues] = useState[]>([]); const handleOnSelect = ( @@ -182,7 +182,7 @@ export const ComboBoxParented: StoryFn = (args) => { ); }; -export const ComboBoxInDialog: StoryFn = (args) => { +export const InDialog: StoryFn = (args) => { const [openDialog, setOpenDialog] = useState(false); const [values, setValues] = useState[]>([]); const [openComboBox, setOpenComboBox] = useState(false); @@ -225,7 +225,7 @@ export const ComboBoxInDialog: StoryFn = (args) => { ); }; -export const ComboBoxWithAdd: StoryFn = (args) => { +export const AddFunctionality: StoryFn = (args) => { const [items, setItems] = useState([...FAKE_ITEMS]); const [values, setValues] = useState[]>([]); const handleOnSelect = (newValues: SelectOptionRequired[]) => { @@ -277,7 +277,7 @@ const CustomValueElement: FC<{ ); -export const ComboBoxWithCustomValueElements: StoryFn = (args) => { +export const CustomizableValueElement: StoryFn = (args) => { const [values, setValues] = useState[]>([]); const handleOnSelect = ( @@ -299,7 +299,7 @@ export const ComboBoxWithCustomValueElements: StoryFn = (args) => { ); }; -export const ComboBoxWithSelectedValuesAsText: StoryFn = (args) => { +export const SelectedValuesAsText: StoryFn = (args) => { const [values, setValues] = useState[]>([]); const handleOnSelect = ( @@ -321,9 +321,7 @@ export const ComboBoxWithSelectedValuesAsText: StoryFn = (args) => { ); }; -export const ComboBoxWithCustomSelectedValuesAsTextFunction: StoryFn = ( - args -) => { +export const CustomSelectedValuesAsTextFunction: StoryFn = (args) => { const [values, setValues] = useState[]>([]); const handleOnSelect = ( @@ -358,7 +356,7 @@ const CustomMenuItem: FC<{ ); -export const ComboboxWithCustomizableSelectMenuItem: StoryFn = (args) => { +export const CustomizableMenuItem: StoryFn = (args) => { const [values, setValues] = useState[]>([]); const handleOnSelect = ( diff --git a/src/molecules/Select/ComboBox/ComboBox.test.tsx b/src/molecules/Select/ComboBox/ComboBox.test.tsx index 7616275c1..0c626657d 100644 --- a/src/molecules/Select/ComboBox/ComboBox.test.tsx +++ b/src/molecules/Select/ComboBox/ComboBox.test.tsx @@ -664,22 +664,102 @@ const CustomValueElement: FC<{ ); -test('Custom value component', () => { - const label = faker.animal.bear(); - const items = fakeSelectItems(); - const handler = vi.fn(); +describe('Custom value component', () => { + test('Renders', () => { + const label = faker.animal.bear(); + const items = fakeSelectItems(); + const handler = vi.fn(); - render( - - ); + render( + + ); + + const customChip = screen + .getByText('custom') + .closest('.amplify-combo-box-chip'); + + expect(customChip).toBeInTheDocument(); + }); + + test('Removal by clicking', async () => { + const label = faker.animal.bear(); + const items = fakeSelectItems(); + const handler = vi.fn(); + + const { rerender } = render( + + ); - expect(screen.getByText('custom')).toBeInTheDocument(); + const user = userEvent.setup(); + const customChip = screen + .getByText('custom') + .closest('.amplify-combo-box-chip'); + + await user.click(customChip!); + + expect(handler).toHaveBeenCalledWith([], items[0]); + + rerender( + + ); + + expect(screen.queryByText('custom')).not.toBeInTheDocument(); + }); + + test('Removal by backspace', async () => { + const label = faker.animal.bear(); + const items = fakeSelectItems(); + const handler = vi.fn(); + + const { rerender } = render( + + ); + + const user = userEvent.setup(); + const searchField = screen.getByRole('combobox'); + + await user.click(searchField); + await user.keyboard('{Backspace}'); + await user.keyboard('{Backspace}'); + + expect(handler).toHaveBeenCalledWith([], items[0]); + + rerender( + + ); + + expect(screen.queryByText('custom')).not.toBeInTheDocument(); + }); }); test('showSelectedValuesAsText', async () => { diff --git a/src/molecules/Select/DynamicMenuItem.tsx b/src/molecules/Select/DynamicMenuItem.tsx index d037c6686..5295e4720 100644 --- a/src/molecules/Select/DynamicMenuItem.tsx +++ b/src/molecules/Select/DynamicMenuItem.tsx @@ -1,4 +1,4 @@ -import { KeyboardEvent, MouseEvent, ReactNode, useMemo } from 'react'; +import { KeyboardEvent, MouseEvent, useMemo } from 'react'; import { checkbox, checkbox_outline } from '@equinor/eds-icons'; @@ -22,14 +22,12 @@ interface DynamicMenuItemProps { menuItemProps: SingleSelectMenuItemProps | MultiSelectMenuItemProps; isSelected: boolean; handleOnParentKeyDown?: (event: KeyboardEvent) => void; - children?: ReactNode; } export const DynamicMenuItem = ({ menuItemProps, isSelected, handleOnParentKeyDown, - children, }: DynamicMenuItemProps) => { const { index, @@ -64,8 +62,6 @@ export const DynamicMenuItem = ({ }; const itemContent = useMemo(() => { - if (children) return children; - if (CustomMenuItemComponent) { return ( @@ -90,7 +86,6 @@ export const DynamicMenuItem = ({ }, [ CustomMenuItemComponent, checkboxIcon, - children, item, menuItemProps, selectedState, diff --git a/src/molecules/Select/GroupedSelectPersistent.tsx b/src/molecules/Select/GroupedSelectPersistent.tsx index 0170f4755..e108f5621 100644 --- a/src/molecules/Select/GroupedSelectPersistent.tsx +++ b/src/molecules/Select/GroupedSelectPersistent.tsx @@ -7,11 +7,25 @@ import { NoItemsFoundText, PersistentGroupsWrapper, } from 'src/molecules/Select/Select.styles'; -import { GroupedSelectPropsCombined } from 'src/molecules/Select/Select.types'; +import { + CustomMenuItemComponentProps, + GroupedSelectProps, + MenuModeSelectProps, + MultiSelectCommon, + PersistentModeSelectProps, + SelectMenuProps, + SingleSelectCommon, +} from 'src/molecules/Select/Select.types'; import { SelectMenuItem } from 'src/molecules/Select/SelectMenuItem'; +// Ignored because is marked at not covered, and is removed at runtime so it cannot be covered. +/* c8 ignore next */ export const GroupedSelectPersistent = ( - props: GroupedSelectPropsCombined + props: GroupedSelectProps & + SelectMenuProps & + CustomMenuItemComponentProps & + (MultiSelectCommon | SingleSelectCommon) & + (PersistentModeSelectProps | MenuModeSelectProps) ) => { const { onItemSelect, @@ -27,9 +41,9 @@ export const GroupedSelectPersistent = ( return No items found; } - if ('value' in props) { - throw new Error('You cannot use SingleSelect with persistent mode'); - } + // This case never happens, since there is a check in select.tsx. This check gives the correct typescript inference. + /* c8 ignore next */ + if ('value' in props) return null; return ( diff --git a/src/molecules/Select/ListSelectPersistent.tsx b/src/molecules/Select/ListSelectPersistent.tsx index 52fa580ef..89476509f 100644 --- a/src/molecules/Select/ListSelectPersistent.tsx +++ b/src/molecules/Select/ListSelectPersistent.tsx @@ -22,6 +22,8 @@ import { import { getChildOffset } from 'src/molecules/Select/Select.utils'; import { SelectMenuItem } from 'src/molecules/Select/SelectMenuItem'; +// Ignored because is marked at not covered, and is removed at runtime so it cannot be covered. +/* c8 ignore next */ export const ListSelectPersistent = ( props: Omit, 'onAddItem'> & ListSelectMenuProps & diff --git a/src/molecules/Select/PersistentComboBox/PersistentComboBox.stories.tsx b/src/molecules/Select/PersistentComboBox/PersistentComboBox.stories.tsx index 7a8dd9152..6f05444ef 100644 --- a/src/molecules/Select/PersistentComboBox/PersistentComboBox.stories.tsx +++ b/src/molecules/Select/PersistentComboBox/PersistentComboBox.stories.tsx @@ -19,10 +19,11 @@ import { } from 'src/molecules/Select/Select.types'; import { actions } from 'storybook/actions'; +import { expect, userEvent, within } from 'storybook/test'; import styled from 'styled-components'; -const FAKE_ITEMS = new Array(10).fill(0).map(() => ({ - label: faker.animal.fish(), +const FAKE_ITEMS = new Array(10).fill(0).map((_, index) => ({ + label: `${faker.animal.fish()} #${index + 1}`, value: faker.string.uuid(), })); @@ -63,33 +64,35 @@ interface Item { const FAKE_GROUPS = new Array(faker.number.int({ min: 2, max: 4 })) .fill(0) - .map(() => ({ - title: faker.animal.lion(), - items: new Array(faker.number.int({ min: 2, max: 4 })).fill(0).map(() => ({ - label: faker.animal.fish(), - value: faker.string.uuid(), - })), + .map((_, groupIndex) => ({ + title: `${faker.animal.lion()} Group ${groupIndex + 1}`, + items: new Array(faker.number.int({ min: 2, max: 4 })) + .fill(0) + .map((_, itemIndex) => ({ + label: `${faker.animal.fish()} G${groupIndex + 1}-${itemIndex + 1}`, + value: faker.string.uuid(), + })), })); const FAKE_ITEMS_WITH_CHILDREN = [ { - label: faker.animal.fish(), + label: `${faker.animal.fish()} (Parent)`, value: faker.string.uuid(), children: new Array(faker.number.int({ min: 3, max: 3 })) .fill(0) - .map(() => ({ - label: faker.animal.fish(), + .map((_, childIndex) => ({ + label: `${faker.animal.fish()} (Child ${childIndex + 1})`, value: faker.string.uuid(), children: new Array(faker.number.int({ min: 3, max: 3 })) .fill(0) - .map(() => ({ - label: faker.animal.fish(), + .map((_, grandchildIndex) => ({ + label: `${faker.animal.fish()} (Grandchild ${childIndex + 1}.${grandchildIndex + 1})`, value: faker.string.uuid(), })), })), }, - ...new Array(5).fill(0).map(() => ({ - label: faker.animal.fish(), + ...new Array(5).fill(0).map((_, index) => ({ + label: `${faker.animal.fish()} #${index + 2}`, value: faker.string.uuid(), })), ]; @@ -159,9 +162,58 @@ const PersistentComboBoxWithAddState = ( export const BasicPersistentComboBox: Story = { render: (args) => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const itemsToVerify = [FAKE_ITEMS[0], FAKE_ITEMS[1], FAKE_ITEMS[2]]; + + for (const item of itemsToVerify) { + const menuItem = canvas.getByRole('button', { name: item.label }); + await expect(menuItem).toBeInTheDocument(); + } + + await userEvent.click( + canvas.getByRole('button', { name: FAKE_ITEMS[0].label }) + ); + + for (const item of itemsToVerify) { + const menuItem = canvas.getByRole('button', { name: item.label }); + await expect(menuItem).toBeInTheDocument(); + } + + await userEvent.click( + canvas.getByRole('button', { name: FAKE_ITEMS[1].label }) + ); + + for (const item of itemsToVerify) { + const menuItem = canvas.getByRole('button', { name: item.label }); + await expect(menuItem).toBeInTheDocument(); + } + }, }; -export const PersistentComboBoxWithSmallParent: Story = { +export const Loading: Story = { + args: { + loading: true, + }, + render: (args) => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const skeletonItems = canvas.getAllByTestId('select-item-skeleton'); + + await expect(skeletonItems).toHaveLength(3); + + const menuItems = canvas.queryAllByRole('button'); + + const actualMenuItems = menuItems.filter((btn) => + FAKE_ITEMS.some((item) => btn.textContent?.includes(item.label)) + ); + await expect(actualMenuItems.length).toBe(0); + }, +}; + +export const SmallParent: Story = { render: (args) => (
), + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const searchBox = canvas.getByRole('combobox'); + const itemsToVerify = [FAKE_ITEMS[0], FAKE_ITEMS[1], FAKE_ITEMS[2]]; + + for (const item of itemsToVerify) { + const menuItem = canvas.getByRole('button', { name: item.label }); + await expect(menuItem).toBeInTheDocument(); + } + + const searchTerm = FAKE_ITEMS[0].label.substring( + 0, + Math.min(5, FAKE_ITEMS[0].label.length) + ); + await userEvent.type(searchBox, searchTerm); + + const firstMenuItem = canvas.getByRole('button', { + name: FAKE_ITEMS[0].label, + }); + await expect(firstMenuItem).toBeInTheDocument(); + + await userEvent.clear(searchBox); + + for (const item of itemsToVerify) { + const menuItem = canvas.getByRole('button', { name: item.label }); + await expect(menuItem).toBeInTheDocument(); + } + }, }; -export const PersistentComboBoxWithLargeParent: Story = { +export const LargeParent: Story = { render: (args) => (
(
), + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const itemsToVerify = [FAKE_ITEMS[0], FAKE_ITEMS[1], FAKE_ITEMS[2]]; + + for (const item of itemsToVerify) { + const menuItem = canvas.getByRole('button', { name: item.label }); + await expect(menuItem).toBeInTheDocument(); + } + + await userEvent.click( + canvas.getByRole('button', { name: FAKE_ITEMS[0].label }) + ); + + for (const item of itemsToVerify) { + const menuItem = canvas.getByRole('button', { name: item.label }); + await expect(menuItem).toBeInTheDocument(); + } + }, }; -export const PersistentComboBoxWithReallyLongName: Story = { +export const ReallyLongName: Story = { args: { items: FAKE_ITEMS_WITH_REALLY_LONG_NAMES, }, render: (args) => , }; -export const PersistentComboBoxWithLabelsAndHelperText: Story = { +export const LabelsAndHelperText: Story = { args: { label: 'Label here', helperText: 'helper text', @@ -222,31 +322,134 @@ export const PersistentComboBoxWithLabelsAndHelperText: Story = { render: (args) => , }; -export const PersistentComboBoxWithGroups: Story = { +export const Groups: Story = { args: { groups: FAKE_GROUPS, items: undefined, }, render: (args) => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const allGroupItems = FAKE_GROUPS.flatMap((g) => g.items); + const itemsToVerify = allGroupItems.slice(0, 3); // First 3 items from groups + + for (const item of itemsToVerify) { + const menuItem = canvas.getByRole('button', { name: item.label }); + await expect(menuItem).toBeInTheDocument(); + } + + await userEvent.click( + canvas.getByRole('button', { name: allGroupItems[0].label }) + ); + + for (const item of itemsToVerify) { + const menuItem = canvas.getByRole('button', { name: item.label }); + await expect(menuItem).toBeInTheDocument(); + } + }, }; -export const PersistentComboBoxParented: Story = { +export const Parented: Story = { args: { items: FAKE_ITEMS_WITH_CHILDREN, }, render: (args) => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const parentItem = FAKE_ITEMS_WITH_CHILDREN.find( + (item) => 'children' in item + ); + if (!parentItem) + throw new Error('No parent item with children found in test data'); + const firstChild = parentItem?.children[0]; + + const parentMenuItem = canvas.getByRole('button', { + name: parentItem.label, + }); + await expect(parentMenuItem).toBeInTheDocument(); + + expect( + canvas.queryByRole('button', { name: firstChild.label }) + ).not.toBeInTheDocument(); + + const toggleButtons = canvas.getAllByTestId('toggle-button'); + await userEvent.click(toggleButtons[0]); + + const childMenuItem = canvas.getByRole('button', { + name: firstChild.label, + }); + await expect(childMenuItem).toBeInTheDocument(); + + await userEvent.click( + canvas.getByRole('button', { name: firstChild.label }) + ); + + await expect( + canvas.getByRole('button', { name: parentItem.label }) + ).toBeInTheDocument(); + await expect( + canvas.getByRole('button', { name: firstChild.label }) + ).toBeInTheDocument(); + }, }; -export const PersistentComboBoxWithAdd: Story = { +export const AddFunctionality: Story = { render: (args) => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const searchBox = canvas.getByRole('combobox'); + + await expect( + canvas.getByRole('button', { name: FAKE_ITEMS[0].label }) + ).toBeInTheDocument(); + + const newItemText = 'New Fish Item'; + await userEvent.type(searchBox, newItemText); + + await expect(canvas.getByText('Add tag')).toBeInTheDocument(); + + const addButton = canvas.getByRole('button', { + name: `Add "${newItemText}" as new tag`, + }); + await expect(addButton).toBeInTheDocument(); + + await userEvent.click(addButton); + + await userEvent.clear(searchBox); + + await expect( + canvas.getByRole('button', { name: newItemText }) + ).toBeInTheDocument(); + + const anotherItemText = 'Another Fish'; + await userEvent.type(searchBox, anotherItemText); + + await userEvent.keyboard('{Enter}'); + + await userEvent.clear(searchBox); + + await expect( + canvas.getByRole('button', { name: anotherItemText }) + ).toBeInTheDocument(); + + await expect( + canvas.getByRole('button', { name: newItemText }) + ).toBeInTheDocument(); + await expect( + canvas.getByRole('button', { name: FAKE_ITEMS[0].label }) + ).toBeInTheDocument(); + }, }; -export const PersistentComboBoxWithSelectedValuesAsText: Story = { +export const SelectedValuesAsText: Story = { args: { showSelectedAsText: true }, render: (args) => , }; -export const PersistentComboBoxWithCustomSelectedValuesAsTextFunction: Story = { +export const CustomSelectedValuesAsTextFunction: Story = { args: { showSelectedAsText: ({ selectedAmount, totalAmount }) => `${selectedAmount} of ${totalAmount} fishes selected`, @@ -276,7 +479,7 @@ const CustomValueElement: FC<{ ); -export const PersistentComboBoxWithCustomValueElements: Story = { +export const CustomValueElements: Story = { args: { customValueComponent: CustomValueElement, }, @@ -294,9 +497,128 @@ const CustomMenuItem: FC<{ ); -export const PersistentComboBoxWithCustomizableSelectMenuItem: Story = { +export const CustomizableMenuItem: Story = { args: { CustomMenuItemComponent: CustomMenuItem, }, render: (args) => , }; + +export const NoItemsFound: Story = { + tags: ['test-only'], + args: { + items: [], + }, + render: (args) => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + await expect(canvas.getByText('No items found')).toBeInTheDocument(); + + const searchBox = canvas.getByRole('combobox'); + await expect(searchBox).toBeInTheDocument(); + + await userEvent.type(searchBox, 'test search'); + await expect(canvas.getByText('No items found')).toBeInTheDocument(); + }, +}; + +export const NoItemsFoundWithGroups: Story = { + tags: ['test-only'], + args: { + groups: [], + items: undefined, + }, + render: (args) => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + await expect(canvas.getByText('No items found')).toBeInTheDocument(); + + const searchBox = canvas.getByRole('combobox'); + await expect(searchBox).toBeInTheDocument(); + + await userEvent.type(searchBox, 'test search'); + await expect(canvas.getByText('No items found')).toBeInTheDocument(); + }, +}; + +export const AddItemWithExactMatch: Story = { + tags: ['test-only'], + render: (args) => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const searchBox = canvas.getByRole('combobox'); + + const exactItemLabel = FAKE_ITEMS[0].label; + + // Type the EXACT label of an existing item (case-insensitive match) + await userEvent.type(searchBox, exactItemLabel); + + await expect(canvas.queryByText('Add tag')).not.toBeInTheDocument(); + + await expect( + canvas.getByRole('button', { name: exactItemLabel }) + ).toBeInTheDocument(); + + await userEvent.clear(searchBox); + + // Now type a partial match that will result in exactly 1 filtered item + // but doesn't match it exactly + const partialMatch = exactItemLabel.substring(0, exactItemLabel.length - 2); + await userEvent.type(searchBox, partialMatch); + + await expect(canvas.getByText('Add tag')).toBeInTheDocument(); + + await userEvent.clear(searchBox); + + // Type something that doesn't match any items + await userEvent.type(searchBox, 'NonExistentFishSpecies123'); + + await expect(canvas.getByText('Add tag')).toBeInTheDocument(); + + await userEvent.clear(searchBox); + + // Type a search that matches multiple items (e.g., just first few chars) + const multiMatch = FAKE_ITEMS[0].label.substring(0, 3); + await userEvent.type(searchBox, multiMatch); + + await expect(canvas.getByText('Add tag')).toBeInTheDocument(); + }, +}; + +export const AddItemWithCustomSingularWord: Story = { + tags: ['test-only'], + render: (args) => , + play: async ({ canvasElement }) => { + const canvas = within(canvasElement); + + const searchBox = canvas.getByRole('combobox'); + + // Type a search term that will trigger the add item UI + const searchTerm = 'NewCustomItem'; + await userEvent.type(searchBox, searchTerm); + + await expect(canvas.getByText('Add species')).toBeInTheDocument(); + await expect( + canvas.getByText('Species search results') + ).toBeInTheDocument(); + + const addButton = canvas.getByRole('button', { + name: `Add "${searchTerm}" as new species`, + }); + await expect(addButton).toBeInTheDocument(); + + await userEvent.click(addButton); + + await userEvent.clear(searchBox); + + await expect( + canvas.getByRole('button', { name: searchTerm }) + ).toBeInTheDocument(); + }, + args: { + itemSingularWord: 'species', + }, +}; diff --git a/src/molecules/Select/SearchBar.tsx b/src/molecules/Select/SearchBar.tsx index 672317f37..9ced1b02b 100644 --- a/src/molecules/Select/SearchBar.tsx +++ b/src/molecules/Select/SearchBar.tsx @@ -181,6 +181,7 @@ export const SearchBar = ({ top: '50%', transform: 'translateY(-50%)', }} + data-testid="select-loading-skeleton" /> )} diff --git a/src/molecules/Select/Select.test.tsx b/src/molecules/Select/Select.test.tsx index 39fef94ff..a509b78bb 100644 --- a/src/molecules/Select/Select.test.tsx +++ b/src/molecules/Select/Select.test.tsx @@ -885,3 +885,31 @@ test('Shows expected word for item when providing prop', async () => { expect(screen.getByText(`${word} search results`)).toBeInTheDocument(); expect(screen.getByText(`No ${word} for "test" found.`)).toBeInTheDocument(); }); + +test('Throws error when trying to use SingleSelect with persistent mode and groups', () => { + const label = faker.animal.bear(); + const handler = vi.fn(); + const groups = fakeGroups(3); + + // Suppress console.error for this test since we expect an error to be thrown + const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + + expect(() => { + render( +