Repository: refactor-group/refactor-platform-fe
Pull request #95: Add Delete User
Author: login: calebbourg
Labels: name: feature work
description: Specifically implementing a new feature
Created: 2025-04-01T10:41:46Z | Merged: 2025-04-04T17:13:18Z

## Description
This PR adds the ability for a Coach to delete a Coachee.

**Constraints:**
- The current user can only delete other users that are direct Coachees
- The current user cannot delete themself

### Changes
* Adds delete button to members page


### Screenshots / Videos Showing UI Changes (if applicable)
<img width="940" alt="Screenshot 2025-04-01 at 10 05 44" src="https://github.com/user-attachments/assets/2d504019-1b77-4844-a210-bc507d771021" />

### Testing Strategy



### Concerns
_describe any concerns that might be worth mentioning or discussing_


Diff:
diff --git a/package-lock.json b/package-lock.json
index e36d6849..49330d72 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -89,9 +89,9 @@
       }
     },
     "node_modules/@babel/runtime": {
-      "version": "7.26.9",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz",
-      "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==",
+      "version": "7.27.0",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz",
+      "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==",
       "dependencies": {
         "regenerator-runtime": "^0.14.0"
       },
@@ -99,19 +99,40 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@emnapi/core": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.0.tgz",
+      "integrity": "sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "@emnapi/wasi-threads": "1.0.1",
+        "tslib": "^2.4.0"
+      }
+    },
     "node_modules/@emnapi/runtime": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz",
-      "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.0.tgz",
+      "integrity": "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==",
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
+    "node_modules/@emnapi/wasi-threads": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz",
+      "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==",
+      "dev": true,
       "optional": true,
       "dependencies": {
         "tslib": "^2.4.0"
       }
     },
     "node_modules/@eslint-community/eslint-utils": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
-      "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+      "version": "4.5.1",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz",
+      "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==",
       "dev": true,
       "dependencies": {
         "eslint-visitor-keys": "^3.4.3"
@@ -690,15 +711,27 @@
       "resolved": "https://registry.npmjs.org/@lifeomic/attempt/-/attempt-3.1.0.tgz",
       "integrity": "sha512-QZqem4QuAnAyzfz+Gj5/+SLxqwCAw2qmt7732ZXodr6VDWGeYLG6w1i/vYLa55JQM9wRuBKLmXmiZ2P0LtE5rw=="
     },
+    "node_modules/@napi-rs/wasm-runtime": {
+      "version": "0.2.8",
+      "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.8.tgz",
+      "integrity": "sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "@emnapi/core": "^1.4.0",
+        "@emnapi/runtime": "^1.4.0",
+        "@tybys/wasm-util": "^0.9.0"
+      }
+    },
     "node_modules/@next/env": {
       "version": "15.1.2",
       "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.2.tgz",
       "integrity": "sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ=="
     },
     "node_modules/@next/eslint-plugin-next": {
-      "version": "15.1.7",
-      "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.1.7.tgz",
-      "integrity": "sha512-kRP7RjSxfTO13NE317ek3mSGzoZlI33nc/i5hs1KaWpK+egs85xg0DJ4p32QEiHnR0mVjuUfhRIun7awqfL7pQ==",
+      "version": "15.2.4",
+      "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.2.4.tgz",
+      "integrity": "sha512-O8ScvKtnxkp8kL9TpJTTKnMqlkZnS+QxwoQnJwPGBxjBbzd6OVVPEJ5/pMNrktSyXQD/chEfzfFzYLM6JANOOQ==",
       "dev": true,
       "dependencies": {
         "fast-glob": "3.3.1"
@@ -1364,7 +1397,6 @@
       "version": "1.1.6",
       "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.6.tgz",
       "integrity": "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==",
-      "license": "MIT",
       "dependencies": {
         "@radix-ui/primitive": "1.1.1",
         "@radix-ui/react-compose-refs": "1.1.1",
@@ -1894,7 +1926,6 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.2.tgz",
       "integrity": "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==",
-      "license": "MIT",
       "dependencies": {
         "@radix-ui/react-primitive": "2.0.2"
       },
@@ -1949,7 +1980,6 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz",
       "integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==",
-      "license": "MIT",
       "dependencies": {
         "@radix-ui/react-compose-refs": "1.1.1"
       },
@@ -2057,7 +2087,6 @@
       "version": "1.1.8",
       "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz",
       "integrity": "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==",
-      "license": "MIT",
       "dependencies": {
         "@radix-ui/primitive": "1.1.1",
         "@radix-ui/react-compose-refs": "1.1.1",
@@ -2236,9 +2265,9 @@
       "dev": true
     },
     "node_modules/@rushstack/eslint-patch": {
-      "version": "1.10.5",
-      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.5.tgz",
-      "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==",
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz",
+      "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==",
       "dev": true
     },
     "node_modules/@swc/counter": {
@@ -2269,9 +2298,9 @@
       }
     },
     "node_modules/@tiptap/core": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.11.5.tgz",
-      "integrity": "sha512-jb0KTdUJaJY53JaN7ooY3XAxHQNoMYti/H6ANo707PsLXVeEqJ9o8+eBup1JU5CuwzrgnDc2dECt2WIGX9f8Jw==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.11.7.tgz",
+      "integrity": "sha512-zN+NFFxLsxNEL8Qioc+DL6b8+Tt2bmRbXH22Gk6F6nD30x83eaUSFlSv3wqvgyCq3I1i1NO394So+Agmayx6rQ==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2281,9 +2310,9 @@
       }
     },
     "node_modules/@tiptap/extension-blockquote": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.11.5.tgz",
-      "integrity": "sha512-MZfcRIzKRD8/J1hkt/eYv49060GTL6qGR3NY/oTDuw2wYzbQXXLEbjk8hxAtjwNn7G+pWQv3L+PKFzZDxibLuA==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.11.7.tgz",
+      "integrity": "sha512-liD8kWowl3CcYCG9JQlVx1eSNc/aHlt6JpVsuWvzq6J8APWX693i3+zFqyK2eCDn0k+vW62muhSBe3u09hA3Zw==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2293,9 +2322,9 @@
       }
     },
     "node_modules/@tiptap/extension-bold": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.11.5.tgz",
-      "integrity": "sha512-OAq03MHEbl7MtYCUzGuwb0VpOPnM0k5ekMbEaRILFU5ZC7cEAQ36XmPIw1dQayrcuE8GZL35BKub2qtRxyC9iA==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.11.7.tgz",
+      "integrity": "sha512-VTR3JlldBixXbjpLTFme/Bxf1xeUgZZY3LTlt5JDlCW3CxO7k05CIa+kEZ8LXpog5annytZDUVtWqxrNjmsuHQ==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2305,9 +2334,9 @@
       }
     },
     "node_modules/@tiptap/extension-bubble-menu": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.11.5.tgz",
-      "integrity": "sha512-rx+rMd7EEdht5EHLWldpkzJ56SWYA9799b33ustePqhXd6linnokJCzBqY13AfZ9+xp3RsR6C0ZHI9GGea0tIA==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.11.7.tgz",
+      "integrity": "sha512-0vYqSUSSap3kk3/VT4tFE1/6StX70I3/NKQ4J68ZSFgkgyB3ZVlYv7/dY3AkEukjsEp3yN7m8Gw8ei2eEwyzwg==",
       "dependencies": {
         "tippy.js": "^6.3.7"
       },
@@ -2321,9 +2350,9 @@
       }
     },
     "node_modules/@tiptap/extension-bullet-list": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.11.5.tgz",
-      "integrity": "sha512-VXwHlX6A/T6FAspnyjbKDO0TQ+oetXuat6RY1/JxbXphH42nLuBaGWJ6pgy6xMl6XY8/9oPkTNrfJw/8/eeRwA==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.11.7.tgz",
+      "integrity": "sha512-WbPogE2/Q3e3/QYgbT1Sj4KQUfGAJNc5pvb7GrUbvRQsAh7HhtuO8hqdDwH8dEdD/cNUehgt17TO7u8qV6qeBw==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2333,9 +2362,9 @@
       }
     },
     "node_modules/@tiptap/extension-code": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.11.5.tgz",
-      "integrity": "sha512-xOvHevNIQIcCCVn9tpvXa1wBp0wHN/2umbAZGTVzS+AQtM7BTo0tz8IyzwxkcZJaImONcUVYLOLzt2AgW1LltA==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.11.7.tgz",
+      "integrity": "sha512-VpPO1Uy/eF4hYOpohS/yMOcE1C07xmMj0/D989D9aS1x95jWwUVrSkwC+PlWMUBx9PbY2NRsg1ZDwVvlNKZ6yQ==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2345,9 +2374,9 @@
       }
     },
     "node_modules/@tiptap/extension-code-block": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.11.5.tgz",
-      "integrity": "sha512-ksxMMvqLDlC+ftcQLynqZMdlJT1iHYZorXsXw/n+wuRd7YElkRkd6YWUX/Pq/njFY6lDjKiqFLEXBJB8nrzzBA==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.11.7.tgz",
+      "integrity": "sha512-To/y/2H04VWqiANy53aXjV7S6fA86c2759RsH1hTIe57jA1KyE7I5tlAofljOLZK/covkGmPeBddSPHGJbz++Q==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2358,9 +2387,9 @@
       }
     },
     "node_modules/@tiptap/extension-code-block-lowlight": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.11.5.tgz",
-      "integrity": "sha512-EIE+mAGsp8C69dI0Yyg+VH1x36rgyPJc93SfA7h4xFF6Oth18z4YhJtiLaZcwCMyOOVs2efApZ0R3/Fnz2VlqA==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.11.7.tgz",
+      "integrity": "sha512-+eUMxvDgoYmAvkuJ2ljV2COyeH6HwH8LqCNWma+mFZCRDAoXNeqSHbBtI0Vzy4PqchfmxcmKERc99xEzoS9XUQ==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2374,9 +2403,9 @@
       }
     },
     "node_modules/@tiptap/extension-collaboration": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.11.5.tgz",
-      "integrity": "sha512-3tMMq0E+FM3/3YBUMq5rLvks2DC/t1XLH2Kz/VcuVCxqg1Zg5s9nKOl6CcUZ8gbdvZoEd/GYoQyROJ957v9wzw==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.11.7.tgz",
+      "integrity": "sha512-/02gvKHtvatLr+0j+WOTNE1ZbMau+gyVBMhpR9oqL7zfp5BHIvZ9AZNpPn650T0mtcBSLVTv9Vww02ALuognJA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2388,9 +2417,9 @@
       }
     },
     "node_modules/@tiptap/extension-collaboration-cursor": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.11.5.tgz",
-      "integrity": "sha512-sazBzi5HCHgGRihSzWHhHFMSI9oU0v/qqiDZYJ/zhzCKEWONx8WlS6WTxo6z3l6/Qz9lm7clmHNUQNWxnssAOA==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.11.7.tgz",
+      "integrity": "sha512-dfJYaECVdZ0BCL/wEJR8lbFAs2MH+XBTvQOHiDCslN34uFt13KO6Xh72eNt18PgQbw+fQiZTCOMt0Kc5fA5VfQ==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2401,9 +2430,9 @@
       }
     },
     "node_modules/@tiptap/extension-document": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.11.5.tgz",
-      "integrity": "sha512-7I4BRTpIux2a0O2qS3BDmyZ5LGp3pszKbix32CmeVh7lN9dV7W5reDqtJJ9FCZEEF+pZ6e1/DQA362dflwZw2g==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.11.7.tgz",
+      "integrity": "sha512-95ouJXPjdAm9+VBRgFo4lhDoMcHovyl/awORDI8gyEn0Rdglt+ZRZYoySFzbVzer9h0cre+QdIwr9AIzFFbfdA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2413,9 +2442,9 @@
       }
     },
     "node_modules/@tiptap/extension-dropcursor": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.11.5.tgz",
-      "integrity": "sha512-uIN7L3FU0904ec7FFFbndO7RQE/yiON4VzAMhNn587LFMyWO8US139HXIL4O8dpZeYwYL3d1FnDTflZl6CwLlg==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.11.7.tgz",
+      "integrity": "sha512-63mL+nxQILizsr5NbmgDeOjFEWi34BLt7evwL6UUZEVM15K8V1G8pD9Y0kCXrZYpHWz0tqFRXdrhDz0Ppu8oVw==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2426,9 +2455,9 @@
       }
     },
     "node_modules/@tiptap/extension-floating-menu": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.11.5.tgz",
-      "integrity": "sha512-HsMI0hV5Lwzm530Z5tBeyNCBNG38eJ3qjfdV2OHlfSf3+KOEfn6a5AUdoNaZO02LF79/8+7BaYU2drafag9cxQ==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.11.7.tgz",
+      "integrity": "sha512-DG54WoUu2vxHRVzKZiR5I5RMOYj45IlxQMkBAx1wjS0ch41W8DUYEeipvMMjCeKtEI+emz03xYUcOAP9LRmg+w==",
       "dependencies": {
         "tippy.js": "^6.3.7"
       },
@@ -2442,9 +2471,9 @@
       }
     },
     "node_modules/@tiptap/extension-gapcursor": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.11.5.tgz",
