This is an automated email from the ASF dual-hosted git repository.

bbovenzi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new c03e6ec3b3e Rearrange Dag details view (#46939)
c03e6ec3b3e is described below

commit c03e6ec3b3e91a81f72e61108e43f997aff36638
Author: Brent Bovenzi <[email protected]>
AuthorDate: Tue Feb 25 15:46:14 2025 -0500

    Rearrange Dag details view (#46939)
    
    * Rearrange Dag details view
    
    * Address PR feedback
---
 airflow/ui/package.json                            |    3 +-
 airflow/ui/pnpm-lock.yaml                          | 1257 ++++++++++----------
 airflow/ui/src/components/HeaderCard.tsx           |   81 ++
 airflow/ui/src/components/Stat.tsx                 |   12 +-
 .../index.ts => components/TruncatedText.tsx}      |   19 +-
 airflow/ui/src/layouts/BaseLayout.tsx              |    6 +-
 airflow/ui/src/layouts/Details/DagBreadcrumb.tsx   |  143 +++
 airflow/ui/src/layouts/Details/DagVizModal.tsx     |  105 --
 airflow/ui/src/layouts/Details/DetailsLayout.tsx   |  149 ++-
 airflow/ui/src/layouts/Details/Graph/Graph.tsx     |   68 +-
 airflow/ui/src/layouts/Details/Graph/TaskNode.tsx  |    2 +-
 airflow/ui/src/layouts/Details/Grid/Bar.tsx        |    3 +-
 airflow/ui/src/layouts/Details/Grid/Grid.tsx       |    6 +-
 airflow/ui/src/layouts/Details/Grid/GridButton.tsx |    6 +-
 airflow/ui/src/layouts/Details/Grid/GridTI.tsx     |   52 +-
 airflow/ui/src/layouts/Details/Grid/TaskNames.tsx  |    1 +
 airflow/ui/src/layouts/Details/NavTabs.tsx         |   72 +-
 airflow/ui/src/pages/Dag/Dag.tsx                   |   35 +-
 airflow/ui/src/pages/Dag/Header.tsx                |  152 ++-
 airflow/ui/src/pages/Run/Header.tsx                |   67 +-
 airflow/ui/src/pages/Run/Run.tsx                   |   42 +-
 airflow/ui/src/pages/Task/Header.tsx               |   40 +-
 airflow/ui/src/pages/Task/Task.tsx                 |   44 +-
 airflow/ui/src/pages/TaskInstance/Header.tsx       |   95 +-
 airflow/ui/src/pages/TaskInstance/TaskInstance.tsx |   66 +-
 airflow/ui/src/pages/TaskInstances.tsx             |    6 +-
 airflow/ui/src/queries/useClearRun.ts              |    2 +
 airflow/ui/src/queries/useClearTaskInstances.ts    |    2 +
 airflow/ui/src/queries/usePatchDagRun.ts           |    2 +
 airflow/ui/src/queries/usePatchTaskInstance.ts     |    2 +
 airflow/ui/src/queries/useTrigger.ts               |    2 +
 airflow/ui/src/utils/index.ts                      |    1 +
 .../Stat.tsx => utils/useContainerWidth.ts}        |   36 +-
 33 files changed, 1348 insertions(+), 1231 deletions(-)

diff --git a/airflow/ui/package.json b/airflow/ui/package.json
index 80a856114a0..f7a0931f78c 100644
--- a/airflow/ui/package.json
+++ b/airflow/ui/package.json
@@ -17,7 +17,7 @@
   },
   "dependencies": {
     "@chakra-ui/anatomy": "^2.2.2",
-    "@chakra-ui/react": "^3.1.1",
+    "@chakra-ui/react": "^3.8.1",
     "@codemirror/lang-json": "^6.0.1",
     "@emotion/react": "^11.13.3",
     "@tanstack/react-query": "^5.52.1",
@@ -44,6 +44,7 @@
     "react-icons": "^5.4.0",
     "react-json-view": "^1.21.3",
     "react-markdown": "^9.0.1",
+    "react-resizable-panels": "^2.1.7",
     "react-router-dom": "^6.26.2",
     "react-syntax-highlighter": "^15.5.6",
     "remark-gfm": "^4.0.0",
diff --git a/airflow/ui/pnpm-lock.yaml b/airflow/ui/pnpm-lock.yaml
index f47b63f2911..fe27afe69f4 100644
--- a/airflow/ui/pnpm-lock.yaml
+++ b/airflow/ui/pnpm-lock.yaml
@@ -12,8 +12,8 @@ importers:
         specifier: ^2.2.2
         version: 2.2.2
       '@chakra-ui/react':
-        specifier: ^3.1.1
-        version: 
3.1.1(@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected])
+        specifier: ^3.8.1
+        version: 
3.8.1(@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected])
       '@codemirror/lang-json':
         specifier: ^6.0.1
         version: 6.0.1
@@ -49,7 +49,7 @@ importers:
         version: 1.7.7
       chakra-react-select:
         specifier: 6.0.0-next.2
-        version: 
6.0.0-next.2(@chakra-ui/[email protected](@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected]))(@types/[email protected])([email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected])
+        version: 
6.0.0-next.2(@chakra-ui/[email protected](@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected]))(@types/[email protected])([email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected])
       chart.js:
         specifier: ^4.4.6
         version: 4.4.6
@@ -92,6 +92,9 @@ importers:
       react-markdown:
         specifier: ^9.0.1
         version: 9.0.1(@types/[email protected])([email protected])
+      react-resizable-panels:
+        specifier: ^2.1.7
+        version: 2.1.7([email protected]([email protected]))([email protected])
       react-router-dom:
         specifier: ^6.26.2
         version: 6.26.2([email protected]([email protected]))([email protected])
@@ -234,8 +237,8 @@ packages:
     resolution: {integrity: 
sha512-9K6xOqeevacvweLGik6LnZCb1fBtCOSIWQs8d096XGeqoLKC33UVMGz9+77Gw44KvbH4pKcQPWo4ZpxkXYj05w==}
     engines: {node: '>= 16'}
 
-  '@ark-ui/[email protected]':
-    resolution: {integrity: 
sha512-7Y8NToONNbfDngQh15GNzn4i4RLJTRRmXm9tXB09a1nKbuYICbxFcX+5IgdhvRudoIFR9r2sCbeEy69I6T13gg==}
+  '@ark-ui/[email protected]':
+    resolution: {integrity: 
sha512-grnfoSUrGxN0VMgtf4yvpMgin2T4ERINqYm3x/XKny+q2iIO76PD7yjNP7IW+CDmNxy3QPOidcvRiCyy6x0LGA==}
     peerDependencies:
       react: '>=18.0.0'
       react-dom: '>=18.0.0'
@@ -349,8 +352,8 @@ packages:
   '@chakra-ui/[email protected]':
     resolution: {integrity: 
sha512-MV6D4VLRIHr4PkW4zMyqfrNS1mPlCTiCXwvYGtDFQYr+xHFfonhAuf9WjsSc0nyp2m0OdkSLnzmVKkZFLo25Tg==}
 
-  '@chakra-ui/[email protected]':
-    resolution: {integrity: 
sha512-n7sDBwr99nUNJiLYy6WOIXZr5Sn9W5myo982MGuo5GieFxrP40uH8VyXbq9XaQk+KiZiF4PleQd4R/7yG597RA==}
+  '@chakra-ui/[email protected]':
+    resolution: {integrity: 
sha512-U1SIjSENiJ62tVKGq/fLDcQWSnzjVAsKCqNNIfg5RtPOP4y7j0k//n9HPsmGVLrBEJb5JGSTsudfFen0t/dHBQ==}
     peerDependencies:
       '@emotion/react': '>=11'
       react: '>=18'
@@ -421,6 +424,9 @@ packages:
   '@emotion/[email protected]':
     resolution: {integrity: 
sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==}
 
+  '@emotion/[email protected]':
+    resolution: {integrity: 
sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==}
+
   '@emotion/[email protected]':
     resolution: {integrity: 
sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==}
 
@@ -432,12 +438,20 @@ packages:
     peerDependencies:
       react: '>=16.8.0'
 
+  '@emotion/[email protected]':
+    resolution: {integrity: 
sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==}
+    peerDependencies:
+      react: '>=16.8.0'
+
   '@emotion/[email protected]':
     resolution: {integrity: 
sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==}
 
   '@emotion/[email protected]':
     resolution: {integrity: 
sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==}
 
+  '@emotion/[email protected]':
+    resolution: {integrity: 
sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==}
+
   '@emotion/[email protected]':
     resolution: {integrity: 
sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==}
 
@@ -619,8 +633,8 @@ packages:
   '@floating-ui/[email protected]':
     resolution: {integrity: 
sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==}
 
-  '@floating-ui/[email protected]':
-    resolution: {integrity: 
sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==}
+  '@floating-ui/[email protected]':
+    resolution: {integrity: 
sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==}
 
   '@floating-ui/[email protected]':
     resolution: {integrity: 
sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
@@ -660,11 +674,11 @@ packages:
     peerDependencies:
       '@types/node': '>=18'
 
-  '@internationalized/[email protected]':
-    resolution: {integrity: 
sha512-jLxQjefH9VI5P9UQuqB6qNKnvFt1Ky1TPIzHGsIlCi7sZZoMR8SdYbBGRvM0y+Jtb+ez4ieBzmiAUcpmPYpyOw==}
+  '@internationalized/[email protected]':
+    resolution: {integrity: 
sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ==}
 
-  '@internationalized/[email protected]':
-    resolution: {integrity: 
sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==}
+  '@internationalized/[email protected]':
+    resolution: {integrity: 
sha512-PtrRcJVy7nw++wn4W2OuePQQfTqDzfusSuY1QTtui4wa7r+rGVtR75pO8CyKvHvzyQYi3Q1uO5sY0AsB4e65Bw==}
 
   '@isaacs/[email protected]':
     resolution: {integrity: 
sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
@@ -1409,212 +1423,206 @@ packages:
   '@xyflow/[email protected]':
     resolution: {integrity: 
sha512-bmFXvboVdiydIFZmDCjrbBCYgB0d5pYdkcZPWbAxGmhMRUZ+kW3CksYgYxWabrw51rwpWitLEadvLrivG0mVfA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-0E6LpQgmcbDe12akh2sKYVvk+fwxVUwjVdclj8ntzlkAYy8PNTTbd9kfNB6rX9+lJUXk/Iqb5+Qgy9RjWplnNw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-DWaElpm6RhntW8zVPMfd+s461FuXi6rv4pDPpXb4xCAJ0KTkBzS6PFxoBLL+11Mjv9XioaBoJatIGOCF8GAtTA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-wIJQGBiSHYB94UA7k7o4a8xbyqDwIQ0dG52xcD7+eV1ypT+dP+BtxQKmS5w06aghNdHs8b4F2hVLDVSdyLqRkQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-wpgU7LyU9St3o/ft8Nkundi7MkW37vN1hYc2E7VA/R6mun0qiANsEf83ymIlAYnovLC6WUlBso9xwqejr6wRCg==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-F4dkdLZ3Qeu6Er9rwl8IWEAdhAjcOTRKsE1Otoi0SKjcQKlQfLTPutVDVaZQxz1ZNXNlyq3YUgFE+EiwMV7jxA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-KSz9oMY9rn1N3k3tFTKHlU66eQf8XZ/gy/ex27J0ykZoaYJplWQerSZvVakbILeh+rtpvdiTNaSgrCAwYwvAPA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-h7gR3LCcxgURg/Xz4IoI4ccN/A+u63zNT8HoXjBWezy050YsItj20q2Yelm6ADT9qcbC+a6W83j4C43ejy5Q5w==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-adOB7Y4p4i6b8GJv4V6qhlK1YRj4Ejs5I+eWFd8Rx535uQIcxEEVtpEAD5SRYg5PNk1ikaT+GCoHnTadGj6PuA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-Ctk/r+rbA0ZvdORRKyLMvtxxulda5m0moa5NtT2TuZe3WlTmJRYBMlSQzXwfOAXCjQlLp+zkeyyriP441sm9OQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-XjRvDRmBxwy5OtIzlQOpf7zNk4g0b/uA7qZve5Hz0R7yWOu+NFlbFv0GsvRfgyYMCT5J0xBu271EG9FJq3QKyw==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-EAM3hHXlC5HNcT7D2IaX7p4aOaXLaLYkSCJcMqqo9H3CxVWa7Kfw00yTG1Z0HcRNKiPYTBF/W9fqtHwfpa5s+w==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-MO9+9oedxdKynxgvLLzXs+VQSOhu+GvsCLV4fBt7nMBMGIRHtRSzXHRNRkO0aqbsO/nKQ8TFH7GYzI1NqT/y4A==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-bmF1I179fhEvEXBJU5yzHi+W2Oett0PUVUw2GFFzfIn6w0AgZKNIr8+NLtEWR0Wn0UELXNhLnBSqZC3j2jZHlA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-yD/h8ao/JTljEo+zthpKzTy/f9fqOlJ7Nd6psPoSKZy2MRGD0TDUbOjravb3icVgjTLCiaPVWMWdonny08Me6A==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-0D7sIBilV+KTMwArmfa73uJUtDbAqHH3g5o3RFJ+RYpAIYQTINGLw13tsmUK7xQ8gd6M8ARAcAv1khZdwO4ykA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-r1r3vwozs+lyNgccR3OfmYAydP0cJbIHGsgDKGuempinqv6xIoptHOkFgWNd6Kxz/3MnxP+BMEy6fZzECXkhdQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-wZI57xWU2tlcJDPlQBUyBxg39PUkY12H6MKcf/+1KBOpJiWc87+4HDBCVSt31diUAhJwcbNsYFwJg3BA4vTw7Q==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-TuggUoXRVBOwACksi63TsN2rOukzUpe6oVMUvp9MaQaDbg9gpw0JzLTrdAaHfE+bhgXAb3EjN6wcZjq8zBctZQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-8Ls5TR1kKPLDucuJJ0kuwJ45jOEzhcVN4T/mbkShUrgRSB4FrcNzwdpMrKqidNz8OrtphgYYcn3xx/gGUIHLRQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-uteM+xWZlWhRQe5biA5QWyva9PdzXONs+bpycUtZt8MakQgPmhW2whY9r1aW5NFVb/ScTwGAIGB3Eyc6Npz7Wg==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-l5YAxXjSNWT++gCBLkP/qKwdHpNSxZYGdLU5f1fNupFSSZgZlNTz99ArxsypqFrJKTVvPjDSoOhjG4BeKHAAdg==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-/MShDVBFNnXResLzeyWyKApeHuB9rmUeJo3WD/Bl6rTwjmvVCKRYguIe1SQviOokMLjuAyh0YWXdKMQw0HvMqQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-yoavZXIGuVXi/QCO89hBu9Ni0xH7o8ZcDFX/CIjr3S9sI3fjNak9efkfPFx0Ooo9x0Fvz8mpu+DPB2uk7voXDA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-BMSYcBeypGX0wCLszU2jxWBRUmd5/wPDJ59Y3Zwl9yNld0gtMnuBLSUeokMcG0UVQ/BxkyrWu3VDkKTUYKprqQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-NqG2R01NjZz5a3hGYI0Ok7MNM7OkMlYlTI5fJXDgkkhgXi5Mk87R4+AQNjP7xzSEI35rSlVIJt4ecW59cklHng==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-Me3a0Sw4dTtmBRmbLGO/C1LJ4btZwbd5RLYnf8RPhEnqGJ5Z05i+ffWEe+SNBvpQO14njqBcF6P8VypVD/Ro1A==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-UAnj9WJdFYeTxbwSCdX8zRYhtLvlJqfqy9cn2NEugpxf+9W/GA89JzH1ZdKLyVJUIuIPoqGd4ZaAgv2p64DZ1Q==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-Ux0fkt1PumcqLwExcEozCMEfKBxtd2JlnitXo4hR3lJW5q9G52FkgWDyPSrhblyTkX+7RgxViZTMnHxaXs99jg==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-iIVQLEAV1FKM+aB7v7Xk5o4w95vdmJhe3aTYDxc6Xo+Fw4tsdUmg/UtQ1ScPzbagBo8Cut2krvkG/8SrlCRMyw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-f+4CV29+hcQ3Yw9hh0yyVRANONIUEWIrPS1fpnrrUNtIC0Y7f1Ajx+x089X9VxgQhwreK1sEwpnrL2vIqy+9+A==}
     peerDependencies:
       '@internationalized/date': '>=3.0.0'
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-Pb7FggFOTzCTyo+ap4uuA6vBFrYDSoqW/sMI6kwuOBWL3IjFKfmmSVaem6MYycycWN8d7on4IOp0muWCcJaDUQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-z9sHtgV4fvtXsqLaTD4/o+D+H5wumLYhIw/Bj3yC41gR5oa4Wo9QifRT9DBfvuokmXsrnRZ8k32hUtWoYb6M/A==}
     peerDependencies:
       '@internationalized/date': '>=3.0.0'
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-2kYqFSqpa1SShS2Z8cVqtoOML3uiwIUOZxNVKIea3ItdlMTqHJI+X/NudFvgpUvVj4NMLbUhwIgC+jN2SWDL7g==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-oqi+6Y/rx6ZKxg3s9r6bIuo33x+5+UDhvrlk31kE3LWgU1KJjVV0VEkFMK9B1SJTY7IizhlWMyDx+JXJ+jOy5Q==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-Wl6n1lW1eTKKu5Kg+6jum9nZDXYGA86XL24Rip2aOScrAo2UGCA+nSIgg7GGO5qGs52iawITba38tAe6maZQLw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-vs+zkORzaeNzX4Wsy4OkW1AVce7l4Tc6DHZq8gqNB5SvhK+5wEPl6EmacQRvZyoCxi2m6xpaI98UkLCmVJKU+Q==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-duuwxowflkY7UUI+1vHr9ttzqn2JtJ+mgAS0cBeNmqtvK6XrNaHSrm0B4u4R/KIJ73Tx8TZGbmgN9Vwj/U2FrA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-KFtbqDUykQur587hyrGi8LL8GfTS2mqBpIT0kL3E+S63Mq7U84i+hGf3VyNuInMB5ONpkNEk5JN4G9/HWQ6pAQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-g+7wIdhT1nlY5yhQWoMDzin8uYoBXeQk8TNUj3GZH/1dTX9YC0vs7vz7rotzunLkEA7nEGfLNzdO5CRQBhGp0w==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-V5i3kYSHFJYj8914nBf4VKKtm6m59gG482vm20As4EnLcwGFrOBbm4HXUgsKq0wYSLy/lTtvMrUT8Iqudye2gw==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-SXSaAmaqvhFPJmX25tz487skF+GTIGAmp0Y6iHqDUsUh0qDncUPOr90M+kFtud/6YUPFkzEpKQtmeczJR0LURw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-xXUjmeIUdxkxic5bepp6fVqN9Qs+54PXCAUl6g/DtJecQVmVooIfa3SLSULhany4aR4mlGojp5TJxvSpUBA58Q==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-FK+bQ4nhdcR52868uE0rlmmq4+un5P++WDoe6S4Aldrx7FJS2XTtWMBdx09zBe48DvUYjGM4o3RbuxbCQoD0BQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-k1rOE6NhoULI9d5pt2qVUxWCQVEf3OTPH8UDnbsdf11xn+hMCzRYd9lekUdVGrcHHGvEK+W6iAfWZnlwsJsmow==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-mqw0PLdPs17zrolZBlsYby5kUfo8+QpaU/HAVQavnHQZwNiX4CRBvG1YeqSP699Mvh6QDKc0JhchwAfh+eGGnA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-6cgJsy9bf2DB0v+CVq1L4g4aCePTpfWsV4C0HC+82K+OSPomiIPsQS87wo4+eAcy3z+80Qh+uglZCFAwkW8W+g==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-VVko5ojAoRQsalsaQxGwTt5ONcYaHuw6yFL/HqPKNzGyyG8zPBl0nRGMSZQprTyUSMDtsxNp8ydL1cbauDqU3Q==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-/u86hMd+E5UCrrY9akDAExkO7sgPA1lXzWC9gSX4LSxHATk7Vo4o5+4LiE1MX4WZRytOhtxAycJzNDVpqzmppQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-pTyU33Ag7533X3/RCBvfbGBHFMncg5x2/3n1htSxEVLIIHxbRvvDab2IN550n3OIjMzBLfM4xjNu1R87ed2hlQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-z5OzmR8O3n2043Lwhp1qcizNHXvzc/Xteb3hWmxbX9hR3k0wHJeMXMj3GTDO0FBixRt+d8iHEmt3/8CkI72mqw==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-CO5x3uCGKgigQ91S3c3vy/KEKyXK+eTveIzprFTxlQs4Zu2qMe/nJCIhIkG54fhvW/a5F9wY7Ox1f8hGZ1Z1fA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-b87FqZO6e9RmTY4msEzwZ3hZ8pRuPd2vbR2b6SlXr6ohtmGKlGgBGO4kmarZN/ClE+7VOnOEqIicatRBEgX9bw==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-LPaZfDhQmhyL4fMMKm4gZGUg6vwcSzaHOVlQHdAR8yoSqvO4yXEdxr2xz4civNNknD0crST2erfexGHEY6Oa/Q==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-lS5r3V0l7Z53QyNwkxulYp5QYA9mFkU+3XsZqfM6cBjh+wmGE1xeIwknAmFtYvuYNK37AwT7pp5z0Rm1Ep6WVQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-zuy2E62F/w3G94kh4l3iEAtNxqwuAdNkMwcS8EhT6mnzNcf4BgzW7Ne+O1fRb4IGazZwHPaWC0rYdTUuErK9IA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-fp9t/PNXODwxXR1X+VzgYeSpgoJ+M3W/qvuA2stgPI4kEinwKEssSlP2sH6gTmQVZKL8SV1jiNQinVh00NE85g==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-Li1lrePYcTC2UqAP/oOLcK4syyBomTmAp06CJukSXpGcYe6qUD4CqhLva0qYjvZ6SKaB9Y3BryD9RTjFvZOuZA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-YcTIqka6+/YoH2VRBMnv3CvTjHdUo/NG2nMenAB9Wq0MLTn+TAtcsujenz7ckJcgayVhFAchWNhwK9+/cs1dAw==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-S+ZJ3OFUtCoUdKkDfiF3sgXr+98rhVV+BmHgfAiEYRQA7RjeHDB3jX+eBbeZTLFqvHGtaGWCRE3knto3Ed7YvQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-WcWJB5kM41fDM6YMGC3ZEPVn1q3Nrm+cAFkllRJrRY4+bUKXmtN8bqDaRKghP+dG5CXz66SiM6xBvDE4nqtK5Q==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-58ilkSC2UQw9PsFo4HKBrYcWC1+WRA8M6MqNf9MnxxOvAq+Y8APH0I6ExxAfUhLsk9v+6kPf0txM9MDoB0iNFA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-BmSXc41y1uOra/UV1lt8BurWkuwne/+c371IJCK6l+MWsO0ufq1lrjfx4cyFf5yhVcPRkhv/b/0i+7RxfDSK1A==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-l9cipG1hykvSWIbKc3/3imFQ+Sp3u2VjZirmdM2K9julo7DKxU3r63aQI2s6SpD4tfQPq4AcoXqzZBF0RnQRUg==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-faAlQZYeWHcGH8nIxBYh7HHfVjSKsHV8yUsbhMD0XkePWM6eB+dPRd/Fc3DeT8ieM8+sUODnTHEuxar0i48v4w==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-dEBerxdgPH4dGWEbFM/aY8zYtUAQL7hopv4iWPHv1NMFhWu7IShmKe2xm/4ZSKaOkiWZ2CJyMI0oHr+qQ+ZhWg==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-QIQlxlxM78+TkEhPEGlTbkBR3G2ngm5vhc3BFw4sG6ABMyre8TiIH37EqQB7EGKyAcuz6QwPk3AervHMFKe4YQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-I889jfoTiKX9gRbyZCgKDyBj1+VgFCKyELbFVJhgnWQhip4MLjzI0YjWWp/wgHs/ZwEBaxvy6CRq1KOtvGkQNg==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-1Rsd3cSnlewefNB1RBI0ymK5wlgiBcK42H1IrJIhly6+SXDAhp0Oc45ofsCzpfhkQ4be+A9Cb30ayc6J4ZU2kA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-wNaixDQDotwUUKtpA524tfDvsiQQroDFZYFPZfnwKq89rPT0Zlh8LMKLL/Mfi32Zqp8UP9srdcMEy1XEGrIiNA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-P7UN7rIt03YHt05SuK+kZ9mhl4AfvCvaSGB/9KzEq5r6p1D3lc4+0LVkkOvL2EEB8vbGY/y5BNcvaF2jPQPH5Q==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-sm2xlc03Zy4DdCRNmr7jUgL9s34rK0bVDezn35TCq3QMPWQndIlsCbywcmxqxxtUymwnSwizWenZaWVlspFlgg==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-zZ8H/jcjaXcLRX4dBcmandexeKV/5cBOt4AUVEnd3/X5NFFkA2Njz8rpQFcNRZl814NxG4RCchIu8kmonmUKCA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-aqwqxHrgvfm6rAcxIRTSRFaWA9/UCQGiLP+P01Hg+/+IkVJeJIdxN10ImSOL4Sl9zvsu3jVCXg6xLh4ydnaWqw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-vQTmVUs6aLGqKmWb+FnLDntsulvd/sCvgndeTmwOHRW8PBwPb86aDnvNrNosBSS+Kk9p6CMJwWZ6CuPWR5Kf7Q==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-1LxK/VSU8t9w9/c726gZNHXnawU4SnN0DxsYQa4YxN1RDwFp/RwKp0hLAsunKx7yBdyC1VVyqVPYZdZYQotdQg==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-eZeAkq2s7NYCiNVMvkWL2Or458hZj71u7ygCt6skA18sO1ZksY+qIFqj99leCov+fesz06Hf8bxZz5029t/Wjg==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-B0U2/XJ630kWYY1x5UTBMxXjy2EfbH9T3eRQlSXZS/uToEzvhsYvw/YaIRqyvYxPyrnmB72to6r5Kw8omryw4Q==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-Fy1EjUda7o7e/yTKbZgKKayGOsHxkjLG+x0AakHmbR/k2VKbM4QuFHB9RJLlqNd9a+m/BzS1kEKWzCJ7/mXL9Q==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-gsS32rxw+bSKOLOtF/VPNNafzO/fEU58OYIfM7yA4swrEupUqdfAF/ihNH+Uj/AZQKj2tnwLTR1fJ1w3czpY9w==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-E1N1o1dPVuhWkcrg6urut2aaCqrc16OeE9VJh1mAGIUknF3p0QScH+ql7J/n9r8WOa21xyF6HLKhnWVPRQmHGg==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-57eBd5C205jYUQ7Rsbft9YRy4euNDdxKDpdLdInqk8egf2vFaUWIV152pm5iOGRVidDGgcIunTFvHFCT1rbATQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-YTqP4Ok2YEmEXCEiNW2tufZ6svt4sh7KHqrHZq81vPAJMKKhVosP6LnZvmt4dVn6tKJ0OU8idwFVtPM5jSAWoA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-4LNhFP18g21ni4Hv0RQEYqcMhiyMzTsu1IPizy8I5l3mJvsV6b7w591K2iC4mybLynPBodvkl+fLKqKm3Z+1IA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-ULl0OA207b6Ilsr2QWt4dbx58hA/NnyCmHpvv1pAYSlH3K0Es5b25B80Cc5jM/3NK3yqoY81OkS9U8lxmpWo+A==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-GHAmnHz9pdaP0c5/n4aPSo67Bk1Cvv9PIHuOKKLyalRcao/ARvtiS6371logfB1l9DHtMSARWaZXDrIdNZx/gQ==}
-
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-Ntbi21CTqXIVMrGccVSefwCapACSTOy4XFDM9/piTLeRlfmNxsy7j9hl7EFBpovbe4WYLHjNQaL3MM+hXEjRRQ==}
-
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-Yg30ph9YMy5g6TPHU9MD/NEheaz8qOsVVkefG2EvRVfO2ZGXJclqZHg8/TW8nzUGp3Mt/fAq0A7jfeKvJBcNng==}
-
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-Vli4cigN032dQM69Dr/2rR5FSSN+rzYJUiqAo3oNyvvWSSsgLvoNYcfltxY0Tah/PIftbF1NBUNYaUtv3OJgzA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-CZivUTFQ4TdRKTN+9wpWAo0lEZlMnbjJPVn2VJVpcz+eRNUeoVzevkNY/OzAqdV3mp+VtdNabQn1fAz8ngViPQ==}
     peerDependencies:
       react: '>=18.0.0'
       react-dom: '>=18.0.0'
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-bG48u1NsWBRx/fTQfDFskOkwKzpROVhuzJQi/OtnugHQj1nFfZ5CMpEX3BPv5PGwvOia2ZDm84+e12WucFhr0g==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-gXmvj1wK9FeToOCzvoZ5gycqUNRzfeqd84uwJeG9zA8SVdoyEnoAji8IAynneq8t3LbiNUcu37wjTw0dcWM6ig==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-aEuspeZ98eAEGlAfnCh0syzbmFnMuov9yJc8Ud//pbXd+96J7X1xa4TilHZ+ppm8IZZLGc91axXHwkbIINC1Qw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-68cvXvqgNOlucbnGKRyephk8Qg8wb4xpjgUdmF9xQwICdY/uhW2p4ZGJ4471TDCDIlpoBrJPYsWqV2oWH3QNfA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-Xl3CV1ONpQG3Ah0sriiuCFHXuiuzYz9KQkmEapcE+O5kzLADheIvgFRQYiMdLCltEfSBSBJvPrRM08aGyQgSpw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-HL3MkBpWx4Cw0+h1UP/PnvLP3Z1T+F5mkeS8HWmiP+KPzhtFiEBRrve+xk7h7BMXifteg2UZy53ZiZfJeGsd3w==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-Ba5v3J/fQWVR81wvhHAfwbCjqJlv/15If0SCbKiTA879I5s9dZVYAkvibeGlIEK46SEKbeUpAewE/+eGgrrE6A==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-cc6D8Iz+Ewnx9L0J63QGqC2bbiwzCEcJVE/j4OZDcy4Qk3lqr3qA09uuJbQxAi7yvIeB44DIEt9ryTZPkZbgiw==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-aDuzKySgFOm/D0opDyQOo2KMWFN9ZHuF50rG5cfIgl9dzo447iJfLzObcpAwNpQJq5P7/q+23K+sh+/NRGoUbw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-s8ae88OpAafkpuqimO9beUiVTn3FG+bnWeWnYQOLtNYMCNHzQbVZp9QBNbOoUpNcDT14mx9rfZe98BqfiMohFw==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-2PHBD4Y8h4ZcVphMWSDP6EsSamLYburQDDgJTSN5npcWsLu4iZ45T1U8bV0uICs+UJP9fko4YvjABrPv42asLQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-qXVvXbDRq6Cla036M9OH6plO7ubefM7k65NJQKjtITDua+VliKQLXj9BrdPLT9K96wWntW+D/TiZXE+JNbR4ow==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-UTf5SIvfIfuAuGxRZLi5zDN3LGWQp2jdycS9JnKwL+KJKeHPmTu4OtXbRc2c4lEO0z1T9sVOHB0GPwBGK4+c3Q==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-eMNncj+pcepYTf+51s4ysDS/tjtKXswpwsSQR0AeNqCE3SW3TGzHOM0+uheyjgv9EmDGDrr3Imdo0PCkq3bqug==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-LXCSyIVf6G4SvoPojNxOUiK45Lg1Qo/I8NCIoWAgSh6WgthuyEP05oLlW0OdvfHWLsnSwUjJmfuoRQAQNS3M8Q==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-N/LVOPbpQGtqpnNsdgZsQytpvXVoJ9Uldo8G38Q7892wwhVx63L0qLaiOK+SkU7kUTueOh109HezZ67nq3sadw==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-I5OTZ26Rp3ADySnzpIlI47+BiUAhSIXLMpQQ/T2XCpF9hsrxmAwmpyyJ+48L7aLHtzeEusBOATU+CWMEgycRPQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-uWlVivLZBCuAEXrXOITM1srwfBtAnT8kBYVPElrT5aSO9gkV1YC/g+YdFRol7KKOg12qO561CPKReVfilmtAKg==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-e/xkk4aihOikJsw47Q8nwAm/vUlfgXkkGxydquZg4Z42EDNYt5XcxPpIW+7gbzK+ergDYN7JyHQ4+sIRRPA/jg==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-lIZsOs5nG9TkPs75+OK5THprEO0u3NAiLnEJ489KEFautVX/GMwAWvGHNFS7CcCpLZv+EpVKAPAdmGfEphrzhA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-bE1Z2dANz7f734AuX2b4RtGk6/L8Nf44Q1wxCZ++3CLYV6EBBBDb2kNWr/Pz23md58ve+AcFcd/pzKtoXfWcdw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-1uwNRvy8LyUTCAWjL1kD7BexOZ0sHrZ4OnUwDNuaWbqxUjtzoe+ftvcLXvmwFMmrns7o1SVnjqkgSVKuE4mcDA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-c7fLss1VyFnQzs5f5HNMD3qyJczH+SNzOgqMwU6apKpgYRLMMI0S4F03I/cyDQrCPZMcy6F/bl6zlQmdqb6WLQ==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-1mY8nCNMQgMwWBV5zX0bUcIgstqKjvFOAuYhGLIxbQPbgX7lP8Kr3nuhABh0oC0KnWaKfOMlItir2k795G4KMQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-VSsIQ+RUKo1hC+ip2Hq2jsiBTZNV+cuRntGXvVFegI1VG8W2ug6CtW5ilfxcQte8dfn1s6g2F4TY0g79F7svgA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-nWKx3yyHFBUBPOTDFhi3du4wWlQe8wY0EoeWLQN6bpJSF4qo/BosTZJkUHm//FgUdwdhQBFOAsrlrJ0vL4qvNA==}
     peerDependencies:
       '@internationalized/date': '>=3.0.0'
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-T8JGTNd9tJXUZqerBSDVsv1upD0vpccZqXZthpl8u4KFXj8vR/CZ9fW00linc+tR9XdxvBbkxk3EW/BPbNvoDw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-uG4xCrYHgDZJgvW+71ROQX0xIkqMup37ZpNSLS2f5eD5DO1n/9NYLztA1YyeCJyv1aEDsZreeJLJvNDElgXA2A==}
+
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-4dL99zHXQg8j7ReJAR9zLAp5lNKMS4Nm+THnJaKsA0TF5QkELGnsZz47oKhFY0aQn46paxMLVagLqQ0+2i6D1w==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-Xt4F1BxP0U15WoNx73gIpnFRkCB3/dRkA5zQPECzR/U2drN2JAoCdb9wNQjxmR/6DWkT4PuCeWliUcskHDY8Wg==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-8YaYKFz3ciiQhlTFScrvqH3Ke6UMDQLSgMEsCcERBYatd6TxkJwlFiBzpksIDsZpmloBrylyItJvqmzj9jt6Ig==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-4wAsl33rP/LQq052sE+UYn0tfiJtZeINishI+0xrWc7iQY61F6l6UtZUR4I/NT3sa8XV2xSgunVPP4dVN0JlpA==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-ewF/1h2INDJlzYnoIigcWFWim56ezhfl7YGKgqLBdxBoRvZHyhRIfR8bbddVZk4k144gXsMVMeXwS6VEt6D0eQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-lHs7dp1wUK4B+iY227ZfsQelVcRrad7ZVAh27ZzRdCkUE7KMi8ev45YudbnSM3ltCMGe6F+it7jWcalccFad4w==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-Oo4ZA3vG2sYEotfrWVXfIV1KW0Z+s91U+2YPtM2sOLnhetEVXxj/AwAruZfvS6WOcTI7D9UBrrQolY94fdZeOA==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-oLizz/iU5xj3KCIy/oADAIhs2NjLl3LawYYktD8k02JF2XRPi8bDnRF96E0YPeLOnf5XdEEXmDD2A1l+gWrReg==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-xvYwaL49ffC8nnb+ENgNtkSZE1jMh8tm1E777AqBqnrhJZ28+FA9Sk8YDuWIWhNOV/r4n97jTXqj4SAGCrlAMQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-UYdHh5Jj2LZZwP8Amm9YEoj9f/zYNWuuw+HRGCLZew6moHvKj/HHKJHLooPPjGztFIeRsnicE1mJ9E2bDllBaw==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-Nr/CU/z/SZWDL92P2u9VDZL9JUxY8L1P7dGI0CmDKHlEHk1+vzqg3UnVkUKkZ5eVMNLtloHbrux5X9Gmkl39WQ==}
 