-      "integrity": "sha512-kcWa+Xq9cb6lBdiICvLReuDtz/rLjFKHWpW3jTTF3FiP3wx4H8Rs6bzVtty7uOVTfwupxZRiKICAMEU6iT0xrQ==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.11.7.tgz",
+      "integrity": "sha512-EceesmPG7FyjXZ8EgeJPUov9G1mAf2AwdypxBNH275g6xd5dmU/KvjoFZjmQ0X1ve7mS+wNupVlGxAEUYoveew==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2455,9 +2484,9 @@
       }
     },
     "node_modules/@tiptap/extension-hard-break": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.11.5.tgz",
-      "integrity": "sha512-q9doeN+Yg9F5QNTG8pZGYfNye3tmntOwch683v0CCVCI4ldKaLZ0jG3NbBTq+mosHYdgOH2rNbIORlRRsQ+iYQ==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.11.7.tgz",
+      "integrity": "sha512-zTkZSA6q+F5sLOdCkiC2+RqJQN0zdsJqvFIOVFL/IDVOnq6PZO5THzwRRLvOSnJJl3edRQCl/hUgS0L5sTInGQ==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2467,9 +2496,9 @@
       }
     },
     "node_modules/@tiptap/extension-heading": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.11.5.tgz",
-      "integrity": "sha512-x/MV53psJ9baRcZ4k4WjnCUBMt8zCX7mPlKVT+9C/o+DEs/j/qxPLs95nHeQv70chZpSwCQCt93xMmuF0kPoAg==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.11.7.tgz",
+      "integrity": "sha512-8kWh7y4Rd2fwxfWOhFFWncHdkDkMC1Z60yzIZWjIu72+6yQxvo8w3yeb7LI7jER4kffbMmadgcfhCHC/fkObBA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2479,9 +2508,9 @@
       }
     },
     "node_modules/@tiptap/extension-highlight": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.11.5.tgz",
-      "integrity": "sha512-VBZfT869L9CiTLF8qr+3FBUtJcmlyUTECORNo0ceEiNDg4H6V9uNPwaROMXrWiQCc+DYVCOkx541QrXwNMzxlg==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-highlight/-/extension-highlight-2.11.7.tgz",
+      "integrity": "sha512-c/NH4kIpNOWCUQv8RkFNDyOcgt+2pYFpDf0QBJmzhAuv4BIeS2bDmDtuNS7VgoWRZH+xxCNXfvm2BG+kjtipEg==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2491,9 +2520,9 @@
       }
     },
     "node_modules/@tiptap/extension-history": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.11.5.tgz",
-      "integrity": "sha512-b+wOS33Dz1azw6F1i9LFTEIJ/gUui0Jwz5ZvmVDpL2ZHBhq1Ui0/spTT+tuZOXq7Y/uCbKL8Liu4WoedIvhboQ==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.11.7.tgz",
+      "integrity": "sha512-Cu5x3aS13I040QSRoLdd+w09G4OCVfU+azpUqxufZxeNs9BIJC+0jowPLeOxKDh6D5GGT2A8sQtxc6a/ssbs8g==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2504,9 +2533,9 @@
       }
     },
     "node_modules/@tiptap/extension-horizontal-rule": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.11.5.tgz",
-      "integrity": "sha512-3up2r1Du8/5/4ZYzTC0DjTwhgPI3dn8jhOCLu73m5F3OGvK/9whcXoeWoX103hYMnGDxBlfOje71yQuN35FL4A==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.11.7.tgz",
+      "integrity": "sha512-uVmQwD2dzZ5xwmvUlciy0ItxOdOfQjH6VLmu80zyJf8Yu7mvwP8JyxoXUX0vd1xHpwAhgQ9/ozjIWYGIw79DPQ==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2517,9 +2546,9 @@
       }
     },
     "node_modules/@tiptap/extension-italic": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.11.5.tgz",
-      "integrity": "sha512-9VGfb2/LfPhQ6TjzDwuYLRvw0A6VGbaIp3F+5Mql8XVdTBHb2+rhELbyhNGiGVR78CaB/EiKb6dO9xu/tBWSYA==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.11.7.tgz",
+      "integrity": "sha512-r985bkQfG0HMpmCU0X0p/Xe7U1qgRm2mxvcp6iPCuts2FqxaCoyfNZ8YnMsgVK1mRhM7+CQ5SEg2NOmQNtHvPw==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2529,9 +2558,9 @@
       }
     },
     "node_modules/@tiptap/extension-list-item": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.11.5.tgz",
-      "integrity": "sha512-Mp5RD/pbkfW1vdc6xMVxXYcta73FOwLmblQlFNn/l/E5/X1DUSA4iGhgDDH4EWO3swbs03x2f7Zka/Xoj3+WLg==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.11.7.tgz",
+      "integrity": "sha512-6ikh7Y+qAbkSuIHXPIINqfzmWs5uIGrylihdZ9adaIyvrN1KSnWIqrZIk/NcZTg5YFIJlXrnGSRSjb/QM3WUhw==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2541,9 +2570,9 @@
       }
     },
     "node_modules/@tiptap/extension-ordered-list": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.11.5.tgz",
-      "integrity": "sha512-Cu8KwruBNWAaEfshRQR0yOSaUKAeEwxW7UgbvF9cN/zZuKgK5uZosPCPTehIFCcRe+TBpRtZQh+06f/gNYpYYg==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.11.7.tgz",
+      "integrity": "sha512-bLGCHDMB0vbJk7uu8bRg8vES3GsvxkX7Cgjgm/6xysHFbK98y0asDtNxkW1VvuRreNGz4tyB6vkcVCfrxl4jKw==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2553,9 +2582,9 @@
       }
     },
     "node_modules/@tiptap/extension-paragraph": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.11.5.tgz",
-      "integrity": "sha512-YFBWeg7xu/sBnsDIF/+nh9Arf7R0h07VZMd0id5Ydd2Qe3c1uIZwXxeINVtH0SZozuPIQFAT8ICe9M0RxmE+TA==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.11.7.tgz",
+      "integrity": "sha512-Pl3B4q6DJqTvvAdraqZaNP9Hh0UWEHL5nNdxhaRNuhKaUo7lq8wbDSIxIW3lvV0lyCs0NfyunkUvSm1CXb6d4Q==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2565,9 +2594,9 @@
       }
     },
     "node_modules/@tiptap/extension-strike": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.11.5.tgz",
-      "integrity": "sha512-PVfUiCqrjvsLpbIoVlegSY8RlkR64F1Rr2RYmiybQfGbg+AkSZXDeO0eIrc03//4gua7D9DfIozHmAKv1KN3ow==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.11.7.tgz",
+      "integrity": "sha512-D6GYiW9F24bvAY7XMOARNZbC8YGPzdzWdXd8VOOJABhf4ynMi/oW4NNiko+kZ67jn3EGaKoz32VMJzNQgYi1HA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2577,9 +2606,9 @@
       }
     },
     "node_modules/@tiptap/extension-text": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.11.5.tgz",
-      "integrity": "sha512-Gq1WwyhFpCbEDrLPIHt5A8aLSlf8bfz4jm417c8F/JyU0J5dtYdmx0RAxjnLw1i7ZHE7LRyqqAoS0sl7JHDNSQ==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.11.7.tgz",
+      "integrity": "sha512-wObCn8qZkIFnXTLvBP+X8KgaEvTap/FJ/i4hBMfHBCKPGDx99KiJU6VIbDXG8d5ZcFZE0tOetK1pP5oI7qgMlQ==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2589,9 +2618,9 @@
       }
     },
     "node_modules/@tiptap/extension-text-style": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.11.5.tgz",
-      "integrity": "sha512-YUmYl0gILSd/u/ZkOmNxjNXVw+mu8fpC2f8G4I4tLODm0zCx09j9DDEJXSrM5XX72nxJQqtSQsCpNKnL0hfeEQ==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.11.7.tgz",
+      "integrity": "sha512-LHO6DBg/9SkCQFdWlVfw9nolUmw+Cid94WkTY+7IwrpyG2+ZGQxnKpCJCKyeaFNbDoYAtvu0vuTsSXeCkgShcA==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2601,9 +2630,9 @@
       }
     },
     "node_modules/@tiptap/extension-underline": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.11.5.tgz",
-      "integrity": "sha512-YpWHXNIkSoRSuzT2cvgKpyJ2tTz3LzqkTM64uC+uTJ8cUkvXIWUWejJR42q8ma/mTlQe4lHff4IQ0Sf58Digtw==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.11.7.tgz",
+      "integrity": "sha512-NtoQw6PGijOAtXC6G+0Aq0/Z5wwEjPhNHs8nsjXogfWIgaj/aI4/zfBnA06eI3WT+emMYQTl0fTc4CUPnLVU8g==",
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
@@ -2613,9 +2642,9 @@
       }
     },
     "node_modules/@tiptap/pm": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.11.5.tgz",
-      "integrity": "sha512-z9JFtqc5ZOsdQLd9vRnXfTCQ8v5ADAfRt9Nm7SqP6FUHII8E1hs38ACzf5xursmth/VonJYb5+73Pqxk1hGIPw==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.11.7.tgz",
+      "integrity": "sha512-7gEEfz2Q6bYKXM07vzLUD0vqXFhC5geWRA6LCozTiLdVFDdHWiBrvb2rtkL5T7mfLq03zc1QhH7rI3F6VntOEA==",
       "dependencies": {
         "prosemirror-changeset": "^2.2.1",
         "prosemirror-collab": "^1.3.1",
@@ -2631,7 +2660,7 @@
         "prosemirror-schema-basic": "^1.2.3",
         "prosemirror-schema-list": "^1.4.1",
         "prosemirror-state": "^1.4.3",
-        "prosemirror-tables": "^1.6.3",
+        "prosemirror-tables": "^1.6.4",
         "prosemirror-trailing-node": "^3.0.0",
         "prosemirror-transform": "^1.10.2",
         "prosemirror-view": "^1.37.0"
@@ -2642,12 +2671,12 @@
       }
     },
     "node_modules/@tiptap/react": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.11.5.tgz",
-      "integrity": "sha512-Dp8eHL1G+R/C4+QzAczyb3t1ovexEIZx9ln7SGEM+cT1KHKAw9XGPRgsp92+NQaYI+EdEb/YqoBOSzQcd18/OQ==",
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.11.7.tgz",
+      "integrity": "sha512-gQZEUkAoPsBptnB4T2gAtiUxswjVGhfsM9vOElQco+b11DYmy110T2Zuhg+2YGvB/CG3RoWJx34808P0FX1ijA==",
       "dependencies": {
-        "@tiptap/extension-bubble-menu": "^2.11.5",
-        "@tiptap/extension-floating-menu": "^2.11.5",
+        "@tiptap/extension-bubble-menu": "^2.11.7",
+        "@tiptap/extension-floating-menu": "^2.11.7",
         "@types/use-sync-external-store": "^0.0.6",
         "fast-deep-equal": "^3",
         "use-sync-external-store": "^1"
@@ -2664,37 +2693,47 @@
       }
     },
     "node_modules/@tiptap/starter-kit": {
-      "version": "2.11.5",
-      "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.11.5.tgz",
-      "integrity": "sha512-SLI7Aj2ruU1t//6Mk8f+fqW+18uTqpdfLUJYgwu0CkqBckrkRZYZh6GVLk/02k3H2ki7QkFxiFbZrdbZdng0JA==",
-      "dependencies": {
-        "@tiptap/core": "^2.11.5",
-        "@tiptap/extension-blockquote": "^2.11.5",
-        "@tiptap/extension-bold": "^2.11.5",
-        "@tiptap/extension-bullet-list": "^2.11.5",
-        "@tiptap/extension-code": "^2.11.5",
-        "@tiptap/extension-code-block": "^2.11.5",
-        "@tiptap/extension-document": "^2.11.5",
-        "@tiptap/extension-dropcursor": "^2.11.5",
-        "@tiptap/extension-gapcursor": "^2.11.5",
-        "@tiptap/extension-hard-break": "^2.11.5",
-        "@tiptap/extension-heading": "^2.11.5",
-        "@tiptap/extension-history": "^2.11.5",
-        "@tiptap/extension-horizontal-rule": "^2.11.5",
-        "@tiptap/extension-italic": "^2.11.5",
-        "@tiptap/extension-list-item": "^2.11.5",
-        "@tiptap/extension-ordered-list": "^2.11.5",
-        "@tiptap/extension-paragraph": "^2.11.5",
-        "@tiptap/extension-strike": "^2.11.5",
-        "@tiptap/extension-text": "^2.11.5",
-        "@tiptap/extension-text-style": "^2.11.5",
-        "@tiptap/pm": "^2.11.5"
+      "version": "2.11.7",
+      "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.11.7.tgz",
+      "integrity": "sha512-K+q51KwNU/l0kqRuV5e1824yOLVftj6kGplGQLvJG56P7Rb2dPbM/JeaDbxQhnHT/KDGamG0s0Po0M3pPY163A==",
+      "dependencies": {
+        "@tiptap/core": "^2.11.7",
+        "@tiptap/extension-blockquote": "^2.11.7",
+        "@tiptap/extension-bold": "^2.11.7",
+        "@tiptap/extension-bullet-list": "^2.11.7",
+        "@tiptap/extension-code": "^2.11.7",
+        "@tiptap/extension-code-block": "^2.11.7",
+        "@tiptap/extension-document": "^2.11.7",
+        "@tiptap/extension-dropcursor": "^2.11.7",
+        "@tiptap/extension-gapcursor": "^2.11.7",
+        "@tiptap/extension-hard-break": "^2.11.7",
+        "@tiptap/extension-heading": "^2.11.7",
+        "@tiptap/extension-history": "^2.11.7",
+        "@tiptap/extension-horizontal-rule": "^2.11.7",
+        "@tiptap/extension-italic": "^2.11.7",
+        "@tiptap/extension-list-item": "^2.11.7",
+        "@tiptap/extension-ordered-list": "^2.11.7",
+        "@tiptap/extension-paragraph": "^2.11.7",
+        "@tiptap/extension-strike": "^2.11.7",
+        "@tiptap/extension-text": "^2.11.7",
+        "@tiptap/extension-text-style": "^2.11.7",
+        "@tiptap/pm": "^2.11.7"
       },
       "funding": {
         "type": "github",
         "url": "https://github.com/sponsors/ueberdosis"
       }
     },
+    "node_modules/@tybys/wasm-util": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz",
+      "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "tslib": "^2.4.0"
+      }
+    },
     "node_modules/@types/hast": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
@@ -2730,9 +2769,9 @@
       "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg=="
     },
     "node_modules/@types/node": {
-      "version": "22.13.4",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz",
-      "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==",
+      "version": "22.13.17",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.17.tgz",
+      "integrity": "sha512-nAJuQXoyPj04uLgu+obZcSmsfOenUg6DxPKogeUy6yNCFwWaj5sBF8/G/pNo8EtBJjAfSVgfIlugR/BCOleO+g==",
       "dev": true,
       "dependencies": {
         "undici-types": "~6.20.0"
@@ -2768,16 +2807,16 @@
       "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg=="
     },
     "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.0.tgz",
-      "integrity": "sha512-aFcXEJJCI4gUdXgoo/j9udUYIHgF23MFkg09LFz2dzEmU0+1Plk4rQWv/IYKvPHAtlkkGoB3m5e6oUp+JPsNaQ==",
+      "version": "8.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.0.tgz",
+      "integrity": "sha512-PAIpk/U7NIS6H7TEtN45SPGLQaHNgB7wSjsQV/8+KYokAb2T/gloOA/Bee2yd4/yKVhPKe5LlaUGhAZk5zmSaQ==",
       "dev": true,
       "dependencies": {
         "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "8.24.0",
-        "@typescript-eslint/type-utils": "8.24.0",
-        "@typescript-eslint/utils": "8.24.0",
-        "@typescript-eslint/visitor-keys": "8.24.0",
+        "@typescript-eslint/scope-manager": "8.29.0",
+        "@typescript-eslint/type-utils": "8.29.0",
+        "@typescript-eslint/utils": "8.29.0",
+        "@typescript-eslint/visitor-keys": "8.29.0",
         "graphemer": "^1.4.0",
         "ignore": "^5.3.1",
         "natural-compare": "^1.4.0",
@@ -2793,19 +2832,19 @@
       "peerDependencies": {
         "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <5.9.0"
       }
     },
     "node_modules/@typescript-eslint/parser": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.0.tgz",
-      "integrity": "sha512-MFDaO9CYiard9j9VepMNa9MTcqVvSny2N4hkY6roquzj8pdCBRENhErrteaQuu7Yjn1ppk0v1/ZF9CG3KIlrTA==",
+      "version": "8.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.0.tgz",
+      "integrity": "sha512-8C0+jlNJOwQso2GapCVWWfW/rzaq7Lbme+vGUFKE31djwNncIpgXD7Cd4weEsDdkoZDjH0lwwr3QDQFuyrMg9g==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/scope-manager": "8.24.0",
-        "@typescript-eslint/types": "8.24.0",
-        "@typescript-eslint/typescript-estree": "8.24.0",
-        "@typescript-eslint/visitor-keys": "8.24.0",
+        "@typescript-eslint/scope-manager": "8.29.0",
+        "@typescript-eslint/types": "8.29.0",
+        "@typescript-eslint/typescript-estree": "8.29.0",
+        "@typescript-eslint/visitor-keys": "8.29.0",
         "debug": "^4.3.4"
       },
       "engines": {
@@ -2817,17 +2856,17 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <5.9.0"
       }
     },
     "node_modules/@typescript-eslint/scope-manager": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.0.tgz",
-      "integrity": "sha512-HZIX0UByphEtdVBKaQBgTDdn9z16l4aTUz8e8zPQnyxwHBtf5vtl1L+OhH+m1FGV9DrRmoDuYKqzVrvWDcDozw==",
+      "version": "8.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz",
+      "integrity": "sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "8.24.0",
-        "@typescript-eslint/visitor-keys": "8.24.0"
+        "@typescript-eslint/types": "8.29.0",
+        "@typescript-eslint/visitor-keys": "8.29.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2838,13 +2877,13 @@
       }
     },
     "node_modules/@typescript-eslint/type-utils": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.0.tgz",
-      "integrity": "sha512-8fitJudrnY8aq0F1wMiPM1UUgiXQRJ5i8tFjq9kGfRajU+dbPyOuHbl0qRopLEidy0MwqgTHDt6CnSeXanNIwA==",
+      "version": "8.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.0.tgz",
+      "integrity": "sha512-ahaWQ42JAOx+NKEf5++WC/ua17q5l+j1GFrbbpVKzFL/tKVc0aYY8rVSYUpUvt2hUP1YBr7mwXzx+E/DfUWI9Q==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/typescript-estree": "8.24.0",
-        "@typescript-eslint/utils": "8.24.0",
+        "@typescript-eslint/typescript-estree": "8.29.0",
+        "@typescript-eslint/utils": "8.29.0",
         "debug": "^4.3.4",
         "ts-api-utils": "^2.0.1"
       },
@@ -2857,13 +2896,13 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <5.9.0"
       }
     },
     "node_modules/@typescript-eslint/types": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.0.tgz",
-      "integrity": "sha512-VacJCBTyje7HGAw7xp11q439A+zeGG0p0/p2zsZwpnMzjPB5WteaWqt4g2iysgGFafrqvyLWqq6ZPZAOCoefCw==",
+      "version": "8.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.0.tgz",
+      "integrity": "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==",
       "dev": true,
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2874,13 +2913,13 @@
       }
     },
     "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.0.tgz",
-      "integrity": "sha512-ITjYcP0+8kbsvT9bysygfIfb+hBj6koDsu37JZG7xrCiy3fPJyNmfVtaGsgTUSEuTzcvME5YI5uyL5LD1EV5ZQ==",
+      "version": "8.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz",
+      "integrity": "sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "8.24.0",
-        "@typescript-eslint/visitor-keys": "8.24.0",
+        "@typescript-eslint/types": "8.29.0",
+        "@typescript-eslint/visitor-keys": "8.29.0",
         "debug": "^4.3.4",
         "fast-glob": "^3.3.2",
         "is-glob": "^4.0.3",
@@ -2896,7 +2935,7 @@
         "url": "https://opencollective.com/typescript-eslint"
       },
       "peerDependencies": {
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <5.9.0"
       }
     },
     "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
@@ -2952,15 +2991,15 @@
       }
     },
     "node_modules/@typescript-eslint/utils": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.0.tgz",
-      "integrity": "sha512-07rLuUBElvvEb1ICnafYWr4hk8/U7X9RDCOqd9JcAMtjh/9oRmcfN4yGzbPVirgMR0+HLVHehmu19CWeh7fsmQ==",
+      "version": "8.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.0.tgz",
+      "integrity": "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "8.24.0",
-        "@typescript-eslint/types": "8.24.0",
-        "@typescript-eslint/typescript-estree": "8.24.0"
+        "@typescript-eslint/scope-manager": "8.29.0",
+        "@typescript-eslint/types": "8.29.0",
+        "@typescript-eslint/typescript-estree": "8.29.0"
       },
       "engines": {
         "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2971,16 +3010,16 @@
       },
       "peerDependencies": {
         "eslint": "^8.57.0 || ^9.0.0",
-        "typescript": ">=4.8.4 <5.8.0"
+        "typescript": ">=4.8.4 <5.9.0"
       }
     },
     "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "8.24.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.0.tgz",
-      "integrity": "sha512-kArLq83QxGLbuHrTMoOEWO+l2MwsNS2TGISEdx8xgqpkbytB07XmlQyQdNDrCc1ecSqx0cnmhGvpX+VBwqqSkg==",
+      "version": "8.29.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz",
+      "integrity": "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==",
       "dev": true,
       "dependencies": {
-        "@typescript-eslint/types": "8.24.0",
+        "@typescript-eslint/types": "8.29.0",
         "eslint-visitor-keys": "^4.2.0"
       },
       "engines": {
@@ -3009,6 +3048,204 @@
       "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
       "dev": true
     },
+    "node_modules/@unrs/resolver-binding-darwin-arm64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.3.3.tgz",
+      "integrity": "sha512-EpRILdWr3/xDa/7MoyfO7JuBIJqpBMphtu4+80BK1bRfFcniVT74h3Z7q1+WOc92FuIAYatB1vn9TJR67sORGw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-darwin-x64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.3.3.tgz",
+      "integrity": "sha512-ntj/g7lPyqwinMJWZ+DKHBse8HhVxswGTmNgFKJtdgGub3M3zp5BSZ3bvMP+kBT6dnYJLSVlDqdwOq1P8i0+/g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-freebsd-x64": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.3.3.tgz",
+      "integrity": "sha512-l6BT8f2CU821EW7U8hSUK8XPq4bmyTlt9Mn4ERrfjJNoCw0/JoHAh9amZZtV3cwC3bwwIat+GUnrcHTG9+qixw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.3.3.tgz",
+      "integrity": "sha512-8ScEc5a4y7oE2BonRvzJ+2GSkBaYWyh0/Ko4Q25e/ix6ANpJNhwEPZvCR6GVRmsQAYMIfQvYLdM6YEN+qRjnAQ==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.3.3.tgz",
+      "integrity": "sha512-8qQ6l1VTzLNd3xb2IEXISOKwMGXDCzY/UNy/7SovFW2Sp0K3YbL7Ao7R18v6SQkLqQlhhqSBIFRk+u6+qu5R5A==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.3.3.tgz",
+      "integrity": "sha512-v81R2wjqcWXJlQY23byqYHt9221h4anQ6wwN64oMD/WAE+FmxPHFZee5bhRkNVtzqO/q7wki33VFWlhiADwUeQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.3.3.tgz",
+      "integrity": "sha512-cAOx/j0u5coMg4oct/BwMzvWJdVciVauUvsd+GQB/1FZYKQZmqPy0EjJzJGbVzFc6gbnfEcSqvQE6gvbGf2N8Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.3.3.tgz",
+      "integrity": "sha512-mq2blqwErgDJD4gtFDlTX/HZ7lNP8YCHYFij2gkXPtMzrXxPW1hOtxL6xg4NWxvnj4bppppb0W3s/buvM55yfg==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.3.3.tgz",
+      "integrity": "sha512-u0VRzfFYysarYHnztj2k2xr+eu9rmgoTUUgCCIT37Nr+j0A05Xk2c3RY8Mh5+DhCl2aYibihnaAEJHeR0UOFIQ==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.3.3.tgz",
+      "integrity": "sha512-OrVo5ZsG29kBF0Ug95a2KidS16PqAMmQNozM6InbquOfW/udouk063e25JVLqIBhHLB2WyBnixOQ19tmeC/hIg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.3.3.tgz",
+      "integrity": "sha512-PYnmrwZ4HMp9SkrOhqPghY/aoL+Rtd4CQbr93GlrRTjK6kDzfMfgz3UH3jt6elrQAfupa1qyr1uXzeVmoEAxUA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.3.3.tgz",
+      "integrity": "sha512-81AnQY6fShmktQw4hWDUIilsKSdvr/acdJ5azAreu2IWNlaJOKphJSsUVWE+yCk6kBMoQyG9ZHCb/krb5K0PEA==",
+      "cpu": [
+        "wasm32"
+      ],
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "@napi-rs/wasm-runtime": "^0.2.7"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.3.3.tgz",
+      "integrity": "sha512-X/42BMNw7cW6xrB9syuP5RusRnWGoq+IqvJO8IDpp/BZg64J1uuIW6qA/1Cl13Y4LyLXbJVYbYNSKwR/FiHEng==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.3.3.tgz",
+      "integrity": "sha512-EGNnNGQxMU5aTN7js3ETYvuw882zcO+dsVjs+DwO2j/fRVKth87C8e2GzxW1L3+iWAXMyJhvFBKRavk9Og1Z6A==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.3.3.tgz",
+      "integrity": "sha512-GraLbYqOJcmW1qY3osB+2YIiD62nVf2/bVLHZmrb4t/YSUwE03l7TwcDJl08T/Tm3SVhepX8RQkpzWbag/Sb4w==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
     "node_modules/abstract-leveldown": {
       "version": "6.2.3",
       "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz",
@@ -3027,9 +3264,9 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
-      "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+      "version": "8.14.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
+      "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
       "dev": true,
       "bin": {
         "acorn": "bin/acorn"
@@ -3189,17 +3426,18 @@
       }
     },
     "node_modules/array.prototype.findlastindex": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
-      "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+      "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.4",
         "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.2",
+        "es-abstract": "^1.23.9",
         "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.0.0",