-  '@zag-js/[email protected]':
-    resolution: {integrity: 
sha512-WtIsNyDvnslCjtIIP/bRzx3bJMaT0cIgI3f+TgiFWhtQMlUZMpBkwkKVfvUwI5qcZ+ZOMeoonAWFqFECCb3h3g==}
+  '@zag-js/[email protected]':
+    resolution: {integrity: 
sha512-JUGdEjstrzB0G2AJqzQiURIl6UZ1ONYgby/pqBKX57LO5LxasQXk9oNZh8+ZAvePNC/lKqqTtyyI02YQB4XwkA==}
 
   [email protected]:
     resolution: {integrity: 
sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
@@ -1664,10 +1672,6 @@ packages:
   [email protected]:
     resolution: {integrity: 
sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
 
-  [email protected]:
-    resolution: {integrity: 
sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
-    engines: {node: '>=10'}
-
   [email protected]:
     resolution: {integrity: 
sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
 
@@ -2374,6 +2378,9 @@ packages:
   [email protected]:
     resolution: {integrity: 
sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
 
+  [email protected]:
+    resolution: {integrity: 
sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+
   [email protected]:
     resolution: {integrity: 
sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
 
@@ -2420,9 +2427,6 @@ packages:
     peerDependencies:
       react: ^15.0.2 || ^16.0.0 || ^17.0.0
 
-  [email protected]:
-    resolution: {integrity: 
sha512-1td0l3pMkWJLFipobUcGaf+5DTY4PLDDrcqoSaKP8ediO/CoWCCYk/fT/Y2A4e6TNB+Sh6clRJCjOPPnKoNHnQ==}
-
   [email protected]:
     resolution: {integrity: 
sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
     engines: {node: '>=4.0'}
@@ -2870,10 +2874,6 @@ packages:
   [email protected]:
     resolution: {integrity: 
sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
 
-  [email protected]:
-    resolution: {integrity: 
sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==}
-    engines: {node: '>= 8'}
-
   [email protected]:
     resolution: {integrity: 
sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
 
@@ -3422,6 +3422,9 @@ packages:
   [email protected]:
     resolution: {integrity: 
sha512-y44MCkgtZUCT9tZGuE278fB7PWVf7fRYy0vbRXAts2o5F0EfC4fIQrvQQGBJo1WJbFcVLXzApOscyJuZqHQc1w==}
 
+  [email protected]:
+    resolution: {integrity: 
sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==}
+
   [email protected]:
     resolution: {integrity: 
sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
 
@@ -3499,6 +3502,12 @@ packages:
       '@types/react': '>=18'
       react: '>=18'
 
+  [email protected]:
+    resolution: {integrity: 
sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA==}
+    peerDependencies:
+      react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+      react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+
   [email protected]:
     resolution: {integrity: 
sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==}
     engines: {node: '>=14.0.0'}
@@ -3808,9 +3817,6 @@ packages:
     resolution: {integrity: 
sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==}
     engines: {node: ^14.18.0 || >=16.0.0}
 
-  [email protected]:
-    resolution: {integrity: 
sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
-
   [email protected]:
     resolution: {integrity: 
sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
     engines: {node: '>=10'}
@@ -4253,57 +4259,60 @@ snapshots:
       '@types/json-schema': 7.0.15
       js-yaml: 4.1.0
 
-  '@ark-ui/[email protected]([email protected]([email protected]))([email protected])':
-    dependencies:
-      '@internationalized/date': 3.5.6
-      '@zag-js/accordion': 0.74.2
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/avatar': 0.74.2
-      '@zag-js/carousel': 0.74.2
-      '@zag-js/checkbox': 0.74.2
-      '@zag-js/clipboard': 0.74.2
-      '@zag-js/collapsible': 0.74.2
-      '@zag-js/collection': 0.74.2
-      '@zag-js/color-picker': 0.74.2
-      '@zag-js/color-utils': 0.74.2
-      '@zag-js/combobox': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/date-picker': 0.74.2(@internationalized/[email protected])
-      '@zag-js/date-utils': 0.74.2(@internationalized/[email protected])
-      '@zag-js/dialog': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/editable': 0.74.2
-      '@zag-js/file-upload': 0.74.2
-      '@zag-js/file-utils': 0.74.2
-      '@zag-js/highlight-word': 0.74.2
-      '@zag-js/hover-card': 0.74.2
-      '@zag-js/i18n-utils': 0.74.2
-      '@zag-js/menu': 0.74.2
-      '@zag-js/number-input': 0.74.2
-      '@zag-js/pagination': 0.74.2
-      '@zag-js/pin-input': 0.74.2
-      '@zag-js/popover': 0.74.2
-      '@zag-js/presence': 0.74.2
-      '@zag-js/progress': 0.74.2
-      '@zag-js/qr-code': 0.74.2
-      '@zag-js/radio-group': 0.74.2
-      '@zag-js/rating-group': 0.74.2
-      '@zag-js/react': 0.74.2([email protected]([email protected]))([email protected])
-      '@zag-js/select': 0.74.2
-      '@zag-js/signature-pad': 0.74.2
-      '@zag-js/slider': 0.74.2
-      '@zag-js/splitter': 0.74.2
-      '@zag-js/steps': 0.74.2
-      '@zag-js/switch': 0.74.2
-      '@zag-js/tabs': 0.74.2
-      '@zag-js/tags-input': 0.74.2
-      '@zag-js/time-picker': 0.74.2(@internationalized/[email protected])
-      '@zag-js/timer': 0.74.2
-      '@zag-js/toast': 0.74.2
-      '@zag-js/toggle-group': 0.74.2
-      '@zag-js/tooltip': 0.74.2
-      '@zag-js/tree-view': 0.74.2
-      '@zag-js/types': 0.74.2
+  '@ark-ui/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@internationalized/date': 3.7.0
+      '@zag-js/accordion': 0.82.1
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/auto-resize': 0.82.1
+      '@zag-js/avatar': 0.82.1
+      '@zag-js/carousel': 0.82.1
+      '@zag-js/checkbox': 0.82.1
+      '@zag-js/clipboard': 0.82.1
+      '@zag-js/collapsible': 0.82.1
+      '@zag-js/collection': 0.82.1
+      '@zag-js/color-picker': 0.82.1
+      '@zag-js/color-utils': 0.82.1
+      '@zag-js/combobox': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/date-picker': 0.82.1(@internationalized/[email protected])
+      '@zag-js/date-utils': 0.82.1(@internationalized/[email protected])
+      '@zag-js/dialog': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/editable': 0.82.1
+      '@zag-js/file-upload': 0.82.1
+      '@zag-js/file-utils': 0.82.1
+      '@zag-js/focus-trap': 0.82.1
+      '@zag-js/highlight-word': 0.82.1
+      '@zag-js/hover-card': 0.82.1
+      '@zag-js/i18n-utils': 0.82.1
+      '@zag-js/menu': 0.82.1
+      '@zag-js/number-input': 0.82.1
+      '@zag-js/pagination': 0.82.1
+      '@zag-js/pin-input': 0.82.1
+      '@zag-js/popover': 0.82.1
+      '@zag-js/presence': 0.82.1
+      '@zag-js/progress': 0.82.1
+      '@zag-js/qr-code': 0.82.1
+      '@zag-js/radio-group': 0.82.1
+      '@zag-js/rating-group': 0.82.1
+      '@zag-js/react': 0.82.1([email protected]([email protected]))([email protected])
+      '@zag-js/select': 0.82.1
+      '@zag-js/signature-pad': 0.82.1
+      '@zag-js/slider': 0.82.1
+      '@zag-js/splitter': 0.82.1
+      '@zag-js/steps': 0.82.1
+      '@zag-js/switch': 0.82.1
+      '@zag-js/tabs': 0.82.1
+      '@zag-js/tags-input': 0.82.1
+      '@zag-js/time-picker': 0.82.1(@internationalized/[email protected])
+      '@zag-js/timer': 0.82.1
+      '@zag-js/toast': 0.82.1
+      '@zag-js/toggle-group': 0.82.1
+      '@zag-js/tooltip': 0.82.1
+      '@zag-js/tour': 0.82.1
+      '@zag-js/tree-view': 0.82.1
+      '@zag-js/types': 0.82.1
       react: 18.3.1
       react-dom: 18.3.1([email protected])
 
@@ -4451,17 +4460,17 @@ snapshots:
 
   '@chakra-ui/[email protected]': {}
 
-  
'@chakra-ui/[email protected](@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected])':
+  
'@chakra-ui/[email protected](@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected])':
     dependencies:
-      '@ark-ui/react': 4.1.2([email protected]([email protected]))([email protected])
+      '@ark-ui/react': 4.9.1([email protected]([email protected]))([email protected])
       '@emotion/is-prop-valid': 1.3.1
       '@emotion/react': 11.13.3(@types/[email protected])([email protected])
-      '@emotion/serialize': 1.3.2
-      '@emotion/use-insertion-effect-with-fallbacks': 1.1.0([email protected])
-      '@emotion/utils': 1.4.1
+      '@emotion/serialize': 1.3.3
+      '@emotion/use-insertion-effect-with-fallbacks': 1.2.0([email protected])
+      '@emotion/utils': 1.4.2
       '@pandacss/is-valid-prop': 0.41.0
-      '@zag-js/anatomy': 0.74.2
       csstype: 3.1.3
+      fast-safe-stringify: 2.1.1
       react: 18.3.1
       react-dom: 18.3.1([email protected])
 
@@ -4591,6 +4600,14 @@ snapshots:
       '@emotion/utils': 1.4.1
       csstype: 3.1.3
 
+  '@emotion/[email protected]':
+    dependencies:
+      '@emotion/hash': 0.9.2
+      '@emotion/memoize': 0.9.0
+      '@emotion/unitless': 0.10.0
+      '@emotion/utils': 1.4.2
+      csstype: 3.1.3
+
   '@emotion/[email protected]': {}
 
   '@emotion/[email protected]': {}
@@ -4599,10 +4616,16 @@ snapshots:
     dependencies:
       react: 18.3.1
 
+  '@emotion/[email protected]([email protected])':
+    dependencies:
+      react: 18.3.1
+
   '@emotion/[email protected]': {}
 
   '@emotion/[email protected]': {}
 
+  '@emotion/[email protected]': {}
+
   '@emotion/[email protected]': {}
 
   '@esbuild/[email protected]':
@@ -4715,14 +4738,17 @@ snapshots:
 
   '@floating-ui/[email protected]':
     dependencies:
-      '@floating-ui/utils': 0.2.7
+      '@floating-ui/utils': 0.2.8
 
   '@floating-ui/[email protected]':
     dependencies:
       '@floating-ui/core': 1.6.7
       '@floating-ui/utils': 0.2.8
 
-  '@floating-ui/[email protected]': {}
+  '@floating-ui/[email protected]':
+    dependencies:
+      '@floating-ui/core': 1.6.7
+      '@floating-ui/utils': 0.2.8
 
   '@floating-ui/[email protected]': {}
 
@@ -4767,11 +4793,11 @@ snapshots:
     dependencies:
       '@types/node': 22.5.4
 
-  '@internationalized/[email protected]':
+  '@internationalized/[email protected]':
     dependencies:
       '@swc/helpers': 0.5.13
 
-  '@internationalized/[email protected]':
+  '@internationalized/[email protected]':
     dependencies:
       '@swc/helpers': 0.5.13
 
@@ -5802,498 +5828,462 @@ snapshots:
       d3-selection: 3.0.0
       d3-zoom: 3.0.0
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]': {}
+  '@zag-js/[email protected]': {}
 
-  '@zag-js/[email protected]':
-    dependencies:
-      aria-hidden: 1.2.4
+  '@zag-js/[email protected]': {}
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/dom-query': 0.74.2
+      '@zag-js/dom-query': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/scroll-snap': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/focus-visible': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/focus-visible': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/utils': 0.74.2
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/color-utils': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dismissable': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/popper': 0.74.2
-      '@zag-js/text-selection': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/color-utils': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/popper': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/numeric-range': 0.74.2
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/aria-hidden': 0.74.2
-      '@zag-js/collection': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dismissable': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/popper': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/aria-hidden': 0.82.1
+      '@zag-js/collection': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/popper': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/store': 0.74.2
-      '@zag-js/utils': 0.74.2
-      klona: 2.0.6
+      '@zag-js/store': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected](@internationalized/[email protected])':
+  '@zag-js/[email protected](@internationalized/[email protected])':
     dependencies:
-      '@internationalized/date': 3.5.6
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/date-utils': 0.74.2(@internationalized/[email protected])
-      '@zag-js/dismissable': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/live-region': 0.74.2
-      '@zag-js/popper': 0.74.2
-      '@zag-js/text-selection': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@internationalized/date': 3.7.0
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/date-utils': 0.82.1(@internationalized/[email protected])
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/live-region': 0.82.1
+      '@zag-js/popper': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected](@internationalized/[email protected])':
+  '@zag-js/[email protected](@internationalized/[email protected])':
     dependencies:
-      '@internationalized/date': 3.5.6
+      '@internationalized/date': 3.7.0
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/aria-hidden': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dismissable': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/remove-scroll': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-      focus-trap: 7.6.0
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/aria-hidden': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/focus-trap': 0.82.1
+      '@zag-js/remove-scroll': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/interact-outside': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/interact-outside': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/text-selection': 0.74.2
-      '@zag-js/types': 0.74.2
-
-  '@zag-js/[email protected]': {}
+      '@zag-js/types': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/interact-outside': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/interact-outside': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]': {}
+  '@zag-js/[email protected]': {}
 
-  '@zag-js/[email protected]': {}
+  '@zag-js/[email protected]': {}
 
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/file-utils': 0.74.2
-      '@zag-js/i18n-utils': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/file-utils': 0.82.1
+      '@zag-js/i18n-utils': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/i18n-utils': 0.74.2
+      '@zag-js/i18n-utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/dom-query': 0.74.2
+      '@zag-js/dom-query': 0.82.1
 
-  '@zag-js/[email protected]': {}
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/dom-query': 0.82.1
 
-  '@zag-js/[email protected]': {}
+  '@zag-js/[email protected]': {}
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dismissable': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/popper': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/popper': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/dom-query': 0.74.2
+      '@zag-js/dom-query': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]': {}
+  '@zag-js/[email protected]': {}
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dismissable': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/popper': 0.74.2
-      '@zag-js/rect-utils': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/popper': 0.82.1
+      '@zag-js/rect-utils': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@internationalized/number': 3.5.3
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/number-utils': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]': {}
-
-  '@zag-js/[email protected]': {}
+      '@internationalized/number': 3.6.0
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/aria-hidden': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dismissable': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/popper': 0.74.2
-      '@zag-js/remove-scroll': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-      focus-trap: 7.6.0
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/aria-hidden': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/focus-trap': 0.82.1
+      '@zag-js/popper': 0.82.1
+      '@zag-js/remove-scroll': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@floating-ui/dom': 1.6.11
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@floating-ui/dom': 1.6.12
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/core': 0.74.2
-      '@zag-js/types': 0.74.2
+      '@zag-js/core': 0.82.1
+      '@zag-js/types': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
       proxy-memoize: 3.0.1
       uqr: 0.1.2
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/element-rect': 0.74.2
-      '@zag-js/focus-visible': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/element-rect': 0.82.1
+      '@zag-js/focus-visible': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]([email protected]([email protected]))([email protected])':
+  '@zag-js/[email protected]([email protected]([email protected]))([email protected])':
     dependencies:
-      '@zag-js/core': 0.74.2
-      '@zag-js/store': 0.74.2
-      '@zag-js/types': 0.74.2
-      proxy-compare: 3.0.0
+      '@zag-js/core': 0.82.1
+      '@zag-js/store': 0.82.1
+      '@zag-js/types': 0.82.1
+      proxy-compare: 3.0.1
       react: 18.3.1
       react-dom: 18.3.1([email protected])
 
-  '@zag-js/[email protected]': {}
-
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/dom-query': 0.74.2
-
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/collection': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dismissable': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/popper': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+  '@zag-js/[email protected]': {}
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-      perfect-freehand: 1.2.2
+      '@zag-js/dom-query': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/element-size': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/numeric-range': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/dom-query': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/number-utils': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/collection': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/popper': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
 
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
     dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]':
-    dependencies:
-      proxy-compare: 3.0.0
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+      perfect-freehand: 1.2.2
 
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/focus-visible': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/element-rect': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/auto-resize': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/form-utils': 0.74.2
-      '@zag-js/interact-outside': 0.74.2
-      '@zag-js/live-region': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/dom-query': 0.74.2
-
-  '@zag-js/[email protected](@internationalized/[email protected])':
-    dependencies:
-      '@internationalized/date': 3.5.6
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dismissable': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/popper': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dismissable': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/focus-visible': 0.74.2
-      '@zag-js/popper': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]':
-    dependencies:
-      '@zag-js/anatomy': 0.74.2
-      '@zag-js/core': 0.74.2
-      '@zag-js/dom-event': 0.74.2
-      '@zag-js/dom-query': 0.74.2
-      '@zag-js/types': 0.74.2
-      '@zag-js/utils': 0.74.2
-
-  '@zag-js/[email protected]':
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/element-size': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      proxy-compare: 3.0.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/focus-visible': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/element-rect': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/auto-resize': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/interact-outside': 0.82.1
+      '@zag-js/live-region': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected](@internationalized/[email protected])':
+    dependencies:
+      '@internationalized/date': 3.7.0
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/popper': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/focus-visible': 0.82.1
+      '@zag-js/popper': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dismissable': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/focus-trap': 0.82.1
+      '@zag-js/interact-outside': 0.82.1
+      '@zag-js/popper': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
+    dependencies:
+      '@zag-js/anatomy': 0.82.1
+      '@zag-js/collection': 0.82.1
+      '@zag-js/core': 0.82.1
+      '@zag-js/dom-query': 0.82.1
+      '@zag-js/types': 0.82.1
+      '@zag-js/utils': 0.82.1
+
+  '@zag-js/[email protected]':
     dependencies:
       csstype: 3.1.3
 
-  '@zag-js/[email protected]': {}
+  '@zag-js/[email protected]': {}
 
   [email protected]([email protected]):
     dependencies:
@@ -6335,10 +6325,6 @@ snapshots:
 
   [email protected]: {}
 
-  [email protected]:
-    dependencies:
-      tslib: 2.6.3
-
   [email protected]:
     dependencies:
       deep-equal: 2.2.3
@@ -6508,9 +6494,9 @@ snapshots:
       loupe: 3.1.3
       pathval: 2.0.0
 
-  
[email protected](@chakra-ui/[email protected](@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected]))(@types/[email protected])([email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected]):
+  
[email protected](@chakra-ui/[email protected](@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected]))(@types/[email protected])([email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected]):
     dependencies:
-      '@chakra-ui/react': 
3.1.1(@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected])
+      '@chakra-ui/react': 
3.8.1(@emotion/[email protected](@types/[email protected])([email protected]))([email protected]([email protected]))([email protected])
       next-themes: 0.3.0([email protected]([email protected]))([email protected])
       react: 18.3.1
       react-dom: 18.3.1([email protected])
@@ -7219,6 +7205,8 @@ snapshots:
 
   [email protected]: {}
 
+  [email protected]: {}
+
   [email protected]:
     dependencies:
       reusify: 1.0.4
@@ -7282,10 +7270,6 @@ snapshots:
     transitivePeerDependencies:
       - encoding
 
-  [email protected]:
-    dependencies:
-      tabbable: 6.2.0
-
   [email protected]: {}
 
   [email protected]:
@@ -7731,8 +7715,6 @@ snapshots:
     dependencies:
       json-buffer: 3.0.1
 
-  [email protected]: {}
-
   [email protected]: {}
 
   [email protected]:
@@ -8477,6 +8459,8 @@ snapshots:
 
   [email protected]: {}
 
+  [email protected]: {}
+
   [email protected]: {}
 
   [email protected]:
@@ -8566,6 +8550,11 @@ snapshots:
     transitivePeerDependencies:
       - supports-color
 
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
   [email protected]([email protected]([email protected]))([email protected]):
     dependencies:
       '@remix-run/router': 1.19.2
@@ -8963,8 +8952,6 @@ snapshots:
       '@pkgr/core': 0.1.1
       tslib: 2.6.3
 
-  [email protected]: {}
-
   [email protected]:
     dependencies:
       chownr: 2.0.0
diff --git a/airflow/ui/src/components/HeaderCard.tsx 
b/airflow/ui/src/components/HeaderCard.tsx
new file mode 100644
index 00000000000..0d59258eb4d
--- /dev/null
+++ b/airflow/ui/src/components/HeaderCard.tsx
@@ -0,0 +1,81 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Box, Flex, GridItem, Heading, HStack, SimpleGrid, Spinner } from 
"@chakra-ui/react";
+import { type ReactNode, useRef } from "react";
+
+import type { TaskInstanceState } from "openapi/requests/types.gen";
+import { Stat } from "src/components/Stat";
+import { StateBadge } from "src/components/StateBadge";
+import { useContainerWidth } from "src/utils";
+
+const getColumnCount = (width: number) => {
+  if (width < 400) {
+    return 2;
+  }
+  if (width < 800) {
+    return 4;
+  }
+  if (width < 1000) {
+    return 6;
+  }
+
+  return 8;
+};
+
+type Props = {
+  readonly actions?: ReactNode;
+  readonly icon: ReactNode;
+  readonly isRefreshing?: boolean;
+  readonly state?: TaskInstanceState | null;
+  readonly stats: Array<{ label: string; value: ReactNode | string }>;
+  readonly subTitle?: ReactNode | string;
+  readonly title: ReactNode | string;
+};
+
+export const HeaderCard = ({ actions, icon, isRefreshing, state, stats, 
subTitle, title }: Props) => {
+  const containerRef = useRef<HTMLDivElement>();
+  const containerWidth = useContainerWidth(containerRef);
+
+  return (
+    <Box borderColor="border" borderRadius={8} borderWidth={1} m={2} p={2} 
ref={containerRef}>
+      <Flex alignItems="center" flexWrap="wrap" justifyContent="space-between" 
mb={2}>
+        <Flex alignItems="center" flexWrap="wrap" gap={2}>
+          <Heading size="xl">{icon}</Heading>
+          <Heading size="lg">{title}</Heading>
+          <Heading size="lg">{subTitle}</Heading>
+          {state === undefined ? undefined : <StateBadge 
state={state}>{state}</StateBadge>}
+          {isRefreshing ? <Spinner /> : <div />}
+        </Flex>
+        <HStack gap={1}>{actions}</HStack>
+      </Flex>
+      <SimpleGrid
+        autoFlow="row dense"
+        gap={4}
+        my={2}
+        templateColumns={`repeat(${getColumnCount(containerWidth)}, 1fr)`}
+      >
+        {stats.map(({ label, value }) => (
+          <GridItem key={label}>
+            <Stat label={label}>{value}</Stat>
+          </GridItem>
+        ))}
+      </SimpleGrid>
+    </Box>
+  );
+};
diff --git a/airflow/ui/src/components/Stat.tsx 
b/airflow/ui/src/components/Stat.tsx
index 7f39a092ea2..476bff6a21f 100644
--- a/airflow/ui/src/components/Stat.tsx
+++ b/airflow/ui/src/components/Stat.tsx
@@ -16,15 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Heading, VStack } from "@chakra-ui/react";
-import type { PropsWithChildren } from "react";
+import { Heading, type StackProps, VStack } from "@chakra-ui/react";
+import type { ReactNode } from "react";
 
 type Props = {
-  readonly label: string;
-} & PropsWithChildren;
+  readonly label: ReactNode | string;
+} & StackProps;
 