-        "es-shim-unscopables": "^1.0.2"
+        "es-object-atoms": "^1.1.1",
+        "es-shim-unscopables": "^1.1.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -3308,9 +3546,9 @@
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "node_modules/autoprefixer": {
-      "version": "10.4.20",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
-      "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+      "version": "10.4.21",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
+      "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
       "dev": true,
       "funding": [
         {
@@ -3327,11 +3565,11 @@
         }
       ],
       "dependencies": {
-        "browserslist": "^4.23.3",
-        "caniuse-lite": "^1.0.30001646",
+        "browserslist": "^4.24.4",
+        "caniuse-lite": "^1.0.30001702",
         "fraction.js": "^4.3.7",
         "normalize-range": "^0.1.2",
-        "picocolors": "^1.0.1",
+        "picocolors": "^1.1.1",
         "postcss-value-parser": "^4.2.0"
       },
       "bin": {
@@ -3360,18 +3598,18 @@
       }
     },
     "node_modules/axe-core": {
-      "version": "4.10.2",
-      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
-      "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
+      "version": "4.10.3",
+      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz",
+      "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==",
       "dev": true,
       "engines": {
         "node": ">=4"
       }
     },
     "node_modules/axios": {
-      "version": "1.7.9",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
-      "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
+      "version": "1.8.4",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
+      "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
       "dependencies": {
         "follow-redirects": "^1.15.6",
         "form-data": "^4.0.0",
@@ -3542,13 +3780,13 @@
       }
     },
     "node_modules/call-bound": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
-      "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
       "dev": true,
       "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "get-intrinsic": "^1.2.6"
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
       },
       "engines": {
         "node": ">= 0.4"
@@ -3575,9 +3813,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001699",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz",
-      "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==",
+      "version": "1.0.30001707",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
+      "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
       "funding": [
         {
           "type": "opencollective",
@@ -3627,7 +3865,6 @@
       "version": "0.7.1",
       "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
       "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
-      "license": "Apache-2.0",
       "dependencies": {
         "clsx": "^2.1.1"
       },
@@ -3649,14 +3886,14 @@
       }
     },
     "node_modules/cmdk": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.4.tgz",
-      "integrity": "sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.1.1.tgz",
+      "integrity": "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==",
       "dependencies": {
-        "@radix-ui/react-dialog": "^1.1.2",
+        "@radix-ui/react-compose-refs": "^1.1.1",
+        "@radix-ui/react-dialog": "^1.1.6",
         "@radix-ui/react-id": "^1.1.0",
-        "@radix-ui/react-primitive": "^2.0.0",
-        "use-sync-external-store": "^1.2.2"
+        "@radix-ui/react-primitive": "^2.0.2"
       },
       "peerDependencies": {
         "react": "^18 || ^19 || ^19.0.0-rc",
@@ -3992,9 +4229,9 @@
       "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.5.101",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.101.tgz",
-      "integrity": "sha512-L0ISiQrP/56Acgu4/i/kfPwWSgrzYZUnQrC0+QPFuhqlLP1Ir7qzPPDVS9BcKIyWTRU8+o6CC8dKw38tSWhYIA==",
+      "version": "1.5.129",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.129.tgz",
+      "integrity": "sha512-JlXUemX4s0+9f8mLqib/bHH8gOHf5elKS6KeWG3sk3xozb/JTq/RLXIv8OKUWiK4Ah00Wm88EFj5PYkFr4RUPA==",
       "dev": true
     },
     "node_modules/emoji-regex": {
@@ -4018,19 +4255,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/enhanced-resolve": {
-      "version": "5.18.1",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
-      "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
-      "dev": true,
-      "dependencies": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
     "node_modules/entities": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@@ -4293,12 +4517,12 @@
       }
     },
     "node_modules/eslint-config-next": {
-      "version": "15.1.7",
-      "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.1.7.tgz",
-      "integrity": "sha512-zXoMnYUIy3XHaAoOhrcYkT9UQWvXqWju2K7NNsmb5wd/7XESDwof61eUdW4QhERr3eJ9Ko/vnXqIrj8kk/drYw==",
+      "version": "15.2.4",
+      "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.2.4.tgz",
+      "integrity": "sha512-v4gYjd4eYIme8qzaJItpR5MMBXJ0/YV07u7eb50kEnlEmX7yhOjdUdzz70v4fiINYRjLf8X8TbogF0k7wlz6sA==",
       "dev": true,
       "dependencies": {
-        "@next/eslint-plugin-next": "15.1.7",
+        "@next/eslint-plugin-next": "15.2.4",
         "@rushstack/eslint-patch": "^1.10.3",
         "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
         "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0",
@@ -4340,24 +4564,24 @@
       }
     },
     "node_modules/eslint-import-resolver-typescript": {
-      "version": "3.8.0",
-      "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.8.0.tgz",
-      "integrity": "sha512-fItUrP/+xwpavWgadrn6lsvcMe80s08xIVFXkUXvhR4cZD2ga96kRF/z/iFGDI7ZDnvtlaZ0wGic7Tw+DhgVnA==",
+      "version": "3.10.0",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.0.tgz",
+      "integrity": "sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==",
       "dev": true,
       "dependencies": {
         "@nolyfill/is-core-module": "1.0.39",
-        "debug": "^4.3.7",
-        "enhanced-resolve": "^5.15.0",
+        "debug": "^4.4.0",
         "get-tsconfig": "^4.10.0",
-        "is-bun-module": "^1.0.2",
-        "stable-hash": "^0.0.4",
-        "tinyglobby": "^0.2.10"
+        "is-bun-module": "^2.0.0",
+        "stable-hash": "^0.0.5",
+        "tinyglobby": "^0.2.12",
+        "unrs-resolver": "^1.3.2"
       },
       "engines": {
         "node": "^14.18.0 || >=16.0.0"
       },
       "funding": {
-        "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts"
+        "url": "https://opencollective.com/eslint-import-resolver-typescript"
       },
       "peerDependencies": {
         "eslint": "*",
@@ -4524,9 +4748,9 @@
       }
     },
     "node_modules/eslint-plugin-react-hooks": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz",
-      "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+      "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
       "dev": true,
       "engines": {
         "node": ">=10"
@@ -4706,9 +4930,9 @@
       "dev": true
     },
     "node_modules/fastq": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz",
-      "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==",
+      "version": "1.19.1",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+      "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
       "dependencies": {
         "reusify": "^1.0.4"
       }
@@ -4767,9 +4991,9 @@
       }
     },
     "node_modules/flatted": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
-      "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+      "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
       "dev": true
     },
     "node_modules/follow-redirects": {
@@ -4807,11 +5031,11 @@
       }
     },
     "node_modules/foreground-child": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
-      "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+      "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
       "dependencies": {
-        "cross-spawn": "^7.0.0",
+        "cross-spawn": "^7.0.6",
         "signal-exit": "^4.0.1"
       },
       "engines": {
@@ -4905,16 +5129,16 @@
       }
     },
     "node_modules/get-intrinsic": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz",
-      "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
       "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
+        "call-bind-apply-helpers": "^1.0.2",
         "es-define-property": "^1.0.1",
         "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.0.0",
+        "es-object-atoms": "^1.1.1",
         "function-bind": "^1.1.2",
-        "get-proto": "^1.0.0",
+        "get-proto": "^1.0.1",
         "gopd": "^1.2.0",
         "has-symbols": "^1.1.0",
         "hasown": "^2.0.2",
@@ -5050,12 +5274,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/graceful-fs": {
-      "version": "4.2.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
-      "dev": true
-    },
     "node_modules/graphemer": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
@@ -5191,9 +5409,9 @@
       "optional": true
     },
     "node_modules/immutable": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz",
-      "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw=="
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.1.tgz",
+      "integrity": "sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg=="
     },
     "node_modules/import-fresh": {
       "version": "3.3.1",
@@ -5336,12 +5554,12 @@
       }
     },
     "node_modules/is-bun-module": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz",
-      "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
+      "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
       "dev": true,
       "dependencies": {
-        "semver": "^7.6.3"
+        "semver": "^7.7.1"
       }
     },
     "node_modules/is-callable": {
@@ -5947,9 +6165,9 @@
       }
     },
     "node_modules/lib0": {
-      "version": "0.2.99",
-      "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.99.tgz",
-      "integrity": "sha512-vwztYuUf1uf/1zQxfzRfO5yzfNKhTtgOByCruuiQQxWQXnPb8Itaube5ylofcV0oM0aKal9Mv+S1s1Ky0UYP1w==",
+      "version": "0.2.101",
+      "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.101.tgz",
+      "integrity": "sha512-LljA6+Ehf0Z7YnxhgSAvspzWALjW4wlWdN/W4iGiqYc1KvXQgOVXWI0xwlwqozIL5WRdKeUW2gq0DLhFsY+Xlw==",
       "dependencies": {
         "isomorphic.js": "^0.2.4"
       },
@@ -6067,7 +6285,6 @@
       "version": "0.469.0",
       "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.469.0.tgz",
       "integrity": "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==",
-      "license": "ISC",
       "peerDependencies": {
         "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
       }
@@ -6186,9 +6403,9 @@
       }
     },
     "node_modules/nanoid": {
-      "version": "3.3.8",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
-      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
+      "version": "3.3.11",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
       "funding": [
         {
           "type": "github",
@@ -6268,9 +6485,9 @@
       }
     },
     "node_modules/next-themes": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.4.tgz",
-      "integrity": "sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==",
+      "version": "0.4.6",
+      "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz",
+      "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==",
       "peerDependencies": {
         "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc",
         "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
@@ -6401,14 +6618,15 @@
       }
     },
     "node_modules/object.entries": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
-      "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz",
+      "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==",
       "dev": true,
       "dependencies": {
-        "call-bind": "^1.0.7",
+        "call-bind": "^1.0.8",
+        "call-bound": "^1.0.4",
         "define-properties": "^1.2.1",
-        "es-object-atoms": "^1.0.0"
+        "es-object-atoms": "^1.1.1"
       },
       "engines": {
         "node": ">= 0.4"
@@ -6630,9 +6848,9 @@
       }
     },
     "node_modules/pirates": {
-      "version": "4.0.6",
-      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
-      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+      "version": "4.0.7",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+      "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
       "engines": {
         "node": ">= 6"
       }
@@ -6647,9 +6865,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.5.2",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
-      "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
+      "version": "8.5.3",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+      "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
       "funding": [
         {
           "type": "opencollective",
@@ -6832,9 +7050,9 @@
       }
     },
     "node_modules/prosemirror-commands": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.2.tgz",
-      "integrity": "sha512-0nDHH++qcf/BuPLYvmqZTUUsPJUCPBUXt0J1ErTcDIS369CTp773itzLGIgIXG4LJXOlwYCr44+Mh4ii6MP1QA==",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.0.tgz",
+      "integrity": "sha512-6toodS4R/Aah5pdsrIwnTYPEjW70SlO5a66oo5Kk+CIrgJz3ukOoS+FYDGqvQlAX5PxoGWDX1oD++tn5X3pyRA==",
       "dependencies": {
         "prosemirror-model": "^1.0.0",
         "prosemirror-state": "^1.0.0",
@@ -6874,9 +7092,9 @@
       }
     },
     "node_modules/prosemirror-inputrules": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz",
-      "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.0.tgz",
+      "integrity": "sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==",
       "dependencies": {
         "prosemirror-state": "^1.0.0",
         "prosemirror-transform": "^1.0.0"
@@ -6892,13 +7110,13 @@
       }
     },
     "node_modules/prosemirror-markdown": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz",
-      "integrity": "sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==",
+      "version": "1.13.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz",
+      "integrity": "sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==",
       "dependencies": {
         "@types/markdown-it": "^14.0.0",
         "markdown-it": "^14.0.0",
-        "prosemirror-model": "^1.20.0"
+        "prosemirror-model": "^1.25.0"
       }
     },
     "node_modules/prosemirror-menu": {
@@ -6913,25 +7131,25 @@
       }
     },
     "node_modules/prosemirror-model": {
-      "version": "1.24.1",
-      "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.24.1.tgz",
-      "integrity": "sha512-YM053N+vTThzlWJ/AtPtF1j0ebO36nvbmDy4U7qA2XQB8JVaQp1FmB9Jhrps8s+z+uxhhVTny4m20ptUvhk0Mg==",
+      "version": "1.25.0",
+      "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.0.tgz",
+      "integrity": "sha512-/8XUmxWf0pkj2BmtqZHYJipTBMHIdVjuvFzMvEoxrtyGNmfvdhBiRwYt/eFwy2wA9DtBW3RLqvZnjurEkHaFCw==",
       "dependencies": {
         "orderedmap": "^2.0.0"
       }
     },
     "node_modules/prosemirror-schema-basic": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.3.tgz",
-      "integrity": "sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==",
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz",
+      "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==",
       "dependencies": {
-        "prosemirror-model": "^1.19.0"
+        "prosemirror-model": "^1.25.0"
       }
     },
     "node_modules/prosemirror-schema-list": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.0.tgz",
-      "integrity": "sha512-gg1tAfH1sqpECdhIHOA/aLg2VH3ROKBWQ4m8Qp9mBKrOxQRW61zc+gMCI8nh22gnBzd1t2u1/NPLmO3nAa3ssg==",
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz",
+      "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==",
       "dependencies": {
         "prosemirror-model": "^1.0.0",
         "prosemirror-state": "^1.0.0",
@@ -6975,17 +7193,17 @@
       }
     },
     "node_modules/prosemirror-transform": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz",