-export const Stat = ({ children, label }: Props) => (
-  <VStack align="flex-start" gap={1}>
+export const Stat = ({ children, label, ...rest }: Props) => (
+  <VStack align="flex-start" gap={1} {...rest}>
     <Heading color="fg.muted" fontSize="xs">
       {label}
     </Heading>
diff --git a/airflow/ui/src/utils/index.ts 
b/airflow/ui/src/components/TruncatedText.tsx
similarity index 70%
copy from airflow/ui/src/utils/index.ts
copy to airflow/ui/src/components/TruncatedText.tsx
index 632d24b3f45..7fe16dcdcc2 100644
--- a/airflow/ui/src/utils/index.ts
+++ b/airflow/ui/src/components/TruncatedText.tsx
@@ -16,9 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+import { Text, type TextProps } from "@chakra-ui/react";
 
-export { capitalize } from "./capitalize";
-export { pluralize } from "./pluralize";
-export { getDuration } from "./datetime_utils";
-export { getMetaKey } from "./getMetaKey";
-export * from "./query";
+type Props = {
+  readonly text: string;
+} & TextProps;
+
+export const TruncatedText = ({ text, ...rest }: Props) => {
+  const truncatedText = text.length <= 25 ? text : `…${text.slice(-22)}`;
+
+  return (
+    <Text title={text} {...rest}>
+      {truncatedText}
+    </Text>
+  );
+};
diff --git a/airflow/ui/src/layouts/BaseLayout.tsx 
b/airflow/ui/src/layouts/BaseLayout.tsx
index ddbd37432c4..c099cd7a8cf 100644
--- a/airflow/ui/src/layouts/BaseLayout.tsx
+++ b/airflow/ui/src/layouts/BaseLayout.tsx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Flex } from "@chakra-ui/react";
+import { Box } from "@chakra-ui/react";
 import { useEffect, type PropsWithChildren } from "react";
 import { Outlet, useSearchParams } from "react-router-dom";
 import { useLocalStorage } from "usehooks-ts";
@@ -56,9 +56,9 @@ export const BaseLayout = ({ children }: PropsWithChildren) 
=> {
   return (
     <>
       <Nav />
-      <Flex flexFlow="column" height="100%" ml={20} p={3}>
+      <Box display="flex" flexDirection="column" h="100vh" ml={20} p={3}>
         {children ?? <Outlet />}
-      </Flex>
+      </Box>
     </>
   );
 };
diff --git a/airflow/ui/src/layouts/Details/DagBreadcrumb.tsx 
b/airflow/ui/src/layouts/Details/DagBreadcrumb.tsx
new file mode 100644
index 00000000000..711c8decdcf
--- /dev/null
+++ b/airflow/ui/src/layouts/Details/DagBreadcrumb.tsx
@@ -0,0 +1,143 @@
+/*!
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { HStack, Stat } from "@chakra-ui/react";
+import type { ReactNode } from "react";
+import { LiaSlashSolid } from "react-icons/lia";
+import { Link as RouterLink, useParams, useSearchParams } from 
"react-router-dom";
+
+import {
+  useDagRunServiceGetDagRun,
+  useDagServiceGetDagDetails,
+  useTaskInstanceServiceGetMappedTaskInstance,
+  useTaskServiceGetTask,
+} from "openapi/queries";
+import { StateBadge } from "src/components/StateBadge";
+import Time from "src/components/Time";
+import { TogglePause } from "src/components/TogglePause";
+import { Breadcrumb } from "src/components/ui";
+
+export const DagBreadcrumb = () => {
+  const { dagId = "", runId, taskId } = useParams();
+
+  const [searchParams] = useSearchParams();
+  const mapIndexParam = searchParams.get("map_index");
+  const mapIndex = parseInt(mapIndexParam ?? "-1", 10);
+
+  const { data: dag } = useDagServiceGetDagDetails({
+    dagId,
+  });
+
+  const { data: dagRun } = useDagRunServiceGetDagRun(
+    {
+      dagId,
+      dagRunId: runId ?? "",
+    },
+    undefined,
+    {
+      enabled: Boolean(runId),
+    },
+  );
+
+  const { data: task } = useTaskServiceGetTask({ dagId, taskId }, undefined, { 
enabled: Boolean(taskId) });
+
+  const { data: taskInstance } = useTaskInstanceServiceGetMappedTaskInstance(
+    {
+      dagId,
+      dagRunId: runId ?? "",
+      mapIndex,
+      taskId: taskId ?? "",
+    },
+    undefined,
+    {
+      enabled: Boolean(runId) && Boolean(taskId),
+    },
+  );
+
+  const links: Array<{ label: ReactNode | string; title?: string; value?: 
string }> = [
+    { label: "Dags", value: "/dags" },
+    {
+      label: (
+        <HStack>
+          <TogglePause
+            dagDisplayName={dag?.dag_display_name}
+            dagId={dagId}
+            isPaused={Boolean(dag?.is_paused)}
+            skipConfirm
+          />
+          {dag?.dag_display_name ?? dagId}
+        </HStack>
+      ),
+      title: "Dag",
+      value: `/dags/${dagId}`,
+    },
+  ];
+
+  // Add dag run breadcrumb
+  if (runId !== undefined) {
+    links.push({
+      label:
+        dagRun === undefined ? (
+          runId
+        ) : (
+          <HStack>
+            <StateBadge fontSize="xs" state={dagRun.state} />
+            <Time datetime={dagRun.run_after} />
+          </HStack>
+        ),
+      title: "Dag Run",
+      value: `/dags/${dagId}/runs/${runId}`,
+    });
+  }
+
+  // Add task breadcrumb
+  if (runId !== undefined && taskId !== undefined) {
+    links.push({ label: taskInstance?.task_display_name ?? taskId, title: 
"Task" });
+  }
+
+  if (runId === undefined && taskId !== undefined) {
+    links.push({ label: "All Runs", title: "Dag Run", value: 
`/dags/${dagId}/runs/` });
+    links.push({ label: task?.task_display_name ?? taskId, title: "Task" });
+  }
+
+  if (mapIndexParam !== null) {
+    links.push({ label: mapIndexParam, title: "Map Index" });
+  }
+
+  return (
+    <Breadcrumb.Root mb={1} separator={<LiaSlashSolid />}>
+      {links.map((link, index) => (
+        // eslint-disable-next-line react/no-array-index-key
+        <Stat.Root gap={0} key={`${link.title}-${index}`}>
+          <Stat.Label fontSize="xs" fontWeight="bold">
+            {link.title}
+          </Stat.Label>
+          <Stat.ValueText fontSize="sm" fontWeight="normal">
+            {index === links.length - 1 ? (
+              <Breadcrumb.CurrentLink>{link.label}</Breadcrumb.CurrentLink>
+            ) : (
+              <Breadcrumb.Link asChild color="fg.info">
+                <RouterLink to={link.value ?? ""}>{link.label}</RouterLink>
+              </Breadcrumb.Link>
+            )}
+          </Stat.ValueText>
+        </Stat.Root>
+      ))}
+    </Breadcrumb.Root>
+  );
+};
diff --git a/airflow/ui/src/layouts/Details/DagVizModal.tsx 
b/airflow/ui/src/layouts/Details/DagVizModal.tsx
deleted file mode 100644
index 3c8ca116e38..00000000000
--- a/airflow/ui/src/layouts/Details/DagVizModal.tsx
+++ /dev/null
@@ -1,105 +0,0 @@
-/*!
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import { Button, Heading, HStack } from "@chakra-ui/react";
-import { useRef } from "react";
-import { FaChartGantt } from "react-icons/fa6";
-import { FiGrid } from "react-icons/fi";
-import { Link as RouterLink, useSearchParams } from "react-router-dom";
-
-import type { DAGResponse } from "openapi/requests/types.gen";
-import { DagIcon } from "src/assets/DagIcon";
-import { Dialog } from "src/components/ui";
-import { capitalize } from "src/utils";
-
-import { DagRunSelect } from "./DagRunSelect";
-import { Gantt } from "./Gantt";
-import { Graph } from "./Graph";
-import { Grid } from "./Grid";
-import { ToggleGroups } from "./ToggleGroups";
-
-type DAGVizModalProps = {
-  dagDisplayName?: DAGResponse["dag_display_name"];
-  dagId?: DAGResponse["dag_id"];
-  onClose: () => void;
-  open: boolean;
-};
-
-const visualizationOptions = [
-  {
-    component: <Gantt />,
-    icon: <FaChartGantt height={5} width={5} />,
-    value: "gantt",
-  },
-  { component: <Grid />, icon: <FiGrid height={5} width={5} />, value: "grid" 
},
-  {
-    component: <Graph />,
-    icon: <DagIcon height={5} width={5} />,
-    value: "graph",
-  },
-];
-
-export const DagVizModal: React.FC<DAGVizModalProps> = ({ dagDisplayName, 
dagId, onClose, open }) => {
-  const [searchParams] = useSearchParams();
-  const contentRef = useRef<HTMLDivElement>(null);
-
-  const activeViz = searchParams.get("modal") ?? "graph";
-  const params = new URLSearchParams(searchParams);
-
-  params.delete("modal");
-
-  return (
-    <Dialog.Root lazyMount motionPreset="none" onOpenChange={onClose} 
open={open} size="full">
-      <Dialog.Content backdrop ref={contentRef}>
-        <Dialog.Header bg="blue.muted" pr={16}>
-          <HStack>
-            <Heading mr={3} size="xl">
-              {dagDisplayName ?? dagId}
-            </Heading>
-            {visualizationOptions.map(({ icon, value }) => (
-              <RouterLink
-                key={value}
-                to={{
-                  search: `${params.toString()}&modal=${value}`,
-                }}
-              >
-                <Button
-                  borderColor="colorPalette.fg"
-                  borderRadius={20}
-                  colorPalette="blue"
-                  variant={activeViz === value ? "solid" : "outline"}
-                >
-                  {icon}
-                  {capitalize(value)}
-                </Button>
-              </RouterLink>
-            ))}
-            <DagRunSelect ref={contentRef} />
-            <ToggleGroups />
-          </HStack>
-          <Dialog.CloseTrigger closeButtonProps={{ size: "xl" }} />
-        </Dialog.Header>
-        <Dialog.Body display="flex">
-          {dagId === undefined
-            ? undefined
-            : visualizationOptions.find((viz) => viz.value === 
activeViz)?.component}
-        </Dialog.Body>
-      </Dialog.Content>
-    </Dialog.Root>
-  );
-};
diff --git a/airflow/ui/src/layouts/Details/DetailsLayout.tsx 
b/airflow/ui/src/layouts/Details/DetailsLayout.tsx
index 04402f5e35f..1c12f48071a 100644
--- a/airflow/ui/src/layouts/Details/DetailsLayout.tsx
+++ b/airflow/ui/src/layouts/Details/DetailsLayout.tsx
@@ -16,93 +16,118 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Box, Button, HStack } from "@chakra-ui/react";
-import type { PropsWithChildren } from "react";
-import { FaChartGantt } from "react-icons/fa6";
-import { FiChevronsLeft, FiGrid } from "react-icons/fi";
-import { Outlet, Link as RouterLink, useParams, useSearchParams } from 
"react-router-dom";
+import { Box, HStack, IconButton, ButtonGroup, Flex } from "@chakra-ui/react";
+import { useReactFlow } from "@xyflow/react";
+import type { PropsWithChildren, ReactNode } from "react";
+import { FiGrid } from "react-icons/fi";
+import { MdOutlineAccountTree } from "react-icons/md";
+import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels";
+import { Outlet, useParams } from "react-router-dom";
+import { useLocalStorage } from "usehooks-ts";
 
+import { useDagServiceGetDag } from "openapi/queries";
 import type { DAGResponse } from "openapi/requests/types.gen";
-import { DagIcon } from "src/assets/DagIcon";
 import { ErrorAlert } from "src/components/ErrorAlert";
 import { SearchDagsButton } from "src/components/SearchDags";
+import TriggerDAGButton from "src/components/TriggerDag/TriggerDAGButton";
 import { ProgressBar } from "src/components/ui";
 import { Toaster } from "src/components/ui";
 import { OpenGroupsProvider } from "src/context/openGroups";
 
-import { DagVizModal } from "./DagVizModal";
+import { DagBreadcrumb } from "./DagBreadcrumb";
+import { Graph } from "./Graph";
+import { Grid } from "./Grid";
 import { NavTabs } from "./NavTabs";
 
 type Props = {
   readonly dag?: DAGResponse;
   readonly error?: unknown;
   readonly isLoading?: boolean;
-  readonly tabs: Array<{ label: string; value: string }>;
+  readonly tabs: Array<{ icon: ReactNode; label: string; value: string }>;
 } & PropsWithChildren;
 
-export const DetailsLayout = ({ children, dag, error, isLoading, tabs }: 
Props) => {
+export const DetailsLayout = ({ children, error, isLoading, tabs }: Props) => {
   const { dagId = "" } = useParams();
 
-  const [searchParams, setSearchParams] = useSearchParams();
+  const { data: dag } = useDagServiceGetDag({ dagId });
 
-  const modal = searchParams.get("modal");
+  const [dagView, setDagView] = useLocalStorage<"graph" | "grid">(
+    `dag_view-${dagId}`,
+    dag && (dag.default_view === "graph" || dag.default_view === "grid") ? 
dag.default_view : "grid",
+  );
 
-  const isModalOpen = modal !== null;
-  const onClose = () => {
-    searchParams.delete("modal");
-    setSearchParams(searchParams);
-  };
+  const { fitView, getZoom } = useReactFlow();
 
   return (
     <OpenGroupsProvider dagId={dagId}>
-      <Box>
-        <HStack justifyContent="space-between" mb={2}>
-          <Button asChild colorPalette="blue" variant="ghost">
-            <RouterLink to="/dags">
-              <FiChevronsLeft />
-              Back to all dags
-            </RouterLink>
-          </Button>
+      <HStack justifyContent="space-between" mb={2}>
+        <DagBreadcrumb />
+        <Flex gap={1}>
           <SearchDagsButton />
-        </HStack>
-        <Toaster />
-        {isModalOpen ? undefined : children}
-        <ErrorAlert error={error} />
-        <ProgressBar size="xs" visibility={isLoading ? "visible" : "hidden"} />
-        <NavTabs
-          keepSearch
-          rightButtons={
-            <>
-              <Button asChild colorPalette="blue" variant="ghost">
-                <RouterLink to={{ search: 
`${searchParams.toString()}&modal=gantt` }}>
-                  <FaChartGantt height={5} width={5} />
-                  Gantt
-                </RouterLink>
-              </Button>
-              <Button asChild colorPalette="blue" variant="ghost">
-                <RouterLink to={{ search: 
`${searchParams.toString()}&modal=grid` }}>
-                  <FiGrid height={5} width={5} />
-                  Grid
-                </RouterLink>
-              </Button>
-              <Button asChild colorPalette="blue" variant="ghost">
-                <RouterLink to={{ search: 
`${searchParams.toString()}&modal=graph` }}>
-                  <DagIcon height={5} width={5} />
-                  Graph
-                </RouterLink>
-              </Button>
-            </>
-          }
-          tabs={tabs}
-        />
-        <DagVizModal
-          dagDisplayName={dag?.dag_display_name}
-          dagId={dag?.dag_id}
-          onClose={onClose}
-          open={isModalOpen}
-        />
+          {dag === undefined ? undefined : <TriggerDAGButton dag={dag} />}
+        </Flex>
+      </HStack>
+      <Toaster />
+      <Box flex={1} minH={0}>
+        <PanelGroup autoSaveId={dagId} direction="horizontal">
+          <Panel defaultSize={20} minSize={6}>
+            <Box height="100%" position="relative">
+              <ButtonGroup
+                attached
+                left={0}
+                position="absolute"
+                size="sm"
+                top={0}
+                variant="outline"
+                zIndex={1}
+              >
+                <IconButton
+                  aria-label="Show Grid"
+                  colorPalette="blue"
+                  onClick={() => setDagView("grid")}
+                  title="Show Grid"
+                  variant={dagView === "grid" ? "solid" : "outline"}
+                >
+                  <FiGrid />
+                </IconButton>
+                <IconButton
+                  aria-label="Show Graph"
+                  colorPalette="blue"
+                  onClick={() => setDagView("graph")}
+                  title="Show Graph"
+                  variant={dagView === "graph" ? "solid" : "outline"}
+                >
+                  <MdOutlineAccountTree />
+                </IconButton>
+              </ButtonGroup>
+              {dagView === "graph" ? <Graph /> : <Grid />}
+            </Box>
+          </Panel>
+          <PanelResizeHandle
+            className="resize-handle"
+            onDragging={(isDragging) => {
+              if (!isDragging) {
+                const zoom = getZoom();
+
+                void fitView({ maxZoom: zoom, minZoom: zoom });
+              }
+            }}
+          >
+            <Box bg="fg.subtle" cursor="col-resize" h="100%" 
transition="background 0.2s" w={0.5} />
+          </PanelResizeHandle>
+          <Panel defaultSize={50} minSize={20}>
+            <Box display="flex" flexDirection="column" h="100%">
+              {children}
+              <ErrorAlert error={error} />
+              <ProgressBar size="xs" visibility={isLoading ? "visible" : 
"hidden"} />
+              <NavTabs keepSearch tabs={tabs} />
+              <Box h="100%" overflow="auto" px={2}>
+                <Outlet />
+              </Box>
+            </Box>
+          </Panel>
+        </PanelGroup>
       </Box>
-      <Box overflow="auto">{isModalOpen ? undefined : <Outlet />}</Box>
     </OpenGroupsProvider>
   );
 };
diff --git a/airflow/ui/src/layouts/Details/Graph/Graph.tsx 
b/airflow/ui/src/layouts/Details/Graph/Graph.tsx
index e1a12872153..3acb520ad55 100644
--- a/airflow/ui/src/layouts/Details/Graph/Graph.tsx
+++ b/airflow/ui/src/layouts/Details/Graph/Graph.tsx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Flex, useToken } from "@chakra-ui/react";
+import { useToken } from "@chakra-ui/react";
 import { ReactFlow, Controls, Background, MiniMap, type Node as ReactFlowNode 
} from "@xyflow/react";
 import "@xyflow/react/dist/style.css";
 import { useParams } from "react-router-dom";
@@ -125,39 +125,37 @@ export const Graph = () => {
         });
 
   return (
-    <Flex flex={1}>
-      <ReactFlow
-        colorMode={colorMode}
-        defaultEdgeOptions={{ zIndex: 1 }}
-        edges={data?.edges ?? []}
-        edgeTypes={edgeTypes}
-        // Fit view to selected task or the whole graph on render
-        fitView
-        maxZoom={1}
-        minZoom={0.25}
-        nodes={nodes}
-        nodesDraggable={false}
-        nodeTypes={nodeTypes}
-        onlyRenderVisibleElements
-      >
-        <Background />
-        <Controls showInteractive={false} />
-        <MiniMap
-          nodeColor={(node: ReactFlowNode<CustomNodeProps>) =>
-            nodeColor(
-              node,
-              colorMode === "dark" ? evenDark : evenLight,
-              colorMode === "dark" ? oddDark : oddLight,
-            )
-          }
-          nodeStrokeColor={(node: ReactFlowNode<CustomNodeProps>) =>
-            node.data.isSelected && selectedColor !== undefined ? 
selectedColor : ""
-          }
-          nodeStrokeWidth={15}
-          pannable
-          zoomable
-        />
-      </ReactFlow>
-    </Flex>
+    <ReactFlow
+      colorMode={colorMode}
+      defaultEdgeOptions={{ zIndex: 1 }}
+      edges={data?.edges ?? []}
+      edgeTypes={edgeTypes}
+      // Fit view to selected task or the whole graph on render
+      fitView
+      maxZoom={1}
+      minZoom={0.25}
+      nodes={nodes}
+      nodesDraggable={false}
+      nodeTypes={nodeTypes}
+      onlyRenderVisibleElements
+    >
+      <Background />
+      <Controls showInteractive={false} />
+      <MiniMap
+        nodeColor={(node: ReactFlowNode<CustomNodeProps>) =>
+          nodeColor(
+            node,
+            colorMode === "dark" ? evenDark : evenLight,
+            colorMode === "dark" ? oddDark : oddLight,
+          )
+        }
+        nodeStrokeColor={(node: ReactFlowNode<CustomNodeProps>) =>
+          node.data.isSelected && selectedColor !== undefined ? selectedColor 
: ""
+        }
+        nodeStrokeWidth={15}
+        pannable
+        zoomable
+      />
+    </ReactFlow>
   );
 };
diff --git a/airflow/ui/src/layouts/Details/Graph/TaskNode.tsx 
b/airflow/ui/src/layouts/Details/Graph/TaskNode.tsx
index fbeb5bdd3a7..5faaa92617c 100644
--- a/airflow/ui/src/layouts/Details/Graph/TaskNode.tsx
+++ b/airflow/ui/src/layouts/Details/Graph/TaskNode.tsx
@@ -72,7 +72,7 @@ export const TaskNode = ({
             height={`${height}px`}
             justifyContent="space-between"
             px={3}
-            py={isSelected ? 1 : 2}
+            py={isSelected ? 0 : 1}
             width={`${width}px`}
           >
             <Box>
diff --git a/airflow/ui/src/layouts/Details/Grid/Bar.tsx 
b/airflow/ui/src/layouts/Details/Grid/Bar.tsx
index 811c603f83d..a56a5a913db 100644
--- a/airflow/ui/src/layouts/Details/Grid/Bar.tsx
+++ b/airflow/ui/src/layouts/Details/Grid/Bar.tsx
@@ -59,11 +59,12 @@ export const Bar = ({ index, limit, max, nodes, run }: 
Props) => {
         justifyContent="center"
         pb="2px"
         px="5px"
-        width="14px"
+        width="18px"
         zIndex={1}
       >
         <GridButton
           alignItems="center"
+          color="white"
           dagId={dagId}
           flexDir="column"
           height={`${(run.duration / max) * BAR_HEIGHT}px`}
diff --git a/airflow/ui/src/layouts/Details/Grid/Grid.tsx 
b/airflow/ui/src/layouts/Details/Grid/Grid.tsx
index 31f9263814c..96ee17e6228 100644
--- a/airflow/ui/src/layouts/Details/Grid/Grid.tsx
+++ b/airflow/ui/src/layouts/Details/Grid/Grid.tsx
@@ -38,7 +38,7 @@ import { flattenNodes, type RunWithDuration } from "./utils";
 dayjs.extend(dayjsDuration);
 
 const OFFSET_CHANGE = 10;
-const limit = 25;
+const limit = 14;
 
 export const Grid = () => {
   const { openGroupIds } = useOpenGroups();
@@ -72,7 +72,9 @@ export const Grid = () => {
   const runs: Array<RunWithDuration> = useMemo(
     () =>
       (gridData?.dag_runs ?? []).map((run) => {
-        const duration = 
dayjs.duration(dayjs(run.end_date).diff(run.start_date)).asSeconds();
+        const duration = dayjs
+          .duration(dayjs(run.end_date ?? undefined).diff(run.start_date ?? 
undefined))
+          .asSeconds();
 
         return {
           ...run,
diff --git a/airflow/ui/src/layouts/Details/Grid/GridButton.tsx 
b/airflow/ui/src/layouts/Details/Grid/GridButton.tsx
index 5c10c72e3e3..f3dd0b3dc07 100644
--- a/airflow/ui/src/layouts/Details/Grid/GridButton.tsx
+++ b/airflow/ui/src/layouts/Details/Grid/GridButton.tsx
@@ -47,7 +47,7 @@ export const GridButton = ({
       background={`${state}.solid`}
       borderRadius={2}
       height="10px"
-      minW="10px"
+      minW="14px"
       pb="2px"
       px="2px"
       title={`${label}\n${state}`}
@@ -60,7 +60,7 @@ export const GridButton = ({
       replace
       to={{
         pathname: `/dags/${dagId}/runs/${runId}/${taskId === undefined ? "" : 
`tasks/${taskId}`}`,
-        search: searchParams,
+        search: searchParams.toString(),
       }}
     >
       <Flex
@@ -70,7 +70,7 @@ export const GridButton = ({
         pb="2px"
         px="2px"
         title={`${label}\n${state}`}
-        width="10px"
+        width="14px"
         {...rest}
       >
         {children}
diff --git a/airflow/ui/src/layouts/Details/Grid/GridTI.tsx 
b/airflow/ui/src/layouts/Details/Grid/GridTI.tsx
index 6d1d8afe130..fc939eb8f21 100644
--- a/airflow/ui/src/layouts/Details/Grid/GridTI.tsx
+++ b/airflow/ui/src/layouts/Details/Grid/GridTI.tsx
@@ -16,13 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Flex } from "@chakra-ui/react";
+import { Badge, Flex } from "@chakra-ui/react";
 import type { MouseEvent } from "react";
 import React from "react";
+import { Link } from "react-router-dom";
 
 import type { TaskInstanceState } from "openapi/requests/types.gen";
-
-import { GridButton } from "./GridButton";
+import { StateIcon } from "src/components/StateIcon";
 
 type Props = {
   readonly dagId: string;
@@ -50,30 +50,48 @@ const onMouseLeave = (event: MouseEvent<HTMLDivElement>) => 
{
   });
 };
 
-const Instance = ({ dagId, isGroup, label, runId, search, state, taskId }: 
Props) => (
+const Instance = ({ dagId, runId, search, state, taskId }: Props) => (
   <Flex
     alignItems="flex-end"
+    height="20px"
     id={taskId.replaceAll(".", "-")}
     justifyContent="center"
     key={taskId}
     onMouseEnter={onMouseEnter}
     onMouseLeave={onMouseLeave}
-    px="5px"
-    py="5px"
+    px="2px"
+    py={0}
     transition="background-color 0.2s"
-    width="14px"
     zIndex={1}
   >
-    <GridButton
-      dagId={dagId}
-      isGroup={isGroup}
-      label={label}
-      p="2px"
-      runId={runId}
-      searchParams={search}
-      state={state}
-      taskId={taskId}
-    />
+    <Link
+      replace
+      to={{
+        pathname: `/dags/${dagId}/runs/${runId}/tasks/${taskId}`,
+        search,
+      }}
+    >
+      <Badge
+        borderRadius={4}
+        colorPalette={state === null ? "none" : state}
+        height="14px"
+        minH={0}
+        opacity={state === "success" ? 0.6 : 1}
+        p={0}
+        variant="solid"
+        width="14px"
+      >
+        {state === undefined ? undefined : (
+          <StateIcon
+            size={10}
+            state={state}
+            style={{
+              marginLeft: "2px",
+            }}
+          />
+        )}
+      </Badge>
+    </Link>
   </Flex>
 );
 
diff --git a/airflow/ui/src/layouts/Details/Grid/TaskNames.tsx 
b/airflow/ui/src/layouts/Details/Grid/TaskNames.tsx
index 7ee7f96e535..65a6beb0c12 100644
--- a/airflow/ui/src/layouts/Details/Grid/TaskNames.tsx
+++ b/airflow/ui/src/layouts/Details/Grid/TaskNames.tsx
@@ -90,6 +90,7 @@ export const TaskNames = ({ nodes }: Props) => {
               fontWeight="normal"
               isMapped={Boolean(node.is_mapped)}
               label={node.label}
+              mb={1}
               paddingLeft={node.depth * 3 + 2}
               setupTeardownType={node.setup_teardown_type}
             />
diff --git a/airflow/ui/src/layouts/Details/NavTabs.tsx 
b/airflow/ui/src/layouts/Details/NavTabs.tsx
index 55d62c72da5..a1cc44c00ff 100644
--- a/airflow/ui/src/layouts/Details/NavTabs.tsx
+++ b/airflow/ui/src/layouts/Details/NavTabs.tsx
@@ -17,50 +17,52 @@
  * under the License.
  */
 import { Center, Flex } from "@chakra-ui/react";
-import type { ReactNode } from "react";
+import { useRef, type ReactNode } from "react";
 import { NavLink, useSearchParams } from "react-router-dom";
 
+import { useContainerWidth } from "src/utils";
+
 type Props = {
   readonly keepSearch?: boolean;
-  readonly rightButtons?: ReactNode;
-  readonly tabs: Array<{ label: string; value: string }>;
+  readonly tabs: Array<{ icon?: ReactNode; label: string; value: string }>;
 };
 
-export const NavTabs = ({ keepSearch, rightButtons, tabs }: Props) => {
+export const NavTabs = ({ keepSearch, tabs }: Props) => {
   const [searchParams] = useSearchParams();
 
+  const containerRef = useRef<HTMLDivElement>(null);
+  const containerWidth = useContainerWidth(containerRef);
+
   return (
-    <Flex alignItems="center" borderBottomWidth={1} 
justifyContent="space-between" mb={2}>
-      <Flex>
-        {tabs.map(({ label, value }) => (
-          <NavLink
-            end
-            key={value}
-            to={{
-              pathname: value,
-              // Preserve search params when navigating
-              search: keepSearch ? searchParams.toString() : undefined,
-            }}
-          >
-            {({ isActive }) => (
-              <Center
-                borderBottomColor="border.info"
-                borderBottomWidth={isActive ? 3 : 0}
-                color={isActive ? "fg" : "fg.muted"}
-                fontWeight="bold"
-                height="40px"
-                mb="-2px" // Show the border on top of its parent's border
-                pb={isActive ? 0 : "3px"}
-                px={4}
-                transition="all 0.2s ease"
-              >
-                {label}
-              </Center>
-            )}
-          </NavLink>
-        ))}
-      </Flex>
-      <Flex alignSelf="flex-end">{rightButtons}</Flex>
+    <Flex alignItems="center" borderBottomWidth={1} mb={2} ref={containerRef}>
+      {tabs.map(({ icon, label, value }) => (
+        <NavLink
+          end
+          key={value}
+          title={label}
+          to={{
+            pathname: value,
+            // Preserve search params when navigating
+            search: keepSearch ? searchParams.toString() : undefined,
+          }}
+        >
+          {({ isActive }) => (
+            <Center
+              borderBottomColor="border.info"
+              borderBottomWidth={isActive ? 3 : 0}
+              color={isActive ? "fg" : "fg.muted"}
+              fontWeight="bold"
+              height="40px"
+              mb="-2px" // Show the border on top of its parent's border
+              pb={isActive ? 0 : "3px"}
+              px={4}
+              transition="all 0.2s ease"
+            >
+              {containerWidth > 600 || !Boolean(icon) ? label : icon}
+            </Center>
+          )}
+        </NavLink>
+      ))}
     </Flex>
   );
 };
diff --git a/airflow/ui/src/pages/Dag/Dag.tsx b/airflow/ui/src/pages/Dag/Dag.tsx
index c7107f98fff..4f5372689ab 100644
--- a/airflow/ui/src/pages/Dag/Dag.tsx
+++ b/airflow/ui/src/pages/Dag/Dag.tsx
@@ -16,20 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+import { ReactFlowProvider } from "@xyflow/react";
+import { FiBarChart, FiCode } from "react-icons/fi";
+import { LuChartColumn } from "react-icons/lu";
+import { MdOutlineEventNote } from "react-icons/md";
 import { useParams } from "react-router-dom";
 
 import { useDagServiceGetDagDetails, useDagsServiceRecentDagRuns } from 
"openapi/queries";
+import { TaskIcon } from "src/assets/TaskIcon";
 import { DetailsLayout } from "src/layouts/Details/DetailsLayout";
 import { isStatePending, useAutoRefresh } from "src/utils";
 
 import { Header } from "./Header";
 
 const tabs = [
-  { label: "Overview", value: "" },
-  { label: "Runs", value: "runs" },
-  { label: "Tasks", value: "tasks" },
-  { label: "Events", value: "events" },
-  { label: "Code", value: "code" },
+  { icon: <LuChartColumn />, label: "Overview", value: "" },
+  { icon: <FiBarChart />, label: "Runs", value: "runs" },
+  { icon: <TaskIcon />, label: "Tasks", value: "tasks" },
+  { icon: <MdOutlineEventNote />, label: "Events", value: "events" },
+  { icon: <FiCode />, label: "Code", value: "code" },
 ];
 
 export const Dag = () => {
@@ -63,14 +68,16 @@ export const Dag = () => {
   const dagWithRuns = runsData?.dags.find((recentDag) => recentDag.dag_id === 
dagId);
 
   return (
-    <DetailsLayout dag={dag} error={error ?? runsError} isLoading={isLoading 
|| isLoadingRuns} tabs={tabs}>
-      <Header
-        dag={dag}
-        dagWithRuns={dagWithRuns}
-        isRefreshing={Boolean(
-          dagWithRuns?.latest_dag_runs.some((dr) => isStatePending(dr.state)) 
&& Boolean(refetchInterval),
-        )}
-      />
-    </DetailsLayout>
+    <ReactFlowProvider>
+      <DetailsLayout dag={dag} error={error ?? runsError} isLoading={isLoading 
|| isLoadingRuns} tabs={tabs}>
+        <Header
+          dag={dag}
+          dagWithRuns={dagWithRuns}
+          isRefreshing={Boolean(
+            dagWithRuns?.latest_dag_runs.some((dr) => 
isStatePending(dr.state)) && Boolean(refetchInterval),
+          )}
+        />
+      </DetailsLayout>
+    </ReactFlowProvider>
   );
 };
diff --git a/airflow/ui/src/pages/Dag/Header.tsx 
b/airflow/ui/src/pages/Dag/Header.tsx
index 5ed5c43031c..c5fb72db22e 100644
--- a/airflow/ui/src/pages/Dag/Header.tsx
+++ b/airflow/ui/src/pages/Dag/Header.tsx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Box, Flex, Heading, HStack, SimpleGrid, Spinner, Text } from 
"@chakra-ui/react";
+import { Text } from "@chakra-ui/react";
 import { FiBookOpen, FiCalendar } from "react-icons/fi";
 import { useParams } from "react-router-dom";
 
@@ -24,11 +24,10 @@ import type { DAGDetailsResponse, 
DAGWithLatestDagRunsResponse } from "openapi/r
 import { DagIcon } from "src/assets/DagIcon";
 import DagRunInfo from "src/components/DagRunInfo";
 import DisplayMarkdownButton from "src/components/DisplayMarkdownButton";
+import { HeaderCard } from "src/components/HeaderCard";
 import MenuButton from "src/components/Menu/MenuButton";
 import ParseDag from "src/components/ParseDag";
-import { Stat } from "src/components/Stat";
 import { TogglePause } from "src/components/TogglePause";
-import TriggerDAGButton from "src/components/TriggerDag/TriggerDAGButton";
 import { Tooltip } from "src/components/ui";
 
 import { DagTags } from "../DagsList/DagTags";
@@ -46,87 +45,76 @@ export const Header = ({
   const { dagId } = useParams();
   const latestRun = dagWithRuns?.latest_dag_runs ? 
dagWithRuns.latest_dag_runs[0] : undefined;
 
+  const stats = [
+    {
+      label: "Schedule",
+      value: Boolean(dag?.timetable_summary) ? (
+        <Tooltip content={dag?.timetable_description}>
+          <Text fontSize="sm">
+            <FiCalendar style={{ display: "inline" }} /> 
{dag?.timetable_summary}
+          </Text>
+        </Tooltip>
+      ) : undefined,
+    },
+    {
+      label: "Latest Run",
+      value:
+        Boolean(latestRun) && latestRun !== undefined ? (
+          <DagRunInfo
+            endDate={latestRun.end_date}
+            logicalDate={latestRun.logical_date}
+            runAfter={latestRun.run_after}
+            startDate={latestRun.start_date}
+            state={latestRun.state}
+          />
+        ) : undefined,
+    },
+    {
+      label: "Next Run",
+      value: Boolean(dagWithRuns?.next_dagrun_run_after) ? (
+        <DagRunInfo
+          logicalDate={dagWithRuns?.next_dagrun_logical_date}
+          runAfter={dagWithRuns?.next_dagrun_run_after as string}
+        />
+      ) : undefined,
+    },
+    {
+      label: "Owner",
+      value: dag?.owners.join(", "),
+    },
+    {
+      label: "Tags",
+      value: <DagTags tags={dag?.tags ?? []} />,
+    },
+  ];
+
   return (
-    <Box borderColor="border" borderRadius={8} borderWidth={1} p={2}>
-      <Box p={2}>
-        <Flex alignItems="center" justifyContent="space-between">
-          <HStack alignItems="center" gap={2}>
-            <DagIcon height={8} width={8} />
-            <Heading size="lg">{dag?.dag_display_name ?? dagId}</Heading>
-            {dag !== undefined && (
-              <TogglePause
-                dagDisplayName={dag.dag_display_name}
-                dagId={dag.dag_id}
-                isPaused={dag.is_paused}
+    <HeaderCard
+      actions={
+        dag === undefined ? undefined : (
+          <>
+            {dag.doc_md === null ? undefined : (
+              <DisplayMarkdownButton
+                header="Dag Documentation"
+                icon={<FiBookOpen />}
+                mdContent={dag.doc_md}
+                text="Dag Docs"
               />
             )}
-            {isRefreshing ? <Spinner /> : <div />}
-          </HStack>
-          <Flex>
-            {dag ? (
-              <HStack>
-                {dag.doc_md === null ? undefined : (
-                  <DisplayMarkdownButton
-                    header="Dag Documentation"
-                    icon={<FiBookOpen />}
-                    mdContent={dag.doc_md}
-                    text="Dag Docs"
-                  />
-                )}
-                <ParseDag dagId={dag.dag_id} fileToken={dag.file_token} />
-                <TriggerDAGButton dag={dag} />
-                <MenuButton dag={dag} />
-              </HStack>
-            ) : undefined}
-          </Flex>
-        </Flex>
-        <SimpleGrid columns={4} gap={4} my={2}>
-          <Stat label="Schedule">
-            {Boolean(dag?.timetable_summary) ? (
-              <Tooltip content={dag?.timetable_description}>
-                <Text fontSize="sm">
-                  <FiCalendar style={{ display: "inline" }} /> 
{dag?.timetable_summary}
-                </Text>
-              </Tooltip>
-            ) : undefined}
-          </Stat>
-          <Stat label="Latest Run">
-            {Boolean(latestRun) && latestRun !== undefined ? (
-              <DagRunInfo
-                endDate={latestRun.end_date}
-                logicalDate={latestRun.logical_date}
-                runAfter={latestRun.run_after}
-                startDate={latestRun.start_date}
-                state={latestRun.state}
-              />
-            ) : undefined}
-          </Stat>
-          <Stat label="Next Run">
-            {Boolean(dagWithRuns?.next_dagrun_run_after) ? (
-              <DagRunInfo
-                logicalDate={dagWithRuns?.next_dagrun_logical_date}
-                runAfter={dagWithRuns?.next_dagrun_run_after as string}
-              />
-            ) : undefined}
-          </Stat>
-          <div />
-          <div />
-        </SimpleGrid>
-      </Box>
-      <Flex
-        alignItems="center"
-        bg="bg.muted"
-        borderTopColor="border"
-        borderTopWidth={1}
-        color="fg.subtle"
-        fontSize="sm"
-        justifyContent="space-between"
-        px={2}
-        py={1}
-      >
-        <Text>Owner: {dag?.owners.join(", ")}</Text>
-        <DagTags tags={dag?.tags ?? []} />
-      </Flex>
-    </Box>
+            <ParseDag dagId={dag.dag_id} fileToken={dag.file_token} />
+            <MenuButton dag={dag} />
+          </>
+        )
+      }
+      icon={<DagIcon />}
+      isRefreshing={isRefreshing}
+      stats={stats}
+      subTitle={
+        dag !== undefined && (
+          <TogglePause dagDisplayName={dag.dag_display_name} 
dagId={dag.dag_id} isPaused={dag.is_paused} />
+        )
+      }
+      title={dag?.dag_display_name ?? dagId}
+    />
   );
 };
diff --git a/airflow/ui/src/pages/Run/Header.tsx 
b/airflow/ui/src/pages/Run/Header.tsx
index 493b2d43d3d..f145ec8ff08 100644
--- a/airflow/ui/src/pages/Run/Header.tsx
+++ b/airflow/ui/src/pages/Run/Header.tsx
@@ -16,16 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Box, Flex, Heading, HStack, SimpleGrid, Spinner, Text } from 
"@chakra-ui/react";
+import { HStack, Text } from "@chakra-ui/react";
 import { FiBarChart, FiMessageSquare } from "react-icons/fi";
 
 import type { DAGRunResponse } from "openapi/requests/types.gen";
 import { ClearRunButton } from "src/components/Clear";
 import DisplayMarkdownButton from "src/components/DisplayMarkdownButton";
+import { HeaderCard } from "src/components/HeaderCard";
 import { MarkRunAsButton } from "src/components/MarkAs";
 import { RunTypeIcon } from "src/components/RunTypeIcon";
-import { Stat } from "src/components/Stat";
-import { StateBadge } from "src/components/StateBadge";
 import Time from "src/components/Time";
 import { getDuration } from "src/utils";
 
@@ -36,18 +35,9 @@ export const Header = ({
   readonly dagRun: DAGRunResponse;
   readonly isRefreshing?: boolean;
 }) => (
-  <Box borderColor="border" borderRadius={8} borderWidth={1} p={2}>
-    <Flex alignItems="center" justifyContent="space-between" mb={2}>
-      <HStack alignItems="center" gap={2}>
-        <FiBarChart size="1.75rem" />
-        <Heading size="lg">
-          <strong>Run: </strong>
-          {dagRun.dag_run_id}
-        </Heading>
-        <StateBadge state={dagRun.state}>{dagRun.state}</StateBadge>
-        {isRefreshing ? <Spinner /> : <div />}
-      </HStack>
-      <HStack>
+  <HeaderCard
+    actions={
+      <>
         {dagRun.note === null || dagRun.note.length === 0 ? undefined : (
           <DisplayMarkdownButton
             header="Dag Run Note"
@@ -58,22 +48,33 @@ export const Header = ({
         )}
         <ClearRunButton dagRun={dagRun} />
         <MarkRunAsButton dagRun={dagRun} />
-      </HStack>
-    </Flex>
-    <SimpleGrid columns={4} gap={4}>
-      <Stat label="Run Type">
-        <HStack>
-          <RunTypeIcon runType={dagRun.run_type} />
-          <Text>{dagRun.run_type}</Text>
-        </HStack>
-      </Stat>
-      <Stat label="Start">
-        <Time datetime={dagRun.start_date} />
-      </Stat>
-      <Stat label="End">
-        <Time datetime={dagRun.end_date} />
-      </Stat>
-      <Stat label="Duration">{getDuration(dagRun.start_date, 
dagRun.end_date)}s</Stat>
-    </SimpleGrid>
-  </Box>
+      </>
+    }
+    icon={<FiBarChart />}
+    isRefreshing={isRefreshing}
+    state={dagRun.state}
+    stats={[
+      ...(dagRun.logical_date === null
+        ? []
+        : [
+            {
+              label: "Logical Date",
+              value: <Time datetime={dagRun.logical_date} />,
+            },
+          ]),
+      {
+        label: "Run Type",
+        value: (
+          <HStack>
+            <RunTypeIcon runType={dagRun.run_type} />
+            <Text>{dagRun.run_type}</Text>
+          </HStack>
+        ),
+      },
+      { label: "Start", value: <Time datetime={dagRun.start_date} /> },
+      { label: "End", value: <Time datetime={dagRun.end_date} /> },
+      { label: "Duration", value: `${getDuration(dagRun.start_date, 
dagRun.end_date)}s` },
+    ]}
+    title={<Time datetime={dagRun.run_after} />}
+  />
 );
diff --git a/airflow/ui/src/pages/Run/Run.tsx b/airflow/ui/src/pages/Run/Run.tsx
index 6689ca1a7ad..04ffb61cd89 100644
--- a/airflow/ui/src/pages/Run/Run.tsx
+++ b/airflow/ui/src/pages/Run/Run.tsx
@@ -16,21 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { LiaSlashSolid } from "react-icons/lia";
-import { useParams, Link as RouterLink } from "react-router-dom";
+import { ReactFlowProvider } from "@xyflow/react";
+import { FiCode } from "react-icons/fi";
+import { MdDetails, MdOutlineEventNote, MdOutlineTask } from "react-icons/md";
+import { useParams } from "react-router-dom";
 
 import { useDagRunServiceGetDagRun, useDagServiceGetDagDetails } from 
"openapi/queries";
-import { Breadcrumb } from "src/components/ui";
 import { DetailsLayout } from "src/layouts/Details/DetailsLayout";
 import { isStatePending, useAutoRefresh } from "src/utils";
 
 import { Header } from "./Header";
 
 const tabs = [
-  { label: "Task Instances", value: "" },
-  { label: "Events", value: "events" },
-  { label: "Code", value: "code" },
-  { label: "Details", value: "details" },
+  { icon: <MdOutlineTask />, label: "Task Instances", value: "" },
+  { icon: <MdOutlineEventNote />, label: "Events", value: "events" },
+  { icon: <FiCode />, label: "Code", value: "code" },
+  { icon: <MdDetails />, label: "Details", value: "details" },
 ];
 
 export const Run = () => {
@@ -62,22 +63,15 @@ export const Run = () => {
   );
 
   return (
-    <DetailsLayout dag={dag} error={error ?? dagError} isLoading={isLoading || 
isLoadinDag} tabs={tabs}>
-      <Breadcrumb.Root mb={3} separator={<LiaSlashSolid />}>
-        <Breadcrumb.Link asChild color="fg.info">
-          <RouterLink to="/dags">Dags</RouterLink>
-        </Breadcrumb.Link>
-        <Breadcrumb.Link asChild color="fg.info">
-          <RouterLink to={`/dags/${dagId}`}>{dag?.dag_display_name ?? 
dagId}</RouterLink>
-        </Breadcrumb.Link>
-        <Breadcrumb.CurrentLink>{runId}</Breadcrumb.CurrentLink>
-      </Breadcrumb.Root>
-      {dagRun === undefined ? undefined : (
-        <Header
-          dagRun={dagRun}
-          isRefreshing={Boolean(isStatePending(dagRun.state) && 
Boolean(refetchInterval))}
-        />
-      )}
-    </DetailsLayout>
+    <ReactFlowProvider>
+      <DetailsLayout dag={dag} error={error ?? dagError} isLoading={isLoading 
|| isLoadinDag} tabs={tabs}>
+        {dagRun === undefined ? undefined : (
+          <Header
+            dagRun={dagRun}
+            isRefreshing={Boolean(isStatePending(dagRun.state) && 
Boolean(refetchInterval))}
+          />
+        )}
+      </DetailsLayout>
+    </ReactFlowProvider>
   );
 };
diff --git a/airflow/ui/src/pages/Task/Header.tsx 
b/airflow/ui/src/pages/Task/Header.tsx
index e0c4ee419ff..e90793c2f12 100644
--- a/airflow/ui/src/pages/Task/Header.tsx
+++ b/airflow/ui/src/pages/Task/Header.tsx
@@ -16,44 +16,30 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Box, Flex, Heading, HStack, SimpleGrid, Text } from 
"@chakra-ui/react";
 import { FiBookOpen } from "react-icons/fi";
 
 import type { TaskResponse } from "openapi/requests/types.gen";
 import { TaskIcon } from "src/assets/TaskIcon";
 import DisplayMarkdownButton from "src/components/DisplayMarkdownButton";
-import { Stat } from "src/components/Stat";
+import { HeaderCard } from "src/components/HeaderCard";
 
 export const Header = ({ task }: { readonly task: TaskResponse }) => (
-  <Box borderColor="border" borderRadius={8} borderWidth={1} p={2}>
-    <Flex alignItems="center" justifyContent="space-between" mb={2}>
-      <HStack alignItems="center" gap={2}>
-        <TaskIcon height={8} width={8} />
-        <Heading size="lg">
-          <strong>Task: </strong>
-          {task.task_display_name}
-          {task.is_mapped ? "[ ]" : ""}
-        </Heading>
-        <Flex>
-          <div />
-        </Flex>
-      </HStack>
-      {task.doc_md === null ? undefined : (
+  <HeaderCard
+    actions={
+      task.doc_md === null ? undefined : (
         <DisplayMarkdownButton
           header="Task Documentation"
           icon={<FiBookOpen />}
           mdContent={task.doc_md}
           text="Task Docs"
         />
-      )}
-    </Flex>
-    <SimpleGrid columns={4} gap={4}>
-      <Stat label="Operator">
-        <Text>{task.operator_name}</Text>
-      </Stat>
-      <Stat label="Trigger Rule">
-        <Text>{task.trigger_rule}</Text>
-      </Stat>
-    </SimpleGrid>
-  </Box>
+      )
+    }
+    icon={<TaskIcon />}
+    stats={[
+      { label: "Operator", value: task.operator_name },
+      { label: "Trigger Rule", value: task.trigger_rule },
+    ]}
+    title={`${task.task_display_name}${task.is_mapped ? " [ ]" : ""}`}
+  />
 );
diff --git a/airflow/ui/src/pages/Task/Task.tsx 
b/airflow/ui/src/pages/Task/Task.tsx
index f5ad5f16535..44da8f8368b 100644
--- a/airflow/ui/src/pages/Task/Task.tsx
+++ b/airflow/ui/src/pages/Task/Task.tsx
@@ -16,19 +16,20 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { LiaSlashSolid } from "react-icons/lia";
-import { useParams, Link as RouterLink } from "react-router-dom";
+import { ReactFlowProvider } from "@xyflow/react";
+import { LuChartColumn } from "react-icons/lu";
+import { MdOutlineEventNote, MdOutlineTask } from "react-icons/md";
+import { useParams } from "react-router-dom";
 
 import { useDagServiceGetDagDetails, useTaskServiceGetTask } from 
"openapi/queries";
-import { Breadcrumb } from "src/components/ui";
 import { DetailsLayout } from "src/layouts/Details/DetailsLayout";
 
 import { Header } from "./Header";
 
 const tabs = [
-  { label: "Overview", value: "" },
-  { label: "Task Instances", value: "task_instances" },
-  { label: "Events", value: "events" },
+  { icon: <LuChartColumn />, label: "Overview", value: "" },
+  { icon: <MdOutlineTask />, label: "Task Instances", value: "task_instances" 
},
+  { icon: <MdOutlineEventNote />, label: "Events", value: "events" },
 ];
 
 export const Task = () => {
@@ -44,32 +45,11 @@ export const Task = () => {
     dagId,
   });
 
-  const links = [
-    { label: "Dags", value: "/dags" },
-    { label: dag?.dag_display_name ?? dagId, value: `/dags/${dagId}` },
-    { label: task?.task_display_name ?? taskId },
-  ];
-
   return (
-    <DetailsLayout dag={dag} error={error ?? dagError} isLoading={isLoading || 
isDagLoading} tabs={tabs}>
-      <Breadcrumb.Root mb={3} separator={<LiaSlashSolid />}>
-        {links.map((link, index) => {
-          if (index === links.length - 1) {
-            return <Breadcrumb.CurrentLink 
key={link.label}>{link.label}</Breadcrumb.CurrentLink>;
-          }
-
-          return link.value === undefined ? (
-            <Breadcrumb.Link color="fg.info" key={link.label}>
-              {link.label}
-            </Breadcrumb.Link>
-          ) : (
-            <Breadcrumb.Link asChild color="fg.info" key={link.label}>
-              <RouterLink to={link.value}>{link.label}</RouterLink>
-            </Breadcrumb.Link>
-          );
-        })}
-      </Breadcrumb.Root>
-      {task === undefined ? undefined : <Header task={task} />}
-    </DetailsLayout>
+    <ReactFlowProvider>
+      <DetailsLayout dag={dag} error={error ?? dagError} isLoading={isLoading 
|| isDagLoading} tabs={tabs}>
+        {task === undefined ? undefined : <Header task={task} />}
+      </DetailsLayout>
+    </ReactFlowProvider>
   );
 };
diff --git a/airflow/ui/src/pages/TaskInstance/Header.tsx 
b/airflow/ui/src/pages/TaskInstance/Header.tsx
index bf1784983ee..ce72b3ecc3e 100644
--- a/airflow/ui/src/pages/TaskInstance/Header.tsx
+++ b/airflow/ui/src/pages/TaskInstance/Header.tsx
@@ -16,18 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Box, Flex, Heading, HStack, SimpleGrid, Spinner } from 
"@chakra-ui/react";
+import { Box } from "@chakra-ui/react";
+import { useRef } from "react";
 import { FiMessageSquare } from "react-icons/fi";
 import { MdOutlineTask } from "react-icons/md";
 
 import type { TaskInstanceResponse } from "openapi/requests/types.gen";
 import { ClearTaskInstanceButton } from "src/components/Clear";
 import DisplayMarkdownButton from "src/components/DisplayMarkdownButton";
+import { HeaderCard } from "src/components/HeaderCard";
 import { MarkTaskInstanceAsButton } from "src/components/MarkAs";
-import { Stat } from "src/components/Stat";
-import { StateBadge } from "src/components/StateBadge";
 import Time from "src/components/Time";
-import { getDuration } from "src/utils";
+import { getDuration, useContainerWidth } from "src/utils";
 
 export const Header = ({
   isRefreshing,
@@ -35,47 +35,46 @@ export const Header = ({
 }: {
   readonly isRefreshing?: boolean;
   readonly taskInstance: TaskInstanceResponse;
-}) => (
-  <Box borderColor="border" borderRadius={8} borderWidth={1} p={2}>
-    <Flex alignItems="center" justifyContent="space-between" mb={2}>
-      <HStack alignItems="center" gap={2}>
-        <MdOutlineTask size="1.75rem" />
-        <Heading size="lg">
-          <strong>Task Instance: </strong>
-          {taskInstance.task_display_name} <Time 
datetime={taskInstance.start_date} />
-        </Heading>
-        <StateBadge 
state={taskInstance.state}>{taskInstance.state}</StateBadge>
-        {isRefreshing ? <Spinner /> : <div />}
-      </HStack>
-      <HStack>
-        {taskInstance.note === null || taskInstance.note.length === 0 ? 
undefined : (
-          <DisplayMarkdownButton
-            header="Task Instance Note"
-            icon={<FiMessageSquare color="black" />}
-            mdContent={taskInstance.note}
-            text="Note"
-          />
-        )}
-        <ClearTaskInstanceButton taskInstance={taskInstance} />
-        <MarkTaskInstanceAsButton taskInstance={taskInstance} />
-      </HStack>
-    </Flex>
-    <SimpleGrid columns={6} gap={4} my={2}>
-      <Stat label="Operator">{taskInstance.operator}</Stat>
-      {taskInstance.map_index > -1 ? (
-        <Stat label="Map Index">{taskInstance.rendered_map_index}</Stat>
-      ) : undefined}
-      {taskInstance.try_number > 1 ? <Stat label="Try 
Number">{taskInstance.try_number}</Stat> : undefined}
-      <Stat label="Start">
-        <Time datetime={taskInstance.start_date} />
-      </Stat>
-      <Stat label="End">
-        <Time datetime={taskInstance.end_date} />
-      </Stat>
-      <Stat label="Duration">{getDuration(taskInstance.start_date, 
taskInstance.end_date)}s</Stat>
-      {taskInstance.dag_version?.version_number !== undefined && (
-        <Stat label="Dag 
Version">{`v${taskInstance.dag_version.version_number}`}</Stat>
-      )}
-    </SimpleGrid>
-  </Box>
-);
+}) => {
+  const containerRef = useRef<HTMLDivElement>();
+  const containerWidth = useContainerWidth(containerRef);
+
+  const stats = [
+    { label: "Operator", value: taskInstance.operator },
+    ...(taskInstance.map_index > -1 ? [{ label: "Map Index", value: 
taskInstance.rendered_map_index }] : []),
+    ...(taskInstance.try_number > 1 ? [{ label: "Try Number", value: 
taskInstance.try_number }] : []),
+    { label: "Start", value: <Time datetime={taskInstance.start_date} /> },
+    { label: "End", value: <Time datetime={taskInstance.end_date} /> },
+    { label: "Duration", value: `${getDuration(taskInstance.start_date, 
taskInstance.end_date)}s` },
+    ...(taskInstance.dag_version?.version_number === undefined
+      ? []
+      : [{ label: "Dag Version", value: 
`v${taskInstance.dag_version.version_number}` }]),
+  ];
+
+  return (
+    <Box ref={containerRef}>
+      <HeaderCard
+        actions={
+          <>
+            {taskInstance.note === null || taskInstance.note.length === 0 ? 
undefined : (
+              <DisplayMarkdownButton
+                header="Task Instance Note"
+                icon={<FiMessageSquare color="black" />}
+                mdContent={taskInstance.note}
+                text="Note"
+              />
+            )}
+            <ClearTaskInstanceButton taskInstance={taskInstance} 
withText={containerWidth > 700} />
+            <MarkTaskInstanceAsButton taskInstance={taskInstance} 
withText={containerWidth > 700} />
+          </>
+        }
+        icon={<MdOutlineTask />}
+        isRefreshing={isRefreshing}
+        state={taskInstance.state}
+        stats={stats}
+        subTitle={<Time datetime={taskInstance.start_date} />}
+        title={`${taskInstance.task_display_name}${taskInstance.map_index > -1 
? ` [${taskInstance.rendered_map_index ?? taskInstance.map_index}]` : ""}`}
+      />
+    </Box>
+  );
+};
diff --git a/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx 
b/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx
index 5fef04c0c28..bcda0736dd1 100644
--- a/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx
+++ b/airflow/ui/src/pages/TaskInstance/TaskInstance.tsx
@@ -16,23 +16,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { LiaSlashSolid } from "react-icons/lia";
-import { useParams, Link as RouterLink, useSearchParams } from 
"react-router-dom";
+import { ReactFlowProvider } from "@xyflow/react";
+import { FiCode } from "react-icons/fi";
+import { MdDetails, MdOutlineEventNote, MdReorder, MdSyncAlt } from 
"react-icons/md";
+import { PiBracketsCurlyBold } from "react-icons/pi";
+import { useParams, useSearchParams } from "react-router-dom";
 
 import { useDagServiceGetDagDetails, 
useTaskInstanceServiceGetMappedTaskInstance } from "openapi/queries";
-import { Breadcrumb } from "src/components/ui";
 import { DetailsLayout } from "src/layouts/Details/DetailsLayout";
 import { isStatePending, useAutoRefresh } from "src/utils";
 
 import { Header } from "./Header";
 
 const tabs = [
-  { label: "Logs", value: "" },
-  { label: "Events", value: "events" },
-  { label: "XCom", value: "xcom" },
-  { label: "Code", value: "code" },
-  { label: "Details", value: "details" },
-  { label: "Rendered Templates", value: "rendered_templates" },
+  { icon: <MdReorder />, label: "Logs", value: "" },
+  { icon: <PiBracketsCurlyBold />, label: "Rendered Templates", value: 
"rendered_templates" },
+  { icon: <MdSyncAlt />, label: "XCom", value: "xcom" },
+  { icon: <MdOutlineEventNote />, label: "Events", value: "events" },
+  { icon: <FiCode />, label: "Code", value: "code" },
+  { icon: <MdDetails />, label: "Details", value: "details" },
 ];
 
 export const TaskInstance = () => {
@@ -69,42 +71,16 @@ export const TaskInstance = () => {
     },
   );
 
-  const links = [
-    { label: "Dags", value: "/dags" },
-    { label: dag?.dag_display_name ?? dagId, value: `/dags/${dagId}` },
-    { label: runId, value: `/dags/${dagId}/runs/${runId}` },
-    { label: taskInstance?.task_display_name ?? taskId },
-  ];
-
-  if (mapIndexParam !== null) {
-    links.push({ label: taskInstance?.rendered_map_index ?? mapIndexParam });
-  }
-
   return (
-    <DetailsLayout dag={dag} error={error ?? dagError} isLoading={isLoading || 
isDagLoading} tabs={tabs}>
-      <Breadcrumb.Root mb={3} separator={<LiaSlashSolid />}>
-        {links.map((link, index) => {
-          if (index === links.length - 1) {
-            return <Breadcrumb.CurrentLink 
key={link.label}>{link.label}</Breadcrumb.CurrentLink>;
-          }
-
-          return link.value === undefined ? (
-            <Breadcrumb.Link color="fg.info" key={link.label}>
-              {link.label}
-            </Breadcrumb.Link>
-          ) : (
-            <Breadcrumb.Link asChild color="fg.info" key={link.label}>
-              <RouterLink to={link.value}>{link.label}</RouterLink>
-            </Breadcrumb.Link>
-          );
-        })}
-      </Breadcrumb.Root>
-      {taskInstance === undefined ? undefined : (
-        <Header
-          isRefreshing={Boolean(isStatePending(taskInstance.state) && 
Boolean(refetchInterval))}
-          taskInstance={taskInstance}
-        />
-      )}
-    </DetailsLayout>
+    <ReactFlowProvider>
+      <DetailsLayout dag={dag} error={error ?? dagError} isLoading={isLoading 
|| isDagLoading} tabs={tabs}>
+        {taskInstance === undefined ? undefined : (
+          <Header
+            isRefreshing={Boolean(isStatePending(taskInstance.state) && 
Boolean(refetchInterval))}
+            taskInstance={taskInstance}
+          />
+        )}
+      </DetailsLayout>
+    </ReactFlowProvider>
   );
 };
diff --git a/airflow/ui/src/pages/TaskInstances.tsx 
b/airflow/ui/src/pages/TaskInstances.tsx
index 12559de5f1a..20dff17bb2e 100644
--- a/airflow/ui/src/pages/TaskInstances.tsx
+++ b/airflow/ui/src/pages/TaskInstances.tsx
@@ -31,6 +31,7 @@ import { MarkTaskInstanceAsButton } from 
"src/components/MarkAs";
 import { SearchBar } from "src/components/SearchBar";
 import { StateBadge } from "src/components/StateBadge";
 import Time from "src/components/Time";
+import { TruncatedText } from "src/components/TruncatedText";
 import { Select } from "src/components/ui";
 import { SearchParamsKeys, type SearchParamsKeysType } from 
"src/constants/searchParams";
 import { taskInstanceStateOptions as stateOptions } from 
"src/constants/stateOptions";
@@ -79,7 +80,9 @@ const taskInstanceColumns = (
           accessorKey: "task_display_name",
           cell: ({ row: { original } }: TaskInstanceRow) => (
             <Link asChild color="fg.info" fontWeight="bold">
-              <RouterLink 
to={getTaskInstanceLink(original)}>{original.task_display_name}</RouterLink>
+              <RouterLink to={getTaskInstanceLink(original)}>
+                <TruncatedText text={original.task_display_name} />
+              </RouterLink>
             </Link>
           ),
           enableSorting: false,
@@ -109,7 +112,6 @@ const taskInstanceColumns = (
     accessorKey: "rendered_map_index",
     header: "Map Index",
   },
-
   {
     accessorKey: "try_number",
     enableSorting: false,
diff --git a/airflow/ui/src/queries/useClearRun.ts 
b/airflow/ui/src/queries/useClearRun.ts
index 02cb4926bb6..1c7a80d2a99 100644
--- a/airflow/ui/src/queries/useClearRun.ts
+++ b/airflow/ui/src/queries/useClearRun.ts
@@ -23,6 +23,7 @@ import {
   UseDagRunServiceGetDagRunKeyFn,
   useDagRunServiceGetDagRunsKey,
   UseDagServiceGetDagDetailsKeyFn,
+  UseGridServiceGridDataKeyFn,
   useTaskInstanceServiceGetTaskInstancesKey,
 } from "openapi/queries";
 import { toaster } from "src/components/ui";
@@ -55,6 +56,7 @@ export const useClearDagRun = ({
       UseDagRunServiceGetDagRunKeyFn({ dagId, dagRunId }),
       [useDagRunServiceGetDagRunsKey],
       [useClearDagRunDryRunKey, dagId],
+      UseGridServiceGridDataKeyFn({ dagId }, [{ dagId }]),
     ];
 
     await Promise.all(queryKeys.map((key) => queryClient.invalidateQueries({ 
queryKey: key })));
diff --git a/airflow/ui/src/queries/useClearTaskInstances.ts 
b/airflow/ui/src/queries/useClearTaskInstances.ts
index 8082483586f..e5a4f3e745d 100644
--- a/airflow/ui/src/queries/useClearTaskInstances.ts
+++ b/airflow/ui/src/queries/useClearTaskInstances.ts
@@ -21,6 +21,7 @@ import { useQueryClient } from "@tanstack/react-query";
 import {
   UseDagRunServiceGetDagRunKeyFn,
   useDagRunServiceGetDagRunsKey,
+  UseGridServiceGridDataKeyFn,
   UseTaskInstanceServiceGetMappedTaskInstanceKeyFn,
   useTaskInstanceServicePostClearTaskInstances,
 } from "openapi/queries";
@@ -81,6 +82,7 @@ export const useClearTaskInstances = ({
       [useDagRunServiceGetDagRunsKey],
       [useClearTaskInstancesDryRunKey, dagId],
       [usePatchTaskInstanceDryRunKey, dagId, dagRunId],
+      UseGridServiceGridDataKeyFn({ dagId }, [{ dagId }]),
     ];
 
     await Promise.all(queryKeys.map((key) => queryClient.invalidateQueries({ 
queryKey: key })));
diff --git a/airflow/ui/src/queries/usePatchDagRun.ts 
b/airflow/ui/src/queries/usePatchDagRun.ts
index 0ed16f5ecab..6ca008b6dc1 100644
--- a/airflow/ui/src/queries/usePatchDagRun.ts
+++ b/airflow/ui/src/queries/usePatchDagRun.ts
@@ -22,6 +22,7 @@ import {
   UseDagRunServiceGetDagRunKeyFn,
   useDagRunServiceGetDagRunsKey,
   useDagRunServicePatchDagRun,
+  UseGridServiceGridDataKeyFn,
   useTaskInstanceServiceGetTaskInstancesKey,
 } from "openapi/queries";
 import { toaster } from "src/components/ui";
@@ -53,6 +54,7 @@ export const usePatchDagRun = ({
       [useDagRunServiceGetDagRunsKey],
       [useTaskInstanceServiceGetTaskInstancesKey, { dagId, dagRunId }],
       [useClearDagRunDryRunKey, dagId],
+      UseGridServiceGridDataKeyFn({ dagId }, [{ dagId }]),
     ];
 
     await Promise.all(queryKeys.map((key) => queryClient.invalidateQueries({ 
queryKey: key })));
diff --git a/airflow/ui/src/queries/usePatchTaskInstance.ts 
b/airflow/ui/src/queries/usePatchTaskInstance.ts
index 90cbc5ef0c8..8cd6a7c36cb 100644
--- a/airflow/ui/src/queries/usePatchTaskInstance.ts
+++ b/airflow/ui/src/queries/usePatchTaskInstance.ts
@@ -19,6 +19,7 @@
 import { useQueryClient } from "@tanstack/react-query";
 
 import {
+  UseGridServiceGridDataKeyFn,
   UseTaskInstanceServiceGetMappedTaskInstanceKeyFn,
   UseTaskInstanceServiceGetTaskInstanceKeyFn,
   useTaskInstanceServiceGetTaskInstancesKey,
@@ -59,6 +60,7 @@ export const usePatchTaskInstance = ({
       [useTaskInstanceServiceGetTaskInstancesKey],
       [usePatchTaskInstanceDryRunKey, dagId, dagRunId, { mapIndex, taskId }],
       [useClearTaskInstancesDryRunKey, dagId],
+      UseGridServiceGridDataKeyFn({ dagId }, [{ dagId }]),
     ];
 
     await Promise.all(queryKeys.map((key) => queryClient.invalidateQueries({ 
queryKey: key })));
diff --git a/airflow/ui/src/queries/useTrigger.ts 
b/airflow/ui/src/queries/useTrigger.ts
index 6d93383ff3c..a9aaf9f099d 100644
--- a/airflow/ui/src/queries/useTrigger.ts
+++ b/airflow/ui/src/queries/useTrigger.ts
@@ -24,6 +24,7 @@ import {
   useDagRunServiceTriggerDagRun,
   useDagServiceGetDagsKey,
   useDagsServiceRecentDagRunsKey,
+  UseGridServiceGridDataKeyFn,
   UseTaskInstanceServiceGetTaskInstancesKeyFn,
 } from "openapi/queries";
 import type { DagRunTriggerParams } from 
"src/components/TriggerDag/TriggerDAGForm";
@@ -39,6 +40,7 @@ export const useTrigger = ({ dagId, onSuccessConfirm }: { 
dagId: string; onSucce
       [useDagsServiceRecentDagRunsKey],
       UseDagRunServiceGetDagRunsKeyFn({ dagId }, [{ dagId }]),
       UseTaskInstanceServiceGetTaskInstancesKeyFn({ dagId, dagRunId: "~" }, [{ 
dagId, dagRunId: "~" }]),
+      UseGridServiceGridDataKeyFn({ dagId }, [{ dagId }]),
     ];
 
     await Promise.all(queryKeys.map((key) => queryClient.invalidateQueries({ 
queryKey: key })));
diff --git a/airflow/ui/src/utils/index.ts b/airflow/ui/src/utils/index.ts
index 632d24b3f45..03268cfd503 100644
--- a/airflow/ui/src/utils/index.ts
+++ b/airflow/ui/src/utils/index.ts
@@ -21,4 +21,5 @@ export { capitalize } from "./capitalize";
 export { pluralize } from "./pluralize";
 export { getDuration } from "./datetime_utils";
 export { getMetaKey } from "./getMetaKey";
+export { useContainerWidth } from "./useContainerWidth";
 export * from "./query";
diff --git a/airflow/ui/src/components/Stat.tsx 
b/airflow/ui/src/utils/useContainerWidth.ts
similarity index 58%
copy from airflow/ui/src/components/Stat.tsx
copy to airflow/ui/src/utils/useContainerWidth.ts
index 7f39a092ea2..dce0254d7a0 100644
--- a/airflow/ui/src/components/Stat.tsx
+++ b/airflow/ui/src/utils/useContainerWidth.ts
@@ -16,18 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Heading, VStack } from "@chakra-ui/react";
-import type { PropsWithChildren } from "react";
+import { type MutableRefObject, useEffect, useState } from "react";
 
-type Props = {
-  readonly label: string;
-} & PropsWithChildren;
+export const useContainerWidth = (ref: MutableRefObject<HTMLDivElement | null 
| undefined>) => {
+  const [width, setWidth] = useState(0);
 
-export const Stat = ({ children, label }: Props) => (
-  <VStack align="flex-start" gap={1}>
-    <Heading color="fg.muted" fontSize="xs">
-      {label}
-    </Heading>
-    {children}
-  </VStack>
-);
+  useEffect(() => {
+    if (!ref.current) {
+      return undefined;
+    }
+
+    const resizeObserver = new ResizeObserver((entries) => {
+      for (const entry of entries) {
+        setWidth(entry.contentRect.width);
+      }
+    });
+
+    resizeObserver.observe(ref.current);
+
+    return () => {
+      resizeObserver.disconnect();
+    };
+  }, [ref]);
+
+  return width;
+};


Reply via email to