-      "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==",
+      "version": "1.10.3",
+      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.3.tgz",
+      "integrity": "sha512-Nhh/+1kZGRINbEHmVu39oynhcap4hWTs/BlU7NnxWj3+l0qi8I1mu67v6mMdEe/ltD8hHvU4FV6PHiCw2VSpMw==",
       "dependencies": {
         "prosemirror-model": "^1.21.0"
       }
     },
     "node_modules/prosemirror-view": {
-      "version": "1.38.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.38.0.tgz",
-      "integrity": "sha512-O45kxXQTaP9wPdXhp8TKqCR+/unS/gnfg9Q93svQcB3j0mlp2XSPAmsPefxHADwzC+fbNS404jqRxm3UQaGvgw==",
+      "version": "1.38.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.38.1.tgz",
+      "integrity": "sha512-4FH/uM1A4PNyrxXbD+RAbAsf0d/mM0D/wAKSVVWK7o0A9Q/oOXJBrw786mBf2Vnrs/Edly6dH6Z2gsb7zWwaUw==",
       "dependencies": {
         "prosemirror-model": "^1.20.0",
         "prosemirror-state": "^1.0.0",
@@ -7040,9 +7258,9 @@
       ]
     },
     "node_modules/react": {
-      "version": "19.0.0",
-      "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz",
-      "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==",
+      "version": "19.1.0",
+      "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
+      "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7061,14 +7279,14 @@
       }
     },
     "node_modules/react-dom": {
-      "version": "19.0.0",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz",
-      "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==",
+      "version": "19.1.0",
+      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
+      "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
       "dependencies": {
-        "scheduler": "^0.25.0"
+        "scheduler": "^0.26.0"
       },
       "peerDependencies": {
-        "react": "^19.0.0"
+        "react": "^19.1.0"
       }
     },
     "node_modules/react-is": {
@@ -7262,9 +7480,9 @@
       }
     },
     "node_modules/reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+      "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
       "engines": {
         "iojs": ">=1.0.0",
         "node": ">=0.10.0"
@@ -7386,9 +7604,9 @@
       }
     },
     "node_modules/sass": {
-      "version": "1.85.0",
-      "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz",
-      "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==",
+      "version": "1.86.1",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.1.tgz",
+      "integrity": "sha512-Yaok4XELL1L9Im/ZUClKu//D2OP1rOljKj0Gf34a+GzLbMveOzL7CfqYo+JUa5Xt1nhTCW+OcKp/FtR7/iqj1w==",
       "dependencies": {
         "chokidar": "^4.0.0",
         "immutable": "^5.0.2",
@@ -7405,9 +7623,9 @@
       }
     },
     "node_modules/scheduler": {
-      "version": "0.25.0",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
-      "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="
+      "version": "0.26.0",
+      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+      "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="
     },
     "node_modules/semver": {
       "version": "7.7.1",
@@ -7635,9 +7853,9 @@
       }
     },
     "node_modules/stable-hash": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz",
-      "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==",
+      "version": "0.0.5",
+      "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
+      "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
       "dev": true
     },
     "node_modules/streamsearch": {
@@ -7976,9 +8194,9 @@
       }
     },
     "node_modules/swr": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.2.tgz",
-      "integrity": "sha512-RosxFpiabojs75IwQ316DGoDRmOqtiAj0tg8wCcbEu4CiLZBs/a9QNtHV7TUfDXmmlgqij/NqzKq/eLelyv9xA==",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz",
+      "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==",
       "dependencies": {
         "dequal": "^2.0.3",
         "use-sync-external-store": "^1.4.0"
@@ -8139,15 +8357,6 @@
         "node": ">=8.10.0"
       }
     },
-    "node_modules/tapable": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/text-table": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@@ -8174,16 +8383,19 @@
       }
     },
     "node_modules/tinyglobby": {
-      "version": "0.2.10",
-      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz",
-      "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==",
+      "version": "0.2.12",
+      "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz",
+      "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==",
       "dev": true,
       "dependencies": {
-        "fdir": "^6.4.2",
+        "fdir": "^6.4.3",
         "picomatch": "^4.0.2"
       },
       "engines": {
         "node": ">=12.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/SuperchupuDev"
       }
     },
     "node_modules/tinyglobby/node_modules/fdir": {
@@ -8232,9 +8444,9 @@
       }
     },
     "node_modules/ts-api-utils": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz",
-      "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+      "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
       "dev": true,
       "engines": {
         "node": ">=18.12"
@@ -8249,11 +8461,11 @@
       "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
     },
     "node_modules/ts-luxon": {
-      "version": "5.0.7-beta.0",
-      "resolved": "https://registry.npmjs.org/ts-luxon/-/ts-luxon-5.0.7-beta.0.tgz",
-      "integrity": "sha512-mmBCXl8MXqeZ24pKcdORJShvgSNq9Eb7MD5++w+/gjERu8yJn02mhpDf/gDK9YAZiWuppRLivgPV1ipRjlFuvg==",
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/ts-luxon/-/ts-luxon-5.1.0.tgz",
+      "integrity": "sha512-euc262gJnR5CI/pI804brby+tg9B8qT6nLX2+kTcvwuRkuZrv7Jqb/uuBTln78vB8h+JeCdJ8CG8Y76IswRZRw==",
       "engines": {
-        "node": ">=13"
+        "node": ">=20"
       }
     },
     "node_modules/tsconfig-paths": {
@@ -8372,9 +8584,9 @@
       }
     },
     "node_modules/typescript": {
-      "version": "5.7.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
-      "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
+      "version": "5.8.2",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
+      "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
       "dev": true,
       "bin": {
         "tsc": "bin/tsc",
@@ -8413,10 +8625,36 @@
       "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
       "dev": true
     },
+    "node_modules/unrs-resolver": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.3.3.tgz",
+      "integrity": "sha512-PFLAGQzYlyjniXdbmQ3dnGMZJXX5yrl2YS4DLRfR3BhgUsE1zpRIrccp9XMOGRfIHpdFvCn/nr5N1KMVda4x3A==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/JounQin"
+      },
+      "optionalDependencies": {
+        "@unrs/resolver-binding-darwin-arm64": "1.3.3",
+        "@unrs/resolver-binding-darwin-x64": "1.3.3",
+        "@unrs/resolver-binding-freebsd-x64": "1.3.3",
+        "@unrs/resolver-binding-linux-arm-gnueabihf": "1.3.3",
+        "@unrs/resolver-binding-linux-arm-musleabihf": "1.3.3",
+        "@unrs/resolver-binding-linux-arm64-gnu": "1.3.3",
+        "@unrs/resolver-binding-linux-arm64-musl": "1.3.3",
+        "@unrs/resolver-binding-linux-ppc64-gnu": "1.3.3",
+        "@unrs/resolver-binding-linux-s390x-gnu": "1.3.3",
+        "@unrs/resolver-binding-linux-x64-gnu": "1.3.3",
+        "@unrs/resolver-binding-linux-x64-musl": "1.3.3",
+        "@unrs/resolver-binding-wasm32-wasi": "1.3.3",
+        "@unrs/resolver-binding-win32-arm64-msvc": "1.3.3",
+        "@unrs/resolver-binding-win32-ia32-msvc": "1.3.3",
+        "@unrs/resolver-binding-win32-x64-msvc": "1.3.3"
+      }
+    },
     "node_modules/update-browserslist-db": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
-      "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+      "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
       "dev": true,
       "funding": [
         {
@@ -8494,9 +8732,9 @@
       }
     },
     "node_modules/use-sync-external-store": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz",
-      "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
+      "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
       "peerDependencies": {
         "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
       }
@@ -8590,15 +8828,16 @@
       }
     },
     "node_modules/which-typed-array": {
-      "version": "1.1.18",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz",
-      "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==",
+      "version": "1.1.19",
+      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+      "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
       "dev": true,
       "dependencies": {
         "available-typed-arrays": "^1.0.7",
         "call-bind": "^1.0.8",
-        "call-bound": "^1.0.3",
-        "for-each": "^0.3.3",
+        "call-bound": "^1.0.4",
+        "for-each": "^0.3.5",
+        "get-proto": "^1.0.1",
         "gopd": "^1.2.0",
         "has-tostringtag": "^1.0.2"
       },
@@ -8712,9 +8951,9 @@
       "dev": true
     },
     "node_modules/ws": {
-      "version": "8.18.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
-      "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+      "version": "8.18.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
+      "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
       "engines": {
         "node": ">=10.0.0"
       },
@@ -8758,11 +8997,11 @@
       }
     },
     "node_modules/y-prosemirror": {
-      "version": "1.2.15",
-      "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.2.15.tgz",
-      "integrity": "sha512-XDdrytq2M5bIy3qusQvfRclLu2eWZYPA+BbGWAb9FFWEhOB5FCrnzez2vsA+gvAd0FJTAcr89mjJ5g45r0j7TQ==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.3.0.tgz",
+      "integrity": "sha512-KOCwxdn+tHXauZxgbTWI5RtdL+c1ByzQ4pls6P5tKk+G1UfMqIMXByRYp4fDp23RSWsjbbkWeM5esyN8lN81xg==",
       "dependencies": {
-        "lib0": "^0.2.42"
+        "lib0": "^0.2.100"
       },
       "engines": {
         "node": ">=16.0.0",
@@ -8838,9 +9077,9 @@
       }
     },
     "node_modules/yaml": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
-      "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
+      "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
       "bin": {
         "yaml": "bin.mjs"
       },
@@ -8849,9 +9088,9 @@
       }
     },
     "node_modules/yjs": {
-      "version": "13.6.23",
-      "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.23.tgz",
-      "integrity": "sha512-ExtnT5WIOVpkL56bhLeisG/N5c4fmzKn4k0ROVfJa5TY2QHbH7F0Wu2T5ZhR7ErsFWQEFafyrnSI8TPKVF9Few==",
+      "version": "13.6.24",
+      "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.24.tgz",
+      "integrity": "sha512-xn/pYLTZa3uD1uDG8lpxfLRo5SR/rp0frdASOl2a71aYNvUXdWcLtVL91s2y7j+Q8ppmjZ9H3jsGVgoFMbT2VA==",
       "dependencies": {
         "lib0": "^0.2.99"
       },
diff --git a/src/app/organizations/[id]/members/page.tsx b/src/app/organizations/[id]/members/page.tsx
index 65b6665a..e4a2d01a 100644
--- a/src/app/organizations/[id]/members/page.tsx
+++ b/src/app/organizations/[id]/members/page.tsx
@@ -66,7 +66,6 @@ export default function MembersPage({
 
   return (
     <div className="container mx-auto p-6 space-y-8">
-      <h1 className="text-3xl font-bold">Members</h1>
       <MemberContainer
         users={users}
         relationships={relationships}
diff --git a/src/components/ui/members/member-card.tsx b/src/components/ui/members/member-card.tsx
index f970c565..ce536c16 100644
--- a/src/components/ui/members/member-card.tsx
+++ b/src/components/ui/members/member-card.tsx
@@ -1,18 +1,74 @@
+import { useOrganizationStateStore } from "@/lib/providers/organization-state-store-provider";
+import { useAuthStore } from "@/lib/providers/auth-store-provider";
+import { useUserMutation } from "@/lib/api/organizations/users";
+import { Button } from "@/components/ui/button";
+import { Trash2 } from "lucide-react";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
+import { OrganizationStateStore } from "@/lib/stores/organization-state-store";
+import { AuthStore } from "@/lib/stores/auth-store";
+import { Id } from "@/types/general";
+
 interface MemberCardProps {
   firstName: string;
   lastName: string;
-  email?: string;
+  email: string;
+  userId: Id;
+  userRelationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberCard({ firstName, lastName, email }: MemberCardProps) {
+export function MemberCard({
+  firstName,
+  lastName,
+  email,
+  userId,
+  userRelationships,
+  onRefresh,
+}: MemberCardProps) {
+  const currentOrganizationId = useOrganizationStateStore(
+    (state: OrganizationStateStore) => state.currentOrganizationId
+  );
+  const { userSession } = useAuthStore((state: AuthStore) => state);
+  const { deleteNested: deleteUser } = useUserMutation(currentOrganizationId);
+
+  // Check if current user is a coach in any of this user's relationships
+  // and make sure we can't delete ourselves
+  const canDeleteUser = userRelationships.some(
+    (rel) => rel.coach_id === userSession.id && userId !== userSession.id
+  );
+
+  const handleDelete = async () => {
+    if (!confirm("Are you sure you want to delete this member?")) {
+      return;
+    }
+
+    try {
+      await deleteUser(currentOrganizationId, userId);
+      onRefresh();
+    } catch (error) {
+      console.error("Error deleting user:", error);
+      // TODO: Show an error toast here once we start using toasts for showing operation results.
+    }
+  };
+
   return (
-    <div className="flex items-center p-4 hover:bg-accent/50 transition-colors cursor-pointer">
+    <div className="flex items-center p-4 hover:bg-accent/50 transition-colors">
       <div className="flex-1">
         <h3 className="font-medium">
           {firstName} {lastName}
         </h3>
         {email && <p className="text-sm text-muted-foreground">{email}</p>}
       </div>
+      {canDeleteUser && (
+        <Button
+          variant="ghost"
+          size="icon"
+          onClick={handleDelete}
+          className="text-destructive hover:text-destructive"
+        >
+          <Trash2 className="h-4 w-4" />
+        </Button>
+      )}
     </div>
   );
 }
diff --git a/src/components/ui/members/member-container.tsx b/src/components/ui/members/member-container.tsx
index a001816e..58e02530 100644
--- a/src/components/ui/members/member-container.tsx
+++ b/src/components/ui/members/member-container.tsx
@@ -52,7 +52,7 @@ export function MemberContainer({
   return (
     <div className="space-y-6">
       <div className="flex justify-between items-center">
-        <h2 className="text-2xl font-semibold">Members</h2>
+        <h3 className="text-2xl font-semibold">Members</h3>
         {/* Only show the button if user is a coach to _some_ user within the
         scope of the organization. We may come back and add this directly to user
         data.  */}
@@ -63,7 +63,11 @@ export function MemberContainer({
           />
         )}
       </div>
-      <MemberList users={associatedUsers} />
+      <MemberList
+        users={associatedUsers}
+        relationships={userRelationships}
+        onRefresh={onRefresh}
+      />
     </div>
   );
 }
diff --git a/src/components/ui/members/member-list.tsx b/src/components/ui/members/member-list.tsx
index 34012677..78ca2d59 100644
--- a/src/components/ui/members/member-list.tsx
+++ b/src/components/ui/members/member-list.tsx
@@ -1,12 +1,28 @@
 import { Card, CardContent } from "@/components/ui/card";
 import { User } from "@/types/user";
 import { MemberCard } from "./member-card";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
+import { Id } from "@/types/general";
 
 interface MemberListProps {
   users: User[];
+  relationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberList({ users }: MemberListProps) {
+export function MemberList({
+  users,
+  relationships,
+  onRefresh,
+}: MemberListProps) {
+  // Create a mapping of user IDs to their associated relationships
+  const userRelationshipsMap = users.reduce((accumulator_map, user) => {
+    accumulator_map[user.id] = relationships.filter(
+      (rel) => rel.coach_id === user.id || rel.coachee_id === user.id
+    );
+    return accumulator_map;
+  }, {} as Record<Id, CoachingRelationshipWithUserNames[]>);
+
   return (
     <Card className="w-full">
       <CardContent className="p-6">
@@ -17,6 +33,9 @@ export function MemberList({ users }: MemberListProps) {
               firstName={user.first_name}
               lastName={user.last_name}
               email={user.email}
+              userId={user.id}
+              userRelationships={userRelationshipsMap[user.id]}
+              onRefresh={onRefresh}
             />
           ))}
         </div>
diff --git a/src/lib/api/actions.ts b/src/lib/api/actions.ts
index 6fb4e9d4..e3fb7069 100644
--- a/src/lib/api/actions.ts
+++ b/src/lib/api/actions.ts
@@ -65,6 +65,17 @@ export const ActionApi = {
    */
   delete: async (id: Id): Promise<Action> =>
     EntityApi.deleteFn<null, Action>(`${ACTIONS_BASEURL}/${id}`),
+
+  /**
+   * Deletes an action nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the action
+   * @param actionId The ID of the action to delete
+   * @returns Promise resolving to the deleted Action object
+   */
+  deleteNested: async (_entityId: Id, _actionId: Id): Promise<Action> => {
+    throw new Error("Delete nested operation not implemented");
+  },
 };
 
 /**
@@ -174,5 +185,6 @@ export const useActionMutation = () => {
     createNested: ActionApi.createNested,
     update: ActionApi.update,
     delete: ActionApi.delete,
+    deleteNested: ActionApi.deleteNested,
   });
 };
diff --git a/src/lib/api/agreements.ts b/src/lib/api/agreements.ts
index 9a63e1f8..f15ee45f 100644
--- a/src/lib/api/agreements.ts
+++ b/src/lib/api/agreements.ts
@@ -69,6 +69,17 @@ export const AgreementApi = {
    */
   delete: async (id: Id): Promise<Agreement> =>
     EntityApi.deleteFn<null, Agreement>(`${AGREEMENTS_BASEURL}/${id}`),
+
+  /**
+   * Deletes an agreement nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the agreement
+   * @param agreementId The ID of the agreement to delete
+   * @returns Promise resolving to the deleted Agreement object
+   */
+  deleteNested: async (_entityId: Id, agreementId: Id): Promise<Agreement> => {
+    throw new Error("Delete nested operation not implemented");
+  },
 };
 
 /**
@@ -175,5 +186,6 @@ export const useAgreementMutation = () => {
     createNested: AgreementApi.createNested,
     update: AgreementApi.update,
     delete: AgreementApi.delete,
+    deleteNested: AgreementApi.deleteNested,
   });
 };
diff --git a/src/lib/api/coaching-relationships.ts b/src/lib/api/coaching-relationships.ts
index 63b07007..2778f364 100644
--- a/src/lib/api/coaching-relationships.ts
+++ b/src/lib/api/coaching-relationships.ts
@@ -91,6 +91,20 @@ export const CoachingRelationshipApi = {
   delete: async (_id: Id) => {
     throw new Error("Delete operation not implemented");
   },
+
+  /**
+   * Deletes a coaching relationship nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the coaching relationship
+   * @param relationshipId The ID of the coaching relationship to delete
+   * @returns Promise resolving to the deleted CoachingRelationshipWithUserNames object
+   */
+  deleteNested: async (
+    _organizationId: Id,
+    _relationshipId: Id
+  ): Promise<CoachingRelationshipWithUserNames> => {
+    throw new Error("Delete nested operation not implemented");
+  },
 };
 
 /**
@@ -185,6 +199,7 @@ export const useCoachingRelationshipMutation = (organizationId: Id) => {
       createNested: CoachingRelationshipApi.createNested,
       update: CoachingRelationshipApi.update,
       delete: CoachingRelationshipApi.delete,
+      deleteNested: CoachingRelationshipApi.deleteNested,
     }
   );
 };
diff --git a/src/lib/api/coaching-sessions.ts b/src/lib/api/coaching-sessions.ts
index 8578d3d3..fd6595d4 100644
--- a/src/lib/api/coaching-sessions.ts
+++ b/src/lib/api/coaching-sessions.ts
@@ -95,6 +95,20 @@ export const CoachingSessionApi = {
     EntityApi.deleteFn<null, CoachingSession>(
       `${COACHING_SESSIONS_BASEURL}/${id}`
     ),
+
+  /**
+   * Deletes a coaching session nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the coaching session
+   * @param coachingSessionId The ID of the coaching session to delete
+   * @returns Promise resolving to the deleted CoachingSession object
+   */
+  deleteNested: async (
+    _entityId: Id,
+    coachingSessionId: Id
+  ): Promise<CoachingSession> => {
+    throw new Error("Delete nested operation not implemented");
+  },
 };
 
 /**
@@ -195,6 +209,7 @@ export const useCoachingSessionMutation = () => {
       createNested: CoachingSessionApi.createNested,
       update: CoachingSessionApi.update,
       delete: CoachingSessionApi.delete,
+      deleteNested: CoachingSessionApi.deleteNested,
     }
   );
 };
diff --git a/src/lib/api/entity-api.ts b/src/lib/api/entity-api.ts
index 76c3921c..ef07d58d 100644
--- a/src/lib/api/entity-api.ts
+++ b/src/lib/api/entity-api.ts
@@ -374,6 +374,7 @@ export namespace EntityApi {
       createNested: (id: Id, entity: T) => Promise<U>;
       update: (id: Id, entity: T) => Promise<U>;
       delete: (id: Id) => Promise<U>;
+      deleteNested: (entityId: Id, nestedEntityId: Id) => Promise<U>;
     }
   ) => {
     const [isLoading, setIsLoading] = useState(false);
@@ -444,6 +445,17 @@ export namespace EntityApi {
        * @returns Promise resolving to the deleted entity
        */
       delete: (id: Id) => executeWithState(() => api.delete(id)),
+
+      /**
+       * Deletes an entity nested under another entity (foreign key relationship).
+       *
+       * @param entityId The entity's id under which to delete entity
+       * @param nestedEntityId The nested entity's id to delete
+       * @returns Promise resolving to the deleted entity
+       */
+      deleteNested: (entityId: Id, nestedEntityId: Id) =>
+        executeWithState(() => api.deleteNested(entityId, nestedEntityId)),
+
       /** Indicates if any operation is currently in progress */
       isLoading,
       /** Contains the error if the last operation failed, null otherwise */
diff --git a/src/lib/api/organizations.ts b/src/lib/api/organizations.ts
index c30d1362..fcdf90b3 100644
--- a/src/lib/api/organizations.ts
+++ b/src/lib/api/organizations.ts
@@ -71,6 +71,20 @@ export const OrganizationApi = {
    */
   delete: async (id: Id): Promise<Organization> =>
     EntityApi.deleteFn<null, Organization>(`${ORGANIZATIONS_BASEURL}/${id}`),
+
+  /**
+   * Deletes an organization nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the organization
+   * @param organizationId The ID of the organization to delete
+   * @returns Promise resolving to the deleted Organization object
+   */
+  deleteNested: async (
+    _entityId: Id,
+    _organizationId: Id
+  ): Promise<Organization> => {
+    throw new Error("Delete nested operation not implemented");
+  },
 };
 
 /**
@@ -153,5 +167,6 @@ export const useOrganizationMutation = () => {
     createNested: OrganizationApi.createNested,
     update: OrganizationApi.update,
     delete: OrganizationApi.delete,
+    deleteNested: OrganizationApi.deleteNested,
   });
 };
diff --git a/src/lib/api/organizations/users.ts b/src/lib/api/organizations/users.ts
index 23f29d09..68b5818c 100644
--- a/src/lib/api/organizations/users.ts
+++ b/src/lib/api/organizations/users.ts
@@ -59,6 +59,15 @@ export const UserApi = {
   delete: async (id: Id): Promise<User> => {
     throw new Error("Delete operation not implemented");
   },
+
+  /**
+   * Deletes a user nested in an organization.
+   */
+  deleteNested: async (organizationId: Id, userId: Id): Promise<User> => {
+    return EntityApi.deleteFn<null, User>(
+      `${ORGANIZATIONS_USERS_BASEURL(organizationId)}/${userId}`
+    );
+  },
 };
 
 /**
@@ -92,6 +101,7 @@ export const useUserMutation = (organizationId: Id) => {
       createNested: UserApi.createNested,
       update: UserApi.update,
       delete: UserApi.delete,
+      deleteNested: UserApi.deleteNested,
     }
   );
 };
diff --git a/src/lib/api/overarching-goals.ts b/src/lib/api/overarching-goals.ts
index 3acd09e7..524a7d9a 100644
--- a/src/lib/api/overarching-goals.ts
+++ b/src/lib/api/overarching-goals.ts
@@ -82,6 +82,20 @@ export const OverarchingGoalApi = {
     EntityApi.deleteFn<null, OverarchingGoal>(
       `${OVERARCHING_GOALS_BASEURL}/${id}`
     ),
+
+  /**
+   * Deletes an overarching-goal nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the overarching-goal
+   * @param overarchingGoalId The ID of the overarching-goal to delete
+   * @returns Promise resolving to the deleted OverarchingGoal object
+   */
+  deleteNested: async (
+    _entityId: Id,
+    _overarchingGoalId: Id
+  ): Promise<OverarchingGoal> => {
+    throw new Error("Delete nested operation not implemented");
+  },
 };
 
 /**
@@ -197,6 +211,7 @@ export const useOverarchingGoalMutation = () => {
       createNested: OverarchingGoalApi.createNested,
       update: OverarchingGoalApi.update,
       delete: OverarchingGoalApi.delete,
+      deleteNested: OverarchingGoalApi.deleteNested,
     }
   );
 };
diff --git a/src/lib/api/user-sessions.ts b/src/lib/api/user-sessions.ts
index 95925d93..4ac5ce16 100644
--- a/src/lib/api/user-sessions.ts
+++ b/src/lib/api/user-sessions.ts
@@ -74,7 +74,21 @@ export const UserSessionApi = {
    * @returns Promise resolving to the deleted UserSession object
    */
   delete: async (id: Id): Promise<UserSession> =>
-    EntityApi.deleteFn<null, UserSession>(USER_SESSIONS_LOGOUTURL),
+    EntityApi.deleteFn<null, UserSession>(`${USER_SESSIONS_BASEURL}/${id}`),
+
+  /**
+   * Deletes a user session nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the user session
+   * @param userSessionId The ID of the user session to delete
+   * @returns Promise resolving to the deleted UserSession object
+   */
+  deleteNested: async (
+    _entityId: Id,
+    _userSessionId: Id
+  ): Promise<UserSession> => {
+    throw new Error("Delete nested operation not implemented");
+  },
 };
 
 /**
@@ -95,5 +109,6 @@ export const useUserSessionMutation = () => {
     createNested: UserSessionApi.createNested,
     update: UserSessionApi.update,
     delete: UserSessionApi.delete,
+    deleteNested: UserSessionApi.deleteNested,
   });
 };
diff --git a/src/lib/api/users.ts b/src/lib/api/users.ts
index 3b26fb62..7385ba2e 100644
--- a/src/lib/api/users.ts
+++ b/src/lib/api/users.ts
@@ -47,6 +47,17 @@ export const UserApi = {
    */
   delete: async (id: Id): Promise<User> =>
     EntityApi.deleteFn<null, User>(`${USERS_BASEURL}/${id}`),
+
+  /**
+   * Deletes a user nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the user
+   * @param userId The ID of the user to delete
+   * @returns Promise resolving to the deleted User object
+   */
+  deleteNested: async (_entityId: Id, userId: Id): Promise<User> => {
+    throw new Error("Delete nested operation not implemented");
+  },
 };
 
 /**
@@ -95,5 +106,6 @@ export const useUserMutation = () => {
     createNested: UserApi.createNested,
     update: UserApi.update,
     delete: UserApi.delete,
+    deleteNested: UserApi.deleteNested,
   });
 };


Reviews:
user: login: jhodapp
body: Looking great, works well. Some minor inline changes and I'll be happy to approve.
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-04-01T15:26:33Z
user: login: calebbourg
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T10:24:48Z
user: login: calebbourg
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T10:24:57Z
user: login: calebbourg
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T10:25:04Z
user: login: calebbourg
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T10:27:21Z
user: login: calebbourg
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T10:27:29Z
user: login: calebbourg
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-04-02T10:27:38Z
user: login: jhodapp
state: CHANGES_REQUESTED
author_association: MEMBER
submitted_at: 2025-04-02T14:46:16Z
user: login: jhodapp
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-02T14:47:58Z
user: login: jhodapp
state: APPROVED
author_association: MEMBER
submitted_at: 2025-04-04T17:06:54Z

Review comments:
diff_hunk: @@ -1,18 +1,73 @@
+import { useOrganizationStateStore } from "@/lib/providers/organization-state-store-provider";
+import { useAuthStore } from "@/lib/providers/auth-store-provider";
+import { useUserMutation } from "@/lib/api/organizations/users";
+import { Button } from "@/components/ui/button";
+import { Trash2 } from "lucide-react";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
+import { OrganizationStateStore } from "@/lib/stores/organization-state-store";
+import { AuthStore } from "@/lib/stores/auth-store";
+
 interface MemberCardProps {
   firstName: string;
   lastName: string;
   email?: string;
+  userId: string;
path: src/components/ui/members/member-card.tsx
user: login: jhodapp
body: ```suggestion
  userId: Id;
```
created_at: 2025-04-01T15:09:06Z
author_association: MEMBER
diff_hunk: @@ -1,18 +1,73 @@
+import { useOrganizationStateStore } from "@/lib/providers/organization-state-store-provider";
+import { useAuthStore } from "@/lib/providers/auth-store-provider";
+import { useUserMutation } from "@/lib/api/organizations/users";
+import { Button } from "@/components/ui/button";
+import { Trash2 } from "lucide-react";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
+import { OrganizationStateStore } from "@/lib/stores/organization-state-store";
+import { AuthStore } from "@/lib/stores/auth-store";
+
 interface MemberCardProps {
   firstName: string;
   lastName: string;
   email?: string;
+  userId: string;
+  userRelationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberCard({ firstName, lastName, email }: MemberCardProps) {
+export function MemberCard({
+  firstName,
+  lastName,
+  email,
+  userId,
+  userRelationships,
+  onRefresh,
+}: MemberCardProps) {
+  const currentOrganizationId = useOrganizationStateStore(
+    (state: OrganizationStateStore) => state.currentOrganizationId
+  );
+  const { userSession } = useAuthStore((state: AuthStore) => state);
+  const { deleteNested: deleteUser } = useUserMutation(currentOrganizationId);
+
+  // Check if current user is a coach in any of this user's relationships
+  // and make sure we can't delete ourselves
+  const canDeleteUser = userRelationships.some(
+    (rel) => rel.coach_id === userSession.id && userId !== userSession.id
+  );
+
+  const handleDelete = async () => {
+    if (!confirm("Are you sure you want to delete this member?")) {
+      return;
+    }
+
+    try {
+      await deleteUser(currentOrganizationId, userId);
+      onRefresh(); // Call refresh after successful deletion
path: src/components/ui/members/member-card.tsx
user: login: jhodapp
body: ```suggestion
      onRefresh();
```
created_at: 2025-04-01T15:11:53Z
author_association: MEMBER
diff_hunk: @@ -1,18 +1,73 @@
+import { useOrganizationStateStore } from "@/lib/providers/organization-state-store-provider";
+import { useAuthStore } from "@/lib/providers/auth-store-provider";
+import { useUserMutation } from "@/lib/api/organizations/users";
+import { Button } from "@/components/ui/button";
+import { Trash2 } from "lucide-react";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
+import { OrganizationStateStore } from "@/lib/stores/organization-state-store";
+import { AuthStore } from "@/lib/stores/auth-store";
+
 interface MemberCardProps {
   firstName: string;
   lastName: string;
   email?: string;
+  userId: string;
+  userRelationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberCard({ firstName, lastName, email }: MemberCardProps) {
+export function MemberCard({
+  firstName,
+  lastName,
+  email,
+  userId,
+  userRelationships,
+  onRefresh,
+}: MemberCardProps) {
+  const currentOrganizationId = useOrganizationStateStore(
+    (state: OrganizationStateStore) => state.currentOrganizationId
+  );
+  const { userSession } = useAuthStore((state: AuthStore) => state);
+  const { deleteNested: deleteUser } = useUserMutation(currentOrganizationId);
+
+  // Check if current user is a coach in any of this user's relationships
+  // and make sure we can't delete ourselves
+  const canDeleteUser = userRelationships.some(
+    (rel) => rel.coach_id === userSession.id && userId !== userSession.id
+  );
+
+  const handleDelete = async () => {
+    if (!confirm("Are you sure you want to delete this member?")) {
+      return;
+    }
+
+    try {
+      await deleteUser(currentOrganizationId, userId);
+      onRefresh(); // Call refresh after successful deletion
+    } catch (error) {
+      console.error("Error deleting user:", error);
+      // You might want to show an error toast here
path: src/components/ui/members/member-card.tsx
user: login: jhodapp
body: ```suggestion
      // TODO: Show an error toast here once we start using toasts for showing operation results.
```
created_at: 2025-04-01T15:12:16Z
author_association: MEMBER
diff_hunk: @@ -1,12 +1,27 @@
 import { Card, CardContent } from "@/components/ui/card";
 import { User } from "@/types/user";
 import { MemberCard } from "./member-card";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
 
 interface MemberListProps {
   users: User[];
+  relationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberList({ users }: MemberListProps) {
+export function MemberList({
+  users,
+  relationships,
+  onRefresh,
+}: MemberListProps) {
+  // Create a mapping of user IDs to their associated relationships
+  const userRelationshipsMap = users.reduce((acc, user) => {
path: src/components/ui/members/member-list.tsx
user: login: jhodapp
body: What does `acc` stand for? If it's not too long, can you spell it out?
created_at: 2025-04-01T15:17:01Z
author_association: MEMBER
diff_hunk: @@ -1,12 +1,27 @@
 import { Card, CardContent } from "@/components/ui/card";
 import { User } from "@/types/user";
 import { MemberCard } from "./member-card";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
 
 interface MemberListProps {
   users: User[];
+  relationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberList({ users }: MemberListProps) {
+export function MemberList({
+  users,
+  relationships,
+  onRefresh,
+}: MemberListProps) {
+  // Create a mapping of user IDs to their associated relationships
+  const userRelationshipsMap = users.reduce((acc, user) => {
+    acc[user.id] = relationships.filter(
+      (rel) => rel.coach_id === user.id || rel.coachee_id === user.id
+    );
+    return acc;
+  }, {} as Record<string, CoachingRelationshipWithUserNames[]>);
path: src/components/ui/members/member-list.tsx
user: login: jhodapp
body: ```suggestion
  }, {} as Record<Id, CoachingRelationshipWithUserNames[]>);
```

I think the first type is supposed to hold a Member's Id, but I'm not entirely sure. But if this is true, `Id` type is an appropriate change.
created_at: 2025-04-01T15:19:10Z
author_association: MEMBER
diff_hunk: @@ -65,6 +65,17 @@ export const ActionApi = {
    */
   delete: async (id: Id): Promise<Action> =>
     EntityApi.deleteFn<null, Action>(`${ACTIONS_BASEURL}/${id}`),
+
+  /**
+   * Deletes an action nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the action
+   * @param actionId The ID of the action to delete
+   * @returns Promise resolving to the deleted Action object
+   */
+  deleteNested: async (entityId: Id, actionId: Id): Promise<Action> => {
path: src/lib/api/actions.ts
user: login: jhodapp
body: ```suggestion
  deleteNested: async (_entityId: Id, _actionId: Id): Promise<Action> => {
```
created_at: 2025-04-01T15:21:52Z
author_association: MEMBER
diff_hunk: @@ -69,6 +69,17 @@ export const AgreementApi = {
    */
   delete: async (id: Id): Promise<Agreement> =>
     EntityApi.deleteFn<null, Agreement>(`${AGREEMENTS_BASEURL}/${id}`),
+
+  /**
+   * Deletes an agreement nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the agreement
+   * @param agreementId The ID of the agreement to delete
+   * @returns Promise resolving to the deleted Agreement object
+   */
+  deleteNested: async (entityId: Id, agreementId: Id): Promise<Agreement> => {
path: src/lib/api/agreements.ts
user: login: jhodapp
body: ```suggestion
  deleteNested: async (_entityId: Id, _agreementId: Id): Promise<Agreement> => {
```
created_at: 2025-04-01T15:22:25Z
author_association: MEMBER
diff_hunk: @@ -91,6 +91,20 @@ export const CoachingRelationshipApi = {
   delete: async (_id: Id) => {
     throw new Error("Delete operation not implemented");
   },
+
+  /**
+   * Deletes a coaching relationship nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the coaching relationship
+   * @param relationshipId The ID of the coaching relationship to delete
+   * @returns Promise resolving to the deleted CoachingRelationshipWithUserNames object
+   */
+  deleteNested: async (
+    organizationId: Id,
+    relationshipId: Id
+  ): Promise<CoachingRelationshipWithUserNames> => {
path: src/lib/api/coaching-relationships.ts
user: login: jhodapp
body: ```suggestion
  deleteNested: async (
    _organizationId: Id,
    _relationshipId: Id
  ): Promise<CoachingRelationshipWithUserNames> => {
```
created_at: 2025-04-01T15:22:56Z
author_association: MEMBER
diff_hunk: @@ -95,6 +95,20 @@ export const CoachingSessionApi = {
     EntityApi.deleteFn<null, CoachingSession>(
       `${COACHING_SESSIONS_BASEURL}/${id}`
     ),
+
+  /**
+   * Deletes a coaching session nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the coaching session
+   * @param coachingSessionId The ID of the coaching session to delete
+   * @returns Promise resolving to the deleted CoachingSession object
+   */
+  deleteNested: async (
+    entityId: Id,
+    coachingSessionId: Id
+  ): Promise<CoachingSession> => {
path: src/lib/api/coaching-sessions.ts
user: login: jhodapp
body: ```suggestion
  deleteNested: async (
    _entityId: Id,
    _coachingSessionId: Id
  ): Promise<CoachingSession> => {
```
created_at: 2025-04-01T15:23:27Z
author_association: MEMBER
diff_hunk: @@ -193,6 +193,7 @@ export namespace EntityApi {
     url: string,
     config?: any
   ): Promise<R> => {
+    console.log("deleteFn", url, config);
path: src/lib/api/entity-api.ts
user: login: jhodapp
body: ```suggestion
```
created_at: 2025-04-01T15:23:48Z
author_association: MEMBER
diff_hunk: @@ -71,6 +71,20 @@ export const OrganizationApi = {
    */
   delete: async (id: Id): Promise<Organization> =>
     EntityApi.deleteFn<null, Organization>(`${ORGANIZATIONS_BASEURL}/${id}`),
+
+  /**
+   * Deletes an organization nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the organization
+   * @param organizationId The ID of the organization to delete
+   * @returns Promise resolving to the deleted Organization object
+   */
+  deleteNested: async (
+    entityId: Id,
+    organizationId: Id
+  ): Promise<Organization> => {
path: src/lib/api/organizations.ts
user: login: jhodapp
body: ```suggestion
  deleteNested: async (
    _entityId: Id,
    _organizationId: Id
  ): Promise<Organization> => {
```
created_at: 2025-04-01T15:24:29Z
author_association: MEMBER
diff_hunk: @@ -82,6 +82,20 @@ export const OverarchingGoalApi = {
     EntityApi.deleteFn<null, OverarchingGoal>(
       `${OVERARCHING_GOALS_BASEURL}/${id}`
     ),
+
+  /**
+   * Deletes an overarching-goal nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the overarching-goal
+   * @param overarchingGoalId The ID of the overarching-goal to delete
+   * @returns Promise resolving to the deleted OverarchingGoal object
+   */
+  deleteNested: async (
+    entityId: Id,
+    overarchingGoalId: Id
+  ): Promise<OverarchingGoal> => {
path: src/lib/api/overarching-goals.ts
user: login: jhodapp
body: ```suggestion
  deleteNested: async (
    _entityId: Id,
    _overarchingGoalId: Id
  ): Promise<OverarchingGoal> => {
```
created_at: 2025-04-01T15:25:27Z
author_association: MEMBER
diff_hunk: @@ -74,7 +74,21 @@ export const UserSessionApi = {
    * @returns Promise resolving to the deleted UserSession object
    */
   delete: async (id: Id): Promise<UserSession> =>
-    EntityApi.deleteFn<null, UserSession>(USER_SESSIONS_LOGOUTURL),
+    EntityApi.deleteFn<null, UserSession>(`${USER_SESSIONS_BASEURL}/${id}`),
+
+  /**
+   * Deletes a user session nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the user session
+   * @param userSessionId The ID of the user session to delete
+   * @returns Promise resolving to the deleted UserSession object
+   */
+  deleteNested: async (
+    entityId: Id,
+    userSessionId: Id
+  ): Promise<UserSession> => {
path: src/lib/api/user-sessions.ts
user: login: jhodapp
body: ```suggestion
  deleteNested: async (
    _entityId: Id,
    _userSessionId: Id
  ): Promise<UserSession> => {
```
created_at: 2025-04-01T15:25:43Z
author_association: MEMBER
diff_hunk: @@ -47,6 +47,17 @@ export const UserApi = {
    */
   delete: async (id: Id): Promise<User> =>
     EntityApi.deleteFn<null, User>(`${USERS_BASEURL}/${id}`),
+
+  /**
+   * Deletes a user nested under another entity (foreign key relationship).
+   *
+   * @param entityId The ID of the entity under which to delete the user
+   * @param userId The ID of the user to delete
+   * @returns Promise resolving to the deleted User object
+   */
+  deleteNested: async (entityId: Id, userId: Id): Promise<User> => {
path: src/lib/api/users.ts
user: login: jhodapp
body: ```suggestion
  deleteNested: async (_entityId: Id, _userId: Id): Promise<User> => {
```
created_at: 2025-04-01T15:25:59Z
author_association: MEMBER
diff_hunk: @@ -1,18 +1,73 @@
+import { useOrganizationStateStore } from "@/lib/providers/organization-state-store-provider";
+import { useAuthStore } from "@/lib/providers/auth-store-provider";
+import { useUserMutation } from "@/lib/api/organizations/users";
+import { Button } from "@/components/ui/button";
+import { Trash2 } from "lucide-react";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
+import { OrganizationStateStore } from "@/lib/stores/organization-state-store";
+import { AuthStore } from "@/lib/stores/auth-store";
+
 interface MemberCardProps {
   firstName: string;
   lastName: string;
   email?: string;
+  userId: string;
path: src/components/ui/members/member-card.tsx
user: login: calebbourg
body: Updated accebcf99c476dcd909eb3b27c415223ebecd387
created_at: 2025-04-02T10:24:48Z
author_association: COLLABORATOR
diff_hunk: @@ -1,18 +1,73 @@
+import { useOrganizationStateStore } from "@/lib/providers/organization-state-store-provider";
+import { useAuthStore } from "@/lib/providers/auth-store-provider";
+import { useUserMutation } from "@/lib/api/organizations/users";
+import { Button } from "@/components/ui/button";
+import { Trash2 } from "lucide-react";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
+import { OrganizationStateStore } from "@/lib/stores/organization-state-store";
+import { AuthStore } from "@/lib/stores/auth-store";
+
 interface MemberCardProps {
   firstName: string;
   lastName: string;
   email?: string;
+  userId: string;
+  userRelationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberCard({ firstName, lastName, email }: MemberCardProps) {
+export function MemberCard({
+  firstName,
+  lastName,
+  email,
+  userId,
+  userRelationships,
+  onRefresh,
+}: MemberCardProps) {
+  const currentOrganizationId = useOrganizationStateStore(
+    (state: OrganizationStateStore) => state.currentOrganizationId
+  );
+  const { userSession } = useAuthStore((state: AuthStore) => state);
+  const { deleteNested: deleteUser } = useUserMutation(currentOrganizationId);
+
+  // Check if current user is a coach in any of this user's relationships
+  // and make sure we can't delete ourselves
+  const canDeleteUser = userRelationships.some(
+    (rel) => rel.coach_id === userSession.id && userId !== userSession.id
+  );
+
+  const handleDelete = async () => {
+    if (!confirm("Are you sure you want to delete this member?")) {
+      return;
+    }
+
+    try {
+      await deleteUser(currentOrganizationId, userId);
+      onRefresh(); // Call refresh after successful deletion
path: src/components/ui/members/member-card.tsx
user: login: calebbourg
body: Removed accebcf99c476dcd909eb3b27c415223ebecd387

created_at: 2025-04-02T10:24:57Z
author_association: COLLABORATOR
diff_hunk: @@ -1,18 +1,73 @@
+import { useOrganizationStateStore } from "@/lib/providers/organization-state-store-provider";
+import { useAuthStore } from "@/lib/providers/auth-store-provider";
+import { useUserMutation } from "@/lib/api/organizations/users";
+import { Button } from "@/components/ui/button";
+import { Trash2 } from "lucide-react";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
+import { OrganizationStateStore } from "@/lib/stores/organization-state-store";
+import { AuthStore } from "@/lib/stores/auth-store";
+
 interface MemberCardProps {
   firstName: string;
   lastName: string;
   email?: string;
+  userId: string;
+  userRelationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberCard({ firstName, lastName, email }: MemberCardProps) {
+export function MemberCard({
+  firstName,
+  lastName,
+  email,
+  userId,
+  userRelationships,
+  onRefresh,
+}: MemberCardProps) {
+  const currentOrganizationId = useOrganizationStateStore(
+    (state: OrganizationStateStore) => state.currentOrganizationId
+  );
+  const { userSession } = useAuthStore((state: AuthStore) => state);
+  const { deleteNested: deleteUser } = useUserMutation(currentOrganizationId);
+
+  // Check if current user is a coach in any of this user's relationships
+  // and make sure we can't delete ourselves
+  const canDeleteUser = userRelationships.some(
+    (rel) => rel.coach_id === userSession.id && userId !== userSession.id
+  );
+
+  const handleDelete = async () => {
+    if (!confirm("Are you sure you want to delete this member?")) {
+      return;
+    }
+
+    try {
+      await deleteUser(currentOrganizationId, userId);
+      onRefresh(); // Call refresh after successful deletion
+    } catch (error) {
+      console.error("Error deleting user:", error);
+      // You might want to show an error toast here
path: src/components/ui/members/member-card.tsx
user: login: calebbourg
body: Updated accebcf99c476dcd909eb3b27c415223ebecd387

created_at: 2025-04-02T10:25:04Z
author_association: COLLABORATOR
diff_hunk: @@ -1,12 +1,27 @@
 import { Card, CardContent } from "@/components/ui/card";
 import { User } from "@/types/user";
 import { MemberCard } from "./member-card";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
 
 interface MemberListProps {
   users: User[];
+  relationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberList({ users }: MemberListProps) {
+export function MemberList({
+  users,
+  relationships,
+  onRefresh,
+}: MemberListProps) {
+  // Create a mapping of user IDs to their associated relationships
+  const userRelationshipsMap = users.reduce((acc, user) => {
path: src/components/ui/members/member-list.tsx
user: login: calebbourg
body: It stands for accumulator. Sometimes you'll see it as just `acc` or `sum` depending on what you're trying to accomplish using a `reduce` function (sometimes called `fold` or `inject`). This was just a matter of habit. I agree it can be more descriptive though! Updated in accebcf99c476dcd909eb3b27c415223ebecd387
created_at: 2025-04-02T10:27:21Z
author_association: COLLABORATOR
diff_hunk: @@ -1,12 +1,27 @@
 import { Card, CardContent } from "@/components/ui/card";
 import { User } from "@/types/user";
 import { MemberCard } from "./member-card";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
 
 interface MemberListProps {
   users: User[];
+  relationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberList({ users }: MemberListProps) {
+export function MemberList({
+  users,
+  relationships,
+  onRefresh,
+}: MemberListProps) {
+  // Create a mapping of user IDs to their associated relationships
+  const userRelationshipsMap = users.reduce((acc, user) => {
+    acc[user.id] = relationships.filter(
+      (rel) => rel.coach_id === user.id || rel.coachee_id === user.id
+    );
+    return acc;
+  }, {} as Record<string, CoachingRelationshipWithUserNames[]>);
path: src/components/ui/members/member-list.tsx
user: login: calebbourg
body: accebcf99c476dcd909eb3b27c415223ebecd387
created_at: 2025-04-02T10:27:29Z
author_association: COLLABORATOR
diff_hunk: @@ -193,6 +193,7 @@ export namespace EntityApi {
     url: string,
     config?: any
   ): Promise<R> => {
+    console.log("deleteFn", url, config);
path: src/lib/api/entity-api.ts
user: login: calebbourg
body: Removed in accebcf99c476dcd909eb3b27c415223ebecd387

created_at: 2025-04-02T10:27:38Z
author_association: COLLABORATOR
path: src/app/organizations/[id]/members/page.tsx
user: login: jhodapp
body: @calebbourg The "Add Member" button is now on the left side of the screen instead of the right, which it should be on the right to be consistent with other pages.
created_at: 2025-04-02T14:45:55Z
author_association: MEMBER
diff_hunk: @@ -1,12 +1,27 @@
 import { Card, CardContent } from "@/components/ui/card";
 import { User } from "@/types/user";
 import { MemberCard } from "./member-card";
+import { CoachingRelationshipWithUserNames } from "@/types/coaching_relationship_with_user_names";
 
 interface MemberListProps {
   users: User[];
+  relationships: CoachingRelationshipWithUserNames[];
+  onRefresh: () => void;
 }
 
-export function MemberList({ users }: MemberListProps) {
+export function MemberList({
+  users,
+  relationships,
+  onRefresh,
+}: MemberListProps) {
+  // Create a mapping of user IDs to their associated relationships
+  const userRelationshipsMap = users.reduce((acc, user) => {
path: src/components/ui/members/member-list.tsx
user: login: jhodapp
body: Thanks, I've not used an accumulator before so makes sense that this wasn't obvious to me. Thanks for making it be more descriptive.
created_at: 2025-04-02T14:47:58Z
author_association: MEMBER

PR comments:
user: login: jhodapp
created_at: 2025-04-01T16:03:58Z
body: @calebbourg reminder as discussed in Slack: The Member page has 2 titles and only needs one on that page, and it should be an `<h3>` element. Would you mind making that update in this PR too since it’s such a minor change? Make sure it matches the title in style on the Dashboard page.
author_association: MEMBER
user: login: calebbourg
created_at: 2025-04-02T10:28:47Z
body: @jhodapp Thank you for the review! I think I've addressed everything. Including removing the extra title on the members page

<img width="416" alt="Screenshot 2025-04-02 at 6 18 48 AM" src="https://github.com/user-attachments/assets/e94f1fe5-c17f-47e8-801b-3afc80f9f390" />

author_association: COLLABORATOR
user: login: calebbourg
created_at: 2025-04-04T10:49:37Z
body: @jhodapp How does this look dfa4cb388770761e0c398d8f3cbb495bf1859df4 
<img width="1075" alt="Screenshot 2025-04-04 at 6 47 53 AM" src="https://github.com/user-attachments/assets/4b32892e-5f12-49cd-aadc-448ef2a9334f" />

author_association: COLLABORATOR
user: login: jhodapp
created_at: 2025-04-04T14:39:59Z
body: > @jhodapp How does this look [dfa4cb3](https://github.com/refactor-group/refactor-platform-fe/commit/dfa4cb388770761e0c398d8f3cbb495bf1859df4) <img alt="Screenshot 2025-04-04 at 6 47 53 AM" width="1075" src="https://private-user-images.githubusercontent.com/14064042/430338488-4b32892e-5f12-49cd-aadc-448ef2a9334f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDM3Nzc4MjYsIm5iZiI6MTc0Mzc3NzUyNiwicGF0aCI6Ii8xNDA2NDA0Mi80MzAzMzg0ODgtNGIzMjg5MmUtNWYxMi00OWNkLWFhZGMtNDQ4ZWYyYTkzMzRmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTA0MDQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwNDA0VDE0Mzg0NlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTg2ODE1ZDUzYTc1NzkzMzZlYjc5MWY0M2U1MDU1YzE0Yjg0YTc4ZWFlOGEzMjQ4NzMwMTFmMjM4OWI2YzAxMDQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.rVFpIVK1x2yFXV1Dp97X381t9neRyYtP3srNhLhZrqU">

@calebbourg Looks great, are you sure this is the right commit? It's from 2 days ago, I don't see a pushed commit that changes the button to be right justified.
author_association: MEMBER
user: login: calebbourg
created_at: 2025-04-04T14:48:48Z
body: @jhodapp I believe it is. I moved the "Members" text into the actual component and it placed the button to that side. I chose that approach to couple the both the text and the button with the list itself. Let me know what you think about that.
author_association: COLLABORATOR
user: login: jhodapp
created_at: 2025-04-04T17:06:29Z
body: > @jhodapp I believe it is. I moved the "Members" text into the actual component and it placed the button to that side. I chose that approach to couple the both the text and the button with the list itself. Let me know what you think about that.

I think that's a fine approach for our needs right now on the page, and we an change it in the future easily if necessary.
author_association: MEMBER