From 1c480806c9bf3c267616c7080118dcdc14af0013 Mon Sep 17 00:00:00 2001 From: mathuraditya724 Date: Mon, 26 Jan 2026 05:53:29 +0530 Subject: [PATCH 01/14] wip --- .github/workflows/build.yml | 4 + .../spotlight/coverage/coverage-final.json | 9 + packages/spotlight/package.json | 9 +- packages/spotlight/registry.json | 125 +++ .../components/__tests__/span-tree.test.tsx | 130 +++ .../components/__tests__/trace-item.test.tsx | 168 ++++ .../spotlight/components/span-item.tsx | 169 ++++ .../spotlight/components/span-resizer.tsx | 56 ++ .../spotlight/components/span-tree.tsx | 83 ++ .../spotlight/components/time-since.tsx | 54 ++ .../spotlight/components/trace-badge.tsx | 92 +++ .../spotlight/components/trace-item.tsx | 118 +++ .../spotlight/lib/__tests__/duration.test.ts | 135 +++ .../spotlight/lib/__tests__/utils.test.ts | 73 ++ .../registry/spotlight/lib/duration.ts | 99 +++ .../spotlight/registry/spotlight/lib/types.ts | 163 ++++ .../spotlight/registry/spotlight/lib/utils.ts | 33 + packages/spotlight/src/sentry-config.ts | 3 +- packages/spotlight/src/server/cli/server.ts | 2 +- .../insights/webVitals/WebVitalsDetail.tsx | 2 +- packages/spotlight/vite.config.base.ts | 1 + packages/spotlight/vite.electron.config.ts | 8 +- packages/spotlight/vitest.config.ts | 5 +- packages/website/astro.config.mjs | 6 + packages/website/public/r/.gitkeep | 3 + .../src/content/docs/docs/registry/index.mdx | 158 ++++ .../content/docs/docs/registry/span-tree.mdx | 268 ++++++ .../content/docs/docs/registry/trace-item.mdx | 370 +++++++++ packages/website/vercel.json | 21 + pnpm-lock.yaml | 768 ++++++++++++++++++ turbo.json | 5 + 31 files changed, 3124 insertions(+), 16 deletions(-) create mode 100644 packages/spotlight/coverage/coverage-final.json create mode 100644 packages/spotlight/registry.json create mode 100644 packages/spotlight/registry/spotlight/components/__tests__/span-tree.test.tsx create mode 100644 packages/spotlight/registry/spotlight/components/__tests__/trace-item.test.tsx create mode 100644 packages/spotlight/registry/spotlight/components/span-item.tsx create mode 100644 packages/spotlight/registry/spotlight/components/span-resizer.tsx create mode 100644 packages/spotlight/registry/spotlight/components/span-tree.tsx create mode 100644 packages/spotlight/registry/spotlight/components/time-since.tsx create mode 100644 packages/spotlight/registry/spotlight/components/trace-badge.tsx create mode 100644 packages/spotlight/registry/spotlight/components/trace-item.tsx create mode 100644 packages/spotlight/registry/spotlight/lib/__tests__/duration.test.ts create mode 100644 packages/spotlight/registry/spotlight/lib/__tests__/utils.test.ts create mode 100644 packages/spotlight/registry/spotlight/lib/duration.ts create mode 100644 packages/spotlight/registry/spotlight/lib/types.ts create mode 100644 packages/spotlight/registry/spotlight/lib/utils.ts create mode 100644 packages/website/public/r/.gitkeep create mode 100644 packages/website/src/content/docs/docs/registry/index.mdx create mode 100644 packages/website/src/content/docs/docs/registry/span-tree.mdx create mode 100644 packages/website/src/content/docs/docs/registry/trace-item.mdx diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cb4f12a91..f2d4b166e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -106,6 +106,10 @@ jobs: FOSSILIZE_PLATFORMS: linux-x64,linux-arm64,win-x64,darwin-x64,darwin-arm64 FOSSILIZE_SIGN: ${{ github.event_name == 'push' && (github.ref_name == 'main' || startsWith(github.ref_name, 'release/')) && 'y' || 'n' }} run: pnpm build + + - name: Build component registry + working-directory: packages/spotlight + run: pnpm registry:build - name: Checking npx run: npx ./packages/spotlight --help diff --git a/packages/spotlight/coverage/coverage-final.json b/packages/spotlight/coverage/coverage-final.json new file mode 100644 index 000000000..22e9bc295 --- /dev/null +++ b/packages/spotlight/coverage/coverage-final.json @@ -0,0 +1,9 @@ +{"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-item.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-item.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":75}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":69}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":89}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":78}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":52}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":41}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":69}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":74}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":40}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":2}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":53}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":55}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":41}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":34}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":2}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":11}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":12}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":32}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":55}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":23}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":37}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":7}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":17}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":16}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":12}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":51}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":51}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":48}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":84}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":54}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":61}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":53}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":62}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":55}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":43}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":52}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":64}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":68}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":40}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":62}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":29}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":39}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":53}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":45}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":25}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":20}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":10}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":27}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":10}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":29}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":33}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":22}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":57}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":30}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":43}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":35}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":41}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":10}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":63}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":7}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":32}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":12}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":24}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":70}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":38}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":54}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":12}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":70}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":9}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":64}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":33}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":19}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":27}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":28}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":68}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":67}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":36}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":29}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":36}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":46}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":16}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":13}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":117}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":21}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":32}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":23}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":14}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":76}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":62}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":15}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":12}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":40}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":78}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":46}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":17}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":14}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":32}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":111}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":107}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":28}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":14}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":76}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":20}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":116}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":73}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":14}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":11}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":98}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":44}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":19}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":16}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":14}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":12}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":41}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":45}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":17}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":32}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":46}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":39}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":41}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":49}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":37}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":42}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":10}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":8}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":9}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":4}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":1}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":24}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":11,"34":11,"35":11,"36":11,"37":11,"38":11,"39":11,"40":11,"41":11,"42":11,"43":11,"44":11,"45":11,"46":11,"47":11,"48":11,"49":11,"50":11,"51":11,"52":11,"53":11,"54":11,"55":11,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":11,"64":11,"65":1,"66":1,"67":11,"68":11,"69":0,"70":0,"71":0,"72":0,"73":0,"74":11,"75":11,"76":11,"77":11,"78":11,"79":11,"80":11,"81":11,"82":11,"83":11,"84":11,"85":11,"86":11,"87":11,"88":11,"89":11,"90":11,"91":11,"92":11,"93":11,"94":11,"95":11,"96":11,"97":11,"98":11,"99":11,"100":11,"101":11,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":0,"111":0,"112":0,"113":1,"114":1,"115":1,"116":1,"117":11,"118":11,"119":11,"120":11,"121":11,"122":11,"123":11,"124":11,"125":11,"126":11,"127":11,"128":11,"129":11,"130":11,"131":11,"132":11,"133":11,"134":11,"135":11,"136":11,"137":11,"138":11,"139":11,"140":11,"141":11,"142":11,"143":11,"144":11,"145":11,"146":11,"147":11,"148":11,"149":11,"150":11,"151":11,"152":11,"153":11,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":11,"164":11,"165":11,"166":11,"167":1,"168":1},"branchMap":{"0":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":7},"end":{"line":167,"column":1}},"locations":[{"start":{"line":33,"column":7},"end":{"line":167,"column":1}}]},"1":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":39},"end":{"line":45,"column":51}},"locations":[{"start":{"line":45,"column":39},"end":{"line":45,"column":51}}]},"2":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":24},"end":{"line":53,"column":48}},"locations":[{"start":{"line":53,"column":24},"end":{"line":53,"column":48}}]},"3":{"type":"branch","line":86,"loc":{"start":{"line":86,"column":10},"end":{"line":86,"column":43}},"locations":[{"start":{"line":86,"column":10},"end":{"line":86,"column":43}}]},"4":{"type":"branch","line":87,"loc":{"start":{"line":87,"column":10},"end":{"line":87,"column":35}},"locations":[{"start":{"line":87,"column":10},"end":{"line":87,"column":35}}]},"5":{"type":"branch","line":88,"loc":{"start":{"line":88,"column":10},"end":{"line":88,"column":41}},"locations":[{"start":{"line":88,"column":10},"end":{"line":88,"column":41}}]},"6":{"type":"branch","line":90,"loc":{"start":{"line":90,"column":32},"end":{"line":90,"column":54}},"locations":[{"start":{"line":90,"column":32},"end":{"line":90,"column":54}}]},"7":{"type":"branch","line":97,"loc":{"start":{"line":97,"column":12},"end":{"line":97,"column":38}},"locations":[{"start":{"line":97,"column":12},"end":{"line":97,"column":38}}]},"8":{"type":"branch","line":97,"loc":{"start":{"line":97,"column":25},"end":{"line":97,"column":54}},"locations":[{"start":{"line":97,"column":25},"end":{"line":97,"column":54}}]},"9":{"type":"branch","line":102,"loc":{"start":{"line":102,"column":27},"end":{"line":117,"column":21}},"locations":[{"start":{"line":102,"column":27},"end":{"line":117,"column":21}}]},"10":{"type":"branch","line":116,"loc":{"start":{"line":116,"column":73},"end":{"line":116,"column":100}},"locations":[{"start":{"line":116,"column":73},"end":{"line":116,"column":100}}]},"11":{"type":"branch","line":129,"loc":{"start":{"line":129,"column":49},"end":{"line":129,"column":78}},"locations":[{"start":{"line":129,"column":49},"end":{"line":129,"column":78}}]},"12":{"type":"branch","line":130,"loc":{"start":{"line":130,"column":18},"end":{"line":130,"column":46}},"locations":[{"start":{"line":130,"column":18},"end":{"line":130,"column":46}}]},"13":{"type":"branch","line":154,"loc":{"start":{"line":154,"column":39},"end":{"line":163,"column":10}},"locations":[{"start":{"line":154,"column":39},"end":{"line":163,"column":10}}]},"14":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":22},"end":{"line":67,"column":4}},"locations":[{"start":{"line":65,"column":22},"end":{"line":67,"column":4}}]}},"b":{"0":[11],"1":[0],"2":[1],"3":[1],"4":[1],"5":[1],"6":[0],"7":[1],"8":[10],"9":[1],"10":[0],"11":[0],"12":[0],"13":[1],"14":[1]},"fnMap":{"0":{"name":"SpanItem","decl":{"start":{"line":33,"column":7},"end":{"line":167,"column":1}},"loc":{"start":{"line":33,"column":7},"end":{"line":167,"column":1}},"line":33},"1":{"name":"handleResize","decl":{"start":{"line":56,"column":23},"end":{"line":63,"column":4}},"loc":{"start":{"line":56,"column":23},"end":{"line":63,"column":4}},"line":56},"2":{"name":"handleClick","decl":{"start":{"line":65,"column":22},"end":{"line":67,"column":4}},"loc":{"start":{"line":65,"column":22},"end":{"line":67,"column":4}},"line":65},"3":{"name":"handleKeyDown","decl":{"start":{"line":69,"column":24},"end":{"line":74,"column":4}},"loc":{"start":{"line":69,"column":24},"end":{"line":74,"column":4}},"line":69},"4":{"name":"onClick","decl":{"start":{"line":110,"column":23},"end":{"line":113,"column":16}},"loc":{"start":{"line":110,"column":23},"end":{"line":113,"column":16}},"line":110}},"f":{"0":11,"1":0,"2":1,"3":0,"4":0}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-resizer.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-resizer.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":71}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":41}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":3}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":65}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":61}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":65}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":30}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":3}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":92}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":52}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":34}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":48}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":44}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":29}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":50}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":51}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":6}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":27}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":61}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":57}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":56}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":52}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":10}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":8}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":84}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":66}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":8}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":14}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":73}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":31}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":45}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":46}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":6}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":4}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":27}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":11,"15":11,"16":11,"17":11,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":11,"39":11,"40":11,"41":11,"42":11,"43":11,"44":11,"45":11,"46":11,"47":11,"48":11,"49":11,"50":11,"51":11,"52":11,"53":11,"54":1,"55":1},"branchMap":{"0":{"type":"branch","line":14,"loc":{"start":{"line":14,"column":7},"end":{"line":54,"column":1}},"locations":[{"start":{"line":14,"column":7},"end":{"line":54,"column":1}}]},"1":{"type":"branch","line":44,"loc":{"start":{"line":44,"column":22},"end":{"line":44,"column":49}},"locations":[{"start":{"line":44,"column":22},"end":{"line":44,"column":49}}]},"2":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":33},"end":{"line":47,"column":66}},"locations":[{"start":{"line":47,"column":33},"end":{"line":47,"column":66}}]}},"b":{"0":[11],"1":[0],"2":[0]},"fnMap":{"0":{"name":"SpanResizer","decl":{"start":{"line":14,"column":7},"end":{"line":54,"column":1}},"loc":{"start":{"line":14,"column":7},"end":{"line":54,"column":1}},"line":14},"1":{"name":"onMouseDown","decl":{"start":{"line":18,"column":22},"end":{"line":38,"column":4}},"loc":{"start":{"line":18,"column":22},"end":{"line":38,"column":4}},"line":18},"2":{"name":"onMouseEnter","decl":{"start":{"line":50,"column":20},"end":{"line":50,"column":45}},"loc":{"start":{"line":50,"column":20},"end":{"line":50,"column":45}},"line":50},"3":{"name":"onMouseLeave","decl":{"start":{"line":51,"column":20},"end":{"line":51,"column":46}},"loc":{"start":{"line":51,"column":20},"end":{"line":51,"column":46}},"line":51}},"f":{"0":11,"1":0,"2":0,"3":0}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-tree.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-tree.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":68}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":52}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":33}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":3}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":87}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":12}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":60}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":67}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":62}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":38}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":52}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":42}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":2}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":9}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":27}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":48}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":60}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":43}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":7}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":9}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":35}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":71}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":2}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":12}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":48}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":34}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":41}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":5}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":16}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":15}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":24}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":12}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":19}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":71}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":37}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":16}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":10}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":75}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":26}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":17}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":28}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":21}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":46}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":39}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":19}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":41}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":49}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":37}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":39}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":46}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":10}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":9}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":9}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":24}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":11,"48":11,"49":11,"50":11,"51":11,"52":11,"53":11,"54":11,"55":11,"56":11,"57":11,"58":11,"59":1,"60":1,"61":10,"62":10,"63":11,"64":11,"65":11,"66":11,"67":11,"68":11,"69":11,"70":11,"71":11,"72":11,"73":11,"74":11,"75":11,"76":11,"77":11,"78":11,"79":11,"80":11,"81":1,"82":1},"branchMap":{"0":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":7},"end":{"line":81,"column":1}},"locations":[{"start":{"line":47,"column":7},"end":{"line":81,"column":1}}]},"1":{"type":"branch","line":59,"loc":{"start":{"line":59,"column":36},"end":{"line":61,"column":3}},"locations":[{"start":{"line":59,"column":36},"end":{"line":61,"column":3}}]},"2":{"type":"branch","line":61,"loc":{"start":{"line":61,"column":2},"end":{"line":64,"column":55}},"locations":[{"start":{"line":61,"column":2},"end":{"line":64,"column":55}}]},"3":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":50},"end":{"line":64,"column":63}},"locations":[{"start":{"line":64,"column":50},"end":{"line":64,"column":63}}]},"4":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":17},"end":{"line":77,"column":10}},"locations":[{"start":{"line":65,"column":17},"end":{"line":77,"column":10}}]}},"b":{"0":[11],"1":[1],"2":[10],"3":[1],"4":[11]},"fnMap":{"0":{"name":"SpanTree","decl":{"start":{"line":47,"column":7},"end":{"line":81,"column":1}},"loc":{"start":{"line":47,"column":7},"end":{"line":81,"column":1}},"line":47}},"f":{"0":11}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/time-since.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/time-since.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":26}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":53}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":44}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":41}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":73}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":38}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":2}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":11}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":45}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":30}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":2}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":77}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":59}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":87}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":97}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":16}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":24}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":36}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":51}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":37}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":38}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":38}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":30}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":35}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":82}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":10}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":47}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":11}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":1}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":14,"24":14,"25":14,"26":14,"27":0,"28":0,"29":0,"30":14,"31":14,"32":14,"33":14,"34":14,"35":14,"36":0,"37":14,"38":14,"39":14,"40":14,"41":14,"42":14,"43":14,"44":14,"45":14,"46":14,"47":14,"48":14,"49":14,"50":14,"51":14,"52":1,"53":1},"branchMap":{"0":{"type":"branch","line":23,"loc":{"start":{"line":23,"column":7},"end":{"line":52,"column":1}},"locations":[{"start":{"line":23,"column":7},"end":{"line":52,"column":1}}]},"1":{"type":"branch","line":43,"loc":{"start":{"line":43,"column":23},"end":{"line":43,"column":35}},"locations":[{"start":{"line":43,"column":23},"end":{"line":43,"column":35}}]},"2":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":41},"end":{"line":45,"column":69}},"locations":[{"start":{"line":45,"column":41},"end":{"line":45,"column":69}}]},"3":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":52},"end":{"line":24,"column":95}},"locations":[{"start":{"line":24,"column":52},"end":{"line":24,"column":95}}]},"4":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":86},"end":{"line":24,"column":95}},"locations":[{"start":{"line":24,"column":86},"end":{"line":24,"column":95}}]},"5":{"type":"branch","line":26,"loc":{"start":{"line":26,"column":12},"end":{"line":41,"column":5}},"locations":[{"start":{"line":26,"column":12},"end":{"line":41,"column":5}}]},"6":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":15},"end":{"line":30,"column":5}},"locations":[{"start":{"line":27,"column":15},"end":{"line":30,"column":5}}]},"7":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":11},"end":{"line":40,"column":38}},"locations":[{"start":{"line":40,"column":11},"end":{"line":40,"column":38}}]}},"b":{"0":[14],"1":[0],"2":[0],"3":[14],"4":[0],"5":[14],"6":[0],"7":[14]},"fnMap":{"0":{"name":"TimeSince","decl":{"start":{"line":23,"column":7},"end":{"line":52,"column":1}},"loc":{"start":{"line":23,"column":7},"end":{"line":52,"column":1}},"line":23}},"f":{"0":14}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-badge.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-badge.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":70}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":65}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":72}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":2}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":11}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":45}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":46}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":58}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":76}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":103}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":36}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":68}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":77}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":4}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":10}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":74}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":58}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":11}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":4}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":53}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":51}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":48}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":34}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":64}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":114}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":70}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":27}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":69}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":59}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":29}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":9}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":78}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":64}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":29}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":9}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":17}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":4}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":78}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":1}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":69}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":34}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":14}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":12}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":22}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":21}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":88}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":26}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":15,"17":15,"18":15,"19":15,"20":15,"21":15,"22":15,"23":15,"24":15,"25":15,"26":15,"27":15,"28":15,"29":15,"30":15,"31":15,"32":15,"33":1,"34":1,"35":1,"36":1,"37":15,"38":15,"39":15,"40":15,"41":0,"42":0,"43":15,"44":15,"45":1,"46":1,"47":14,"48":14,"49":14,"50":14,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":13,"70":13,"71":13,"72":13,"73":13,"74":13,"75":13,"76":13,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1},"branchMap":{"0":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":7},"end":{"line":33,"column":1}},"locations":[{"start":{"line":16,"column":7},"end":{"line":33,"column":1}}]},"1":{"type":"branch","line":17,"loc":{"start":{"line":17,"column":14},"end":{"line":17,"column":26}},"locations":[{"start":{"line":17,"column":14},"end":{"line":17,"column":26}}]},"2":{"type":"branch","line":30,"loc":{"start":{"line":30,"column":19},"end":{"line":30,"column":52}},"locations":[{"start":{"line":30,"column":19},"end":{"line":30,"column":52}}]},"3":{"type":"branch","line":30,"loc":{"start":{"line":30,"column":48},"end":{"line":30,"column":58}},"locations":[{"start":{"line":30,"column":48},"end":{"line":30,"column":58}}]},"4":{"type":"branch","line":38,"loc":{"start":{"line":38,"column":0},"end":{"line":51,"column":1}},"locations":[{"start":{"line":38,"column":0},"end":{"line":51,"column":1}}]},"5":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":33},"end":{"line":43,"column":3}},"locations":[{"start":{"line":41,"column":33},"end":{"line":43,"column":3}}]},"6":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":27},"end":{"line":45,"column":79}},"locations":[{"start":{"line":45,"column":27},"end":{"line":45,"column":79}}]},"7":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":59},"end":{"line":45,"column":113}},"locations":[{"start":{"line":45,"column":59},"end":{"line":45,"column":113}}]},"8":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":113},"end":{"line":47,"column":3}},"locations":[{"start":{"line":45,"column":113},"end":{"line":47,"column":3}}]},"9":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":2},"end":{"line":51,"column":1}},"locations":[{"start":{"line":47,"column":2},"end":{"line":51,"column":1}}]},"10":{"type":"branch","line":56,"loc":{"start":{"line":56,"column":7},"end":{"line":64,"column":1}},"locations":[{"start":{"line":56,"column":7},"end":{"line":64,"column":1}}]},"11":{"type":"branch","line":69,"loc":{"start":{"line":69,"column":7},"end":{"line":77,"column":1}},"locations":[{"start":{"line":69,"column":7},"end":{"line":77,"column":1}}]},"12":{"type":"branch","line":82,"loc":{"start":{"line":82,"column":7},"end":{"line":90,"column":1}},"locations":[{"start":{"line":82,"column":7},"end":{"line":90,"column":1}}]}},"b":{"0":[15],"1":[0],"2":[1],"3":[14],"4":[15],"5":[0],"6":[14],"7":[14],"8":[1],"9":[14],"10":[1],"11":[13],"12":[1]},"fnMap":{"0":{"name":"TraceBadge","decl":{"start":{"line":16,"column":7},"end":{"line":33,"column":1}},"loc":{"start":{"line":16,"column":7},"end":{"line":33,"column":1}},"line":16},"1":{"name":"getStatusClasses","decl":{"start":{"line":38,"column":0},"end":{"line":51,"column":1}},"loc":{"start":{"line":38,"column":0},"end":{"line":51,"column":1}},"line":38},"2":{"name":"StatusBadge","decl":{"start":{"line":56,"column":7},"end":{"line":64,"column":1}},"loc":{"start":{"line":56,"column":7},"end":{"line":64,"column":1}},"line":56},"3":{"name":"MethodBadge","decl":{"start":{"line":69,"column":7},"end":{"line":77,"column":1}},"loc":{"start":{"line":69,"column":7},"end":{"line":77,"column":1}},"line":69},"4":{"name":"EnvironmentBadge","decl":{"start":{"line":82,"column":7},"end":{"line":90,"column":1}},"loc":{"start":{"line":82,"column":7},"end":{"line":90,"column":1}},"line":82}},"f":{"0":15,"1":15,"2":1,"3":13,"4":1}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-item.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-item.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":71}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":105}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":67}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":69}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":52}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":60}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":53}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":66}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":66}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":2}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":12}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":58}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":47}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":40}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":34}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":31}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":2}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":11}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":9}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":13}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":56}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":45}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":7}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":2}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":9}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":29}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":29}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":29}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":22}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":51}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":33}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":9}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":8}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":9}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":95}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":38}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":53}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":45}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":25}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":75}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":37}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":57}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":49}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":10}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":8}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":27}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":31}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":20}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":61}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":46}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":33}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":18}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":8}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":25}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":37}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":21}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":62}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":64}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":10}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":31}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":60}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":51}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":64}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":85}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":92}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":12}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":30}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":49}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":95}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":83}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":39}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":17}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":14}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":12}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":19}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":87}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":104}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":22}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":31}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":22}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":55}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":10}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":4}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":1}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":25}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":14,"49":2,"50":2,"51":14,"52":14,"53":1,"54":1,"55":1,"56":1,"57":1,"58":14,"59":14,"60":14,"61":14,"62":14,"63":14,"64":14,"65":14,"66":14,"67":14,"68":14,"69":14,"70":14,"71":14,"72":14,"73":14,"74":14,"75":14,"76":14,"77":14,"78":14,"79":14,"80":1,"81":13,"82":13,"83":14,"84":14,"85":14,"86":14,"87":14,"88":14,"89":14,"90":14,"91":14,"92":14,"93":14,"94":14,"95":14,"96":14,"97":14,"98":14,"99":14,"100":14,"101":14,"102":14,"103":14,"104":14,"105":14,"106":14,"107":14,"108":14,"109":14,"110":14,"111":14,"112":14,"113":14,"114":14,"115":14,"116":1,"117":1},"branchMap":{"0":{"type":"branch","line":48,"loc":{"start":{"line":48,"column":7},"end":{"line":116,"column":1}},"locations":[{"start":{"line":48,"column":7},"end":{"line":116,"column":1}}]},"1":{"type":"branch","line":74,"loc":{"start":{"line":74,"column":8},"end":{"line":74,"column":33}},"locations":[{"start":{"line":74,"column":8},"end":{"line":74,"column":33}}]},"2":{"type":"branch","line":80,"loc":{"start":{"line":80,"column":9},"end":{"line":81,"column":62}},"locations":[{"start":{"line":80,"column":9},"end":{"line":81,"column":62}}]},"3":{"type":"branch","line":81,"loc":{"start":{"line":81,"column":60},"end":{"line":83,"column":64}},"locations":[{"start":{"line":81,"column":60},"end":{"line":83,"column":64}}]},"4":{"type":"branch","line":91,"loc":{"start":{"line":91,"column":17},"end":{"line":91,"column":85}},"locations":[{"start":{"line":91,"column":17},"end":{"line":91,"column":85}}]},"5":{"type":"branch","line":99,"loc":{"start":{"line":99,"column":17},"end":{"line":99,"column":95}},"locations":[{"start":{"line":99,"column":17},"end":{"line":99,"column":95}}]},"6":{"type":"branch","line":108,"loc":{"start":{"line":108,"column":9},"end":{"line":108,"column":61}},"locations":[{"start":{"line":108,"column":9},"end":{"line":108,"column":61}}]},"7":{"type":"branch","line":108,"loc":{"start":{"line":108,"column":56},"end":{"line":108,"column":104}},"locations":[{"start":{"line":108,"column":56},"end":{"line":108,"column":104}}]},"8":{"type":"branch","line":49,"loc":{"start":{"line":49,"column":22},"end":{"line":51,"column":4}},"locations":[{"start":{"line":49,"column":22},"end":{"line":51,"column":4}}]},"9":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":24},"end":{"line":58,"column":4}},"locations":[{"start":{"line":53,"column":24},"end":{"line":58,"column":4}}]},"10":{"type":"branch","line":54,"loc":{"start":{"line":54,"column":18},"end":{"line":54,"column":44}},"locations":[{"start":{"line":54,"column":18},"end":{"line":54,"column":44}}]}},"b":{"0":[14],"1":[1],"2":[1],"3":[13],"4":[1],"5":[13],"6":[1],"7":[13],"8":[2],"9":[1],"10":[0]},"fnMap":{"0":{"name":"TraceItem","decl":{"start":{"line":48,"column":7},"end":{"line":116,"column":1}},"loc":{"start":{"line":48,"column":7},"end":{"line":116,"column":1}},"line":48},"1":{"name":"handleClick","decl":{"start":{"line":49,"column":22},"end":{"line":51,"column":4}},"loc":{"start":{"line":49,"column":22},"end":{"line":51,"column":4}},"line":49},"2":{"name":"handleKeyDown","decl":{"start":{"line":53,"column":24},"end":{"line":58,"column":4}},"loc":{"start":{"line":53,"column":24},"end":{"line":58,"column":4}},"line":53}},"f":{"0":14,"1":2,"2":1}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/duration.ts": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/duration.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":57}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":60}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":3}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":62}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":3}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":56}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":20}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":2}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":55}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":3}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":46}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":25}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":80}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":39}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":2}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":45}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":46}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":11}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":58}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":60}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":60}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":66}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":64}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":49}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":47}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":47}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":75}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":2}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":32}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":63}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":35}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":2}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":11}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":31}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":37}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":70}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":58}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":1}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":65}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":51}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":2}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":45}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":47}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":2}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":38}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":37}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":40}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":39}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":58}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":34}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":28}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":49}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":47}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":39}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":1}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":49}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":2}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":69}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":37}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":2}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":11}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":76}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":42}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":20}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":12}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":63}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":23,"40":23,"41":23,"42":3,"43":3,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":57,"59":57,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":48,"76":298,"77":30,"78":30,"79":30,"80":298,"81":18,"82":18,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":3,"95":3,"96":3,"97":3,"98":3},"branchMap":{"0":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":8},"end":{"line":24,"column":23}},"locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":23}}]},"1":{"type":"branch","line":39,"loc":{"start":{"line":39,"column":7},"end":{"line":44,"column":1}},"locations":[{"start":{"line":39,"column":7},"end":{"line":44,"column":1}}]},"2":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":23},"end":{"line":40,"column":49}},"locations":[{"start":{"line":40,"column":23},"end":{"line":40,"column":49}}]},"3":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":30},"end":{"line":41,"column":29}},"locations":[{"start":{"line":40,"column":30},"end":{"line":41,"column":29}}]},"4":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":22},"end":{"line":41,"column":47}},"locations":[{"start":{"line":41,"column":22},"end":{"line":41,"column":47}}]},"5":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":29},"end":{"line":42,"column":29}},"locations":[{"start":{"line":41,"column":29},"end":{"line":42,"column":29}}]},"6":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":22},"end":{"line":44,"column":1}},"locations":[{"start":{"line":42,"column":22},"end":{"line":44,"column":1}}]},"7":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":29},"end":{"line":44,"column":1}},"locations":[{"start":{"line":42,"column":29},"end":{"line":44,"column":1}}]},"8":{"type":"branch","line":58,"loc":{"start":{"line":58,"column":7},"end":{"line":60,"column":1}},"locations":[{"start":{"line":58,"column":7},"end":{"line":60,"column":1}}]},"9":{"type":"branch","line":75,"loc":{"start":{"line":75,"column":7},"end":{"line":83,"column":1}},"locations":[{"start":{"line":75,"column":7},"end":{"line":83,"column":1}}]},"10":{"type":"branch","line":76,"loc":{"start":{"line":76,"column":33},"end":{"line":81,"column":3}},"locations":[{"start":{"line":76,"column":33},"end":{"line":81,"column":3}}]},"11":{"type":"branch","line":77,"loc":{"start":{"line":77,"column":27},"end":{"line":80,"column":5}},"locations":[{"start":{"line":77,"column":27},"end":{"line":80,"column":5}}]},"12":{"type":"branch","line":81,"loc":{"start":{"line":81,"column":2},"end":{"line":83,"column":1}},"locations":[{"start":{"line":81,"column":2},"end":{"line":83,"column":1}}]},"13":{"type":"branch","line":94,"loc":{"start":{"line":94,"column":7},"end":{"line":99,"column":1}},"locations":[{"start":{"line":94,"column":7},"end":{"line":99,"column":1}}]}},"b":{"0":[18],"1":[23],"2":[3],"3":[20],"4":[3],"5":[17],"6":[14],"7":[3],"8":[57],"9":[48],"10":[298],"11":[30],"12":[18],"13":[3]},"fnMap":{"0":{"name":"getDurationClassName","decl":{"start":{"line":39,"column":7},"end":{"line":44,"column":1}},"loc":{"start":{"line":39,"column":7},"end":{"line":44,"column":1}},"line":39},"1":{"name":"formatNumber","decl":{"start":{"line":58,"column":7},"end":{"line":60,"column":1}},"loc":{"start":{"line":58,"column":7},"end":{"line":60,"column":1}},"line":58},"2":{"name":"formatDuration","decl":{"start":{"line":75,"column":7},"end":{"line":83,"column":1}},"loc":{"start":{"line":75,"column":7},"end":{"line":83,"column":1}},"line":75},"3":{"name":"formatSpanDuration","decl":{"start":{"line":94,"column":7},"end":{"line":99,"column":1}},"loc":{"start":{"line":94,"column":7},"end":{"line":99,"column":1}},"line":94}},"f":{"0":23,"1":57,"2":48,"3":3}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/utils.ts": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/utils.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":45}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":3}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":75}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":78}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":2}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":67}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":11}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":62}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":74}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":3}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":45}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":48}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":50}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":40}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":46}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":2}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":11}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":49}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":48}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":57}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":33}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":110,"16":110,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":24,"32":24},"branchMap":{"0":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":7},"end":{"line":17,"column":1}},"locations":[{"start":{"line":15,"column":7},"end":{"line":17,"column":1}}]},"1":{"type":"branch","line":31,"loc":{"start":{"line":31,"column":7},"end":{"line":33,"column":1}},"locations":[{"start":{"line":31,"column":7},"end":{"line":33,"column":1}}]}},"b":{"0":[110],"1":[24]},"fnMap":{"0":{"name":"cn","decl":{"start":{"line":15,"column":7},"end":{"line":17,"column":1}},"loc":{"start":{"line":15,"column":7},"end":{"line":17,"column":1}},"line":15},"1":{"name":"truncateId","decl":{"start":{"line":31,"column":7},"end":{"line":33,"column":1}},"loc":{"start":{"line":31,"column":7},"end":{"line":33,"column":1}},"line":31}},"f":{"0":110,"1":24}} +} diff --git a/packages/spotlight/package.json b/packages/spotlight/package.json index 90ab3be43..5e812fae5 100644 --- a/packages/spotlight/package.json +++ b/packages/spotlight/package.json @@ -30,11 +30,10 @@ "test:e2e:cli": "vitest run --config vitest.cli.config.ts", "test:e2e:ui": "playwright test tests/e2e/ui", "test:e2e:electron": "playwright test tests/electron.test.ts", - "sample": "node ./_fixtures/send_to_sidecar.cjs" + "sample": "node ./_fixtures/send_to_sidecar.cjs", + "registry:build": "shadcn build --output ../website/public/r" }, - "files": [ - "dist" - ], + "files": ["dist"], "bin": { "spotlight": "./dist/run.js" }, @@ -72,6 +71,8 @@ "zod": "^4" }, "devDependencies": { + "shadcn": "^2.5.0", + "lucide-react": "^0.468.0", "@electron/notarize": "^2.5.0", "@fontsource/raleway": "catalog:", "@microlink/react-json-view": "^1.23.4", diff --git a/packages/spotlight/registry.json b/packages/spotlight/registry.json new file mode 100644 index 000000000..1b99c08f7 --- /dev/null +++ b/packages/spotlight/registry.json @@ -0,0 +1,125 @@ +{ + "$schema": "https://ui.shadcn.com/schema/registry.json", + "name": "spotlight", + "homepage": "https://spotlightjs.com", + "items": [ + { + "name": "span-tree", + "type": "registry:block", + "title": "Span Tree", + "description": "A hierarchical waterfall visualization for distributed trace spans with collapsible nodes and resizable columns.", + "dependencies": ["dayjs", "lucide-react"], + "registryDependencies": ["badge"], + "categories": ["traces", "observability"], + "files": [ + { + "path": "registry/spotlight/components/span-tree.tsx", + "type": "registry:component" + }, + { + "path": "registry/spotlight/components/span-item.tsx", + "type": "registry:component" + }, + { + "path": "registry/spotlight/components/span-resizer.tsx", + "type": "registry:component" + }, + { + "path": "registry/spotlight/lib/types.ts", + "type": "registry:lib" + }, + { + "path": "registry/spotlight/lib/duration.ts", + "type": "registry:lib" + }, + { + "path": "registry/spotlight/lib/utils.ts", + "type": "registry:lib" + } + ], + "css": { + "@layer components": { + ".span-tree": { + "position": "relative" + }, + ".span-tree ul": { + "list-style": "none", + "margin": "0", + "padding": "0" + }, + ".span-tree.deep > li": { + "border-left": "1px solid hsl(var(--border))", + "padding-left": "1rem", + "margin-left": "1rem" + }, + ".span-tree li:last-child": { + "border-color": "transparent" + }, + ".span-tree.deep > li:before": { + "content": "\"\"", + "display": "inline-block", + "position": "absolute", + "height": "15px", + "width": "12px", + "margin-left": "-16px", + "border-bottom": "1px solid hsl(var(--border))" + }, + ".span-tree li:last-child:before": { + "border-left": "1px solid hsl(var(--border))" + }, + ".span-tree .node": { + "display": "flex", + "align-items": "center", + "gap": "0.25rem", + "overflow": "hidden", + "padding": "0.25rem", + "padding-left": "0.25rem" + }, + ".span-tree .waterfall": { + "position": "absolute", + "right": "0", + "height": "1.75rem", + "border-left": "2px solid hsl(var(--border))", + "padding": "0.25rem", + "padding-left": "0.25rem" + } + } + } + }, + { + "name": "trace-item", + "type": "registry:block", + "title": "Trace Item", + "description": "A trace summary row component showing ID, duration, status, and transaction name for distributed traces.", + "dependencies": ["dayjs", "lucide-react"], + "registryDependencies": ["badge"], + "categories": ["traces", "observability"], + "files": [ + { + "path": "registry/spotlight/components/trace-item.tsx", + "type": "registry:component" + }, + { + "path": "registry/spotlight/components/time-since.tsx", + "type": "registry:component" + }, + { + "path": "registry/spotlight/components/trace-badge.tsx", + "type": "registry:component" + }, + { + "path": "registry/spotlight/lib/types.ts", + "type": "registry:lib" + }, + { + "path": "registry/spotlight/lib/duration.ts", + "type": "registry:lib" + }, + { + "path": "registry/spotlight/lib/utils.ts", + "type": "registry:lib" + } + ] + } + ] +} diff --git a/packages/spotlight/registry/spotlight/components/__tests__/span-tree.test.tsx b/packages/spotlight/registry/spotlight/components/__tests__/span-tree.test.tsx new file mode 100644 index 000000000..50647508d --- /dev/null +++ b/packages/spotlight/registry/spotlight/components/__tests__/span-tree.test.tsx @@ -0,0 +1,130 @@ +import { fireEvent, render, screen } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; +import "@testing-library/jest-dom"; +import type { SpanData } from "../../lib/types"; +import { SpanTree } from "../span-tree"; + +const createMockSpan = (overrides: Partial = {}): SpanData => ({ + span_id: "span-1", + trace_id: "trace-1", + op: "http.request", + description: "GET /api/users", + start_timestamp: 1000, + timestamp: 1500, + status: "ok", + children: [], + ...overrides, +}); + +describe("SpanTree", () => { + it("renders nothing when spans array is empty", () => { + const { container } = render(); + expect(container.firstChild).toBeNull(); + }); + + it("renders a single span", () => { + const span = createMockSpan(); + + render(); + + expect(screen.getByText("http.request")).toBeInTheDocument(); + expect(screen.getByText("GET /api/users")).toBeInTheDocument(); + }); + + it("renders multiple root spans", () => { + const spans: SpanData[] = [ + createMockSpan({ span_id: "span-1", op: "http.request" }), + createMockSpan({ span_id: "span-2", op: "db.query" }), + ]; + + render(); + + expect(screen.getByText("http.request")).toBeInTheDocument(); + expect(screen.getByText("db.query")).toBeInTheDocument(); + }); + + it("calls onSpanSelect when span is clicked", () => { + const onSpanSelect = vi.fn(); + const span = createMockSpan(); + + render(); + + fireEvent.click(screen.getByRole("button")); + expect(onSpanSelect).toHaveBeenCalledWith("span-1", span); + }); + + it("highlights selected span", () => { + const span = createMockSpan(); + + render(); + + const button = screen.getByRole("button"); + expect(button).toHaveClass("bg-muted"); + }); + + it("highlights spans in highlightedSpanIds", () => { + const span = createMockSpan(); + const highlightedSpanIds = new Set(["span-1"]); + + render( + , + ); + + const button = screen.getByRole("button"); + expect(button).toHaveClass("bg-primary/10"); + }); + + it("renders nested spans with children", () => { + const parentSpan = createMockSpan({ + span_id: "parent", + op: "http.request", + children: [ + createMockSpan({ + span_id: "child-1", + op: "db.query", + parent_span_id: "parent", + }), + ], + }); + + render(); + + expect(screen.getByText("http.request")).toBeInTheDocument(); + expect(screen.getByText("db.query")).toBeInTheDocument(); + }); + + it("displays duration in correct format", () => { + const span = createMockSpan({ + start_timestamp: 1000, + timestamp: 1500, // 500ms duration + }); + + render(); + + expect(screen.getByText("500ms")).toBeInTheDocument(); + }); + + it("applies custom className", () => { + const span = createMockSpan(); + + const { container } = render( + , + ); + + expect(container.firstChild).toHaveClass("custom-class"); + }); + + it("shows error styling for error status", () => { + const span = createMockSpan({ status: "error" }); + + render(); + + const button = screen.getByRole("button"); + expect(button).toHaveClass("text-destructive"); + }); +}); diff --git a/packages/spotlight/registry/spotlight/components/__tests__/trace-item.test.tsx b/packages/spotlight/registry/spotlight/components/__tests__/trace-item.test.tsx new file mode 100644 index 000000000..88d9021d4 --- /dev/null +++ b/packages/spotlight/registry/spotlight/components/__tests__/trace-item.test.tsx @@ -0,0 +1,168 @@ +import { fireEvent, render, screen } from "@testing-library/react"; +import { describe, expect, it, vi } from "vitest"; +import "@testing-library/jest-dom"; +import type { SpanData, TraceData } from "../../lib/types"; +import { TraceItem } from "../trace-item"; + +const createMockTrace = (overrides: Partial = {}): TraceData => ({ + trace_id: "abc123def456", + start_timestamp: Date.now() - 60000, // 1 minute ago + timestamp: Date.now() - 59000, // 59 seconds ago (1 second duration) + status: "ok", + spans: new Map(), + spanTree: [], + rootTransactionName: "/api/users", + rootTransactionMethod: "GET", + ...overrides, +}); + +describe("TraceItem", () => { + it("renders trace ID truncated to 8 characters", () => { + const trace = createMockTrace({ trace_id: "abc123def456ghi789" }); + + render(); + + expect(screen.getByText("abc123de")).toBeInTheDocument(); + }); + + it("renders transaction name and method", () => { + const trace = createMockTrace({ + rootTransactionName: "/api/users/:id", + rootTransactionMethod: "POST", + }); + + render(); + + expect(screen.getByText("/api/users/:id")).toBeInTheDocument(); + expect(screen.getByText("POST")).toBeInTheDocument(); + }); + + it("renders environment badge when present", () => { + const trace = createMockTrace({ environment: "production" }); + + render(); + + expect(screen.getByText("production")).toBeInTheDocument(); + }); + + it("renders span count", () => { + const spans = new Map(); + spans.set("span-1", { + span_id: "span-1", + start_timestamp: 1000, + timestamp: 1500, + }); + spans.set("span-2", { + span_id: "span-2", + start_timestamp: 1100, + timestamp: 1400, + }); + + const trace = createMockTrace({ spans }); + + render(); + + expect(screen.getByText("2 spans")).toBeInTheDocument(); + }); + + it("calls onSelect when clicked", () => { + const onSelect = vi.fn(); + const trace = createMockTrace(); + + render(); + + fireEvent.click(screen.getByRole("button")); + expect(onSelect).toHaveBeenCalledWith(trace.trace_id, trace); + }); + + it("calls onSelect when Enter key is pressed", () => { + const onSelect = vi.fn(); + const trace = createMockTrace(); + + render(); + + fireEvent.keyDown(screen.getByRole("button"), { key: "Enter" }); + expect(onSelect).toHaveBeenCalledWith(trace.trace_id, trace); + }); + + it("applies selected styling when isSelected is true", () => { + const trace = createMockTrace(); + + render(); + + const button = screen.getByRole("button"); + expect(button).toHaveClass("bg-muted"); + }); + + it("shows success indicator for ok status", () => { + const trace = createMockTrace({ status: "ok" }); + + render(); + + expect(screen.getByText("ok")).toBeInTheDocument(); + }); + + it("shows error indicator for error status", () => { + const trace = createMockTrace({ status: "error" }); + + render(); + + // Should show the status badge + expect(screen.getByText("ERROR")).toBeInTheDocument(); + }); + + it("renders duration formatted correctly", () => { + const trace = createMockTrace({ + start_timestamp: 1000, + timestamp: 2500, // 1.5 second duration + }); + + render(); + + expect(screen.getByText("1.5s")).toBeInTheDocument(); + }); + + it("renders duration in milliseconds for short spans", () => { + const trace = createMockTrace({ + start_timestamp: 1000, + timestamp: 1500, // 500ms duration + }); + + render(); + + expect(screen.getByText("500ms")).toBeInTheDocument(); + }); + + it("applies custom className", () => { + const trace = createMockTrace(); + + render(); + + const button = screen.getByRole("button"); + expect(button).toHaveClass("custom-class"); + }); + + it("renders without method badge when method is not provided", () => { + const trace = createMockTrace({ + rootTransactionMethod: undefined, + }); + + render(); + + expect(screen.queryByText("GET")).not.toBeInTheDocument(); + expect(screen.queryByText("POST")).not.toBeInTheDocument(); + }); + + it("renders without environment badge when environment is not provided", () => { + const trace = createMockTrace({ + environment: undefined, + }); + + render(); + + // Only the trace ID and transaction name should be present, not environment badge + expect(screen.getByText("abc123de")).toBeInTheDocument(); + expect(screen.queryByText("production")).not.toBeInTheDocument(); + expect(screen.queryByText("development")).not.toBeInTheDocument(); + }); +}); diff --git a/packages/spotlight/registry/spotlight/components/span-item.tsx b/packages/spotlight/registry/spotlight/components/span-item.tsx new file mode 100644 index 000000000..91ab69435 --- /dev/null +++ b/packages/spotlight/registry/spotlight/components/span-item.tsx @@ -0,0 +1,169 @@ +"use client"; + +import { SpanResizer } from "@/registry/spotlight/components/span-resizer"; +import { SpanTree } from "@/registry/spotlight/components/span-tree"; +import { formatDuration, getDurationClassName } from "@/registry/spotlight/lib/duration"; +import type { SpanData, SpanItemProps } from "@/registry/spotlight/lib/types"; +import { cn } from "@/registry/spotlight/lib/utils"; +import { ChevronDown } from "lucide-react"; +import { useRef, useState } from "react"; + +/** + * SpanItem renders a single span row in the waterfall visualization. + * It displays the span name, operation, and a timing bar showing duration + * relative to the total trace duration. + * + * Features: + * - Collapsible children with expand/collapse button + * - Resizable split between name and waterfall columns + * - Highlight support for search results + * - Click selection with callback + * + * @example + * setSelectedSpan(span)} + * spanNodeWidth={50} + * onNodeWidthChange={setNodeWidth} + * /> + */ +export function SpanItem({ + span, + startTimestamp, + totalDuration, + depth = 1, + selectedSpanId, + highlightedSpanIds, + onSpanSelect, + spanNodeWidth, + onNodeWidthChange, +}: SpanItemProps) { + const containerRef = useRef(null); + const childrenCount = span.children?.length ?? 0; + + // Auto-collapse based on depth or child count + const [isCollapsed, setIsCollapsed] = useState(depth >= 10 || childrenCount > 10); + const [isResizing, setIsResizing] = useState(false); + + const spanDuration = span.timestamp - span.start_timestamp; + const isSelected = selectedSpanId === span.span_id; + const isHighlighted = highlightedSpanIds?.has(span.span_id); + const hasError = span.status && span.status !== "ok"; + + const handleResize = (e: MouseEvent) => { + if (containerRef.current && onNodeWidthChange) { + const rect = containerRef.current.getBoundingClientRect(); + const newWidth = ((e.clientX - rect.left) / rect.width) * 100; + // Clamp width between 20% and 80% + onNodeWidthChange(Math.min(Math.max(newWidth, 20), 80)); + } + }; + + const handleClick = () => { + onSpanSelect?.(span.span_id, span); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + handleClick(); + } + }; + + return ( +
  • +
    + {/* Span name column */} +
    + {/* Collapse/expand button for spans with children */} + {childrenCount > 0 && ( + + )} + + {/* Operation name */} + {span.op && ( + <> + {span.op} + + + )} + + {/* Span description or ID */} + + {span.description || span.span_id} + +
    + + {/* Waterfall column */} +
    + + + {/* Timing bar */} +
    + + {formatDuration(spanDuration)} + +
    +
    +
    + + {/* Render children recursively */} + {!isCollapsed && childrenCount > 0 && ( + + )} +
  • + ); +} + +export default SpanItem; diff --git a/packages/spotlight/registry/spotlight/components/span-resizer.tsx b/packages/spotlight/registry/spotlight/components/span-resizer.tsx new file mode 100644 index 000000000..f565b4853 --- /dev/null +++ b/packages/spotlight/registry/spotlight/components/span-resizer.tsx @@ -0,0 +1,56 @@ +"use client"; + +import type { SpanResizerProps } from "@/registry/spotlight/lib/types"; +import { cn } from "@/registry/spotlight/lib/utils"; +import { useRef, useState } from "react"; + +/** + * SpanResizer component provides a draggable handle for resizing + * the span name column width in the waterfall visualization. + * + * It displays a thin vertical line that becomes visible on hover + * and during drag operations. + */ +export function SpanResizer({ handleResize, isResizing, setIsResizing }: SpanResizerProps) { + const [isHovered, setIsHovered] = useState(false); + const lastUpdateRef = useRef(0); + + const onMouseDown = (e: React.MouseEvent) => { + e.preventDefault(); + setIsResizing(true); + + const onMouseMove = (e: MouseEvent) => { + const now = Date.now(); + // Throttle to ~60fps for smooth performance + if (now - lastUpdateRef.current < 16) return; + lastUpdateRef.current = now; + requestAnimationFrame(() => handleResize(e)); + }; + + const onMouseUp = () => { + setIsResizing(false); + document.removeEventListener("mousemove", onMouseMove); + document.removeEventListener("mouseup", onMouseUp); + }; + + document.addEventListener("mousemove", onMouseMove); + document.addEventListener("mouseup", onMouseUp); + }; + + return ( +
    setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + /> + ); +} + +export default SpanResizer; diff --git a/packages/spotlight/registry/spotlight/components/span-tree.tsx b/packages/spotlight/registry/spotlight/components/span-tree.tsx new file mode 100644 index 000000000..1c15c6cda --- /dev/null +++ b/packages/spotlight/registry/spotlight/components/span-tree.tsx @@ -0,0 +1,83 @@ +"use client"; + +import { SpanItem } from "@/registry/spotlight/components/span-item"; +import type { SpanTreeProps } from "@/registry/spotlight/lib/types"; +import { cn } from "@/registry/spotlight/lib/utils"; +import { useState } from "react"; + +/** + * SpanTree renders a hierarchical waterfall visualization for distributed trace spans. + * + * Features: + * - Hierarchical display of parent-child span relationships + * - Resizable split between span name and waterfall timing columns + * - Timing bars showing span duration relative to total trace + * - Collapsible nodes for deep traces + * - Optional highlighting for search/filter results + * - Click selection with callback support + * + * @example + * ```tsx + * { + * console.log("Selected span:", span); + * setSelectedId(id); + * }} + * /> + * ``` + * + * @example With highlighting + * ```tsx + * const matchingSpanIds = new Set( + * spans.filter(s => s.op?.includes(searchQuery)).map(s => s.span_id) + * ); + * + * + * ``` + */ +export function SpanTree({ + spans, + traceStartTimestamp, + traceDuration, + selectedSpanId, + onSpanSelect, + highlightedSpanIds, + initialNodeWidth = 50, + className, +}: SpanTreeProps) { + const [spanNodeWidth, setSpanNodeWidth] = useState(initialNodeWidth); + + if (!spans || spans.length === 0) { + return null; + } + + return ( +
      1 && "deep", className)}> + {spans.map(span => ( + + ))} +
    + ); +} + +export default SpanTree; diff --git a/packages/spotlight/registry/spotlight/components/time-since.tsx b/packages/spotlight/registry/spotlight/components/time-since.tsx new file mode 100644 index 000000000..ef2d301bb --- /dev/null +++ b/packages/spotlight/registry/spotlight/components/time-since.tsx @@ -0,0 +1,54 @@ +"use client"; + +import type { TimeSinceProps } from "@/registry/spotlight/lib/types"; +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; +import { useEffect, useState } from "react"; + +// Extend dayjs with relative time plugin +dayjs.extend(relativeTime); + +/** + * TimeSince component displays a relative time string that automatically + * updates at a configurable interval. + * + * @example + * + * // Renders: "2 minutes ago" + * + * @example + * + * // Renders: "a few seconds ago" and updates every second + */ +export function TimeSince({ date, refreshInterval = 5000, ...props }: TimeSinceProps) { + const [value, setValue] = useState(() => (date ? dayjs(date).fromNow() : null)); + + useEffect(() => { + if (!date) { + setValue(null); + return; + } + + // Set initial value + setValue(dayjs(date).fromNow()); + + // Set up interval to refresh the relative time + const timer = setInterval(() => { + setValue(dayjs(date).fromNow()); + }, refreshInterval); + + return () => clearInterval(timer); + }, [date, refreshInterval]); + + if (!date || !value) return null; + + const dateTimeString = date instanceof Date ? date.toISOString() : String(date); + + return ( + + ); +} + +export default TimeSince; diff --git a/packages/spotlight/registry/spotlight/components/trace-badge.tsx b/packages/spotlight/registry/spotlight/components/trace-badge.tsx new file mode 100644 index 000000000..8ed27e725 --- /dev/null +++ b/packages/spotlight/registry/spotlight/components/trace-badge.tsx @@ -0,0 +1,92 @@ +"use client"; + +import type { TraceBadgeProps } from "@/registry/spotlight/lib/types"; +import { cn } from "@/registry/spotlight/lib/utils"; + +/** + * TraceBadge displays contextual badges for trace visualization. + * Supports different variants for status, HTTP method, and environment. + * + * @example + * + * + * + * + */ +export function TraceBadge({ variant, value, className }: TraceBadgeProps) { + if (!value) return null; + + const baseClasses = + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-medium transition-colors"; + + const variantClasses = { + status: getStatusClasses(value), + method: "border-transparent bg-muted text-foreground font-mono", + environment: "border-transparent bg-secondary text-secondary-foreground", + }; + + return ( + + {variant === "status" ? value.toUpperCase() : value} + + ); +} + +/** + * Returns appropriate classes based on status value. + */ +function getStatusClasses(status: string): string { + const normalizedStatus = status.toLowerCase(); + + if (normalizedStatus === "ok") { + return "border-green-500/30 bg-green-500/20 text-green-500"; + } + + if (normalizedStatus === "error" || normalizedStatus === "internal_error" || normalizedStatus === "cancelled") { + return "border-destructive/30 bg-destructive/20 text-destructive"; + } + + // Default/unknown status + return "border-muted-foreground/30 bg-muted text-muted-foreground"; +} + +/** + * StatusBadge is a convenience wrapper for status variant. + */ +export function StatusBadge({ + status, + className, +}: { + status: string; + className?: string; +}) { + return ; +} + +/** + * MethodBadge is a convenience wrapper for HTTP method variant. + */ +export function MethodBadge({ + method, + className, +}: { + method: string; + className?: string; +}) { + return ; +} + +/** + * EnvironmentBadge is a convenience wrapper for environment variant. + */ +export function EnvironmentBadge({ + environment, + className, +}: { + environment: string; + className?: string; +}) { + return ; +} + +export default TraceBadge; diff --git a/packages/spotlight/registry/spotlight/components/trace-item.tsx b/packages/spotlight/registry/spotlight/components/trace-item.tsx new file mode 100644 index 000000000..12990fcfd --- /dev/null +++ b/packages/spotlight/registry/spotlight/components/trace-item.tsx @@ -0,0 +1,118 @@ +"use client"; + +import { TimeSince } from "@/registry/spotlight/components/time-since"; +import { EnvironmentBadge, MethodBadge, StatusBadge } from "@/registry/spotlight/components/trace-badge"; +import { formatDuration } from "@/registry/spotlight/lib/duration"; +import type { TraceItemProps } from "@/registry/spotlight/lib/types"; +import { cn } from "@/registry/spotlight/lib/utils"; +import { truncateId } from "@/registry/spotlight/lib/utils"; +import { Activity, AlertCircle } from "lucide-react"; + +/** + * TraceItem renders a summary row for a single distributed trace. + * It displays the trace ID, timing, status, and transaction name. + * + * Features: + * - Status icon (Activity for ok, AlertCircle for errors) + * - Truncated trace ID with relative timestamp + * - Transaction method and name display + * - Duration and span count stats + * - Optional environment badge + * + * @example + * ```tsx + * { + * setSelectedTraceId(id); + * console.log("Selected trace:", trace); + * }} + * /> + * ``` + * + * @example In a list + * ```tsx + *
    + * {traces.map((trace) => ( + * + * ))} + *
    + * ``` + */ +export function TraceItem({ trace, isSelected = false, onSelect, className }: TraceItemProps) { + const handleClick = () => { + onSelect?.(trace.trace_id, trace); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + handleClick(); + } + }; + + const duration = formatDuration(trace.timestamp - trace.start_timestamp); + const spanCount = trace.spans.size; + const hasError = trace.status && trace.status !== "ok"; + const truncatedId = truncateId(trace.trace_id); + + return ( +
    + {/* Status Icon */} +
    + {hasError ? ( + + ) : ( + + )} +
    + + {/* Trace ID and Time */} +
    +
    + {truncatedId} + {trace.environment && } +
    + +
    + + {/* Transaction Name */} +
    +
    + {trace.rootTransactionMethod && } + + {trace.rootTransactionName} + +
    +
    + + {/* Stats */} +
    + {hasError ? : ok} + + {duration} + + {spanCount.toLocaleString()} spans +
    +
    + ); +} + +export default TraceItem; diff --git a/packages/spotlight/registry/spotlight/lib/__tests__/duration.test.ts b/packages/spotlight/registry/spotlight/lib/__tests__/duration.test.ts new file mode 100644 index 000000000..b1275f1aa --- /dev/null +++ b/packages/spotlight/registry/spotlight/lib/__tests__/duration.test.ts @@ -0,0 +1,135 @@ +import { describe, expect, it } from "vitest"; +import { DURATION_LABELS, formatDuration, formatNumber, formatSpanDuration, getDurationClassName } from "../duration"; + +describe("formatNumber", () => { + it("formats numbers with default 2 decimal places", () => { + expect(formatNumber(1.5)).toBe("1.5"); + expect(formatNumber(2.456)).toBe("2.46"); + expect(formatNumber(2.0)).toBe("2"); + expect(formatNumber(10.0)).toBe("10"); + }); + + it("formats numbers with custom decimal places", () => { + expect(formatNumber(2.456789, 3)).toBe("2.457"); + expect(formatNumber(2.0, 1)).toBe("2"); + expect(formatNumber(1.5, 0)).toBe("2"); // Rounded + }); + + it("removes trailing .00", () => { + expect(formatNumber(5.0)).toBe("5"); + expect(formatNumber(100.0)).toBe("100"); + }); +}); + +describe("formatDuration", () => { + it("formats milliseconds", () => { + expect(formatDuration(0)).toBe("0ms"); + expect(formatDuration(1)).toBe("1ms"); + expect(formatDuration(500)).toBe("500ms"); + expect(formatDuration(999)).toBe("999ms"); + }); + + it("formats seconds", () => { + expect(formatDuration(1000)).toBe("1s"); + expect(formatDuration(1500)).toBe("1.5s"); + expect(formatDuration(5000)).toBe("5s"); + expect(formatDuration(59999)).toBe("60s"); // Trailing zeros removed + }); + + it("formats minutes", () => { + expect(formatDuration(60000)).toBe("1min"); + expect(formatDuration(90000)).toBe("1.5min"); + expect(formatDuration(300000)).toBe("5min"); + }); + + it("formats hours", () => { + expect(formatDuration(3600000)).toBe("1hr"); + expect(formatDuration(5400000)).toBe("1.5hr"); + }); + + it("formats days", () => { + expect(formatDuration(86400000)).toBe("1d"); + expect(formatDuration(172800000)).toBe("2d"); + }); + + it("formats weeks", () => { + expect(formatDuration(604800000)).toBe("1wk"); + expect(formatDuration(1209600000)).toBe("2wk"); + }); + + it("formats months", () => { + expect(formatDuration(2629800000)).toBe("1mo"); + }); + + it("formats years", () => { + expect(formatDuration(31557600000)).toBe("1yr"); + expect(formatDuration(63115200000)).toBe("2yr"); + }); +}); + +describe("formatSpanDuration", () => { + it("calculates and formats span duration", () => { + expect( + formatSpanDuration({ + start_timestamp: 1000, + timestamp: 1500, + }), + ).toBe("500ms"); + }); + + it("handles zero duration", () => { + expect( + formatSpanDuration({ + start_timestamp: 1000, + timestamp: 1000, + }), + ).toBe("0ms"); + }); + + it("handles long durations", () => { + expect( + formatSpanDuration({ + start_timestamp: 0, + timestamp: 5000, + }), + ).toBe("5s"); + }); +}); + +describe("getDurationClassName", () => { + it("returns destructive for durations > 1000ms", () => { + expect(getDurationClassName(1001)).toBe("text-destructive"); + expect(getDurationClassName(5000)).toBe("text-destructive"); + expect(getDurationClassName(10000)).toBe("text-destructive"); + }); + + it("returns orange for durations > 500ms", () => { + expect(getDurationClassName(501)).toBe("text-orange-500"); + expect(getDurationClassName(750)).toBe("text-orange-500"); + expect(getDurationClassName(1000)).toBe("text-orange-500"); + }); + + it("returns yellow for durations > 100ms", () => { + expect(getDurationClassName(101)).toBe("text-yellow-500"); + expect(getDurationClassName(300)).toBe("text-yellow-500"); + expect(getDurationClassName(500)).toBe("text-yellow-500"); + }); + + it("returns muted-foreground for durations <= 100ms", () => { + expect(getDurationClassName(0)).toBe("text-muted-foreground"); + expect(getDurationClassName(50)).toBe("text-muted-foreground"); + expect(getDurationClassName(100)).toBe("text-muted-foreground"); + }); +}); + +describe("DURATION_LABELS", () => { + it("contains all expected time units", () => { + expect(DURATION_LABELS[31557600000]).toBe("yr"); + expect(DURATION_LABELS[2629800000]).toBe("mo"); + expect(DURATION_LABELS[604800000]).toBe("wk"); + expect(DURATION_LABELS[86400000]).toBe("d"); + expect(DURATION_LABELS[3600000]).toBe("hr"); + expect(DURATION_LABELS[60000]).toBe("min"); + expect(DURATION_LABELS[1000]).toBe("s"); + }); +}); diff --git a/packages/spotlight/registry/spotlight/lib/__tests__/utils.test.ts b/packages/spotlight/registry/spotlight/lib/__tests__/utils.test.ts new file mode 100644 index 000000000..5c1532a81 --- /dev/null +++ b/packages/spotlight/registry/spotlight/lib/__tests__/utils.test.ts @@ -0,0 +1,73 @@ +import { describe, expect, it } from "vitest"; +import { cn, truncateId } from "../utils"; + +describe("cn", () => { + it("merges class names", () => { + expect(cn("foo", "bar")).toBe("foo bar"); + }); + + it("handles conditional classes", () => { + expect(cn("foo", true && "bar")).toBe("foo bar"); + expect(cn("foo", false && "bar")).toBe("foo"); + }); + + it("handles undefined and null", () => { + expect(cn("foo", undefined, "bar")).toBe("foo bar"); + expect(cn("foo", null, "bar")).toBe("foo bar"); + }); + + it("handles arrays", () => { + expect(cn(["foo", "bar"])).toBe("foo bar"); + }); + + it("handles objects", () => { + expect(cn({ foo: true, bar: false, baz: true })).toBe("foo baz"); + }); + + it("merges Tailwind classes correctly", () => { + // tailwind-merge should dedupe conflicting classes + expect(cn("px-2", "px-4")).toBe("px-4"); + expect(cn("bg-red-500", "bg-blue-500")).toBe("bg-blue-500"); + }); + + it("preserves non-conflicting classes", () => { + expect(cn("px-2", "py-4")).toBe("px-2 py-4"); + expect(cn("text-red-500", "bg-blue-500")).toBe("text-red-500 bg-blue-500"); + }); + + it("handles empty inputs", () => { + expect(cn()).toBe(""); + expect(cn("")).toBe(""); + expect(cn("", "")).toBe(""); + }); +}); + +describe("truncateId", () => { + it("truncates long IDs to 8 characters by default", () => { + expect(truncateId("abc123def456ghi789")).toBe("abc123de"); + }); + + it("truncates to custom length", () => { + expect(truncateId("abc123def456ghi789", 4)).toBe("abc1"); + expect(truncateId("abc123def456ghi789", 12)).toBe("abc123def456"); + }); + + it("returns full string if shorter than length", () => { + expect(truncateId("abc")).toBe("abc"); + expect(truncateId("abcde", 10)).toBe("abcde"); + }); + + it("handles empty string", () => { + expect(truncateId("")).toBe(""); + }); + + it("handles undefined with default value", () => { + expect(truncateId(undefined)).toBe(""); + expect(truncateId()).toBe(""); + }); + + it("handles exact length strings", () => { + expect(truncateId("abcdefgh")).toBe("abcdefgh"); + expect(truncateId("abcd", 4)).toBe("abcd"); + }); +}); diff --git a/packages/spotlight/registry/spotlight/lib/duration.ts b/packages/spotlight/registry/spotlight/lib/duration.ts new file mode 100644 index 000000000..edd44633b --- /dev/null +++ b/packages/spotlight/registry/spotlight/lib/duration.ts @@ -0,0 +1,99 @@ +/** + * Duration formatting utilities for trace visualization. + * Converts millisecond durations to human-readable strings. + */ + +/** + * Labels for duration units, keyed by millisecond thresholds. + */ +export const DURATION_LABELS: Record = { + 31557600000: "yr", + 2629800000: "mo", + 604800000: "wk", + 86400000: "d", + 3600000: "hr", + 60000: "min", + 1000: "s", +}; + +/** + * Sorted duration thresholds from largest to smallest. + */ +const DURATIONS = Object.keys(DURATION_LABELS) + .map(Number) + .sort((a, b) => b - a); + +/** + * Returns a Tailwind class name for coloring duration text based on thresholds. + * Uses shadcn-compatible color tokens. + * + * @param duration - Duration in milliseconds + * @returns Tailwind class name for text color + * + * @example + * getDurationClassName(1500) // "text-destructive" (> 1s) + * getDurationClassName(600) // "text-orange-500" (> 500ms) + * getDurationClassName(150) // "text-yellow-500" (> 100ms) + * getDurationClassName(50) // "text-muted-foreground" (< 100ms) + */ +export function getDurationClassName(duration: number): string { + if (duration > 1000) return "text-destructive"; + if (duration > 500) return "text-orange-500"; + if (duration > 100) return "text-yellow-500"; + return "text-muted-foreground"; +} + +/** + * Formats a number with specified decimal places, removing trailing zeros. + * + * @param num - Number to format + * @param decimalPlaces - Number of decimal places (default: 2) + * @returns Formatted number string + * + * @example + * formatNumber(1.5, 2) // "1.5" + * formatNumber(2.0, 2) // "2" + * formatNumber(3.14159, 2) // "3.14" + */ +export function formatNumber(num: number, decimalPlaces = 2): string { + return num.toFixed(decimalPlaces).replace(/\.?0+$/, ""); +} + +/** + * Formats a duration in milliseconds to a human-readable string. + * Automatically selects the most appropriate unit. + * + * @param duration - Duration in milliseconds + * @returns Formatted duration string with unit + * + * @example + * formatDuration(500) // "500ms" + * formatDuration(1500) // "1.5s" + * formatDuration(65000) // "1.08min" + * formatDuration(3700000) // "1.03hr" + */ +export function formatDuration(duration: number): string { + for (const limit of DURATIONS) { + if (duration >= limit) { + const num = formatNumber(duration / limit); + return `${num}${DURATION_LABELS[limit]}`; + } + } + return `${formatNumber(duration)}ms`; +} + +/** + * Calculates and formats the duration of a span. + * + * @param span - Object with start_timestamp and timestamp properties + * @returns Formatted duration string + * + * @example + * formatSpanDuration({ start_timestamp: 1000, timestamp: 1500 }) // "500ms" + */ +export function formatSpanDuration(span: { + timestamp: number; + start_timestamp: number; +}): string { + return formatDuration(span.timestamp - span.start_timestamp); +} diff --git a/packages/spotlight/registry/spotlight/lib/types.ts b/packages/spotlight/registry/spotlight/lib/types.ts new file mode 100644 index 000000000..5418fbf5d --- /dev/null +++ b/packages/spotlight/registry/spotlight/lib/types.ts @@ -0,0 +1,163 @@ +/** + * Generic span interface compatible with OpenTelemetry trace data. + * This represents a single unit of work within a distributed trace. + */ +export interface SpanData { + /** Unique identifier for this span */ + span_id: string; + /** Trace ID this span belongs to */ + trace_id?: string; + /** Parent span ID, null for root spans */ + parent_span_id?: string | null; + /** Operation name (e.g., "http.request", "db.query") */ + op?: string | null; + /** Human-readable description of the span */ + description?: string | null; + /** Start time as Unix timestamp in milliseconds */ + start_timestamp: number; + /** End time as Unix timestamp in milliseconds */ + timestamp: number; + /** Span status ("ok", "error", or custom string) */ + status?: "ok" | "error" | string; + /** Child spans */ + children?: SpanData[]; + /** Additional span attributes/data */ + data?: Record; + /** Key-value tags for filtering and categorization */ + tags?: Record; +} + +/** + * Generic trace interface representing a complete distributed trace. + * Contains all spans and metadata for a single trace. + */ +export interface TraceData { + /** Unique trace identifier */ + trace_id: string; + /** Start time of the trace (earliest span start) */ + start_timestamp: number; + /** End time of the trace (latest span end) */ + timestamp: number; + /** Overall trace status */ + status?: "ok" | "error" | string; + /** Map of span_id to SpanData for quick lookups */ + spans: Map; + /** Hierarchical tree of spans with children populated */ + spanTree: SpanData[]; + /** Name of the root transaction/operation */ + rootTransactionName: string; + /** HTTP method if applicable (GET, POST, etc.) */ + rootTransactionMethod?: string; + /** Number of transactions in this trace */ + transactionCount?: number; + /** Total number of spans */ + spanCount?: number; + /** Platform identifier (e.g., "javascript", "python") */ + platform?: string; + /** Environment (e.g., "production", "development") */ + environment?: string; +} + +/** + * Props for the SpanTree component. + * Renders a hierarchical waterfall visualization of spans. + */ +export interface SpanTreeProps { + /** Array of root spans (with children populated) */ + spans: SpanData[]; + /** Start timestamp of the entire trace (for waterfall positioning) */ + traceStartTimestamp: number; + /** Total duration of the trace in milliseconds */ + traceDuration: number; + /** Currently selected span ID */ + selectedSpanId?: string; + /** Callback when a span is clicked */ + onSpanSelect?: (spanId: string, span: SpanData) => void; + /** Optional: Set of span IDs to highlight (e.g., search results) */ + highlightedSpanIds?: Set; + /** Initial width percentage of the span name column (default: 50) */ + initialNodeWidth?: number; + /** Custom class name for the root element */ + className?: string; +} + +/** + * Props for individual SpanItem component. + * Renders a single span row with timing bar and children. + */ +export interface SpanItemProps { + /** The span data to render */ + span: SpanData; + /** Start timestamp of the entire trace */ + startTimestamp: number; + /** Total duration of the trace in milliseconds */ + totalDuration: number; + /** Current nesting depth (used for auto-collapse) */ + depth?: number; + /** Currently selected span ID */ + selectedSpanId?: string; + /** Set of span IDs to highlight */ + highlightedSpanIds?: Set; + /** Callback when this span is clicked */ + onSpanSelect?: (spanId: string, span: SpanData) => void; + /** Current width of the span name column (percentage) */ + spanNodeWidth: number; + /** Callback to update the span name column width */ + onNodeWidthChange?: (width: number) => void; +} + +/** + * Props for the TraceItem component. + * Renders a summary row for a single trace. + */ +export interface TraceItemProps { + /** The trace data to render */ + trace: TraceData; + /** Whether this trace is currently selected */ + isSelected?: boolean; + /** Callback when trace is clicked */ + onSelect?: (traceId: string, trace: TraceData) => void; + /** Custom class name */ + className?: string; +} + +/** + * Props for the TimeSince component. + * Displays relative time (e.g., "2 minutes ago"). + */ +export interface TimeSinceProps extends React.HTMLAttributes { + /** The date/timestamp to show relative time for */ + date: string | number | Date; + /** How often to refresh the display in milliseconds (default: 5000) */ + refreshInterval?: number; +} + +/** + * Props for the SpanResizer component. + * Handles draggable resize of the span name column. + */ +export interface SpanResizerProps { + /** Callback during resize with mouse event */ + handleResize: (e: MouseEvent) => void; + /** Whether currently resizing */ + isResizing: boolean; + /** Callback to set resizing state */ + setIsResizing: (val: boolean) => void; +} + +/** + * Variant types for trace badges. + */ +export type TraceBadgeVariant = "status" | "method" | "environment"; + +/** + * Props for TraceBadge component. + */ +export interface TraceBadgeProps { + /** The badge variant */ + variant: TraceBadgeVariant; + /** The value to display */ + value: string; + /** Custom class name */ + className?: string; +} diff --git a/packages/spotlight/registry/spotlight/lib/utils.ts b/packages/spotlight/registry/spotlight/lib/utils.ts new file mode 100644 index 000000000..8d4a644a6 --- /dev/null +++ b/packages/spotlight/registry/spotlight/lib/utils.ts @@ -0,0 +1,33 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +/** + * Utility function to merge Tailwind CSS classes with conditional support. + * Combines clsx for conditional classes and tailwind-merge for deduplication. + * + * @param inputs - Class values to merge (strings, objects, arrays) + * @returns Merged class string + * + * @example + * cn("px-4 py-2", isActive && "bg-primary", "hover:bg-muted") + * // Returns: "px-4 py-2 bg-primary hover:bg-muted" (if isActive is true) + */ +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +/** + * Truncates an ID string to a specified length. + * Useful for displaying shortened trace/span IDs. + * + * @param id - The ID string to truncate + * @param length - Maximum length (default: 8) + * @returns Truncated ID string + * + * @example + * truncateId("abc123def456ghi789") // "abc123de" + * truncateId("abc123def456ghi789", 4) // "abc1" + */ +export function truncateId(id = "", length = 8): string { + return id.substring(0, length); +} diff --git a/packages/spotlight/src/sentry-config.ts b/packages/spotlight/src/sentry-config.ts index 7f2db93cd..f9c07863a 100644 --- a/packages/spotlight/src/sentry-config.ts +++ b/packages/spotlight/src/sentry-config.ts @@ -3,8 +3,7 @@ const isCI = process.env.CI === "true" || process.env.GITHUB_ACTIONS === "true"; // Use build-time injected version for fossilized binaries, fallback to env var for npm/npx runs declare const __SPOTLIGHT_VERSION__: string | undefined; -const version = - typeof __SPOTLIGHT_VERSION__ !== "undefined" ? __SPOTLIGHT_VERSION__ : process.env.npm_package_version; +const version = typeof __SPOTLIGHT_VERSION__ !== "undefined" ? __SPOTLIGHT_VERSION__ : process.env.npm_package_version; export const sentryBaseConfig = { enabled: Boolean(process.env.NODE_ENV) && process.env.NODE_ENV !== "development", diff --git a/packages/spotlight/src/server/cli/server.ts b/packages/spotlight/src/server/cli/server.ts index b6736dbae..1bfb92e62 100644 --- a/packages/spotlight/src/server/cli/server.ts +++ b/packages/spotlight/src/server/cli/server.ts @@ -1,6 +1,6 @@ import type { AddressInfo } from "node:net"; -import { PortInUseError, setupSpotlight } from "../main.ts"; import { logger } from "../logger.ts"; +import { PortInUseError, setupSpotlight } from "../main.ts"; import type { CLIHandlerOptions, Command, CommandMeta } from "../types/cli.ts"; import { openInBrowser } from "../utils/extras.ts"; diff --git a/packages/spotlight/src/ui/telemetry/components/insights/webVitals/WebVitalsDetail.tsx b/packages/spotlight/src/ui/telemetry/components/insights/webVitals/WebVitalsDetail.tsx index 230f5c7cb..a6a6b8f05 100644 --- a/packages/spotlight/src/ui/telemetry/components/insights/webVitals/WebVitalsDetail.tsx +++ b/packages/spotlight/src/ui/telemetry/components/insights/webVitals/WebVitalsDetail.tsx @@ -14,7 +14,7 @@ import PerformanceChart from "./PerformanceChart"; const WebVitalsDetail = () => { const events = useSentryEvents(); const { page } = useParams(); - + let measurementEvent: SentryEventWithPerformanceData | undefined; for (const event of events) { if (event.event_id === page && event.measurements && event?.contexts?.trace?.op === "pageload") { diff --git a/packages/spotlight/vite.config.base.ts b/packages/spotlight/vite.config.base.ts index 05d01c4ee..10cd62b07 100644 --- a/packages/spotlight/vite.config.base.ts +++ b/packages/spotlight/vite.config.base.ts @@ -8,6 +8,7 @@ export const aliases = { "@spotlight/ui": resolve(__dirname, "src/ui"), "@spotlight/server": resolve(__dirname, "src/server"), "@spotlight/shared": resolve(__dirname, "src/shared"), + "@/registry": resolve(__dirname, "registry"), }; export const defineProduction = { diff --git a/packages/spotlight/vite.electron.config.ts b/packages/spotlight/vite.electron.config.ts index da02153db..11689c2cb 100644 --- a/packages/spotlight/vite.electron.config.ts +++ b/packages/spotlight/vite.electron.config.ts @@ -2,13 +2,7 @@ import { sentryVitePlugin } from "@sentry/vite-plugin"; import sourcemaps from "rollup-plugin-sourcemaps2"; import { defineConfig } from "vite"; import electron from "vite-plugin-electron/simple"; -import { - aliases, - defineDevelopment, - defineProduction, - reactPlugins, - sentryPluginOptions, -} from "./vite.config.base"; +import { aliases, defineDevelopment, defineProduction, reactPlugins, sentryPluginOptions } from "./vite.config.base"; export default defineConfig(({ mode }) => { const isDev = mode === "development"; diff --git a/packages/spotlight/vitest.config.ts b/packages/spotlight/vitest.config.ts index 4985237d2..7fbb89297 100644 --- a/packages/spotlight/vitest.config.ts +++ b/packages/spotlight/vitest.config.ts @@ -15,7 +15,10 @@ export default defineConfig({ reporter: ["json"], }, globals: true, - include: ["./src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], + include: [ + "./src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}", + "./registry/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}", + ], exclude: [ "**/node_modules/**", "**/dist/**", diff --git a/packages/website/astro.config.mjs b/packages/website/astro.config.mjs index 097dbe29a..c89f8f026 100644 --- a/packages/website/astro.config.mjs +++ b/packages/website/astro.config.mjs @@ -113,6 +113,12 @@ export default defineConfig({ directory: "docs/sdk", }, }, + { + label: "Component Registry", + autogenerate: { + directory: "docs/registry", + }, + }, { label: "Contribute", autogenerate: { diff --git a/packages/website/public/r/.gitkeep b/packages/website/public/r/.gitkeep new file mode 100644 index 000000000..cbe74c332 --- /dev/null +++ b/packages/website/public/r/.gitkeep @@ -0,0 +1,3 @@ +# This directory contains the shadcn registry JSON files. +# Files are generated by `pnpm registry:build` in packages/spotlight. +# Do not manually edit files in this directory. diff --git a/packages/website/src/content/docs/docs/registry/index.mdx b/packages/website/src/content/docs/docs/registry/index.mdx new file mode 100644 index 000000000..0f2f744c3 --- /dev/null +++ b/packages/website/src/content/docs/docs/registry/index.mdx @@ -0,0 +1,158 @@ +--- +title: Component Registry +description: Install Spotlight's trace visualization components in your project using shadcn CLI. +--- + +Spotlight provides a [shadcn/ui](https://ui.shadcn.com/) compatible component registry for trace visualization components. These components can be installed in any React project using the shadcn CLI. + +## Overview + +The Spotlight component registry includes: + +- **SpanTree** - A hierarchical waterfall visualization for distributed trace spans +- **TraceItem** - A trace summary row component for displaying trace metadata + +These components are designed to be: + +- **Framework agnostic** - Works with Next.js, Vite, Remix, and any React setup +- **Customizable** - Uses shadcn's design tokens for easy theming +- **Lightweight** - Minimal dependencies (dayjs, lucide-react) +- **Type-safe** - Full TypeScript support with exported types + +## Prerequisites + +Before installing components from this registry, ensure your project has: + +1. **shadcn/ui initialized** - Run `pnpm dlx shadcn@latest init` if not already set up +2. **Required dependencies** - The CLI will automatically install these + +## Installation + +Install components using the shadcn CLI: + +```bash +# Install SpanTree (includes SpanItem, SpanResizer) +pnpm dlx shadcn@latest add https://spotlightjs.com/r/span-tree.json + +# Install TraceItem (includes TimeSince, TraceBadge) +pnpm dlx shadcn@latest add https://spotlightjs.com/r/trace-item.json +``` + +## Quick Start + +After installation, import and use the components: + +```tsx +import { SpanTree } from "@/components/span-tree"; +import { TraceItem } from "@/components/trace-item"; +import type { TraceData } from "@/lib/types"; + +function TracePage({ traces }: { traces: TraceData[] }) { + const [selectedTraceId, setSelectedTraceId] = useState(); + const [selectedSpanId, setSelectedSpanId] = useState(); + + const selectedTrace = traces.find(t => t.trace_id === selectedTraceId); + + return ( +
    + {/* Trace list */} +
    + {traces.map((trace) => ( + { + setSelectedTraceId(id); + setSelectedSpanId(undefined); + }} + /> + ))} +
    + + {/* Span tree for selected trace */} + {selectedTrace && ( + setSelectedSpanId(id)} + /> + )} +
    + ); +} +``` + +## Data Format + +The components expect trace data in a specific format. Here's the TypeScript interface: + +```typescript +interface SpanData { + span_id: string; + trace_id?: string; + parent_span_id?: string | null; + op?: string | null; + description?: string | null; + start_timestamp: number; // Unix timestamp in ms + timestamp: number; // End timestamp in ms + status?: "ok" | "error" | string; + children?: SpanData[]; + data?: Record; + tags?: Record; +} + +interface TraceData { + trace_id: string; + start_timestamp: number; + timestamp: number; + status?: "ok" | "error" | string; + spans: Map; + spanTree: SpanData[]; + rootTransactionName: string; + rootTransactionMethod?: string; + transactionCount?: number; + spanCount?: number; + platform?: string; + environment?: string; +} +``` + +## Converting from OpenTelemetry + +If you're using OpenTelemetry, you can convert spans to this format: + +```typescript +function convertOtelSpan(otelSpan: OtelSpan): SpanData { + return { + span_id: otelSpan.spanContext().spanId, + trace_id: otelSpan.spanContext().traceId, + parent_span_id: otelSpan.parentSpanId, + op: otelSpan.name, + description: otelSpan.attributes?.['description'] as string, + start_timestamp: otelSpan.startTime[0] * 1000 + otelSpan.startTime[1] / 1e6, + timestamp: otelSpan.endTime[0] * 1000 + otelSpan.endTime[1] / 1e6, + status: otelSpan.status.code === 1 ? "ok" : "error", + data: otelSpan.attributes, + }; +} +``` + +## Theming + +Components use shadcn's CSS variables for styling, making them automatically compatible with your theme: + +- `--background` / `--foreground` - Base colors +- `--muted` / `--muted-foreground` - Secondary colors +- `--primary` - Accent color for highlights +- `--destructive` - Error states +- `--border` - Tree connector lines + +To customize the waterfall bar colors or timing thresholds, you can modify the `duration.ts` utility after installation. + +## Next Steps + +- [SpanTree Component](/docs/registry/span-tree) - Detailed API reference +- [TraceItem Component](/docs/registry/trace-item) - Detailed API reference diff --git a/packages/website/src/content/docs/docs/registry/span-tree.mdx b/packages/website/src/content/docs/docs/registry/span-tree.mdx new file mode 100644 index 000000000..5c4c8adfe --- /dev/null +++ b/packages/website/src/content/docs/docs/registry/span-tree.mdx @@ -0,0 +1,268 @@ +--- +title: SpanTree Component +description: A hierarchical waterfall visualization for distributed trace spans. +--- + +The SpanTree component renders a hierarchical waterfall visualization for distributed trace spans. It displays spans with timing bars, collapsible children, and a resizable layout. + +## Installation + +```bash +pnpm dlx shadcn@latest add https://spotlightjs.com/r/span-tree.json +``` + +This installs: +- `span-tree.tsx` - Main tree component +- `span-item.tsx` - Individual span row component +- `span-resizer.tsx` - Column resize handle +- `types.ts` - TypeScript type definitions +- `duration.ts` - Duration formatting utilities +- `utils.ts` - Utility functions (cn, truncateId) + +## Basic Usage + +```tsx +import { SpanTree } from "@/components/span-tree"; + +function TraceView({ trace }) { + const [selectedSpanId, setSelectedSpanId] = useState(); + + return ( + { + setSelectedSpanId(id); + console.log("Selected span:", span); + }} + /> + ); +} +``` + +## Props + +### SpanTree Props + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `spans` | `SpanData[]` | required | Array of root spans with children populated | +| `traceStartTimestamp` | `number` | required | Start timestamp of the trace (for positioning) | +| `traceDuration` | `number` | required | Total duration in milliseconds | +| `selectedSpanId` | `string` | - | Currently selected span ID | +| `onSpanSelect` | `(id: string, span: SpanData) => void` | - | Callback when span is clicked | +| `highlightedSpanIds` | `Set` | - | Span IDs to highlight (e.g., search results) | +| `initialNodeWidth` | `number` | `50` | Initial width of name column (percentage) | +| `className` | `string` | - | Additional CSS classes | + +### SpanData Interface + +```typescript +interface SpanData { + span_id: string; + trace_id?: string; + parent_span_id?: string | null; + op?: string | null; + description?: string | null; + start_timestamp: number; + timestamp: number; + status?: "ok" | "error" | string; + children?: SpanData[]; + data?: Record; + tags?: Record; +} +``` + +## Features + +### Collapsible Children + +Spans with children display a collapse/expand button. The tree auto-collapses: +- Spans at depth >= 10 +- Spans with more than 10 children + +```tsx +// Children are automatically rendered when collapsed state changes + +``` + +### Resizable Columns + +Users can drag the divider between the span name column and the waterfall to resize: + +```tsx + +``` + +### Highlighting + +Highlight specific spans (useful for search): + +```tsx +const searchResults = useMemo(() => { + const matchingIds = new Set(); + const findMatches = (spans: SpanData[]) => { + for (const span of spans) { + if (span.op?.includes(query) || span.description?.includes(query)) { + matchingIds.add(span.span_id); + } + if (span.children) findMatches(span.children); + } + }; + findMatches(trace.spanTree); + return matchingIds; +}, [trace, query]); + + +``` + +### Duration Color Coding + +Span durations are color-coded based on thresholds: + +| Duration | Color | CSS Class | +|----------|-------|-----------| +| > 1000ms | Red | `text-destructive` | +| > 500ms | Orange | `text-orange-500` | +| > 100ms | Yellow | `text-yellow-500` | +| < 100ms | Gray | `text-muted-foreground` | + +To customize these thresholds, modify `duration.ts` after installation. + +## Styling + +The component uses these CSS variables: + +```css +/* Tree connector lines */ +.span-tree.deep > li { + border-left: 1px solid hsl(var(--border)); +} + +/* Selected state */ +.span-item.selected { + background: hsl(var(--muted)); +} + +/* Highlighted state (search results) */ +.span-item.highlighted { + background: hsl(var(--primary) / 0.1); +} +``` + +### Custom Styling + +```tsx + +``` + +## Building Span Trees + +The component expects spans with `children` already populated. Here's a utility to build the tree: + +```typescript +function buildSpanTree(spans: SpanData[]): SpanData[] { + const spanMap = new Map(spans.map(s => [s.span_id, { ...s, children: [] }])); + const roots: SpanData[] = []; + + for (const span of spanMap.values()) { + if (span.parent_span_id && spanMap.has(span.parent_span_id)) { + spanMap.get(span.parent_span_id)!.children!.push(span); + } else { + roots.push(span); + } + } + + // Sort children by start time + const sortChildren = (span: SpanData) => { + span.children?.sort((a, b) => a.start_timestamp - b.start_timestamp); + span.children?.forEach(sortChildren); + }; + roots.forEach(sortChildren); + roots.sort((a, b) => a.start_timestamp - b.start_timestamp); + + return roots; +} +``` + +## Examples + +### With Span Details Panel + +```tsx +function TraceViewer({ trace }) { + const [selectedSpan, setSelectedSpan] = useState(); + + return ( +
    +
    + setSelectedSpan(span)} + /> +
    + {selectedSpan && ( +
    +

    {selectedSpan.op}

    +

    + {selectedSpan.description} +

    +
    +            {JSON.stringify(selectedSpan.data, null, 2)}
    +          
    +
    + )} +
    + ); +} +``` + +### Filtered View + +```tsx +function FilteredSpanTree({ trace, filter }) { + const filteredSpans = useMemo(() => { + const filterSpans = (spans: SpanData[]): SpanData[] => { + return spans + .filter(span => !filter || span.op?.includes(filter)) + .map(span => ({ + ...span, + children: span.children ? filterSpans(span.children) : undefined, + })); + }; + return filterSpans(trace.spanTree); + }, [trace, filter]); + + return ( + + ); +} +``` diff --git a/packages/website/src/content/docs/docs/registry/trace-item.mdx b/packages/website/src/content/docs/docs/registry/trace-item.mdx new file mode 100644 index 000000000..4d1159375 --- /dev/null +++ b/packages/website/src/content/docs/docs/registry/trace-item.mdx @@ -0,0 +1,370 @@ +--- +title: TraceItem Component +description: A trace summary row component showing ID, duration, status, and transaction name. +--- + +The TraceItem component renders a summary row for a single distributed trace. It displays the trace ID, timing information, status, and transaction details in a compact, clickable format. + +## Installation + +```bash +pnpm dlx shadcn@latest add https://spotlightjs.com/r/trace-item.json +``` + +This installs: +- `trace-item.tsx` - Main trace row component +- `time-since.tsx` - Relative time display component +- `trace-badge.tsx` - Status/method/environment badges +- `types.ts` - TypeScript type definitions +- `duration.ts` - Duration formatting utilities +- `utils.ts` - Utility functions + +## Basic Usage + +```tsx +import { TraceItem } from "@/components/trace-item"; + +function TraceList({ traces }) { + const [selectedId, setSelectedId] = useState(); + + return ( +
    + {traces.map((trace) => ( + setSelectedId(id)} + /> + ))} +
    + ); +} +``` + +## Props + +### TraceItem Props + +| Prop | Type | Default | Description | +|------|------|---------|-------------| +| `trace` | `TraceData` | required | The trace data to display | +| `isSelected` | `boolean` | `false` | Whether this trace is currently selected | +| `onSelect` | `(id: string, trace: TraceData) => void` | - | Callback when trace is clicked | +| `className` | `string` | - | Additional CSS classes | + +### TraceData Interface + +```typescript +interface TraceData { + trace_id: string; + start_timestamp: number; + timestamp: number; + status?: "ok" | "error" | string; + spans: Map; + spanTree: SpanData[]; + rootTransactionName: string; + rootTransactionMethod?: string; + transactionCount?: number; + spanCount?: number; + platform?: string; + environment?: string; +} +``` + +## Features + +### Status Indication + +The component shows different icons based on trace status: + +- **Activity icon** - For successful traces (`status: "ok"` or undefined) +- **AlertCircle icon** - For error traces (any other status) + +```tsx +// Error trace will show red alert icon +const errorTrace = { + ...trace, + status: "error" +}; + + +``` + +### Transaction Display + +Shows the HTTP method (if available) and transaction name: + +```tsx +const trace = { + trace_id: "abc123", + rootTransactionName: "/api/users/:id", + rootTransactionMethod: "GET", + // ... +}; + +// Renders: [GET] /api/users/:id + +``` + +### Environment Badge + +If the trace has an environment, it's displayed as a badge: + +```tsx +const trace = { + trace_id: "abc123", + environment: "production", + // ... +}; + +// Shows environment badge next to trace ID + +``` + +### Relative Time + +The timestamp is displayed as relative time (e.g., "2 minutes ago") and updates automatically every 5 seconds. + +## Styling + +The component uses shadcn design tokens: + +```css +/* Default state */ +.trace-item { + background: transparent; +} + +/* Hover state */ +.trace-item:hover { + background: hsl(var(--muted) / 0.5); +} + +/* Selected state */ +.trace-item.selected { + background: hsl(var(--muted)); +} + +/* Error status */ +.trace-item .status-error { + color: hsl(var(--destructive)); +} +``` + +### Custom Styling + +```tsx + +``` + +## Sub-Components + +### TimeSince + +Displays relative time that auto-updates: + +```tsx +import { TimeSince } from "@/components/time-since"; + + +``` + +### TraceBadge + +Status, method, and environment badges: + +```tsx +import { StatusBadge, MethodBadge, EnvironmentBadge } from "@/components/trace-badge"; + + // Green "OK" badge + // Red "ERROR" badge + // Neutral "POST" badge + // Secondary "dev" badge +``` + +## Examples + +### With Trace Details + +```tsx +function TraceViewer({ traces }) { + const [selectedTrace, setSelectedTrace] = useState(); + + return ( +
    + {/* Trace list */} +
    + {traces.map((trace) => ( + setSelectedTrace(trace)} + /> + ))} +
    + + {/* Trace details */} +
    + {selectedTrace ? ( + + ) : ( +
    + Select a trace to view details +
    + )} +
    +
    + ); +} +``` + +### Filtered List + +```tsx +function FilteredTraceList({ traces, statusFilter }) { + const filteredTraces = useMemo(() => { + if (!statusFilter) return traces; + return traces.filter(t => + statusFilter === "error" + ? t.status && t.status !== "ok" + : t.status === "ok" || !t.status + ); + }, [traces, statusFilter]); + + return ( +
    + {filteredTraces.length === 0 ? ( +
    + No traces match the filter +
    + ) : ( + filteredTraces.map((trace) => ( + + )) + )} +
    + ); +} +``` + +### With Virtualization + +For large lists, combine with a virtualization library: + +```tsx +import { useVirtualizer } from "@tanstack/react-virtual"; + +function VirtualizedTraceList({ traces }) { + const parentRef = useRef(null); + + const virtualizer = useVirtualizer({ + count: traces.length, + getScrollElement: () => parentRef.current, + estimateSize: () => 60, // Approximate row height + }); + + return ( +
    +
    + {virtualizer.getVirtualItems().map((virtualItem) => ( +
    + +
    + ))} +
    +
    + ); +} +``` + +### Custom Actions + +```tsx +function TraceListWithActions({ traces }) { + return ( +
    + {traces.map((trace) => ( +
    +
    + console.log("Selected:", id)} + /> +
    +
    + +
    +
    + ))} +
    + ); +} +``` + +## Building TraceData + +Convert your trace data to the expected format: + +```typescript +function buildTraceData(rawTrace: RawTrace): TraceData { + const spans = new Map(); + + for (const span of rawTrace.spans) { + spans.set(span.span_id, { + span_id: span.span_id, + trace_id: rawTrace.trace_id, + parent_span_id: span.parent_span_id, + op: span.name, + description: span.attributes?.description, + start_timestamp: span.start_time, + timestamp: span.end_time, + status: span.status, + data: span.attributes, + }); + } + + return { + trace_id: rawTrace.trace_id, + start_timestamp: Math.min(...rawTrace.spans.map(s => s.start_time)), + timestamp: Math.max(...rawTrace.spans.map(s => s.end_time)), + status: rawTrace.status, + spans, + spanTree: buildSpanTree(Array.from(spans.values())), + rootTransactionName: rawTrace.name || "Unknown", + rootTransactionMethod: rawTrace.method, + environment: rawTrace.environment, + }; +} +``` diff --git a/packages/website/vercel.json b/packages/website/vercel.json index b404aa281..4b4de1e6c 100644 --- a/packages/website/vercel.json +++ b/packages/website/vercel.json @@ -8,6 +8,27 @@ "value": "js-profiling" } ] + }, + { + "source": "/r/(.*).json", + "headers": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "Access-Control-Allow-Methods", + "value": "GET" + }, + { + "key": "Cache-Control", + "value": "public, max-age=3600" + } + ] } ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba4c16cf2..b09f8f242 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -272,6 +272,9 @@ importers: happy-dom: specifier: ^20.0.2 version: 20.0.2 + lucide-react: + specifier: ^0.468.0 + version: 0.468.0(react@18.3.1) magic-string: specifier: ^0.30.11 version: 0.30.21 @@ -296,6 +299,9 @@ importers: rollup-plugin-sourcemaps2: specifier: ^0.4.1 version: 0.4.4(@types/node@22.15.28)(rollup@4.53.3) + shadcn: + specifier: ^2.5.0 + version: 2.10.0(@types/node@22.15.28)(hono@4.11.4)(typescript@5.9.2) shiki: specifier: ^3.13.0 version: 3.13.0 @@ -415,6 +421,10 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + '@antfu/ni@23.3.1': + resolution: {integrity: sha512-C90iyzm/jLV7Lomv2UzwWUzRv9WZr1oRsFRKsX5HjQL4EXrbi9H/RtBkjCP+NF+ABZXUKpAa4F1dkoTaea4zHg==} + hasBin: true + '@antfu/utils@0.7.10': resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} @@ -511,10 +521,32 @@ packages: resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.6': + resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.1': resolution: {integrity: sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==} engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} @@ -525,10 +557,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.27.1': resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -559,6 +609,17 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} @@ -571,6 +632,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-typescript@7.28.6': + resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.27.1': resolution: {integrity: sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==} engines: {node: '>=6.9.0'} @@ -583,10 +650,18 @@ packages: resolution: {integrity: sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==} engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.27.1': resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.6': + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + engines: {node: '>=6.9.0'} + '@babel/types@7.28.4': resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} engines: {node: '>=6.9.0'} @@ -595,6 +670,10 @@ packages: resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1660,6 +1739,41 @@ packages: cpu: [x64] os: [win32] + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1738,6 +1852,10 @@ packages: '@cfworker/json-schema': optional: true + '@mswjs/interceptors@0.40.0': + resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} + engines: {node: '>=18'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1753,6 +1871,15 @@ packages: '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@opentelemetry/api-logs@0.208.0': resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==} engines: {node: '>=8.0.0'} @@ -2953,6 +3080,9 @@ packages: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} + '@ts-morph/common@0.19.0': + resolution: {integrity: sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==} + '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} @@ -3108,6 +3238,9 @@ packages: '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + '@types/tedious@4.0.14': resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} @@ -3449,6 +3582,10 @@ packages: assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -3558,6 +3695,9 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + bluebird-lst@1.0.9: resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} @@ -3616,6 +3756,9 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builder-util-runtime@9.2.4: resolution: {integrity: sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==} engines: {node: '>=12.0.0'} @@ -3739,10 +3882,18 @@ packages: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} @@ -3751,6 +3902,10 @@ packages: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -3758,6 +3913,10 @@ packages: clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clone@2.1.2: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} @@ -3766,6 +3925,9 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + code-block-writer@12.0.0: + resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} @@ -3964,6 +4126,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} @@ -4015,6 +4181,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + default-browser-id@3.0.0: resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} engines: {node: '>=12'} @@ -4023,6 +4193,9 @@ packages: resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} engines: {node: '>=14.16'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -4343,6 +4516,11 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -4491,6 +4669,10 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + fetch-event-stream@0.1.5: resolution: {integrity: sha512-V1PWovkspxQfssq/NnxoEyQo1DV+MRK/laPuPblIZmSjMN8P5u46OhlFQznSr9p/t0Sp8Uc6SbM3yCMfr0KU8g==} @@ -4544,6 +4726,10 @@ packages: resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + forwarded-parse@2.1.2: resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} @@ -4628,6 +4814,10 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -4718,6 +4908,10 @@ packages: graphemesplit@2.6.0: resolution: {integrity: sha512-rG9w2wAfkpg0DILa1pjnjNfucng3usON360shisqIMUBw/87pojcBSrHmeE4UwryAuBih7g8m1oilf5/u8EWdQ==} + graphql@16.12.0: + resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + h3@1.15.5: resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} @@ -4808,6 +5002,9 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -4859,6 +5056,10 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} + https-proxy-agent@6.2.1: + resolution: {integrity: sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA==} + engines: {node: '>= 14'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -5008,10 +5209,21 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} + is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -5026,6 +5238,10 @@ packages: is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -5034,6 +5250,10 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -5310,6 +5530,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -5345,6 +5569,11 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lucide-react@0.468.0: + resolution: {integrity: sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -5631,6 +5860,10 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} @@ -5662,6 +5895,11 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} + mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} @@ -5678,9 +5916,23 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msw@2.12.7: + resolution: {integrity: sha512-retd5i3xCZDVWMYjHEVuKTmhqY8lSsxujjVrZiGbbdoxxIBg5S7rCuYy/YQpfrTYIxpd/o0Kyb/3H+1udBMoYg==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + mylas@2.1.13: resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} engines: {node: '>=12.0.0'} @@ -5717,6 +5969,11 @@ packages: node-addon-api@1.7.2: resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} @@ -5729,6 +5986,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.2: resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} hasBin: true @@ -5832,6 +6093,13 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@6.3.1: + resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -6266,6 +6534,10 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + recma-build-jsx@1.0.0: resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} @@ -6374,6 +6646,10 @@ packages: responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -6401,6 +6677,9 @@ packages: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} + rettime@0.7.0: + resolution: {integrity: sha512-LPRKoHnLKd/r3dVxcwO7vhCW+orkOGj9ViueosEBK6ie89CijnfRlhaDhHq/3Hxu4CkWQtxwlBG0mzTQY6uQjw==} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -6496,6 +6775,10 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shadcn@2.10.0: + resolution: {integrity: sha512-/zxjmHGbaYVFtI6bUridFVV7VFStIv3vU/w1h7xenhz7KRzc9pqHsyFvcExZprG7dlA5kW9knRgv8+Cl/H7w9w==} + hasBin: true + sharp@0.33.5: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -6651,12 +6934,19 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + stream-replace-string@2.0.0: resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==} streamx@2.22.0: resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -6682,6 +6972,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -6690,6 +6984,10 @@ packages: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -6744,6 +7042,10 @@ packages: svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tailwind-merge@3.3.0: resolution: {integrity: sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ==} @@ -6789,6 +7091,9 @@ packages: tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + tiny-typed-emitter@2.1.0: resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} @@ -6819,6 +7124,13 @@ packages: resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} engines: {node: '>=12'} + tldts-core@7.0.19: + resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} + + tldts@7.0.19: + resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} + hasBin: true + tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} @@ -6838,6 +7150,10 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -6860,6 +7176,9 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-morph@18.0.0: + resolution: {integrity: sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==} + tsc-alias@1.8.16: resolution: {integrity: sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g==} engines: {node: '>=16.20.2'} @@ -6875,6 +7194,10 @@ packages: typescript: optional: true + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -6940,6 +7263,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.4.1: + resolution: {integrity: sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==} + engines: {node: '>=20'} + type-is@2.0.1: resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} engines: {node: '>= 0.6'} @@ -7104,6 +7431,9 @@ packages: uploadthing: optional: true + until-async@3.0.2: + resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} + untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} @@ -7357,9 +7687,16 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -7402,6 +7739,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -7487,6 +7828,10 @@ packages: resolution: {integrity: sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==} engines: {node: '>=18.19'} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + yoctocolors@2.1.2: resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} engines: {node: '>=18'} @@ -7549,6 +7894,8 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 + '@antfu/ni@23.3.1': {} + '@antfu/utils@0.7.10': {} '@apm-js-collab/code-transformer@0.8.2': {} @@ -7796,6 +8143,18 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 + '@babel/generator@7.28.6': + dependencies: + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.5 + '@babel/helper-compilation-targets@7.27.1': dependencies: '@babel/compat-data': 7.27.1 @@ -7804,6 +8163,28 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.27.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.6 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': + dependencies: + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.27.1 @@ -7820,8 +8201,30 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-optimise-call-expression@7.27.1': + dependencies: + '@babel/types': 7.28.5 + '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.28.6': {} + + '@babel/helper-replace-supers@7.28.6(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.27.1': {} @@ -7843,6 +8246,15 @@ snapshots: dependencies: '@babel/types': 7.28.5 + '@babel/parser@7.28.6': + dependencies: + '@babel/types': 7.28.6 + + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.1)': dependencies: '@babel/core': 7.27.1 @@ -7853,6 +8265,17 @@ snapshots: '@babel/core': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.27.1)': + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.1) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.27.1) + transitivePeerDependencies: + - supports-color + '@babel/runtime@7.27.1': {} '@babel/runtime@7.28.6': {} @@ -7863,6 +8286,12 @@ snapshots: '@babel/parser': 7.28.4 '@babel/types': 7.28.4 + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 + '@babel/traverse@7.27.1': dependencies: '@babel/code-frame': 7.27.1 @@ -7875,6 +8304,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.6': + dependencies: + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.6 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + '@babel/types@7.28.4': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -7885,6 +8326,11 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@7.28.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@bcoe/v8-coverage@0.2.3': {} '@biomejs/biome@1.9.4': @@ -8630,6 +9076,34 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@inquirer/ansi@1.0.2': {} + + '@inquirer/confirm@5.1.21(@types/node@22.15.28)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.15.28) + '@inquirer/type': 3.0.10(@types/node@22.15.28) + optionalDependencies: + '@types/node': 22.15.28 + + '@inquirer/core@10.3.2(@types/node@22.15.28)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.15.28) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.15.28 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/type@3.0.10(@types/node@22.15.28)': + optionalDependencies: + '@types/node': 22.15.28 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -8770,6 +9244,28 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} + '@modelcontextprotocol/sdk@1.25.2(hono@4.11.4)(zod@3.25.76)': + dependencies: + '@hono/node-server': 1.19.7(hono@4.11.4) + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.6 + express: 5.2.1 + express-rate-limit: 7.5.1(express@5.2.1) + jose: 6.1.3 + json-schema-typed: 8.0.2 + pkce-challenge: 5.0.1 + raw-body: 3.0.2 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - hono + - supports-color + '@modelcontextprotocol/sdk@1.25.2(hono@4.11.4)(zod@4.1.13)': dependencies: '@hono/node-server': 1.19.7(hono@4.11.4) @@ -8792,6 +9288,15 @@ snapshots: - hono - supports-color + '@mswjs/interceptors@0.40.0': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8806,6 +9311,15 @@ snapshots: '@one-ini/wasm@0.1.1': {} + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + + '@open-draft/until@2.1.0': {} + '@opentelemetry/api-logs@0.208.0': dependencies: '@opentelemetry/api': 1.9.0 @@ -10119,6 +10633,13 @@ snapshots: '@tootallnate/once@2.0.0': {} + '@ts-morph/common@0.19.0': + dependencies: + fast-glob: 3.3.2 + minimatch: 7.4.6 + mkdirp: 2.1.6 + path-browserify: 1.0.1 + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.8 @@ -10299,6 +10820,8 @@ snapshots: '@types/semver@7.7.1': {} + '@types/statuses@2.0.6': {} + '@types/tedious@4.0.14': dependencies: '@types/node': 24.10.1 @@ -10755,6 +11278,10 @@ snapshots: assertion-error@1.1.0: {} + ast-types@0.16.1: + dependencies: + tslib: 2.8.1 + astral-regex@2.0.0: optional: true @@ -10953,6 +11480,12 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + bl@5.1.0: + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + bluebird-lst@1.0.9: dependencies: bluebird: 3.7.2 @@ -11031,6 +11564,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builder-util-runtime@9.2.4: dependencies: debug: 4.4.3 @@ -11171,10 +11709,16 @@ snapshots: cli-boxes@3.0.0: {} + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} + cli-truncate@2.1.0: dependencies: slice-ansi: 3.0.0 @@ -11186,6 +11730,8 @@ snapshots: slice-ansi: 5.0.0 string-width: 7.2.0 + cli-width@4.1.0: {} + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -11196,10 +11742,14 @@ snapshots: dependencies: mimic-response: 1.0.1 + clone@1.0.4: {} + clone@2.1.2: {} clsx@2.1.1: {} + code-block-writer@12.0.0: {} + code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -11399,6 +11949,8 @@ snapshots: csstype@3.1.3: {} + data-uri-to-buffer@4.0.1: {} + dayjs@1.11.13: {} de-indent@1.0.2: {} @@ -11433,6 +11985,8 @@ snapshots: deep-is@0.1.4: {} + deepmerge@4.3.1: {} + default-browser-id@3.0.0: dependencies: bplist-parser: 0.2.0 @@ -11445,6 +11999,10 @@ snapshots: execa: 7.2.0 titleize: 3.0.0 + defaults@1.0.4: + dependencies: + clone: 1.0.4 + defer-to-connect@2.0.1: {} define-data-property@1.1.4: @@ -11912,6 +12470,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} + esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -12110,6 +12670,11 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + fetch-event-stream@0.1.5: {} file-entry-cache@6.0.1: @@ -12184,6 +12749,10 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + forwarded-parse@2.1.2: {} forwarded@0.2.0: {} @@ -12273,6 +12842,8 @@ snapshots: get-nonce@1.0.1: {} + get-own-enumerable-keys@1.0.0: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -12397,6 +12968,8 @@ snapshots: js-base64: 3.7.8 unicode-trie: 2.0.0 + graphql@16.12.0: {} + h3@1.15.5: dependencies: cookie-es: 1.2.2 @@ -12624,6 +13197,8 @@ snapshots: he@1.2.0: {} + headers-polyfill@4.0.3: {} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -12680,6 +13255,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@6.2.1: + dependencies: + agent-base: 7.1.3 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 @@ -12801,8 +13383,14 @@ snapshots: dependencies: is-docker: 3.0.0 + is-interactive@2.0.0: {} + + is-node-process@1.2.0: {} + is-number@7.0.0: {} + is-obj@3.0.0: {} + is-path-inside@3.0.3: {} is-plain-obj@4.1.0: {} @@ -12814,10 +13402,14 @@ snapshots: '@types/estree': 1.0.8 optional: true + is-regexp@3.1.0: {} + is-stream@2.0.1: {} is-stream@3.0.0: {} + is-unicode-supported@1.3.0: {} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -13061,6 +13653,11 @@ snapshots: lodash@4.17.21: {} + log-symbols@5.1.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + log-update@6.1.0: dependencies: ansi-escapes: 7.0.0 @@ -13100,6 +13697,10 @@ snapshots: dependencies: yallist: 4.0.0 + lucide-react@0.468.0(react@18.3.1): + dependencies: + react: 18.3.1 + lz-string@1.5.0: {} macho-unsign@2.0.6: {} @@ -13651,6 +14252,10 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimatch@7.4.6: + dependencies: + brace-expansion: 2.0.2 + minimatch@8.0.4: dependencies: brace-expansion: 2.0.2 @@ -13677,6 +14282,8 @@ snapshots: dependencies: minipass: 7.1.2 + mkdirp@2.1.6: {} + mlly@1.7.4: dependencies: acorn: 8.15.0 @@ -13692,8 +14299,35 @@ snapshots: ms@2.1.3: {} + msw@2.12.7(@types/node@22.15.28)(typescript@5.9.2): + dependencies: + '@inquirer/confirm': 5.1.21(@types/node@22.15.28) + '@mswjs/interceptors': 0.40.0 + '@open-draft/deferred-promise': 2.2.0 + '@types/statuses': 2.0.6 + cookie: 1.1.1 + graphql: 16.12.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + rettime: 0.7.0 + statuses: 2.0.2 + strict-event-emitter: 0.5.1 + tough-cookie: 6.0.0 + type-fest: 5.4.1 + until-async: 3.0.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - '@types/node' + muggle-string@0.4.1: {} + mute-stream@2.0.0: {} + mylas@2.1.13: {} nanoid@3.3.11: {} @@ -13725,12 +14359,20 @@ snapshots: node-addon-api@1.7.2: optional: true + node-domexception@1.0.0: {} + node-fetch-native@1.6.7: {} node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-gyp-build@4.8.2: {} node-mock-http@1.0.4: {} @@ -13832,6 +14474,20 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@6.3.1: + dependencies: + chalk: 5.6.2 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + strip-ansi: 7.1.2 + wcwidth: 1.0.1 + + outvariant@1.4.3: {} + p-cancelable@2.1.1: {} p-limit@3.1.0: @@ -14263,6 +14919,14 @@ snapshots: readdirp@4.1.2: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + recma-build-jsx@1.0.0: dependencies: '@types/estree': 1.0.8 @@ -14445,6 +15109,11 @@ snapshots: dependencies: lowercase-keys: 2.0.0 + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -14481,6 +15150,8 @@ snapshots: retry@0.12.0: {} + rettime@0.7.0: {} + reusify@1.0.4: {} rfdc@1.4.1: {} @@ -14615,6 +15286,40 @@ snapshots: setprototypeof@1.2.0: {} + shadcn@2.10.0(@types/node@22.15.28)(hono@4.11.4)(typescript@5.9.2): + dependencies: + '@antfu/ni': 23.3.1 + '@babel/core': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.27.1) + '@modelcontextprotocol/sdk': 1.25.2(hono@4.11.4)(zod@3.25.76) + commander: 10.0.1 + cosmiconfig: 8.3.6(typescript@5.9.2) + deepmerge: 4.3.1 + diff: 8.0.3 + execa: 7.2.0 + fast-glob: 3.3.2 + fs-extra: 11.3.0 + https-proxy-agent: 6.2.1 + kleur: 4.1.5 + msw: 2.12.7(@types/node@22.15.28)(typescript@5.9.2) + node-fetch: 3.3.2 + ora: 6.3.1 + postcss: 8.5.6 + prompts: 2.4.2 + recast: 0.23.11 + stringify-object: 5.0.0 + ts-morph: 18.0.0 + tsconfig-paths: 4.2.0 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - '@cfworker/json-schema' + - '@types/node' + - hono + - supports-color + - typescript + sharp@0.33.5: dependencies: color: 4.2.3 @@ -14840,6 +15545,10 @@ snapshots: std-env@3.9.0: {} + stdin-discarder@0.1.0: + dependencies: + bl: 5.1.0 + stream-replace-string@2.0.0: {} streamx@2.22.0: @@ -14849,6 +15558,8 @@ snapshots: optionalDependencies: bare-events: 2.5.4 + strict-event-emitter@0.5.1: {} + string-argv@0.3.2: {} string-width@4.2.3: @@ -14882,6 +15593,12 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -14890,6 +15607,8 @@ snapshots: dependencies: ansi-regex: 6.2.2 + strip-bom@3.0.0: {} + strip-final-newline@2.0.0: {} strip-final-newline@3.0.0: {} @@ -14952,6 +15671,8 @@ snapshots: svg-parser@2.0.4: {} + tagged-tag@1.0.0: {} + tailwind-merge@3.3.0: {} tailwindcss@4.1.11: {} @@ -15009,6 +15730,8 @@ snapshots: tiny-inflate@1.0.3: {} + tiny-invariant@1.3.3: {} + tiny-typed-emitter@2.1.0: {} tinybench@2.9.0: {} @@ -15031,6 +15754,12 @@ snapshots: titleize@3.0.0: {} + tldts-core@7.0.19: {} + + tldts@7.0.19: + dependencies: + tldts-core: 7.0.19 + tmp-promise@3.0.3: dependencies: tmp: 0.2.5 @@ -15045,6 +15774,10 @@ snapshots: totalist@3.0.1: {} + tough-cookie@6.0.0: + dependencies: + tldts: 7.0.19 + tr46@0.0.3: {} tree-kill@1.2.2: {} @@ -15061,6 +15794,11 @@ snapshots: dependencies: typescript: 5.9.2 + ts-morph@18.0.0: + dependencies: + '@ts-morph/common': 0.19.0 + code-block-writer: 12.0.0 + tsc-alias@1.8.16: dependencies: chokidar: 3.6.0 @@ -15075,6 +15813,12 @@ snapshots: optionalDependencies: typescript: 5.9.2 + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + tslib@2.8.1: {} tsx@4.20.3: @@ -15127,6 +15871,10 @@ snapshots: type-fest@4.41.0: {} + type-fest@5.4.1: + dependencies: + tagged-tag: 1.0.0 + type-is@2.0.1: dependencies: content-type: 1.0.5 @@ -15256,6 +16004,8 @@ snapshots: ofetch: 1.5.1 ufo: 1.6.1 + until-async@3.0.2: {} + untildify@4.0.0: {} update-browserslist-db@1.1.3(browserslist@4.24.4): @@ -15499,8 +16249,14 @@ snapshots: vscode-uri@3.0.8: {} + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + web-namespaces@2.0.1: {} + web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} webpack-sources@3.2.3: {} @@ -15533,6 +16289,12 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -15605,6 +16367,8 @@ snapshots: dependencies: yoctocolors: 2.1.2 + yoctocolors-cjs@2.1.3: {} + yoctocolors@2.1.2: {} zip-stream@4.1.1: @@ -15617,6 +16381,10 @@ snapshots: dependencies: zod: 3.25.76 + zod-to-json-schema@3.25.1(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod-to-json-schema@3.25.1(zod@4.1.13): dependencies: zod: 4.1.13 diff --git a/turbo.json b/turbo.json index 34ef27f0e..266fbd724 100644 --- a/turbo.json +++ b/turbo.json @@ -33,6 +33,11 @@ "dependsOn": ["build"], "cache": false, "persistent": true + }, + "registry:build": { + "dependsOn": ["^build"], + "outputs": ["../website/public/r/**"], + "cache": false } }, "globalDependencies": ["biome.json", "tsconfig.json", "package.json"] From 581139ce15627338ab4ea22368f482bd49ba1c84 Mon Sep 17 00:00:00 2001 From: mathuraditya724 Date: Mon, 26 Jan 2026 08:57:32 +0530 Subject: [PATCH 02/14] chore: removed coverage file --- packages/spotlight/coverage/coverage-final.json | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 packages/spotlight/coverage/coverage-final.json diff --git a/packages/spotlight/coverage/coverage-final.json b/packages/spotlight/coverage/coverage-final.json deleted file mode 100644 index 22e9bc295..000000000 --- a/packages/spotlight/coverage/coverage-final.json +++ /dev/null @@ -1,9 +0,0 @@ -{"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-item.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-item.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":75}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":69}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":89}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":78}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":52}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":41}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":69}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":74}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":40}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":2}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":53}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":55}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":41}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":34}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":2}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":11}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":12}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":32}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":55}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":23}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":37}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":7}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":17}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":16}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":12}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":51}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":51}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":48}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":84}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":54}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":61}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":53}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":62}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":55}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":43}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":52}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":64}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":68}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":40}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":62}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":29}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":39}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":53}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":45}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":25}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":20}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":10}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":27}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":10}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":29}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":33}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":22}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":57}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":30}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":43}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":35}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":41}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":10}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":63}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":7}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":32}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":12}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":24}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":70}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":38}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":54}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":12}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":70}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":9}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":64}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":33}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":19}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":27}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":28}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":68}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":67}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":36}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":29}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":36}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":46}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":16}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":13}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":117}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":21}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":32}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":23}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":14}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":76}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":62}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":15}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":12}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":40}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":78}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":46}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":17}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":14}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":32}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":111}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":107}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":0}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":28}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":14}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":76}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":20}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":116}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":73}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":14}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":11}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":98}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":44}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":19}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":16}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":14}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":12}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":0}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":41}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":45}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":17}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":32}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":46}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":39}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":41}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":49}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":37}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":42}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":10}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":8}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":9}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":4}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":1}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":0}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":24}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":11,"34":11,"35":11,"36":11,"37":11,"38":11,"39":11,"40":11,"41":11,"42":11,"43":11,"44":11,"45":11,"46":11,"47":11,"48":11,"49":11,"50":11,"51":11,"52":11,"53":11,"54":11,"55":11,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":11,"64":11,"65":1,"66":1,"67":11,"68":11,"69":0,"70":0,"71":0,"72":0,"73":0,"74":11,"75":11,"76":11,"77":11,"78":11,"79":11,"80":11,"81":11,"82":11,"83":11,"84":11,"85":11,"86":11,"87":11,"88":11,"89":11,"90":11,"91":11,"92":11,"93":11,"94":11,"95":11,"96":11,"97":11,"98":11,"99":11,"100":11,"101":11,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":0,"111":0,"112":0,"113":1,"114":1,"115":1,"116":1,"117":11,"118":11,"119":11,"120":11,"121":11,"122":11,"123":11,"124":11,"125":11,"126":11,"127":11,"128":11,"129":11,"130":11,"131":11,"132":11,"133":11,"134":11,"135":11,"136":11,"137":11,"138":11,"139":11,"140":11,"141":11,"142":11,"143":11,"144":11,"145":11,"146":11,"147":11,"148":11,"149":11,"150":11,"151":11,"152":11,"153":11,"154":1,"155":1,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":11,"164":11,"165":11,"166":11,"167":1,"168":1},"branchMap":{"0":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":7},"end":{"line":167,"column":1}},"locations":[{"start":{"line":33,"column":7},"end":{"line":167,"column":1}}]},"1":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":39},"end":{"line":45,"column":51}},"locations":[{"start":{"line":45,"column":39},"end":{"line":45,"column":51}}]},"2":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":24},"end":{"line":53,"column":48}},"locations":[{"start":{"line":53,"column":24},"end":{"line":53,"column":48}}]},"3":{"type":"branch","line":86,"loc":{"start":{"line":86,"column":10},"end":{"line":86,"column":43}},"locations":[{"start":{"line":86,"column":10},"end":{"line":86,"column":43}}]},"4":{"type":"branch","line":87,"loc":{"start":{"line":87,"column":10},"end":{"line":87,"column":35}},"locations":[{"start":{"line":87,"column":10},"end":{"line":87,"column":35}}]},"5":{"type":"branch","line":88,"loc":{"start":{"line":88,"column":10},"end":{"line":88,"column":41}},"locations":[{"start":{"line":88,"column":10},"end":{"line":88,"column":41}}]},"6":{"type":"branch","line":90,"loc":{"start":{"line":90,"column":32},"end":{"line":90,"column":54}},"locations":[{"start":{"line":90,"column":32},"end":{"line":90,"column":54}}]},"7":{"type":"branch","line":97,"loc":{"start":{"line":97,"column":12},"end":{"line":97,"column":38}},"locations":[{"start":{"line":97,"column":12},"end":{"line":97,"column":38}}]},"8":{"type":"branch","line":97,"loc":{"start":{"line":97,"column":25},"end":{"line":97,"column":54}},"locations":[{"start":{"line":97,"column":25},"end":{"line":97,"column":54}}]},"9":{"type":"branch","line":102,"loc":{"start":{"line":102,"column":27},"end":{"line":117,"column":21}},"locations":[{"start":{"line":102,"column":27},"end":{"line":117,"column":21}}]},"10":{"type":"branch","line":116,"loc":{"start":{"line":116,"column":73},"end":{"line":116,"column":100}},"locations":[{"start":{"line":116,"column":73},"end":{"line":116,"column":100}}]},"11":{"type":"branch","line":129,"loc":{"start":{"line":129,"column":49},"end":{"line":129,"column":78}},"locations":[{"start":{"line":129,"column":49},"end":{"line":129,"column":78}}]},"12":{"type":"branch","line":130,"loc":{"start":{"line":130,"column":18},"end":{"line":130,"column":46}},"locations":[{"start":{"line":130,"column":18},"end":{"line":130,"column":46}}]},"13":{"type":"branch","line":154,"loc":{"start":{"line":154,"column":39},"end":{"line":163,"column":10}},"locations":[{"start":{"line":154,"column":39},"end":{"line":163,"column":10}}]},"14":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":22},"end":{"line":67,"column":4}},"locations":[{"start":{"line":65,"column":22},"end":{"line":67,"column":4}}]}},"b":{"0":[11],"1":[0],"2":[1],"3":[1],"4":[1],"5":[1],"6":[0],"7":[1],"8":[10],"9":[1],"10":[0],"11":[0],"12":[0],"13":[1],"14":[1]},"fnMap":{"0":{"name":"SpanItem","decl":{"start":{"line":33,"column":7},"end":{"line":167,"column":1}},"loc":{"start":{"line":33,"column":7},"end":{"line":167,"column":1}},"line":33},"1":{"name":"handleResize","decl":{"start":{"line":56,"column":23},"end":{"line":63,"column":4}},"loc":{"start":{"line":56,"column":23},"end":{"line":63,"column":4}},"line":56},"2":{"name":"handleClick","decl":{"start":{"line":65,"column":22},"end":{"line":67,"column":4}},"loc":{"start":{"line":65,"column":22},"end":{"line":67,"column":4}},"line":65},"3":{"name":"handleKeyDown","decl":{"start":{"line":69,"column":24},"end":{"line":74,"column":4}},"loc":{"start":{"line":69,"column":24},"end":{"line":74,"column":4}},"line":69},"4":{"name":"onClick","decl":{"start":{"line":110,"column":23},"end":{"line":113,"column":16}},"loc":{"start":{"line":110,"column":23},"end":{"line":113,"column":16}},"line":110}},"f":{"0":11,"1":0,"2":1,"3":0,"4":0}} -,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-resizer.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-resizer.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":71}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":41}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":3}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":65}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":61}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":65}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":30}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":3}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":92}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":52}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":34}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":48}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":44}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":29}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":50}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":51}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":6}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":27}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":61}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":57}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":56}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":52}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":10}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":8}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":84}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":66}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":8}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":14}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":73}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":31}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":45}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":46}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":6}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":4}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":27}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":11,"15":11,"16":11,"17":11,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":11,"39":11,"40":11,"41":11,"42":11,"43":11,"44":11,"45":11,"46":11,"47":11,"48":11,"49":11,"50":11,"51":11,"52":11,"53":11,"54":1,"55":1},"branchMap":{"0":{"type":"branch","line":14,"loc":{"start":{"line":14,"column":7},"end":{"line":54,"column":1}},"locations":[{"start":{"line":14,"column":7},"end":{"line":54,"column":1}}]},"1":{"type":"branch","line":44,"loc":{"start":{"line":44,"column":22},"end":{"line":44,"column":49}},"locations":[{"start":{"line":44,"column":22},"end":{"line":44,"column":49}}]},"2":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":33},"end":{"line":47,"column":66}},"locations":[{"start":{"line":47,"column":33},"end":{"line":47,"column":66}}]}},"b":{"0":[11],"1":[0],"2":[0]},"fnMap":{"0":{"name":"SpanResizer","decl":{"start":{"line":14,"column":7},"end":{"line":54,"column":1}},"loc":{"start":{"line":14,"column":7},"end":{"line":54,"column":1}},"line":14},"1":{"name":"onMouseDown","decl":{"start":{"line":18,"column":22},"end":{"line":38,"column":4}},"loc":{"start":{"line":18,"column":22},"end":{"line":38,"column":4}},"line":18},"2":{"name":"onMouseEnter","decl":{"start":{"line":50,"column":20},"end":{"line":50,"column":45}},"loc":{"start":{"line":50,"column":20},"end":{"line":50,"column":45}},"line":50},"3":{"name":"onMouseLeave","decl":{"start":{"line":51,"column":20},"end":{"line":51,"column":46}},"loc":{"start":{"line":51,"column":20},"end":{"line":51,"column":46}},"line":51}},"f":{"0":11,"1":0,"2":0,"3":0}} -,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-tree.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-tree.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":68}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":52}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":33}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":3}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":87}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":12}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":60}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":67}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":62}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":38}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":52}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":42}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":2}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":9}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":27}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":48}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":60}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":43}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":7}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":9}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":35}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":71}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":2}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":12}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":48}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":34}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":41}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":5}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":16}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":15}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":24}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":12}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":19}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":71}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":37}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":16}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":10}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":75}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":26}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":17}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":28}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":21}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":46}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":39}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":19}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":41}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":49}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":37}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":39}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":46}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":10}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":9}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":9}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":24}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":11,"48":11,"49":11,"50":11,"51":11,"52":11,"53":11,"54":11,"55":11,"56":11,"57":11,"58":11,"59":1,"60":1,"61":10,"62":10,"63":11,"64":11,"65":11,"66":11,"67":11,"68":11,"69":11,"70":11,"71":11,"72":11,"73":11,"74":11,"75":11,"76":11,"77":11,"78":11,"79":11,"80":11,"81":1,"82":1},"branchMap":{"0":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":7},"end":{"line":81,"column":1}},"locations":[{"start":{"line":47,"column":7},"end":{"line":81,"column":1}}]},"1":{"type":"branch","line":59,"loc":{"start":{"line":59,"column":36},"end":{"line":61,"column":3}},"locations":[{"start":{"line":59,"column":36},"end":{"line":61,"column":3}}]},"2":{"type":"branch","line":61,"loc":{"start":{"line":61,"column":2},"end":{"line":64,"column":55}},"locations":[{"start":{"line":61,"column":2},"end":{"line":64,"column":55}}]},"3":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":50},"end":{"line":64,"column":63}},"locations":[{"start":{"line":64,"column":50},"end":{"line":64,"column":63}}]},"4":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":17},"end":{"line":77,"column":10}},"locations":[{"start":{"line":65,"column":17},"end":{"line":77,"column":10}}]}},"b":{"0":[11],"1":[1],"2":[10],"3":[1],"4":[11]},"fnMap":{"0":{"name":"SpanTree","decl":{"start":{"line":47,"column":7},"end":{"line":81,"column":1}},"loc":{"start":{"line":47,"column":7},"end":{"line":81,"column":1}},"line":47}},"f":{"0":11}} -,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/time-since.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/time-since.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":26}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":53}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":44}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":41}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":73}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":38}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":2}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":11}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":45}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":30}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":2}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":77}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":59}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":87}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":97}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":16}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":24}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":36}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":51}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":37}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":38}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":38}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":30}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":35}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":82}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":10}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":47}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":11}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":1}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":14,"24":14,"25":14,"26":14,"27":0,"28":0,"29":0,"30":14,"31":14,"32":14,"33":14,"34":14,"35":14,"36":0,"37":14,"38":14,"39":14,"40":14,"41":14,"42":14,"43":14,"44":14,"45":14,"46":14,"47":14,"48":14,"49":14,"50":14,"51":14,"52":1,"53":1},"branchMap":{"0":{"type":"branch","line":23,"loc":{"start":{"line":23,"column":7},"end":{"line":52,"column":1}},"locations":[{"start":{"line":23,"column":7},"end":{"line":52,"column":1}}]},"1":{"type":"branch","line":43,"loc":{"start":{"line":43,"column":23},"end":{"line":43,"column":35}},"locations":[{"start":{"line":43,"column":23},"end":{"line":43,"column":35}}]},"2":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":41},"end":{"line":45,"column":69}},"locations":[{"start":{"line":45,"column":41},"end":{"line":45,"column":69}}]},"3":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":52},"end":{"line":24,"column":95}},"locations":[{"start":{"line":24,"column":52},"end":{"line":24,"column":95}}]},"4":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":86},"end":{"line":24,"column":95}},"locations":[{"start":{"line":24,"column":86},"end":{"line":24,"column":95}}]},"5":{"type":"branch","line":26,"loc":{"start":{"line":26,"column":12},"end":{"line":41,"column":5}},"locations":[{"start":{"line":26,"column":12},"end":{"line":41,"column":5}}]},"6":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":15},"end":{"line":30,"column":5}},"locations":[{"start":{"line":27,"column":15},"end":{"line":30,"column":5}}]},"7":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":11},"end":{"line":40,"column":38}},"locations":[{"start":{"line":40,"column":11},"end":{"line":40,"column":38}}]}},"b":{"0":[14],"1":[0],"2":[0],"3":[14],"4":[0],"5":[14],"6":[0],"7":[14]},"fnMap":{"0":{"name":"TimeSince","decl":{"start":{"line":23,"column":7},"end":{"line":52,"column":1}},"loc":{"start":{"line":23,"column":7},"end":{"line":52,"column":1}},"line":23}},"f":{"0":14}} -,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-badge.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-badge.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":70}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":65}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":72}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":2}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":11}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":45}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":46}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":58}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":76}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":103}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":36}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":68}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":77}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":4}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":10}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":74}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":58}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":11}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":4}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":53}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":51}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":48}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":34}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":64}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":114}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":70}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":27}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":69}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":59}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":29}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":9}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":78}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":64}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":29}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":9}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":17}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":4}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":78}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":1}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":69}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":34}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":14}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":12}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":22}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":21}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":88}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":26}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":15,"17":15,"18":15,"19":15,"20":15,"21":15,"22":15,"23":15,"24":15,"25":15,"26":15,"27":15,"28":15,"29":15,"30":15,"31":15,"32":15,"33":1,"34":1,"35":1,"36":1,"37":15,"38":15,"39":15,"40":15,"41":0,"42":0,"43":15,"44":15,"45":1,"46":1,"47":14,"48":14,"49":14,"50":14,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":13,"70":13,"71":13,"72":13,"73":13,"74":13,"75":13,"76":13,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1},"branchMap":{"0":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":7},"end":{"line":33,"column":1}},"locations":[{"start":{"line":16,"column":7},"end":{"line":33,"column":1}}]},"1":{"type":"branch","line":17,"loc":{"start":{"line":17,"column":14},"end":{"line":17,"column":26}},"locations":[{"start":{"line":17,"column":14},"end":{"line":17,"column":26}}]},"2":{"type":"branch","line":30,"loc":{"start":{"line":30,"column":19},"end":{"line":30,"column":52}},"locations":[{"start":{"line":30,"column":19},"end":{"line":30,"column":52}}]},"3":{"type":"branch","line":30,"loc":{"start":{"line":30,"column":48},"end":{"line":30,"column":58}},"locations":[{"start":{"line":30,"column":48},"end":{"line":30,"column":58}}]},"4":{"type":"branch","line":38,"loc":{"start":{"line":38,"column":0},"end":{"line":51,"column":1}},"locations":[{"start":{"line":38,"column":0},"end":{"line":51,"column":1}}]},"5":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":33},"end":{"line":43,"column":3}},"locations":[{"start":{"line":41,"column":33},"end":{"line":43,"column":3}}]},"6":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":27},"end":{"line":45,"column":79}},"locations":[{"start":{"line":45,"column":27},"end":{"line":45,"column":79}}]},"7":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":59},"end":{"line":45,"column":113}},"locations":[{"start":{"line":45,"column":59},"end":{"line":45,"column":113}}]},"8":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":113},"end":{"line":47,"column":3}},"locations":[{"start":{"line":45,"column":113},"end":{"line":47,"column":3}}]},"9":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":2},"end":{"line":51,"column":1}},"locations":[{"start":{"line":47,"column":2},"end":{"line":51,"column":1}}]},"10":{"type":"branch","line":56,"loc":{"start":{"line":56,"column":7},"end":{"line":64,"column":1}},"locations":[{"start":{"line":56,"column":7},"end":{"line":64,"column":1}}]},"11":{"type":"branch","line":69,"loc":{"start":{"line":69,"column":7},"end":{"line":77,"column":1}},"locations":[{"start":{"line":69,"column":7},"end":{"line":77,"column":1}}]},"12":{"type":"branch","line":82,"loc":{"start":{"line":82,"column":7},"end":{"line":90,"column":1}},"locations":[{"start":{"line":82,"column":7},"end":{"line":90,"column":1}}]}},"b":{"0":[15],"1":[0],"2":[1],"3":[14],"4":[15],"5":[0],"6":[14],"7":[14],"8":[1],"9":[14],"10":[1],"11":[13],"12":[1]},"fnMap":{"0":{"name":"TraceBadge","decl":{"start":{"line":16,"column":7},"end":{"line":33,"column":1}},"loc":{"start":{"line":16,"column":7},"end":{"line":33,"column":1}},"line":16},"1":{"name":"getStatusClasses","decl":{"start":{"line":38,"column":0},"end":{"line":51,"column":1}},"loc":{"start":{"line":38,"column":0},"end":{"line":51,"column":1}},"line":38},"2":{"name":"StatusBadge","decl":{"start":{"line":56,"column":7},"end":{"line":64,"column":1}},"loc":{"start":{"line":56,"column":7},"end":{"line":64,"column":1}},"line":56},"3":{"name":"MethodBadge","decl":{"start":{"line":69,"column":7},"end":{"line":77,"column":1}},"loc":{"start":{"line":69,"column":7},"end":{"line":77,"column":1}},"line":69},"4":{"name":"EnvironmentBadge","decl":{"start":{"line":82,"column":7},"end":{"line":90,"column":1}},"loc":{"start":{"line":82,"column":7},"end":{"line":90,"column":1}},"line":82}},"f":{"0":15,"1":15,"2":1,"3":13,"4":1}} -,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-item.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-item.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":71}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":105}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":67}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":69}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":52}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":60}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":53}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":66}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":66}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":2}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":12}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":58}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":47}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":40}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":34}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":31}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":2}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":11}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":9}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":13}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":56}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":45}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":7}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":2}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":9}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":29}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":29}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":29}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":22}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":51}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":33}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":9}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":8}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":9}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":95}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":38}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":53}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":45}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":25}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":75}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":37}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":57}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":49}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":10}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":8}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":27}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":31}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":20}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":61}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":46}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":33}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":18}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":8}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":25}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":37}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":21}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":62}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":64}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":10}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":31}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":60}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":51}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":64}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":85}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":92}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":12}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":30}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":49}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":95}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":83}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":39}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":17}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":14}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":12}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":19}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":87}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":104}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":22}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":31}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":22}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":55}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":10}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":4}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":1}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":25}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":14,"49":2,"50":2,"51":14,"52":14,"53":1,"54":1,"55":1,"56":1,"57":1,"58":14,"59":14,"60":14,"61":14,"62":14,"63":14,"64":14,"65":14,"66":14,"67":14,"68":14,"69":14,"70":14,"71":14,"72":14,"73":14,"74":14,"75":14,"76":14,"77":14,"78":14,"79":14,"80":1,"81":13,"82":13,"83":14,"84":14,"85":14,"86":14,"87":14,"88":14,"89":14,"90":14,"91":14,"92":14,"93":14,"94":14,"95":14,"96":14,"97":14,"98":14,"99":14,"100":14,"101":14,"102":14,"103":14,"104":14,"105":14,"106":14,"107":14,"108":14,"109":14,"110":14,"111":14,"112":14,"113":14,"114":14,"115":14,"116":1,"117":1},"branchMap":{"0":{"type":"branch","line":48,"loc":{"start":{"line":48,"column":7},"end":{"line":116,"column":1}},"locations":[{"start":{"line":48,"column":7},"end":{"line":116,"column":1}}]},"1":{"type":"branch","line":74,"loc":{"start":{"line":74,"column":8},"end":{"line":74,"column":33}},"locations":[{"start":{"line":74,"column":8},"end":{"line":74,"column":33}}]},"2":{"type":"branch","line":80,"loc":{"start":{"line":80,"column":9},"end":{"line":81,"column":62}},"locations":[{"start":{"line":80,"column":9},"end":{"line":81,"column":62}}]},"3":{"type":"branch","line":81,"loc":{"start":{"line":81,"column":60},"end":{"line":83,"column":64}},"locations":[{"start":{"line":81,"column":60},"end":{"line":83,"column":64}}]},"4":{"type":"branch","line":91,"loc":{"start":{"line":91,"column":17},"end":{"line":91,"column":85}},"locations":[{"start":{"line":91,"column":17},"end":{"line":91,"column":85}}]},"5":{"type":"branch","line":99,"loc":{"start":{"line":99,"column":17},"end":{"line":99,"column":95}},"locations":[{"start":{"line":99,"column":17},"end":{"line":99,"column":95}}]},"6":{"type":"branch","line":108,"loc":{"start":{"line":108,"column":9},"end":{"line":108,"column":61}},"locations":[{"start":{"line":108,"column":9},"end":{"line":108,"column":61}}]},"7":{"type":"branch","line":108,"loc":{"start":{"line":108,"column":56},"end":{"line":108,"column":104}},"locations":[{"start":{"line":108,"column":56},"end":{"line":108,"column":104}}]},"8":{"type":"branch","line":49,"loc":{"start":{"line":49,"column":22},"end":{"line":51,"column":4}},"locations":[{"start":{"line":49,"column":22},"end":{"line":51,"column":4}}]},"9":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":24},"end":{"line":58,"column":4}},"locations":[{"start":{"line":53,"column":24},"end":{"line":58,"column":4}}]},"10":{"type":"branch","line":54,"loc":{"start":{"line":54,"column":18},"end":{"line":54,"column":44}},"locations":[{"start":{"line":54,"column":18},"end":{"line":54,"column":44}}]}},"b":{"0":[14],"1":[1],"2":[1],"3":[13],"4":[1],"5":[13],"6":[1],"7":[13],"8":[2],"9":[1],"10":[0]},"fnMap":{"0":{"name":"TraceItem","decl":{"start":{"line":48,"column":7},"end":{"line":116,"column":1}},"loc":{"start":{"line":48,"column":7},"end":{"line":116,"column":1}},"line":48},"1":{"name":"handleClick","decl":{"start":{"line":49,"column":22},"end":{"line":51,"column":4}},"loc":{"start":{"line":49,"column":22},"end":{"line":51,"column":4}},"line":49},"2":{"name":"handleKeyDown","decl":{"start":{"line":53,"column":24},"end":{"line":58,"column":4}},"loc":{"start":{"line":53,"column":24},"end":{"line":58,"column":4}},"line":53}},"f":{"0":14,"1":2,"2":1}} -,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/duration.ts": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/duration.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":57}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":60}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":3}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":62}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":3}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":56}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":20}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":2}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":55}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":3}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":46}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":25}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":80}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":39}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":2}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":45}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":46}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":11}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":58}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":60}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":60}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":66}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":64}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":49}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":47}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":47}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":75}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":2}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":32}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":63}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":35}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":2}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":11}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":31}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":37}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":70}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":58}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":1}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":65}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":51}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":2}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":45}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":47}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":2}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":38}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":37}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":40}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":39}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":58}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":34}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":28}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":49}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":47}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":39}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":1}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":49}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":2}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":69}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":37}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":2}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":11}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":76}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":42}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":20}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":12}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":63}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":23,"40":23,"41":23,"42":3,"43":3,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":57,"59":57,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":48,"76":298,"77":30,"78":30,"79":30,"80":298,"81":18,"82":18,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":3,"95":3,"96":3,"97":3,"98":3},"branchMap":{"0":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":8},"end":{"line":24,"column":23}},"locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":23}}]},"1":{"type":"branch","line":39,"loc":{"start":{"line":39,"column":7},"end":{"line":44,"column":1}},"locations":[{"start":{"line":39,"column":7},"end":{"line":44,"column":1}}]},"2":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":23},"end":{"line":40,"column":49}},"locations":[{"start":{"line":40,"column":23},"end":{"line":40,"column":49}}]},"3":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":30},"end":{"line":41,"column":29}},"locations":[{"start":{"line":40,"column":30},"end":{"line":41,"column":29}}]},"4":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":22},"end":{"line":41,"column":47}},"locations":[{"start":{"line":41,"column":22},"end":{"line":41,"column":47}}]},"5":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":29},"end":{"line":42,"column":29}},"locations":[{"start":{"line":41,"column":29},"end":{"line":42,"column":29}}]},"6":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":22},"end":{"line":44,"column":1}},"locations":[{"start":{"line":42,"column":22},"end":{"line":44,"column":1}}]},"7":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":29},"end":{"line":44,"column":1}},"locations":[{"start":{"line":42,"column":29},"end":{"line":44,"column":1}}]},"8":{"type":"branch","line":58,"loc":{"start":{"line":58,"column":7},"end":{"line":60,"column":1}},"locations":[{"start":{"line":58,"column":7},"end":{"line":60,"column":1}}]},"9":{"type":"branch","line":75,"loc":{"start":{"line":75,"column":7},"end":{"line":83,"column":1}},"locations":[{"start":{"line":75,"column":7},"end":{"line":83,"column":1}}]},"10":{"type":"branch","line":76,"loc":{"start":{"line":76,"column":33},"end":{"line":81,"column":3}},"locations":[{"start":{"line":76,"column":33},"end":{"line":81,"column":3}}]},"11":{"type":"branch","line":77,"loc":{"start":{"line":77,"column":27},"end":{"line":80,"column":5}},"locations":[{"start":{"line":77,"column":27},"end":{"line":80,"column":5}}]},"12":{"type":"branch","line":81,"loc":{"start":{"line":81,"column":2},"end":{"line":83,"column":1}},"locations":[{"start":{"line":81,"column":2},"end":{"line":83,"column":1}}]},"13":{"type":"branch","line":94,"loc":{"start":{"line":94,"column":7},"end":{"line":99,"column":1}},"locations":[{"start":{"line":94,"column":7},"end":{"line":99,"column":1}}]}},"b":{"0":[18],"1":[23],"2":[3],"3":[20],"4":[3],"5":[17],"6":[14],"7":[3],"8":[57],"9":[48],"10":[298],"11":[30],"12":[18],"13":[3]},"fnMap":{"0":{"name":"getDurationClassName","decl":{"start":{"line":39,"column":7},"end":{"line":44,"column":1}},"loc":{"start":{"line":39,"column":7},"end":{"line":44,"column":1}},"line":39},"1":{"name":"formatNumber","decl":{"start":{"line":58,"column":7},"end":{"line":60,"column":1}},"loc":{"start":{"line":58,"column":7},"end":{"line":60,"column":1}},"line":58},"2":{"name":"formatDuration","decl":{"start":{"line":75,"column":7},"end":{"line":83,"column":1}},"loc":{"start":{"line":75,"column":7},"end":{"line":83,"column":1}},"line":75},"3":{"name":"formatSpanDuration","decl":{"start":{"line":94,"column":7},"end":{"line":99,"column":1}},"loc":{"start":{"line":94,"column":7},"end":{"line":99,"column":1}},"line":94}},"f":{"0":23,"1":57,"2":48,"3":3}} -,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/utils.ts": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/utils.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":45}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":3}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":75}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":78}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":2}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":67}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":11}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":62}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":74}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":3}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":45}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":48}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":50}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":40}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":46}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":2}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":11}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":49}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":48}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":57}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":33}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":110,"16":110,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":24,"32":24},"branchMap":{"0":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":7},"end":{"line":17,"column":1}},"locations":[{"start":{"line":15,"column":7},"end":{"line":17,"column":1}}]},"1":{"type":"branch","line":31,"loc":{"start":{"line":31,"column":7},"end":{"line":33,"column":1}},"locations":[{"start":{"line":31,"column":7},"end":{"line":33,"column":1}}]}},"b":{"0":[110],"1":[24]},"fnMap":{"0":{"name":"cn","decl":{"start":{"line":15,"column":7},"end":{"line":17,"column":1}},"loc":{"start":{"line":15,"column":7},"end":{"line":17,"column":1}},"line":15},"1":{"name":"truncateId","decl":{"start":{"line":31,"column":7},"end":{"line":33,"column":1}},"loc":{"start":{"line":31,"column":7},"end":{"line":33,"column":1}},"line":31}},"f":{"0":110,"1":24}} -} From 260372b99df21e0cc853dadc4f99facbb97e76db Mon Sep 17 00:00:00 2001 From: mathuraditya724 Date: Mon, 26 Jan 2026 09:43:03 +0530 Subject: [PATCH 03/14] feat: added nextjs app --- packages/registry/.gitignore | 41 ++ packages/registry/app/favicon.ico | Bin 0 -> 25931 bytes packages/registry/app/globals.css | 125 +++++ packages/registry/app/layout.tsx | 30 + packages/registry/app/page.tsx | 3 + packages/registry/components.json | 22 + packages/registry/lib/utils.ts | 6 + packages/registry/next.config.ts | 7 + packages/registry/package.json | 28 + packages/registry/postcss.config.mjs | 7 + packages/registry/public/.gitkeep | 0 packages/registry/tsconfig.json | 27 + pnpm-lock.yaml | 809 +++++++++++++++++++++++---- 13 files changed, 1002 insertions(+), 103 deletions(-) create mode 100644 packages/registry/.gitignore create mode 100644 packages/registry/app/favicon.ico create mode 100644 packages/registry/app/globals.css create mode 100644 packages/registry/app/layout.tsx create mode 100644 packages/registry/app/page.tsx create mode 100644 packages/registry/components.json create mode 100644 packages/registry/lib/utils.ts create mode 100644 packages/registry/next.config.ts create mode 100644 packages/registry/package.json create mode 100644 packages/registry/postcss.config.mjs create mode 100644 packages/registry/public/.gitkeep create mode 100644 packages/registry/tsconfig.json diff --git a/packages/registry/.gitignore b/packages/registry/.gitignore new file mode 100644 index 000000000..5ef6a5207 --- /dev/null +++ b/packages/registry/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/packages/registry/app/favicon.ico b/packages/registry/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/packages/registry/app/globals.css b/packages/registry/app/globals.css new file mode 100644 index 000000000..e111b61e9 --- /dev/null +++ b/packages/registry/app/globals.css @@ -0,0 +1,125 @@ +@import "tailwindcss"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); + --color-sidebar-ring: var(--sidebar-ring); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar: var(--sidebar); + --color-chart-5: var(--chart-5); + --color-chart-4: var(--chart-4); + --color-chart-3: var(--chart-3); + --color-chart-2: var(--chart-2); + --color-chart-1: var(--chart-1); + --color-ring: var(--ring); + --color-input: var(--input); + --color-border: var(--border); + --color-destructive: var(--destructive); + --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-secondary-foreground: var(--secondary-foreground); + --color-secondary: var(--secondary); + --color-primary-foreground: var(--primary-foreground); + --color-primary: var(--primary); + --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --radius-2xl: calc(var(--radius) + 8px); + --radius-3xl: calc(var(--radius) + 12px); + --radius-4xl: calc(var(--radius) + 16px); +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.141 0.005 285.823); + --card: oklch(1 0 0); + --card-foreground: oklch(0.141 0.005 285.823); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.141 0.005 285.823); + --primary: oklch(0.21 0.006 285.885); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.967 0.001 286.375); + --secondary-foreground: oklch(0.21 0.006 285.885); + --muted: oklch(0.967 0.001 286.375); + --muted-foreground: oklch(0.552 0.016 285.938); + --accent: oklch(0.967 0.001 286.375); + --accent-foreground: oklch(0.21 0.006 285.885); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.92 0.004 286.32); + --input: oklch(0.92 0.004 286.32); + --ring: oklch(0.705 0.015 286.067); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.141 0.005 285.823); + --sidebar-primary: oklch(0.21 0.006 285.885); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.967 0.001 286.375); + --sidebar-accent-foreground: oklch(0.21 0.006 285.885); + --sidebar-border: oklch(0.92 0.004 286.32); + --sidebar-ring: oklch(0.705 0.015 286.067); +} + +.dark { + --background: oklch(0.141 0.005 285.823); + --foreground: oklch(0.985 0 0); + --card: oklch(0.21 0.006 285.885); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.21 0.006 285.885); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.92 0.004 286.32); + --primary-foreground: oklch(0.21 0.006 285.885); + --secondary: oklch(0.274 0.006 286.033); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.274 0.006 286.033); + --muted-foreground: oklch(0.705 0.015 286.067); + --accent: oklch(0.274 0.006 286.033); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.552 0.016 285.938); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.21 0.006 285.885); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.274 0.006 286.033); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.552 0.016 285.938); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/packages/registry/app/layout.tsx b/packages/registry/app/layout.tsx new file mode 100644 index 000000000..6ad27e3f2 --- /dev/null +++ b/packages/registry/app/layout.tsx @@ -0,0 +1,30 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/packages/registry/app/page.tsx b/packages/registry/app/page.tsx new file mode 100644 index 000000000..9899158d7 --- /dev/null +++ b/packages/registry/app/page.tsx @@ -0,0 +1,3 @@ +export default function Home() { + return
    Hello
    ; +} diff --git a/packages/registry/components.json b/packages/registry/components.json new file mode 100644 index 000000000..d5005f097 --- /dev/null +++ b/packages/registry/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "app/globals.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/packages/registry/lib/utils.ts b/packages/registry/lib/utils.ts new file mode 100644 index 000000000..365058ceb --- /dev/null +++ b/packages/registry/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/packages/registry/next.config.ts b/packages/registry/next.config.ts new file mode 100644 index 000000000..e9ffa3083 --- /dev/null +++ b/packages/registry/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/packages/registry/package.json b/packages/registry/package.json new file mode 100644 index 000000000..918d36295 --- /dev/null +++ b/packages/registry/package.json @@ -0,0 +1,28 @@ +{ + "name": "registry", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.563.0", + "next": "16.1.4", + "react": "19.2.3", + "react-dom": "19.2.3", + "tailwind-merge": "^3.4.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "tailwindcss": "^4", + "tw-animate-css": "^1.4.0", + "typescript": "^5" + } +} diff --git a/packages/registry/postcss.config.mjs b/packages/registry/postcss.config.mjs new file mode 100644 index 000000000..61e36849c --- /dev/null +++ b/packages/registry/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/packages/registry/public/.gitkeep b/packages/registry/public/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/packages/registry/tsconfig.json b/packages/registry/tsconfig.json new file mode 100644 index 000000000..cc9ed39b5 --- /dev/null +++ b/packages/registry/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts", "**/*.mts"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b09f8f242..f57772b2c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,6 +89,52 @@ importers: specifier: 'catalog:' version: 5.9.2 + packages/registry: + dependencies: + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lucide-react: + specifier: ^0.563.0 + version: 0.563.0(react@19.2.3) + next: + specifier: ^15.4.8 + version: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: + specifier: 19.2.3 + version: 19.2.3 + react-dom: + specifier: 19.2.3 + version: 19.2.3(react@19.2.3) + tailwind-merge: + specifier: ^3.4.0 + version: 3.4.0 + devDependencies: + '@tailwindcss/postcss': + specifier: ^4 + version: 4.1.18 + '@types/node': + specifier: ^20 + version: 20.19.21 + '@types/react': + specifier: ^19 + version: 19.2.9 + '@types/react-dom': + specifier: ^19 + version: 19.2.3(@types/react@19.2.9) + tailwindcss: + specifier: ^4 + version: 4.1.11 + tw-animate-css: + specifier: ^1.4.0 + version: 1.4.0 + typescript: + specifier: ^5 + version: 5.9.2 + packages/spotlight: dependencies: '@hono/mcp': @@ -184,7 +230,7 @@ importers: version: 3.13.0 '@tailwindcss/vite': specifier: 'catalog:' - version: 4.1.11(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1)) + version: 4.1.11(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 @@ -217,10 +263,10 @@ importers: version: 6.21.0(eslint@8.57.1)(typescript@5.9.2) '@vitejs/plugin-react': specifier: ^4.3.2 - version: 4.4.1(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1)) + version: 4.4.1(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1)) '@vitest/coverage-v8': specifier: ^0.34.6 - version: 0.34.6(vitest@0.34.6(happy-dom@20.0.2)(lightningcss@1.30.1)(playwright@1.56.1)(terser@5.43.1)) + version: 0.34.6(vitest@0.34.6(happy-dom@20.0.2)(lightningcss@1.30.2)(playwright@1.56.1)(terser@5.43.1)) autoprefixer: specifier: ^10.4.20 version: 10.4.21(postcss@8.5.6) @@ -328,19 +374,19 @@ importers: version: 2.16.0(react@18.3.1) vite: specifier: 'catalog:' - version: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1) + version: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1) vite-plugin-dts: specifier: ^4.5.4 - version: 4.5.4(@types/node@22.15.28)(rollup@4.53.3)(typescript@5.9.2)(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1)) + version: 4.5.4(@types/node@22.15.28)(rollup@4.53.3)(typescript@5.9.2)(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1)) vite-plugin-electron: specifier: ^0.29.0 version: 0.29.0 vite-plugin-svgr: specifier: ^3.3.0 - version: 3.3.0(rollup@4.53.3)(typescript@5.9.2)(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1)) + version: 3.3.0(rollup@4.53.3)(typescript@5.9.2)(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1)) vitest: specifier: 'catalog:' - version: 0.34.6(happy-dom@20.0.2)(lightningcss@1.30.1)(playwright@1.56.1)(terser@5.43.1) + version: 0.34.6(happy-dom@20.0.2)(lightningcss@1.30.2)(playwright@1.56.1)(terser@5.43.1) zustand: specifier: ^5.0.3 version: 5.0.3(@types/react@18.3.20)(react@18.3.1) @@ -349,25 +395,25 @@ importers: dependencies: '@astrojs/react': specifier: ^4.2.0 - version: 4.2.7(@types/node@24.10.1)(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(jiti@2.4.2)(lightningcss@1.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + version: 4.2.7(@types/node@24.10.1)(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) '@astrojs/starlight': specifier: ^0.32.4 - version: 0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) + version: 0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) '@astrojs/starlight-tailwind': specifier: ^3.0.1 - version: 3.0.1(@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)))(@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11))(tailwindcss@4.1.11) + version: 3.0.1(@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)))(@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11))(tailwindcss@4.1.11) '@astrojs/vercel': specifier: ^8.0.8 - version: 8.1.4(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(react@18.3.1)(rollup@4.53.3)(svelte@4.2.19) + version: 8.1.4(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.53.3)(svelte@4.2.19) '@fontsource/raleway': specifier: 'catalog:' version: 5.2.5 '@sentry/astro': specifier: 'catalog:' - version: 10.32.1(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) + version: 10.32.1(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) '@tailwindcss/vite': specifier: 'catalog:' - version: 4.1.11(vite@6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) + version: 4.1.11(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) '@types/react': specifier: 'catalog:' version: 18.3.20 @@ -376,10 +422,10 @@ importers: version: 18.3.7(@types/react@18.3.20) '@vercel/analytics': specifier: ^1.6.1 - version: 1.6.1(react@18.3.1)(svelte@4.2.19) + version: 1.6.1(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(svelte@4.2.19) astro: specifier: ^5.15.9 - version: 5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + version: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) react: specifier: 'catalog:' version: 18.3.1 @@ -407,7 +453,7 @@ importers: version: 5.9.2 vite-plugin-inspect: specifier: ^0.7.42 - version: 0.7.42(rollup@4.53.3)(vite@6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) + version: 0.7.42(rollup@4.53.3)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) packages: @@ -417,6 +463,10 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -1793,6 +1843,9 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1856,6 +1909,57 @@ packages: resolution: {integrity: sha512-EFd6cVbHsgLa6wa4RljGj6Wk75qoHxUSyc5asLyyPSyuhIcdS2Q3Phw6ImS1q+CkALthJRShiYfKANcQMuMqsQ==} engines: {node: '>=18'} + '@next/env@15.5.9': + resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} + + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2951,6 +3055,9 @@ packages: peerDependencies: '@svgr/core': '*' + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} @@ -2961,60 +3068,117 @@ packages: '@tailwindcss/node@4.1.11': resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + '@tailwindcss/node@4.1.18': + resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==} + '@tailwindcss/oxide-android-arm64@4.1.11': resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} engines: {node: '>= 10'} cpu: [arm64] os: [android] + '@tailwindcss/oxide-android-arm64@4.1.18': + resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + '@tailwindcss/oxide-darwin-arm64@4.1.11': resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] + '@tailwindcss/oxide-darwin-arm64@4.1.18': + resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.1.11': resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.1.18': + resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@tailwindcss/oxide-freebsd-x64@4.1.11': resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] + '@tailwindcss/oxide-freebsd-x64@4.1.18': + resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.1.11': resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@tailwindcss/oxide-wasm32-wasi@4.1.11': resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} engines: {node: '>=14.0.0'} @@ -3027,22 +3191,53 @@ packages: - '@emnapi/wasi-threads' - tslib + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@tailwindcss/oxide@4.1.11': resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} engines: {node: '>= 10'} + '@tailwindcss/oxide@4.1.18': + resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.18': + resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==} + '@tailwindcss/typography@0.5.16': resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} peerDependencies: @@ -3203,9 +3398,6 @@ packages: '@types/node@24.10.1': resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} - '@types/node@24.7.2': - resolution: {integrity: sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==} - '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -3226,9 +3418,17 @@ packages: peerDependencies: '@types/react': ^18.0.0 + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + '@types/react@18.3.20': resolution: {integrity: sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==} + '@types/react@19.2.9': + resolution: {integrity: sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==} + '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -3906,6 +4106,9 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -4126,6 +4329,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -4395,6 +4601,10 @@ packages: resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -5304,6 +5514,10 @@ packages: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} @@ -5398,70 +5612,140 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-android-arm64@1.30.2: + resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + lightningcss-darwin-arm64@1.30.1: resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] + lightningcss-darwin-arm64@1.30.2: + resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + lightningcss-darwin-x64@1.30.1: resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] + lightningcss-darwin-x64@1.30.2: + resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + lightningcss-freebsd-x64@1.30.1: resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] + lightningcss-freebsd-x64@1.30.2: + resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + lightningcss-linux-arm-gnueabihf@1.30.1: resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + lightningcss-linux-arm64-gnu@1.30.1: resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-gnu@1.30.2: + resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-arm64-musl@1.30.1: resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + lightningcss-linux-arm64-musl@1.30.2: + resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + lightningcss-linux-x64-gnu@1.30.1: resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-gnu@1.30.2: + resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-linux-x64-musl@1.30.1: resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + lightningcss-linux-x64-musl@1.30.2: + resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + lightningcss-win32-arm64-msvc@1.30.1: resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [win32] + lightningcss-win32-arm64-msvc@1.30.2: + resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + lightningcss-win32-x64-msvc@1.30.1: resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [win32] + lightningcss-win32-x64-msvc@1.30.2: + resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + lightningcss@1.30.1: resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} engines: {node: '>= 12.0.0'} + lightningcss@1.30.2: + resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} + engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -5574,6 +5858,11 @@ packages: peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc + lucide-react@0.563.0: + resolution: {integrity: sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + lz-string@1.5.0: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true @@ -5960,6 +6249,27 @@ packages: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} + next@15.5.9: + resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + nlcst-to-string@4.0.0: resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} @@ -6310,6 +6620,10 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + postcss@8.5.6: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} @@ -6443,6 +6757,11 @@ packages: peerDependencies: react: ^18.3.1 + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} + peerDependencies: + react: ^19.2.3 + react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -6512,6 +6831,10 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + read-config-file@6.3.2: resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} engines: {node: '>=12.0.0'} @@ -6743,6 +7066,9 @@ packages: scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -7016,6 +7342,19 @@ packages: style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} @@ -7049,9 +7388,15 @@ packages: tailwind-merge@3.3.0: resolution: {integrity: sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ==} + tailwind-merge@3.4.0: + resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==} + tailwindcss@4.1.11: resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + tapable@2.2.2: resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} engines: {node: '>=6'} @@ -7243,6 +7588,9 @@ packages: tw-animate-css@1.3.5: resolution: {integrity: sha512-t3u+0YNoloIhj1mMXs779P6MO9q3p3mvGn4k1n3nJPqJw/glZcuijG2qTSN4z4mgNRfW5ZC3aXJFLwDtiipZXA==} + tw-animate-css@1.4.0: + resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -7303,9 +7651,6 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.14.0: - resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} - undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} @@ -7889,6 +8234,8 @@ snapshots: '@adobe/css-tools@4.4.4': {} + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -7968,12 +8315,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': + '@astrojs/mdx@4.3.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': dependencies: '@astrojs/markdown-remark': 6.3.7 '@mdx-js/mdx': 3.1.1 acorn: 8.15.0 - astro: 5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -7991,15 +8338,15 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/react@4.2.7(@types/node@24.10.1)(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(jiti@2.4.2)(lightningcss@1.30.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)': + '@astrojs/react@4.2.7(@types/node@24.10.1)(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)': dependencies: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@vitejs/plugin-react': 4.4.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) + '@vitejs/plugin-react': 4.4.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.6.0 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -8020,22 +8367,22 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.25.76 - '@astrojs/starlight-tailwind@3.0.1(@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)))(@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11))(tailwindcss@4.1.11)': + '@astrojs/starlight-tailwind@3.0.1(@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)))(@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11))(tailwindcss@4.1.11)': dependencies: - '@astrojs/starlight': 0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) - '@astrojs/tailwind': 6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11) + '@astrojs/starlight': 0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) + '@astrojs/tailwind': 6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11) tailwindcss: 4.1.11 - '@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': + '@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': dependencies: - '@astrojs/mdx': 4.3.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) + '@astrojs/mdx': 4.3.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) '@astrojs/sitemap': 3.6.0 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) - astro-expressive-code: 0.40.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) + astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro-expressive-code: 0.40.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.2 @@ -8057,9 +8404,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11)': + '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11)': dependencies: - astro: 5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) autoprefixer: 10.4.23(postcss@8.5.6) postcss: 8.5.6 postcss-load-config: 4.0.2(postcss@8.5.6) @@ -8079,14 +8426,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/vercel@8.1.4(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(react@18.3.1)(rollup@4.53.3)(svelte@4.2.19)': + '@astrojs/vercel@8.1.4(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.53.3)(svelte@4.2.19)': dependencies: '@astrojs/internal-helpers': 0.6.1 - '@vercel/analytics': 1.6.1(react@18.3.1)(svelte@4.2.19) + '@vercel/analytics': 1.6.1(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(svelte@4.2.19) '@vercel/edge': 1.2.1 '@vercel/nft': 0.29.2(rollup@4.53.3) '@vercel/routing-utils': 5.0.4 - astro: 5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) esbuild: 0.25.3 tinyglobby: 0.2.12 transitivePeerDependencies: @@ -9128,6 +9475,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/source-map@0.3.11': @@ -9297,6 +9649,32 @@ snapshots: outvariant: 1.4.3 strict-event-emitter: 0.5.1 + '@next/env@15.5.9': {} + + '@next/swc-darwin-arm64@15.5.7': + optional: true + + '@next/swc-darwin-x64@15.5.7': + optional: true + + '@next/swc-linux-arm64-gnu@15.5.7': + optional: true + + '@next/swc-linux-arm64-musl@15.5.7': + optional: true + + '@next/swc-linux-x64-gnu@15.5.7': + optional: true + + '@next/swc-linux-x64-musl@15.5.7': + optional: true + + '@next/swc-win32-arm64-msvc@15.5.7': + optional: true + + '@next/swc-win32-x64-msvc@15.5.7': + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10017,13 +10395,13 @@ snapshots: '@sentry-internal/browser-utils': 10.32.1 '@sentry/core': 10.32.1 - '@sentry/astro@10.32.1(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': + '@sentry/astro@10.32.1(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': dependencies: '@sentry/browser': 10.32.1 '@sentry/core': 10.32.1 '@sentry/node': 10.32.1 '@sentry/vite-plugin': 4.6.1 - astro: 5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) transitivePeerDependencies: - encoding - supports-color @@ -10507,6 +10885,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + '@swc/helpers@0.5.17': dependencies: tslib: 2.8.1 @@ -10525,42 +10907,88 @@ snapshots: source-map-js: 1.2.1 tailwindcss: 4.1.11 + '@tailwindcss/node@4.1.18': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.4 + jiti: 2.6.1 + lightningcss: 1.30.2 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.1.18 + '@tailwindcss/oxide-android-arm64@4.1.11': optional: true + '@tailwindcss/oxide-android-arm64@4.1.18': + optional: true + '@tailwindcss/oxide-darwin-arm64@4.1.11': optional: true + '@tailwindcss/oxide-darwin-arm64@4.1.18': + optional: true + '@tailwindcss/oxide-darwin-x64@4.1.11': optional: true + '@tailwindcss/oxide-darwin-x64@4.1.18': + optional: true + '@tailwindcss/oxide-freebsd-x64@4.1.11': optional: true + '@tailwindcss/oxide-freebsd-x64@4.1.18': + optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18': + optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.1.18': + optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.1.18': + optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.1.18': + optional: true + '@tailwindcss/oxide-linux-x64-musl@4.1.11': optional: true + '@tailwindcss/oxide-linux-x64-musl@4.1.18': + optional: true + '@tailwindcss/oxide-wasm32-wasi@4.1.11': optional: true + '@tailwindcss/oxide-wasm32-wasi@4.1.18': + optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.1.18': + optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.1.18': + optional: true + '@tailwindcss/oxide@4.1.11': dependencies: detect-libc: 2.1.2 @@ -10579,6 +11007,29 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + '@tailwindcss/oxide@4.1.18': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-arm64': 4.1.18 + '@tailwindcss/oxide-darwin-x64': 4.1.18 + '@tailwindcss/oxide-freebsd-x64': 4.1.18 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.18 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.18 + '@tailwindcss/oxide-linux-x64-musl': 4.1.18 + '@tailwindcss/oxide-wasm32-wasi': 4.1.18 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.18 + + '@tailwindcss/postcss@4.1.18': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.18 + '@tailwindcss/oxide': 4.1.18 + postcss: 8.5.6 + tailwindcss: 4.1.18 + '@tailwindcss/typography@0.5.16(tailwindcss@4.1.11)': dependencies: lodash.castarray: 4.4.0 @@ -10587,19 +11038,19 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.1.11 - '@tailwindcss/vite@4.1.11(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1))': + '@tailwindcss/vite@4.1.11(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1))': dependencies: '@tailwindcss/node': 4.1.11 '@tailwindcss/oxide': 4.1.11 tailwindcss: 4.1.11 - vite: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1) + vite: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1) - '@tailwindcss/vite@4.1.11(vite@6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2))': + '@tailwindcss/vite@4.1.11(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.1.11 '@tailwindcss/oxide': 4.1.11 tailwindcss: 4.1.11 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) '@testing-library/dom@10.4.1': dependencies: @@ -10677,7 +11128,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 24.10.1 + '@types/node': 20.19.21 '@types/responselike': 1.0.3 '@types/chai-subset@1.3.5': @@ -10692,7 +11143,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 24.10.1 + '@types/node': 20.19.21 '@types/debug@4.1.12': dependencies: @@ -10708,16 +11159,16 @@ snapshots: '@types/fontkit@2.0.8': dependencies: - '@types/node': 24.10.1 + '@types/node': 20.19.21 '@types/fs-extra@9.0.13': dependencies: - '@types/node': 24.10.1 + '@types/node': 20.19.21 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 24.10.1 + '@types/node': 20.19.21 '@types/hast@3.0.4': dependencies: @@ -10733,13 +11184,13 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 24.10.1 + '@types/node': 20.19.21 '@types/lodash@4.17.13': {} '@types/logfmt@1.2.6': dependencies: - '@types/node': 24.7.2 + '@types/node': 20.19.21 '@types/mdast@4.0.4': dependencies: @@ -10753,7 +11204,7 @@ snapshots: '@types/mysql@2.15.27': dependencies: - '@types/node': 24.10.1 + '@types/node': 20.19.21 '@types/nlcst@2.0.3': dependencies: @@ -10776,10 +11227,7 @@ snapshots: '@types/node@24.10.1': dependencies: undici-types: 7.16.0 - - '@types/node@24.7.2': - dependencies: - undici-types: 7.14.0 + optional: true '@types/parse-json@4.0.2': {} @@ -10789,13 +11237,13 @@ snapshots: '@types/pg@8.15.6': dependencies: - '@types/node': 24.10.1 + '@types/node': 20.19.21 pg-protocol: 1.9.5 pg-types: 2.2.0 '@types/plist@3.0.5': dependencies: - '@types/node': 24.7.2 + '@types/node': 20.19.21 xmlbuilder: 15.1.1 optional: true @@ -10805,18 +11253,26 @@ snapshots: dependencies: '@types/react': 18.3.20 + '@types/react-dom@19.2.3(@types/react@19.2.9)': + dependencies: + '@types/react': 19.2.9 + '@types/react@18.3.20': dependencies: '@types/prop-types': 15.7.13 csstype: 3.1.3 + '@types/react@19.2.9': + dependencies: + csstype: 3.2.3 + '@types/responselike@1.0.3': dependencies: - '@types/node': 24.10.1 + '@types/node': 20.19.21 '@types/sax@1.2.7': dependencies: - '@types/node': 24.10.1 + '@types/node': 20.19.21 '@types/semver@7.7.1': {} @@ -10824,7 +11280,7 @@ snapshots: '@types/tedious@4.0.14': dependencies: - '@types/node': 24.10.1 + '@types/node': 20.19.21 '@types/unist@2.0.11': {} @@ -10837,7 +11293,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 24.7.2 + '@types/node': 20.19.21 optional: true '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': @@ -10928,8 +11384,9 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vercel/analytics@1.6.1(react@18.3.1)(svelte@4.2.19)': + '@vercel/analytics@1.6.1(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(svelte@4.2.19)': optionalDependencies: + next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 svelte: 4.2.19 @@ -10961,29 +11418,29 @@ snapshots: optionalDependencies: ajv: 6.12.6 - '@vitejs/plugin-react@4.4.1(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1))': + '@vitejs/plugin-react@4.4.1(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1))': dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1) + vite: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.4.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2))': + '@vitejs/plugin-react@4.4.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2))': dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@0.34.6(vitest@0.34.6(happy-dom@20.0.2)(lightningcss@1.30.1)(playwright@1.56.1)(terser@5.43.1))': + '@vitest/coverage-v8@0.34.6(vitest@0.34.6(happy-dom@20.0.2)(lightningcss@1.30.2)(playwright@1.56.1)(terser@5.43.1))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -10996,7 +11453,7 @@ snapshots: std-env: 3.9.0 test-exclude: 6.0.0 v8-to-istanbul: 9.3.0 - vitest: 0.34.6(happy-dom@20.0.2)(lightningcss@1.30.1)(playwright@1.56.1)(terser@5.43.1) + vitest: 0.34.6(happy-dom@20.0.2)(lightningcss@1.30.2)(playwright@1.56.1)(terser@5.43.1) transitivePeerDependencies: - supports-color @@ -11287,12 +11744,12 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.40.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)): + astro-expressive-code@0.40.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)): dependencies: - astro: 5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) rehype-expressive-code: 0.40.2 - astro@5.15.9(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2): + astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -11348,8 +11805,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.17.2 vfile: 6.0.3 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) + vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -11732,6 +12189,8 @@ snapshots: cli-width@4.1.0: {} + client-only@0.0.1: {} + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -11949,6 +12408,8 @@ snapshots: csstype@3.1.3: {} + csstype@3.2.3: {} + data-uri-to-buffer@4.0.1: {} dayjs@1.11.13: {} @@ -12231,6 +12692,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.2 + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + entities@4.5.0: {} entities@6.0.1: {} @@ -13462,6 +13928,8 @@ snapshots: jiti@2.4.2: {} + jiti@2.6.1: {} + jju@1.4.0: {} jose@6.1.3: {} @@ -13541,36 +14009,69 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-android-arm64@1.30.2: + optional: true + lightningcss-darwin-arm64@1.30.1: optional: true + lightningcss-darwin-arm64@1.30.2: + optional: true + lightningcss-darwin-x64@1.30.1: optional: true + lightningcss-darwin-x64@1.30.2: + optional: true + lightningcss-freebsd-x64@1.30.1: optional: true + lightningcss-freebsd-x64@1.30.2: + optional: true + lightningcss-linux-arm-gnueabihf@1.30.1: optional: true + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + lightningcss-linux-arm64-gnu@1.30.1: optional: true + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + lightningcss-linux-arm64-musl@1.30.1: optional: true + lightningcss-linux-arm64-musl@1.30.2: + optional: true + lightningcss-linux-x64-gnu@1.30.1: optional: true + lightningcss-linux-x64-gnu@1.30.2: + optional: true + lightningcss-linux-x64-musl@1.30.1: optional: true + lightningcss-linux-x64-musl@1.30.2: + optional: true + lightningcss-win32-arm64-msvc@1.30.1: optional: true + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + lightningcss-win32-x64-msvc@1.30.1: optional: true + lightningcss-win32-x64-msvc@1.30.2: + optional: true + lightningcss@1.30.1: dependencies: detect-libc: 2.1.2 @@ -13586,6 +14087,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.1 lightningcss-win32-x64-msvc: 1.30.1 + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -13701,6 +14218,10 @@ snapshots: dependencies: react: 18.3.1 + lucide-react@0.563.0(react@19.2.3): + dependencies: + react: 19.2.3 + lz-string@1.5.0: {} macho-unsign@2.0.6: {} @@ -14347,6 +14868,57 @@ snapshots: neotraverse@0.6.18: {} + next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 15.5.9 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001764 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.56.1 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + optional: true + + next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + '@next/env': 15.5.9 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001764 + postcss: 8.4.31 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + styled-jsx: 5.1.6(react@19.2.3) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.56.1 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + nlcst-to-string@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -14640,8 +15212,8 @@ snapshots: platformicons@7.0.5(react@18.3.1): dependencies: - '@types/node': 24.7.2 - '@types/react': 18.3.20 + '@types/node': 20.19.21 + '@types/react': 19.2.9 react: 18.3.1 playwright-core@1.56.1: {} @@ -14688,6 +15260,12 @@ snapshots: postcss-value-parser@4.2.0: {} + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postcss@8.5.6: dependencies: nanoid: 3.3.11 @@ -14822,6 +15400,11 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-dom@19.2.3(react@19.2.3): + dependencies: + react: 19.2.3 + scheduler: 0.27.0 + react-is@16.13.1: {} react-is@17.0.2: {} @@ -14884,6 +15467,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + react@19.2.3: {} + read-config-file@6.3.2: dependencies: config-file-ts: 0.2.6 @@ -15243,6 +15828,8 @@ snapshots: dependencies: loose-envify: 1.4.0 + scheduler@0.27.0: {} + semver-compare@1.0.0: optional: true @@ -15633,6 +16220,17 @@ snapshots: dependencies: inline-style-parser: 0.2.4 + styled-jsx@5.1.6(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optional: true + + styled-jsx@5.1.6(react@19.2.3): + dependencies: + client-only: 0.0.1 + react: 19.2.3 + stylis@4.2.0: {} sumchecker@3.0.1: @@ -15675,8 +16273,12 @@ snapshots: tailwind-merge@3.3.0: {} + tailwind-merge@3.4.0: {} + tailwindcss@4.1.11: {} + tailwindcss@4.1.18: {} + tapable@2.2.2: {} tar-stream@2.2.0: @@ -15858,6 +16460,8 @@ snapshots: tw-animate-css@1.3.5: {} + tw-animate-css@1.4.0: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -15899,9 +16503,8 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.14.0: {} - - undici-types@7.16.0: {} + undici-types@7.16.0: + optional: true unicode-properties@1.4.1: dependencies: @@ -16099,14 +16702,14 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@0.34.6(@types/node@24.7.2)(lightningcss@1.30.1)(terser@5.43.1): + vite-node@0.34.6(@types/node@20.19.21)(lightningcss@1.30.2)(terser@5.43.1): dependencies: cac: 6.7.14 debug: 4.4.3 mlly: 1.7.4 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.21(@types/node@24.7.2)(lightningcss@1.30.1)(terser@5.43.1) + vite: 5.4.21(@types/node@20.19.21)(lightningcss@1.30.2)(terser@5.43.1) transitivePeerDependencies: - '@types/node' - less @@ -16118,7 +16721,7 @@ snapshots: - supports-color - terser - vite-plugin-dts@4.5.4(@types/node@22.15.28)(rollup@4.53.3)(typescript@5.9.2)(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1)): + vite-plugin-dts@4.5.4(@types/node@22.15.28)(rollup@4.53.3)(typescript@5.9.2)(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1)): dependencies: '@microsoft/api-extractor': 7.52.8(@types/node@22.15.28) '@rollup/pluginutils': 5.3.0(rollup@4.53.3) @@ -16131,7 +16734,7 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.2 optionalDependencies: - vite: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1) + vite: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1) transitivePeerDependencies: - '@types/node' - rollup @@ -16139,7 +16742,7 @@ snapshots: vite-plugin-electron@0.29.0: {} - vite-plugin-inspect@0.7.42(rollup@4.53.3)(vite@6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)): + vite-plugin-inspect@0.7.42(rollup@4.53.3)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.2(rollup@4.53.3) @@ -16149,45 +16752,45 @@ snapshots: open: 9.1.0 picocolors: 1.1.0 sirv: 2.0.4 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) transitivePeerDependencies: - rollup - supports-color - vite-plugin-svgr@3.3.0(rollup@4.53.3)(typescript@5.9.2)(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1)): + vite-plugin-svgr@3.3.0(rollup@4.53.3)(typescript@5.9.2)(vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1)): dependencies: '@rollup/pluginutils': 5.3.0(rollup@4.53.3) '@svgr/core': 8.1.0(typescript@5.9.2) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.2)) - vite: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1) + vite: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1) transitivePeerDependencies: - rollup - supports-color - typescript - vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.1)(terser@5.43.1): + vite@5.4.21(@types/node@20.19.21)(lightningcss@1.30.2)(terser@5.43.1): dependencies: esbuild: 0.25.12 postcss: 8.5.6 rollup: 4.53.3 optionalDependencies: - '@types/node': 22.15.28 + '@types/node': 20.19.21 fsevents: 2.3.3 - lightningcss: 1.30.1 + lightningcss: 1.30.2 terser: 5.43.1 - vite@5.4.21(@types/node@24.7.2)(lightningcss@1.30.1)(terser@5.43.1): + vite@5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1): dependencies: esbuild: 0.25.12 postcss: 8.5.6 rollup: 4.53.3 optionalDependencies: - '@types/node': 24.7.2 + '@types/node': 22.15.28 fsevents: 2.3.3 - lightningcss: 1.30.1 + lightningcss: 1.30.2 terser: 5.43.1 - vite@6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2): + vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -16198,21 +16801,21 @@ snapshots: optionalDependencies: '@types/node': 24.10.1 fsevents: 2.3.3 - jiti: 2.4.2 - lightningcss: 1.30.1 + jiti: 2.6.1 + lightningcss: 1.30.2 terser: 5.43.1 tsx: 4.20.3 yaml: 2.8.2 - vitefu@1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)): + vitefu@1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)): optionalDependencies: - vite: 6.4.1(@types/node@24.10.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) - vitest@0.34.6(happy-dom@20.0.2)(lightningcss@1.30.1)(playwright@1.56.1)(terser@5.43.1): + vitest@0.34.6(happy-dom@20.0.2)(lightningcss@1.30.2)(playwright@1.56.1)(terser@5.43.1): dependencies: '@types/chai': 4.3.20 '@types/chai-subset': 1.3.5 - '@types/node': 24.7.2 + '@types/node': 20.19.21 '@vitest/expect': 0.34.6 '@vitest/runner': 0.34.6 '@vitest/snapshot': 0.34.6 @@ -16231,8 +16834,8 @@ snapshots: strip-literal: 1.3.0 tinybench: 2.9.0 tinypool: 0.7.0 - vite: 5.4.21(@types/node@24.7.2)(lightningcss@1.30.1)(terser@5.43.1) - vite-node: 0.34.6(@types/node@24.7.2)(lightningcss@1.30.1)(terser@5.43.1) + vite: 5.4.21(@types/node@20.19.21)(lightningcss@1.30.2)(terser@5.43.1) + vite-node: 0.34.6(@types/node@20.19.21)(lightningcss@1.30.2)(terser@5.43.1) why-is-node-running: 2.3.0 optionalDependencies: happy-dom: 20.0.2 From 45b0a4e03884c9e342d147ed434b36dc738e00f3 Mon Sep 17 00:00:00 2001 From: mathuraditya724 Date: Mon, 26 Jan 2026 10:16:19 +0530 Subject: [PATCH 04/14] fix: some good changes --- packages/registry/app/globals.css | 67 +++++ packages/registry/app/page.tsx | 242 +++++++++++++++++- packages/registry/components/span-item.tsx | 155 +++++++++++ packages/registry/components/span-resizer.tsx | 53 ++++ packages/registry/components/span-tree.tsx | 47 ++++ packages/registry/components/theme-toggle.tsx | 37 +++ packages/registry/components/time-since.tsx | 46 ++++ packages/registry/components/trace-badge.tsx | 86 +++++++ packages/registry/components/trace-item.tsx | 83 ++++++ packages/registry/lib/duration.ts | 99 +++++++ packages/registry/lib/types.ts | 163 ++++++++++++ packages/registry/lib/utils.ts | 12 + packages/registry/package.json | 1 + packages/registry/tsconfig.json | 2 +- .../spotlight/coverage/coverage-final.json | 9 + packages/spotlight/registry.json | 21 +- .../spotlight/components/span-item.tsx | 17 +- .../spotlight/components/trace-item.tsx | 6 +- pnpm-lock.yaml | 3 + 19 files changed, 1131 insertions(+), 18 deletions(-) create mode 100644 packages/registry/components/span-item.tsx create mode 100644 packages/registry/components/span-resizer.tsx create mode 100644 packages/registry/components/span-tree.tsx create mode 100644 packages/registry/components/theme-toggle.tsx create mode 100644 packages/registry/components/time-since.tsx create mode 100644 packages/registry/components/trace-badge.tsx create mode 100644 packages/registry/components/trace-item.tsx create mode 100644 packages/registry/lib/duration.ts create mode 100644 packages/registry/lib/types.ts create mode 100644 packages/spotlight/coverage/coverage-final.json diff --git a/packages/registry/app/globals.css b/packages/registry/app/globals.css index e111b61e9..cebf19319 100644 --- a/packages/registry/app/globals.css +++ b/packages/registry/app/globals.css @@ -123,3 +123,70 @@ @apply bg-background text-foreground; } } + +/* Span tree waterfall visualization styles */ +.span-tree { + position: relative; +} + +.span-tree .span-tree { + position: static; +} + +.span-tree, +.span-tree ul { + list-style: none; + margin: 0; + padding: 0; +} + +.span-tree.deep > li > ul { + margin-left: 8px; +} + +.span-tree.deep > li { + border-left: 1px solid hsl(var(--border)); + padding-left: 1rem; + margin-left: 1rem; +} + +.span-tree li:last-child { + border-left: 0; +} + +.span-tree > li:first-child:before { + display: none; +} + +.span-tree.deep > li:before, +.span-tree .span-tree > li:before { + content: ""; + display: inline-block; + position: absolute; + height: 15px; + width: 12px; + margin-left: -16px; + border-bottom: 1px solid hsl(var(--border)); +} + +.span-tree li:last-child:before { + border-left: 1px solid hsl(var(--border)); +} + +.span-tree .node { + display: flex; + align-items: center; + gap: 0 0.25rem; /* gap-x-1: horizontal gap only */ + overflow: hidden; + padding: 0.25rem 0; /* py-1 */ + padding-left: 0.25rem; /* pl-1 */ +} + +.span-tree .waterfall { + position: absolute; + right: 0; + height: 1.75rem; /* h-7 */ + border-left: 2px solid hsl(var(--border)); + padding: 0.25rem 0; /* py-1 */ + padding-left: 0.25rem; /* pl-1 */ +} diff --git a/packages/registry/app/page.tsx b/packages/registry/app/page.tsx index 9899158d7..4d0a07fef 100644 --- a/packages/registry/app/page.tsx +++ b/packages/registry/app/page.tsx @@ -1,3 +1,243 @@ +"use client"; + +import { SpanTree } from "@/components/span-tree"; +import { ThemeToggle } from "@/components/theme-toggle"; +import { TraceItem } from "@/components/trace-item"; +import type { SpanData, TraceData } from "@/lib/types"; +import { useState } from "react"; + +// Sample span data with nested children +const sampleSpans: SpanData[] = [ + { + span_id: "span-root", + op: "http.server", + description: "GET /api/users", + start_timestamp: 0, + timestamp: 350, + status: "ok", + children: [ + { + span_id: "span-auth", + op: "auth.verify", + description: "JWT token verification", + start_timestamp: 5, + timestamp: 25, + status: "ok", + parent_span_id: "span-root", + }, + { + span_id: "span-db", + op: "db.query", + description: "SELECT * FROM users WHERE active = true", + start_timestamp: 30, + timestamp: 180, + status: "ok", + parent_span_id: "span-root", + children: [ + { + span_id: "span-db-connect", + op: "db.connect", + description: "PostgreSQL connection pool", + start_timestamp: 30, + timestamp: 45, + status: "ok", + parent_span_id: "span-db", + }, + { + span_id: "span-db-execute", + op: "db.execute", + description: "Execute query", + start_timestamp: 45, + timestamp: 175, + status: "ok", + parent_span_id: "span-db", + }, + ], + }, + { + span_id: "span-cache", + op: "cache.get", + description: "redis.get(user:preferences:*)", + start_timestamp: 185, + timestamp: 195, + status: "ok", + parent_span_id: "span-root", + }, + { + span_id: "span-serialize", + op: "serialize", + description: "JSON response serialization", + start_timestamp: 200, + timestamp: 340, + status: "ok", + parent_span_id: "span-root", + }, + ], + }, +]; + +// Sample error trace spans +const errorSpans: SpanData[] = [ + { + span_id: "err-root", + op: "http.server", + description: "POST /api/orders", + start_timestamp: 0, + timestamp: 1200, + status: "error", + children: [ + { + span_id: "err-validate", + op: "validation", + description: "Request body validation", + start_timestamp: 5, + timestamp: 15, + status: "ok", + parent_span_id: "err-root", + }, + { + span_id: "err-payment", + op: "http.client", + description: "POST https://payments.stripe.com/v1/charges", + start_timestamp: 20, + timestamp: 1150, + status: "error", + parent_span_id: "err-root", + }, + ], + }, +]; + +// Create sample traces +const sampleTraces: TraceData[] = [ + { + trace_id: "abc123def456ghi789jkl", + start_timestamp: Date.now() - 30000, + timestamp: Date.now() - 29650, + status: "ok", + spans: new Map(sampleSpans.flatMap(flattenSpans).map(s => [s.span_id, s])), + spanTree: sampleSpans, + rootTransactionName: "/api/users", + rootTransactionMethod: "GET", + environment: "development", + }, + { + trace_id: "xyz789abc123def456mno", + start_timestamp: Date.now() - 120000, + timestamp: Date.now() - 118800, + status: "error", + spans: new Map(errorSpans.flatMap(flattenSpans).map(s => [s.span_id, s])), + spanTree: errorSpans, + rootTransactionName: "/api/orders", + rootTransactionMethod: "POST", + environment: "staging", + }, + { + trace_id: "pqr456stu789vwx012yz", + start_timestamp: Date.now() - 300000, + timestamp: Date.now() - 299800, + status: "ok", + spans: new Map(), + spanTree: [], + rootTransactionName: "/health", + rootTransactionMethod: "GET", + environment: "production", + }, +]; + +// Helper to flatten spans for the Map +function flattenSpans(span: SpanData): SpanData[] { + const result = [span]; + if (span.children) { + for (const child of span.children) { + result.push(...flattenSpans(child)); + } + } + return result; +} + export default function Home() { - return
    Hello
    ; + const [selectedTraceId, setSelectedTraceId] = useState(); + const [selectedSpanId, setSelectedSpanId] = useState(); + + const selectedTrace = sampleTraces.find(t => t.trace_id === selectedTraceId); + + return ( +
    +
    +
    +

    Spotlight Registry Demo

    + +
    +

    Preview of the shadcn-compatible trace visualization components

    + + {/* Trace List Section */} +
    +

    TraceItem Component

    +

    Click a trace to view its spans in the waterfall below

    +
    + {sampleTraces.map(trace => ( + { + setSelectedTraceId(id); + setSelectedSpanId(undefined); + }} + /> + ))} +
    +
    + + {/* Span Tree Section */} +
    +

    SpanTree Component

    + {selectedTrace ? ( + <> +

    + Waterfall view for trace{" "} + {selectedTrace.trace_id.slice(0, 8)} + {selectedSpanId && ( + <> + {" "} + — Selected span: {selectedSpanId} + + )} +

    +
    + {selectedTrace.spanTree.length > 0 ? ( + setSelectedSpanId(id)} + /> + ) : ( +

    This trace has no spans to display

    + )} +
    + + ) : ( +
    + Select a trace above to view its span waterfall +
    + )} +
    + + {/* Installation Info */} +
    +

    Installation

    +

    Install these components in your project using the shadcn CLI:

    +
    +

    # Install SpanTree (includes SpanItem, SpanResizer)

    +

    pnpm dlx shadcn@latest add https://spotlightjs.com/r/span-tree.json

    +

    # Install TraceItem (includes TimeSince, TraceBadge)

    +

    pnpm dlx shadcn@latest add https://spotlightjs.com/r/trace-item.json

    +
    +
    +
    +
    + ); } diff --git a/packages/registry/components/span-item.tsx b/packages/registry/components/span-item.tsx new file mode 100644 index 000000000..2209c1172 --- /dev/null +++ b/packages/registry/components/span-item.tsx @@ -0,0 +1,155 @@ +"use client"; + +import { SpanResizer } from "@/components/span-resizer"; +import { SpanTree } from "@/components/span-tree"; +import { formatDuration, getDurationClassName } from "@/lib/duration"; +import type { SpanItemProps } from "@/lib/types"; +import { cn } from "@/lib/utils"; +import { ChevronDown } from "lucide-react"; +import { useRef, useState } from "react"; + +/** + * SpanItem renders a single span row in the waterfall visualization. + */ +export function SpanItem({ + span, + startTimestamp, + totalDuration, + depth = 1, + selectedSpanId, + highlightedSpanIds, + onSpanSelect, + spanNodeWidth, + onNodeWidthChange, +}: SpanItemProps) { + const containerRef = useRef(null); + const childrenCount = span.children?.length ?? 0; + + // Auto-collapse based on depth or child count + const [isCollapsed, setIsCollapsed] = useState(depth >= 10 || childrenCount > 10); + const [isResizing, setIsResizing] = useState(false); + + const spanDuration = span.timestamp - span.start_timestamp; + const isSelected = selectedSpanId === span.span_id; + const isHighlighted = highlightedSpanIds?.has(span.span_id); + const hasError = span.status && span.status !== "ok"; + + const handleResize = (e: MouseEvent) => { + if (containerRef.current && onNodeWidthChange) { + const rect = containerRef.current.getBoundingClientRect(); + const newWidth = ((e.clientX - rect.left) / rect.width) * 100; + // Clamp width between 20% and 80% + onNodeWidthChange(Math.min(Math.max(newWidth, 20), 80)); + } + }; + + const handleClick = () => { + onSpanSelect?.(span.span_id, span); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + handleClick(); + } + }; + + return ( +
  • +
    + {/* Span name column */} +
    + {/* Collapse/expand button for spans with children */} + {childrenCount > 0 && ( + + )} + + {/* Operation name */} + {span.op && ( + <> + {span.op} + + + )} + + {/* Span description or ID */} + + {span.description || span.span_id} + +
    + + {/* Waterfall column */} +
    + + + {/* Timing bar */} +
    + + {formatDuration(spanDuration)} + +
    +
    +
    + + {/* Render children recursively */} + {!isCollapsed && childrenCount > 0 && ( + + )} +
  • + ); +} + +export default SpanItem; diff --git a/packages/registry/components/span-resizer.tsx b/packages/registry/components/span-resizer.tsx new file mode 100644 index 000000000..73bf35c89 --- /dev/null +++ b/packages/registry/components/span-resizer.tsx @@ -0,0 +1,53 @@ +"use client"; + +import type { SpanResizerProps } from "@/lib/types"; +import { cn } from "@/lib/utils"; +import { useRef, useState } from "react"; + +/** + * SpanResizer component provides a draggable handle for resizing + * the span name column width in the waterfall visualization. + */ +export function SpanResizer({ handleResize, isResizing, setIsResizing }: SpanResizerProps) { + const [isHovered, setIsHovered] = useState(false); + const lastUpdateRef = useRef(0); + + const onMouseDown = (e: React.MouseEvent) => { + e.preventDefault(); + setIsResizing(true); + + const onMouseMove = (e: MouseEvent) => { + const now = Date.now(); + // Throttle to ~60fps for smooth performance + if (now - lastUpdateRef.current < 16) return; + lastUpdateRef.current = now; + requestAnimationFrame(() => handleResize(e)); + }; + + const onMouseUp = () => { + setIsResizing(false); + document.removeEventListener("mousemove", onMouseMove); + document.removeEventListener("mouseup", onMouseUp); + }; + + document.addEventListener("mousemove", onMouseMove); + document.addEventListener("mouseup", onMouseUp); + }; + + return ( +
    setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + /> + ); +} + +export default SpanResizer; diff --git a/packages/registry/components/span-tree.tsx b/packages/registry/components/span-tree.tsx new file mode 100644 index 000000000..e74b187ba --- /dev/null +++ b/packages/registry/components/span-tree.tsx @@ -0,0 +1,47 @@ +"use client"; + +import { SpanItem } from "@/components/span-item"; +import type { SpanTreeProps } from "@/lib/types"; +import { cn } from "@/lib/utils"; +import { useState } from "react"; + +/** + * SpanTree renders a hierarchical waterfall visualization for distributed trace spans. + */ +export function SpanTree({ + spans, + traceStartTimestamp, + traceDuration, + selectedSpanId, + onSpanSelect, + highlightedSpanIds, + initialNodeWidth = 50, + className, +}: SpanTreeProps) { + const [spanNodeWidth, setSpanNodeWidth] = useState(initialNodeWidth); + + if (!spans || spans.length === 0) { + return null; + } + + return ( +
      1 && "deep", className)}> + {spans.map(span => ( + + ))} +
    + ); +} + +export default SpanTree; diff --git a/packages/registry/components/theme-toggle.tsx b/packages/registry/components/theme-toggle.tsx new file mode 100644 index 000000000..869e0fd0b --- /dev/null +++ b/packages/registry/components/theme-toggle.tsx @@ -0,0 +1,37 @@ +"use client"; + +import { cn } from "@/lib/utils"; +import { Moon, Sun } from "lucide-react"; +import { useEffect, useState } from "react"; + +export function ThemeToggle() { + const [isDark, setIsDark] = useState(false); + + useEffect(() => { + // Check localStorage or system preference on mount + const stored = localStorage.getItem("theme"); + const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + const shouldBeDark = stored === "dark" || (!stored && prefersDark); + + setIsDark(shouldBeDark); + document.documentElement.classList.toggle("dark", shouldBeDark); + }, []); + + const toggle = () => { + const newValue = !isDark; + setIsDark(newValue); + document.documentElement.classList.toggle("dark", newValue); + localStorage.setItem("theme", newValue ? "dark" : "light"); + }; + + return ( + + ); +} diff --git a/packages/registry/components/time-since.tsx b/packages/registry/components/time-since.tsx new file mode 100644 index 000000000..411071e82 --- /dev/null +++ b/packages/registry/components/time-since.tsx @@ -0,0 +1,46 @@ +"use client"; + +import type { TimeSinceProps } from "@/lib/types"; +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; +import { useEffect, useState } from "react"; + +// Extend dayjs with relative time plugin +dayjs.extend(relativeTime); + +/** + * TimeSince component displays a relative time string that automatically + * updates at a configurable interval. + */ +export function TimeSince({ date, refreshInterval = 5000, ...props }: TimeSinceProps) { + const [value, setValue] = useState(() => (date ? dayjs(date).fromNow() : null)); + + useEffect(() => { + if (!date) { + setValue(null); + return; + } + + // Set initial value + setValue(dayjs(date).fromNow()); + + // Set up interval to refresh the relative time + const timer = setInterval(() => { + setValue(dayjs(date).fromNow()); + }, refreshInterval); + + return () => clearInterval(timer); + }, [date, refreshInterval]); + + if (!date || !value) return null; + + const dateTimeString = date instanceof Date ? date.toISOString() : String(date); + + return ( + + ); +} + +export default TimeSince; diff --git a/packages/registry/components/trace-badge.tsx b/packages/registry/components/trace-badge.tsx new file mode 100644 index 000000000..ee5d136d5 --- /dev/null +++ b/packages/registry/components/trace-badge.tsx @@ -0,0 +1,86 @@ +"use client"; + +import type { TraceBadgeProps } from "@/lib/types"; +import { cn } from "@/lib/utils"; + +/** + * TraceBadge displays contextual badges for trace visualization. + * Supports different variants for status, HTTP method, and environment. + */ +export function TraceBadge({ variant, value, className }: TraceBadgeProps) { + if (!value) return null; + + const baseClasses = + "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-medium transition-colors"; + + const variantClasses = { + status: getStatusClasses(value), + method: "border-transparent bg-muted text-foreground font-mono", + environment: "border-transparent bg-secondary text-secondary-foreground", + }; + + return ( + + {variant === "status" ? value.toUpperCase() : value} + + ); +} + +/** + * Returns appropriate classes based on status value. + */ +function getStatusClasses(status: string): string { + const normalizedStatus = status.toLowerCase(); + + if (normalizedStatus === "ok") { + return "border-green-500/30 bg-green-500/20 text-green-500"; + } + + if (normalizedStatus === "error" || normalizedStatus === "internal_error" || normalizedStatus === "cancelled") { + return "border-destructive/30 bg-destructive/20 text-destructive"; + } + + // Default/unknown status + return "border-muted-foreground/30 bg-muted text-muted-foreground"; +} + +/** + * StatusBadge is a convenience wrapper for status variant. + */ +export function StatusBadge({ + status, + className, +}: { + status: string; + className?: string; +}) { + return ; +} + +/** + * MethodBadge is a convenience wrapper for HTTP method variant. + */ +export function MethodBadge({ + method, + className, +}: { + method: string; + className?: string; +}) { + return ; +} + +/** + * EnvironmentBadge is a convenience wrapper for environment variant. + */ +export function EnvironmentBadge({ + environment, + className, +}: { + environment: string; + className?: string; +}) { + return ; +} + +export default TraceBadge; diff --git a/packages/registry/components/trace-item.tsx b/packages/registry/components/trace-item.tsx new file mode 100644 index 000000000..d7b19d8ed --- /dev/null +++ b/packages/registry/components/trace-item.tsx @@ -0,0 +1,83 @@ +"use client"; + +import { TimeSince } from "@/components/time-since"; +import { EnvironmentBadge, MethodBadge, StatusBadge } from "@/components/trace-badge"; +import { formatDuration } from "@/lib/duration"; +import type { TraceItemProps } from "@/lib/types"; +import { cn, truncateId } from "@/lib/utils"; +import { Activity, AlertCircle } from "lucide-react"; + +/** + * TraceItem renders a summary row for a single distributed trace. + */ +export function TraceItem({ trace, isSelected = false, onSelect, className }: TraceItemProps) { + const handleClick = () => { + onSelect?.(trace.trace_id, trace); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + handleClick(); + } + }; + + const duration = formatDuration(trace.timestamp - trace.start_timestamp); + const spanCount = trace.spans.size; + const hasError = trace.status && trace.status !== "ok"; + const truncatedId = truncateId(trace.trace_id); + + return ( +
    + {/* Status Icon */} +
    + {hasError ? ( + + ) : ( + + )} +
    + + {/* Trace ID and Time */} +
    +
    + {truncatedId} + {trace.environment && } +
    + +
    + + {/* Transaction Name */} +
    +
    + {trace.rootTransactionMethod && } + + {trace.rootTransactionName} + +
    +
    + + {/* Stats */} +
    + {hasError ? : ok} + + {duration} + + {spanCount.toLocaleString()} spans +
    +
    + ); +} + +export default TraceItem; diff --git a/packages/registry/lib/duration.ts b/packages/registry/lib/duration.ts new file mode 100644 index 000000000..edd44633b --- /dev/null +++ b/packages/registry/lib/duration.ts @@ -0,0 +1,99 @@ +/** + * Duration formatting utilities for trace visualization. + * Converts millisecond durations to human-readable strings. + */ + +/** + * Labels for duration units, keyed by millisecond thresholds. + */ +export const DURATION_LABELS: Record = { + 31557600000: "yr", + 2629800000: "mo", + 604800000: "wk", + 86400000: "d", + 3600000: "hr", + 60000: "min", + 1000: "s", +}; + +/** + * Sorted duration thresholds from largest to smallest. + */ +const DURATIONS = Object.keys(DURATION_LABELS) + .map(Number) + .sort((a, b) => b - a); + +/** + * Returns a Tailwind class name for coloring duration text based on thresholds. + * Uses shadcn-compatible color tokens. + * + * @param duration - Duration in milliseconds + * @returns Tailwind class name for text color + * + * @example + * getDurationClassName(1500) // "text-destructive" (> 1s) + * getDurationClassName(600) // "text-orange-500" (> 500ms) + * getDurationClassName(150) // "text-yellow-500" (> 100ms) + * getDurationClassName(50) // "text-muted-foreground" (< 100ms) + */ +export function getDurationClassName(duration: number): string { + if (duration > 1000) return "text-destructive"; + if (duration > 500) return "text-orange-500"; + if (duration > 100) return "text-yellow-500"; + return "text-muted-foreground"; +} + +/** + * Formats a number with specified decimal places, removing trailing zeros. + * + * @param num - Number to format + * @param decimalPlaces - Number of decimal places (default: 2) + * @returns Formatted number string + * + * @example + * formatNumber(1.5, 2) // "1.5" + * formatNumber(2.0, 2) // "2" + * formatNumber(3.14159, 2) // "3.14" + */ +export function formatNumber(num: number, decimalPlaces = 2): string { + return num.toFixed(decimalPlaces).replace(/\.?0+$/, ""); +} + +/** + * Formats a duration in milliseconds to a human-readable string. + * Automatically selects the most appropriate unit. + * + * @param duration - Duration in milliseconds + * @returns Formatted duration string with unit + * + * @example + * formatDuration(500) // "500ms" + * formatDuration(1500) // "1.5s" + * formatDuration(65000) // "1.08min" + * formatDuration(3700000) // "1.03hr" + */ +export function formatDuration(duration: number): string { + for (const limit of DURATIONS) { + if (duration >= limit) { + const num = formatNumber(duration / limit); + return `${num}${DURATION_LABELS[limit]}`; + } + } + return `${formatNumber(duration)}ms`; +} + +/** + * Calculates and formats the duration of a span. + * + * @param span - Object with start_timestamp and timestamp properties + * @returns Formatted duration string + * + * @example + * formatSpanDuration({ start_timestamp: 1000, timestamp: 1500 }) // "500ms" + */ +export function formatSpanDuration(span: { + timestamp: number; + start_timestamp: number; +}): string { + return formatDuration(span.timestamp - span.start_timestamp); +} diff --git a/packages/registry/lib/types.ts b/packages/registry/lib/types.ts new file mode 100644 index 000000000..5418fbf5d --- /dev/null +++ b/packages/registry/lib/types.ts @@ -0,0 +1,163 @@ +/** + * Generic span interface compatible with OpenTelemetry trace data. + * This represents a single unit of work within a distributed trace. + */ +export interface SpanData { + /** Unique identifier for this span */ + span_id: string; + /** Trace ID this span belongs to */ + trace_id?: string; + /** Parent span ID, null for root spans */ + parent_span_id?: string | null; + /** Operation name (e.g., "http.request", "db.query") */ + op?: string | null; + /** Human-readable description of the span */ + description?: string | null; + /** Start time as Unix timestamp in milliseconds */ + start_timestamp: number; + /** End time as Unix timestamp in milliseconds */ + timestamp: number; + /** Span status ("ok", "error", or custom string) */ + status?: "ok" | "error" | string; + /** Child spans */ + children?: SpanData[]; + /** Additional span attributes/data */ + data?: Record; + /** Key-value tags for filtering and categorization */ + tags?: Record; +} + +/** + * Generic trace interface representing a complete distributed trace. + * Contains all spans and metadata for a single trace. + */ +export interface TraceData { + /** Unique trace identifier */ + trace_id: string; + /** Start time of the trace (earliest span start) */ + start_timestamp: number; + /** End time of the trace (latest span end) */ + timestamp: number; + /** Overall trace status */ + status?: "ok" | "error" | string; + /** Map of span_id to SpanData for quick lookups */ + spans: Map; + /** Hierarchical tree of spans with children populated */ + spanTree: SpanData[]; + /** Name of the root transaction/operation */ + rootTransactionName: string; + /** HTTP method if applicable (GET, POST, etc.) */ + rootTransactionMethod?: string; + /** Number of transactions in this trace */ + transactionCount?: number; + /** Total number of spans */ + spanCount?: number; + /** Platform identifier (e.g., "javascript", "python") */ + platform?: string; + /** Environment (e.g., "production", "development") */ + environment?: string; +} + +/** + * Props for the SpanTree component. + * Renders a hierarchical waterfall visualization of spans. + */ +export interface SpanTreeProps { + /** Array of root spans (with children populated) */ + spans: SpanData[]; + /** Start timestamp of the entire trace (for waterfall positioning) */ + traceStartTimestamp: number; + /** Total duration of the trace in milliseconds */ + traceDuration: number; + /** Currently selected span ID */ + selectedSpanId?: string; + /** Callback when a span is clicked */ + onSpanSelect?: (spanId: string, span: SpanData) => void; + /** Optional: Set of span IDs to highlight (e.g., search results) */ + highlightedSpanIds?: Set; + /** Initial width percentage of the span name column (default: 50) */ + initialNodeWidth?: number; + /** Custom class name for the root element */ + className?: string; +} + +/** + * Props for individual SpanItem component. + * Renders a single span row with timing bar and children. + */ +export interface SpanItemProps { + /** The span data to render */ + span: SpanData; + /** Start timestamp of the entire trace */ + startTimestamp: number; + /** Total duration of the trace in milliseconds */ + totalDuration: number; + /** Current nesting depth (used for auto-collapse) */ + depth?: number; + /** Currently selected span ID */ + selectedSpanId?: string; + /** Set of span IDs to highlight */ + highlightedSpanIds?: Set; + /** Callback when this span is clicked */ + onSpanSelect?: (spanId: string, span: SpanData) => void; + /** Current width of the span name column (percentage) */ + spanNodeWidth: number; + /** Callback to update the span name column width */ + onNodeWidthChange?: (width: number) => void; +} + +/** + * Props for the TraceItem component. + * Renders a summary row for a single trace. + */ +export interface TraceItemProps { + /** The trace data to render */ + trace: TraceData; + /** Whether this trace is currently selected */ + isSelected?: boolean; + /** Callback when trace is clicked */ + onSelect?: (traceId: string, trace: TraceData) => void; + /** Custom class name */ + className?: string; +} + +/** + * Props for the TimeSince component. + * Displays relative time (e.g., "2 minutes ago"). + */ +export interface TimeSinceProps extends React.HTMLAttributes { + /** The date/timestamp to show relative time for */ + date: string | number | Date; + /** How often to refresh the display in milliseconds (default: 5000) */ + refreshInterval?: number; +} + +/** + * Props for the SpanResizer component. + * Handles draggable resize of the span name column. + */ +export interface SpanResizerProps { + /** Callback during resize with mouse event */ + handleResize: (e: MouseEvent) => void; + /** Whether currently resizing */ + isResizing: boolean; + /** Callback to set resizing state */ + setIsResizing: (val: boolean) => void; +} + +/** + * Variant types for trace badges. + */ +export type TraceBadgeVariant = "status" | "method" | "environment"; + +/** + * Props for TraceBadge component. + */ +export interface TraceBadgeProps { + /** The badge variant */ + variant: TraceBadgeVariant; + /** The value to display */ + value: string; + /** Custom class name */ + className?: string; +} diff --git a/packages/registry/lib/utils.ts b/packages/registry/lib/utils.ts index 365058ceb..d5142195a 100644 --- a/packages/registry/lib/utils.ts +++ b/packages/registry/lib/utils.ts @@ -1,6 +1,18 @@ import { type ClassValue, clsx } from "clsx"; import { twMerge } from "tailwind-merge"; +/** + * Utility function to merge Tailwind CSS classes with conditional support. + * Combines clsx for conditional classes and tailwind-merge for deduplication. + */ export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } + +/** + * Truncates an ID string to a specified length. + * Useful for displaying shortened trace/span IDs. + */ +export function truncateId(id = "", length = 8): string { + return id.substring(0, length); +} diff --git a/packages/registry/package.json b/packages/registry/package.json index 918d36295..786daa664 100644 --- a/packages/registry/package.json +++ b/packages/registry/package.json @@ -10,6 +10,7 @@ "dependencies": { "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "dayjs": "^1.11.13", "lucide-react": "^0.563.0", "next": "16.1.4", "react": "19.2.3", diff --git a/packages/registry/tsconfig.json b/packages/registry/tsconfig.json index cc9ed39b5..02d8dee79 100644 --- a/packages/registry/tsconfig.json +++ b/packages/registry/tsconfig.json @@ -11,7 +11,7 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "react-jsx", + "jsx": "preserve", "incremental": true, "plugins": [ { diff --git a/packages/spotlight/coverage/coverage-final.json b/packages/spotlight/coverage/coverage-final.json new file mode 100644 index 000000000..c6fafdb0e --- /dev/null +++ b/packages/spotlight/coverage/coverage-final.json @@ -0,0 +1,9 @@ +{"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-item.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-item.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":75}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":69}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":89}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":78}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":52}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":43}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":41}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":69}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":74}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":40}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":2}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":53}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":55}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":41}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":34}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":2}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":11}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":12}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":20}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":32}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":55}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":23}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":37}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":3}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":26}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":7}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":17}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":16}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":12}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":21}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":15}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":16}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":19}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":51}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":51}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":48}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":84}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":54}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":0}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":61}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":53}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":62}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":55}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":43}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":52}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":64}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":68}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":40}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":62}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":5}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":4}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":29}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":39}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":4}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":0}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":53}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":45}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":25}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":20}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":5}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":4}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":0}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":10}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":27}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":10}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":21}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":20}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":29}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":33}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":22}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":57}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":30}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":43}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":35}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":41}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":10}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":63}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":7}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":32}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":12}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":24}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":70}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":38}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":54}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":12}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":70}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":9}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":64}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":33}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":19}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":27}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":28}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":68}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":71}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":38}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":16}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":29}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":36}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":46}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":16}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":13}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":29}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":117}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":21}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":12}},"118":{"start":{"line":119,"column":0},"end":{"line":119,"column":0}},"119":{"start":{"line":120,"column":0},"end":{"line":120,"column":32}},"120":{"start":{"line":121,"column":0},"end":{"line":121,"column":23}},"121":{"start":{"line":122,"column":0},"end":{"line":122,"column":14}},"122":{"start":{"line":123,"column":0},"end":{"line":123,"column":76}},"123":{"start":{"line":124,"column":0},"end":{"line":124,"column":62}},"124":{"start":{"line":125,"column":0},"end":{"line":125,"column":15}},"125":{"start":{"line":126,"column":0},"end":{"line":126,"column":12}},"126":{"start":{"line":127,"column":0},"end":{"line":127,"column":0}},"127":{"start":{"line":128,"column":0},"end":{"line":128,"column":40}},"128":{"start":{"line":129,"column":0},"end":{"line":129,"column":78}},"129":{"start":{"line":130,"column":0},"end":{"line":130,"column":46}},"130":{"start":{"line":131,"column":0},"end":{"line":131,"column":17}},"131":{"start":{"line":132,"column":0},"end":{"line":132,"column":14}},"132":{"start":{"line":133,"column":0},"end":{"line":133,"column":0}},"133":{"start":{"line":134,"column":0},"end":{"line":134,"column":32}},"134":{"start":{"line":135,"column":0},"end":{"line":135,"column":12}},"135":{"start":{"line":136,"column":0},"end":{"line":136,"column":91}},"136":{"start":{"line":137,"column":0},"end":{"line":137,"column":47}},"137":{"start":{"line":138,"column":0},"end":{"line":138,"column":9}},"138":{"start":{"line":139,"column":0},"end":{"line":139,"column":107}},"139":{"start":{"line":140,"column":0},"end":{"line":140,"column":0}},"140":{"start":{"line":141,"column":0},"end":{"line":141,"column":28}},"141":{"start":{"line":142,"column":0},"end":{"line":142,"column":14}},"142":{"start":{"line":143,"column":0},"end":{"line":143,"column":68}},"143":{"start":{"line":144,"column":0},"end":{"line":144,"column":20}},"144":{"start":{"line":145,"column":0},"end":{"line":145,"column":118}},"145":{"start":{"line":146,"column":0},"end":{"line":146,"column":73}},"146":{"start":{"line":147,"column":0},"end":{"line":147,"column":14}},"147":{"start":{"line":148,"column":0},"end":{"line":148,"column":11}},"148":{"start":{"line":149,"column":0},"end":{"line":149,"column":98}},"149":{"start":{"line":150,"column":0},"end":{"line":150,"column":44}},"150":{"start":{"line":151,"column":0},"end":{"line":151,"column":19}},"151":{"start":{"line":152,"column":0},"end":{"line":152,"column":16}},"152":{"start":{"line":153,"column":0},"end":{"line":153,"column":14}},"153":{"start":{"line":154,"column":0},"end":{"line":154,"column":12}},"154":{"start":{"line":155,"column":0},"end":{"line":155,"column":0}},"155":{"start":{"line":156,"column":0},"end":{"line":156,"column":41}},"156":{"start":{"line":157,"column":0},"end":{"line":157,"column":45}},"157":{"start":{"line":158,"column":0},"end":{"line":158,"column":17}},"158":{"start":{"line":159,"column":0},"end":{"line":159,"column":32}},"159":{"start":{"line":160,"column":0},"end":{"line":160,"column":46}},"160":{"start":{"line":161,"column":0},"end":{"line":161,"column":39}},"161":{"start":{"line":162,"column":0},"end":{"line":162,"column":41}},"162":{"start":{"line":163,"column":0},"end":{"line":163,"column":49}},"163":{"start":{"line":164,"column":0},"end":{"line":164,"column":37}},"164":{"start":{"line":165,"column":0},"end":{"line":165,"column":42}},"165":{"start":{"line":166,"column":0},"end":{"line":166,"column":10}},"166":{"start":{"line":167,"column":0},"end":{"line":167,"column":8}},"167":{"start":{"line":168,"column":0},"end":{"line":168,"column":9}},"168":{"start":{"line":169,"column":0},"end":{"line":169,"column":4}},"169":{"start":{"line":170,"column":0},"end":{"line":170,"column":1}},"170":{"start":{"line":171,"column":0},"end":{"line":171,"column":0}},"171":{"start":{"line":172,"column":0},"end":{"line":172,"column":24}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":11,"34":11,"35":11,"36":11,"37":11,"38":11,"39":11,"40":11,"41":11,"42":11,"43":11,"44":11,"45":11,"46":11,"47":11,"48":11,"49":11,"50":11,"51":11,"52":11,"53":11,"54":11,"55":11,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":11,"64":11,"65":1,"66":1,"67":11,"68":11,"69":0,"70":0,"71":0,"72":0,"73":0,"74":11,"75":11,"76":11,"77":11,"78":11,"79":11,"80":11,"81":11,"82":11,"83":11,"84":11,"85":11,"86":11,"87":11,"88":11,"89":11,"90":11,"91":11,"92":11,"93":11,"94":11,"95":11,"96":11,"97":11,"98":11,"99":11,"100":11,"101":11,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":0,"111":0,"112":0,"113":1,"114":1,"115":1,"116":1,"117":11,"118":11,"119":11,"120":11,"121":11,"122":11,"123":11,"124":11,"125":11,"126":11,"127":11,"128":11,"129":11,"130":11,"131":11,"132":11,"133":11,"134":11,"135":11,"136":11,"137":11,"138":11,"139":11,"140":11,"141":11,"142":11,"143":11,"144":11,"145":11,"146":11,"147":11,"148":11,"149":11,"150":11,"151":11,"152":11,"153":11,"154":11,"155":11,"156":11,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"163":1,"164":1,"165":1,"166":11,"167":11,"168":11,"169":11,"170":1,"171":1},"branchMap":{"0":{"type":"branch","line":33,"loc":{"start":{"line":33,"column":7},"end":{"line":170,"column":1}},"locations":[{"start":{"line":33,"column":7},"end":{"line":170,"column":1}}]},"1":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":39},"end":{"line":45,"column":51}},"locations":[{"start":{"line":45,"column":39},"end":{"line":45,"column":51}}]},"2":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":24},"end":{"line":53,"column":48}},"locations":[{"start":{"line":53,"column":24},"end":{"line":53,"column":48}}]},"3":{"type":"branch","line":86,"loc":{"start":{"line":86,"column":10},"end":{"line":86,"column":43}},"locations":[{"start":{"line":86,"column":10},"end":{"line":86,"column":43}}]},"4":{"type":"branch","line":87,"loc":{"start":{"line":87,"column":10},"end":{"line":87,"column":35}},"locations":[{"start":{"line":87,"column":10},"end":{"line":87,"column":35}}]},"5":{"type":"branch","line":88,"loc":{"start":{"line":88,"column":10},"end":{"line":88,"column":41}},"locations":[{"start":{"line":88,"column":10},"end":{"line":88,"column":41}}]},"6":{"type":"branch","line":90,"loc":{"start":{"line":90,"column":32},"end":{"line":90,"column":54}},"locations":[{"start":{"line":90,"column":32},"end":{"line":90,"column":54}}]},"7":{"type":"branch","line":97,"loc":{"start":{"line":97,"column":12},"end":{"line":97,"column":38}},"locations":[{"start":{"line":97,"column":12},"end":{"line":97,"column":38}}]},"8":{"type":"branch","line":97,"loc":{"start":{"line":97,"column":25},"end":{"line":97,"column":54}},"locations":[{"start":{"line":97,"column":25},"end":{"line":97,"column":54}}]},"9":{"type":"branch","line":102,"loc":{"start":{"line":102,"column":27},"end":{"line":117,"column":21}},"locations":[{"start":{"line":102,"column":27},"end":{"line":117,"column":21}}]},"10":{"type":"branch","line":116,"loc":{"start":{"line":116,"column":73},"end":{"line":116,"column":100}},"locations":[{"start":{"line":116,"column":73},"end":{"line":116,"column":100}}]},"11":{"type":"branch","line":129,"loc":{"start":{"line":129,"column":49},"end":{"line":129,"column":78}},"locations":[{"start":{"line":129,"column":49},"end":{"line":129,"column":78}}]},"12":{"type":"branch","line":130,"loc":{"start":{"line":130,"column":18},"end":{"line":130,"column":46}},"locations":[{"start":{"line":130,"column":18},"end":{"line":130,"column":46}}]},"13":{"type":"branch","line":157,"loc":{"start":{"line":157,"column":39},"end":{"line":166,"column":10}},"locations":[{"start":{"line":157,"column":39},"end":{"line":166,"column":10}}]},"14":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":22},"end":{"line":67,"column":4}},"locations":[{"start":{"line":65,"column":22},"end":{"line":67,"column":4}}]}},"b":{"0":[11],"1":[0],"2":[1],"3":[1],"4":[1],"5":[1],"6":[0],"7":[1],"8":[10],"9":[1],"10":[0],"11":[0],"12":[0],"13":[1],"14":[1]},"fnMap":{"0":{"name":"SpanItem","decl":{"start":{"line":33,"column":7},"end":{"line":170,"column":1}},"loc":{"start":{"line":33,"column":7},"end":{"line":170,"column":1}},"line":33},"1":{"name":"handleResize","decl":{"start":{"line":56,"column":23},"end":{"line":63,"column":4}},"loc":{"start":{"line":56,"column":23},"end":{"line":63,"column":4}},"line":56},"2":{"name":"handleClick","decl":{"start":{"line":65,"column":22},"end":{"line":67,"column":4}},"loc":{"start":{"line":65,"column":22},"end":{"line":67,"column":4}},"line":65},"3":{"name":"handleKeyDown","decl":{"start":{"line":69,"column":24},"end":{"line":74,"column":4}},"loc":{"start":{"line":69,"column":24},"end":{"line":74,"column":4}},"line":69},"4":{"name":"onClick","decl":{"start":{"line":110,"column":23},"end":{"line":113,"column":16}},"loc":{"start":{"line":110,"column":23},"end":{"line":113,"column":16}},"line":110}},"f":{"0":11,"1":0,"2":1,"3":0,"4":0}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-resizer.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-resizer.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":71}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":41}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":0}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":3}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":65}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":61}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":65}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":30}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":3}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":92}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":52}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":34}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":0}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":48}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":23}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":24}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":44}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":29}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":50}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":51}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":51}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":6}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":29}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":27}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":61}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":57}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":6}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":0}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":56}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":52}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":4}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":10}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":8}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":20}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":84}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":66}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":8}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":14}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":73}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":31}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":45}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":46}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":6}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":4}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":1}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":0}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":27}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":11,"15":11,"16":11,"17":11,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":11,"39":11,"40":11,"41":11,"42":11,"43":11,"44":11,"45":11,"46":11,"47":11,"48":11,"49":11,"50":11,"51":11,"52":11,"53":11,"54":1,"55":1},"branchMap":{"0":{"type":"branch","line":14,"loc":{"start":{"line":14,"column":7},"end":{"line":54,"column":1}},"locations":[{"start":{"line":14,"column":7},"end":{"line":54,"column":1}}]},"1":{"type":"branch","line":44,"loc":{"start":{"line":44,"column":22},"end":{"line":44,"column":49}},"locations":[{"start":{"line":44,"column":22},"end":{"line":44,"column":49}}]},"2":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":33},"end":{"line":47,"column":66}},"locations":[{"start":{"line":47,"column":33},"end":{"line":47,"column":66}}]}},"b":{"0":[11],"1":[0],"2":[0]},"fnMap":{"0":{"name":"SpanResizer","decl":{"start":{"line":14,"column":7},"end":{"line":54,"column":1}},"loc":{"start":{"line":14,"column":7},"end":{"line":54,"column":1}},"line":14},"1":{"name":"onMouseDown","decl":{"start":{"line":18,"column":22},"end":{"line":38,"column":4}},"loc":{"start":{"line":18,"column":22},"end":{"line":38,"column":4}},"line":18},"2":{"name":"onMouseEnter","decl":{"start":{"line":50,"column":20},"end":{"line":50,"column":45}},"loc":{"start":{"line":50,"column":20},"end":{"line":50,"column":45}},"line":50},"3":{"name":"onMouseLeave","decl":{"start":{"line":51,"column":20},"end":{"line":51,"column":46}},"loc":{"start":{"line":51,"column":20},"end":{"line":51,"column":46}},"line":51}},"f":{"0":11,"1":0,"2":0,"3":0}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-tree.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/span-tree.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":68}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":52}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":33}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":3}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":87}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":12}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":60}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":67}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":62}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":38}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":52}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":42}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":2}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":9}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":12}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":27}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":48}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":60}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":32}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":34}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":43}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":25}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":7}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":6}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":29}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":9}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":35}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":71}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":5}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":2}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":12}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":27}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":48}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":34}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":41}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":5}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":6}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":26}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":8}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":22}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":16}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":17}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":15}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":21}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":24}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":12}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":19}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":71}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":0}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":37}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":16}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":3}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":0}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":10}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":75}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":26}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":17}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":28}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":21}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":46}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":39}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":19}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":41}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":49}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":37}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":39}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":46}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":10}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":9}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":9}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":4}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":1}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":0}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":24}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":11,"48":11,"49":11,"50":11,"51":11,"52":11,"53":11,"54":11,"55":11,"56":11,"57":11,"58":11,"59":1,"60":1,"61":10,"62":10,"63":11,"64":11,"65":11,"66":11,"67":11,"68":11,"69":11,"70":11,"71":11,"72":11,"73":11,"74":11,"75":11,"76":11,"77":11,"78":11,"79":11,"80":11,"81":1,"82":1},"branchMap":{"0":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":7},"end":{"line":81,"column":1}},"locations":[{"start":{"line":47,"column":7},"end":{"line":81,"column":1}}]},"1":{"type":"branch","line":59,"loc":{"start":{"line":59,"column":36},"end":{"line":61,"column":3}},"locations":[{"start":{"line":59,"column":36},"end":{"line":61,"column":3}}]},"2":{"type":"branch","line":61,"loc":{"start":{"line":61,"column":2},"end":{"line":64,"column":55}},"locations":[{"start":{"line":61,"column":2},"end":{"line":64,"column":55}}]},"3":{"type":"branch","line":64,"loc":{"start":{"line":64,"column":50},"end":{"line":64,"column":63}},"locations":[{"start":{"line":64,"column":50},"end":{"line":64,"column":63}}]},"4":{"type":"branch","line":65,"loc":{"start":{"line":65,"column":17},"end":{"line":77,"column":10}},"locations":[{"start":{"line":65,"column":17},"end":{"line":77,"column":10}}]}},"b":{"0":[11],"1":[1],"2":[10],"3":[1],"4":[11]},"fnMap":{"0":{"name":"SpanTree","decl":{"start":{"line":47,"column":7},"end":{"line":81,"column":1}},"loc":{"start":{"line":47,"column":7},"end":{"line":81,"column":1}},"line":47}},"f":{"0":11}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/time-since.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/time-since.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":69}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":26}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":53}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":44}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":0}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":41}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":27}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":73}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":38}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":2}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":11}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":45}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":30}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":2}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":11}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":77}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":59}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":3}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":87}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":97}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":19}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":16}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":21}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":13}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":5}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":0}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":24}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":36}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":51}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":37}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":38}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":24}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":0}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":38}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":30}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":0}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":35}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":82}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":0}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":10}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":47}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":13}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":11}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":1}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":0}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":25}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":14,"24":14,"25":14,"26":14,"27":0,"28":0,"29":0,"30":14,"31":14,"32":14,"33":14,"34":14,"35":14,"36":0,"37":14,"38":14,"39":14,"40":14,"41":14,"42":14,"43":14,"44":14,"45":14,"46":14,"47":14,"48":14,"49":14,"50":14,"51":14,"52":1,"53":1},"branchMap":{"0":{"type":"branch","line":23,"loc":{"start":{"line":23,"column":7},"end":{"line":52,"column":1}},"locations":[{"start":{"line":23,"column":7},"end":{"line":52,"column":1}}]},"1":{"type":"branch","line":43,"loc":{"start":{"line":43,"column":23},"end":{"line":43,"column":35}},"locations":[{"start":{"line":43,"column":23},"end":{"line":43,"column":35}}]},"2":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":41},"end":{"line":45,"column":69}},"locations":[{"start":{"line":45,"column":41},"end":{"line":45,"column":69}}]},"3":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":52},"end":{"line":24,"column":95}},"locations":[{"start":{"line":24,"column":52},"end":{"line":24,"column":95}}]},"4":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":86},"end":{"line":24,"column":95}},"locations":[{"start":{"line":24,"column":86},"end":{"line":24,"column":95}}]},"5":{"type":"branch","line":26,"loc":{"start":{"line":26,"column":12},"end":{"line":41,"column":5}},"locations":[{"start":{"line":26,"column":12},"end":{"line":41,"column":5}}]},"6":{"type":"branch","line":27,"loc":{"start":{"line":27,"column":15},"end":{"line":30,"column":5}},"locations":[{"start":{"line":27,"column":15},"end":{"line":30,"column":5}}]},"7":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":11},"end":{"line":40,"column":38}},"locations":[{"start":{"line":40,"column":11},"end":{"line":40,"column":38}}]}},"b":{"0":[14],"1":[0],"2":[0],"3":[14],"4":[0],"5":[14],"6":[0],"7":[14]},"fnMap":{"0":{"name":"TimeSince","decl":{"start":{"line":23,"column":7},"end":{"line":52,"column":1}},"loc":{"start":{"line":23,"column":7},"end":{"line":52,"column":1}},"line":23}},"f":{"0":14}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-badge.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-badge.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":70}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":52}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":65}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":72}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":2}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":11}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":45}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":48}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":46}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":58}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":3}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":76}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":26}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":21}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":103}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":0}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":26}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":36}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":68}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":77}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":4}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":0}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":10}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":74}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":58}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":11}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":4}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":0}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":3}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":53}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":3}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":51}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":48}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":0}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":34}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":64}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":3}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":0}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":114}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":70}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":0}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":27}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":69}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":1}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":3}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":59}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":3}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":29}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":9}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":12}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":4}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":17}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":21}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":4}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":78}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":1}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":0}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":3}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":64}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":3}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":29}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":9}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":12}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":4}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":17}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":21}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":4}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":78}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":1}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":0}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":3}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":69}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":34}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":14}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":12}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":4}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":22}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":21}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":4}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":88}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":1}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":0}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":26}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":15,"17":15,"18":15,"19":15,"20":15,"21":15,"22":15,"23":15,"24":15,"25":15,"26":15,"27":15,"28":15,"29":15,"30":15,"31":15,"32":15,"33":1,"34":1,"35":1,"36":1,"37":15,"38":15,"39":15,"40":15,"41":0,"42":0,"43":15,"44":15,"45":1,"46":1,"47":14,"48":14,"49":14,"50":14,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":13,"70":13,"71":13,"72":13,"73":13,"74":13,"75":13,"76":13,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1},"branchMap":{"0":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":7},"end":{"line":33,"column":1}},"locations":[{"start":{"line":16,"column":7},"end":{"line":33,"column":1}}]},"1":{"type":"branch","line":17,"loc":{"start":{"line":17,"column":14},"end":{"line":17,"column":26}},"locations":[{"start":{"line":17,"column":14},"end":{"line":17,"column":26}}]},"2":{"type":"branch","line":30,"loc":{"start":{"line":30,"column":19},"end":{"line":30,"column":52}},"locations":[{"start":{"line":30,"column":19},"end":{"line":30,"column":52}}]},"3":{"type":"branch","line":30,"loc":{"start":{"line":30,"column":48},"end":{"line":30,"column":58}},"locations":[{"start":{"line":30,"column":48},"end":{"line":30,"column":58}}]},"4":{"type":"branch","line":38,"loc":{"start":{"line":38,"column":0},"end":{"line":51,"column":1}},"locations":[{"start":{"line":38,"column":0},"end":{"line":51,"column":1}}]},"5":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":33},"end":{"line":43,"column":3}},"locations":[{"start":{"line":41,"column":33},"end":{"line":43,"column":3}}]},"6":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":27},"end":{"line":45,"column":79}},"locations":[{"start":{"line":45,"column":27},"end":{"line":45,"column":79}}]},"7":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":59},"end":{"line":45,"column":113}},"locations":[{"start":{"line":45,"column":59},"end":{"line":45,"column":113}}]},"8":{"type":"branch","line":45,"loc":{"start":{"line":45,"column":113},"end":{"line":47,"column":3}},"locations":[{"start":{"line":45,"column":113},"end":{"line":47,"column":3}}]},"9":{"type":"branch","line":47,"loc":{"start":{"line":47,"column":2},"end":{"line":51,"column":1}},"locations":[{"start":{"line":47,"column":2},"end":{"line":51,"column":1}}]},"10":{"type":"branch","line":56,"loc":{"start":{"line":56,"column":7},"end":{"line":64,"column":1}},"locations":[{"start":{"line":56,"column":7},"end":{"line":64,"column":1}}]},"11":{"type":"branch","line":69,"loc":{"start":{"line":69,"column":7},"end":{"line":77,"column":1}},"locations":[{"start":{"line":69,"column":7},"end":{"line":77,"column":1}}]},"12":{"type":"branch","line":82,"loc":{"start":{"line":82,"column":7},"end":{"line":90,"column":1}},"locations":[{"start":{"line":82,"column":7},"end":{"line":90,"column":1}}]}},"b":{"0":[15],"1":[0],"2":[1],"3":[14],"4":[15],"5":[0],"6":[14],"7":[14],"8":[1],"9":[14],"10":[1],"11":[13],"12":[1]},"fnMap":{"0":{"name":"TraceBadge","decl":{"start":{"line":16,"column":7},"end":{"line":33,"column":1}},"loc":{"start":{"line":16,"column":7},"end":{"line":33,"column":1}},"line":16},"1":{"name":"getStatusClasses","decl":{"start":{"line":38,"column":0},"end":{"line":51,"column":1}},"loc":{"start":{"line":38,"column":0},"end":{"line":51,"column":1}},"line":38},"2":{"name":"StatusBadge","decl":{"start":{"line":56,"column":7},"end":{"line":64,"column":1}},"loc":{"start":{"line":56,"column":7},"end":{"line":64,"column":1}},"line":56},"3":{"name":"MethodBadge","decl":{"start":{"line":69,"column":7},"end":{"line":77,"column":1}},"loc":{"start":{"line":69,"column":7},"end":{"line":77,"column":1}},"line":69},"4":{"name":"EnvironmentBadge","decl":{"start":{"line":82,"column":7},"end":{"line":90,"column":1}},"loc":{"start":{"line":82,"column":7},"end":{"line":90,"column":1}},"line":82}},"f":{"0":15,"1":15,"2":1,"3":13,"4":1}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-item.tsx": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/components/trace-item.tsx","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":13}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":0}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":71}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":105}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":67}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":69}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":52}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":60}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":53}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":0}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":3}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":66}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":66}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":2}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":12}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":58}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":47}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":40}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":34}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":31}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":2}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":11}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":9}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":13}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":22}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":56}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":31}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":30}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":45}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":7}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":5}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":6}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":2}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":21}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":9}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":29}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":29}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":17}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":29}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":22}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":51}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":33}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":9}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":8}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":9}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":6}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":3}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":95}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":29}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":38}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":4}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":0}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":53}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":45}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":25}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":20}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":5}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":4}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":0}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":75}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":37}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":57}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":49}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":0}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":10}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":8}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":19}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":18}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":27}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":31}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":20}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":61}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":46}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":33}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":18}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":8}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":5}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":25}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":37}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":21}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":62}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":13}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":64}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":10}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":12}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":0}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":31}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":69}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":51}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":70}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":85}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":14}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":92}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":12}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":0}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":30}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":38}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":49}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":95}},"99":{"start":{"line":100,"column":0},"end":{"line":100,"column":83}},"100":{"start":{"line":101,"column":0},"end":{"line":101,"column":39}},"101":{"start":{"line":102,"column":0},"end":{"line":102,"column":17}},"102":{"start":{"line":103,"column":0},"end":{"line":103,"column":14}},"103":{"start":{"line":104,"column":0},"end":{"line":104,"column":12}},"104":{"start":{"line":105,"column":0},"end":{"line":105,"column":0}},"105":{"start":{"line":106,"column":0},"end":{"line":106,"column":19}},"106":{"start":{"line":107,"column":0},"end":{"line":107,"column":87}},"107":{"start":{"line":108,"column":0},"end":{"line":108,"column":104}},"108":{"start":{"line":109,"column":0},"end":{"line":109,"column":22}},"109":{"start":{"line":110,"column":0},"end":{"line":110,"column":31}},"110":{"start":{"line":111,"column":0},"end":{"line":111,"column":22}},"111":{"start":{"line":112,"column":0},"end":{"line":112,"column":55}},"112":{"start":{"line":113,"column":0},"end":{"line":113,"column":12}},"113":{"start":{"line":114,"column":0},"end":{"line":114,"column":10}},"114":{"start":{"line":115,"column":0},"end":{"line":115,"column":4}},"115":{"start":{"line":116,"column":0},"end":{"line":116,"column":1}},"116":{"start":{"line":117,"column":0},"end":{"line":117,"column":0}},"117":{"start":{"line":118,"column":0},"end":{"line":118,"column":25}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":14,"49":2,"50":2,"51":14,"52":14,"53":1,"54":1,"55":1,"56":1,"57":1,"58":14,"59":14,"60":14,"61":14,"62":14,"63":14,"64":14,"65":14,"66":14,"67":14,"68":14,"69":14,"70":14,"71":14,"72":14,"73":14,"74":14,"75":14,"76":14,"77":14,"78":14,"79":14,"80":1,"81":13,"82":13,"83":14,"84":14,"85":14,"86":14,"87":14,"88":14,"89":14,"90":14,"91":14,"92":14,"93":14,"94":14,"95":14,"96":14,"97":14,"98":14,"99":14,"100":14,"101":14,"102":14,"103":14,"104":14,"105":14,"106":14,"107":14,"108":14,"109":14,"110":14,"111":14,"112":14,"113":14,"114":14,"115":14,"116":1,"117":1},"branchMap":{"0":{"type":"branch","line":48,"loc":{"start":{"line":48,"column":7},"end":{"line":116,"column":1}},"locations":[{"start":{"line":48,"column":7},"end":{"line":116,"column":1}}]},"1":{"type":"branch","line":74,"loc":{"start":{"line":74,"column":8},"end":{"line":74,"column":33}},"locations":[{"start":{"line":74,"column":8},"end":{"line":74,"column":33}}]},"2":{"type":"branch","line":80,"loc":{"start":{"line":80,"column":9},"end":{"line":81,"column":62}},"locations":[{"start":{"line":80,"column":9},"end":{"line":81,"column":62}}]},"3":{"type":"branch","line":81,"loc":{"start":{"line":81,"column":60},"end":{"line":83,"column":64}},"locations":[{"start":{"line":81,"column":60},"end":{"line":83,"column":64}}]},"4":{"type":"branch","line":91,"loc":{"start":{"line":91,"column":17},"end":{"line":91,"column":85}},"locations":[{"start":{"line":91,"column":17},"end":{"line":91,"column":85}}]},"5":{"type":"branch","line":99,"loc":{"start":{"line":99,"column":17},"end":{"line":99,"column":95}},"locations":[{"start":{"line":99,"column":17},"end":{"line":99,"column":95}}]},"6":{"type":"branch","line":108,"loc":{"start":{"line":108,"column":9},"end":{"line":108,"column":61}},"locations":[{"start":{"line":108,"column":9},"end":{"line":108,"column":61}}]},"7":{"type":"branch","line":108,"loc":{"start":{"line":108,"column":56},"end":{"line":108,"column":104}},"locations":[{"start":{"line":108,"column":56},"end":{"line":108,"column":104}}]},"8":{"type":"branch","line":49,"loc":{"start":{"line":49,"column":22},"end":{"line":51,"column":4}},"locations":[{"start":{"line":49,"column":22},"end":{"line":51,"column":4}}]},"9":{"type":"branch","line":53,"loc":{"start":{"line":53,"column":24},"end":{"line":58,"column":4}},"locations":[{"start":{"line":53,"column":24},"end":{"line":58,"column":4}}]},"10":{"type":"branch","line":54,"loc":{"start":{"line":54,"column":18},"end":{"line":54,"column":44}},"locations":[{"start":{"line":54,"column":18},"end":{"line":54,"column":44}}]}},"b":{"0":[14],"1":[1],"2":[1],"3":[13],"4":[1],"5":[13],"6":[1],"7":[13],"8":[2],"9":[1],"10":[0]},"fnMap":{"0":{"name":"TraceItem","decl":{"start":{"line":48,"column":7},"end":{"line":116,"column":1}},"loc":{"start":{"line":48,"column":7},"end":{"line":116,"column":1}},"line":48},"1":{"name":"handleClick","decl":{"start":{"line":49,"column":22},"end":{"line":51,"column":4}},"loc":{"start":{"line":49,"column":22},"end":{"line":51,"column":4}},"line":49},"2":{"name":"handleKeyDown","decl":{"start":{"line":53,"column":24},"end":{"line":58,"column":4}},"loc":{"start":{"line":53,"column":24},"end":{"line":58,"column":4}},"line":53}},"f":{"0":14,"1":2,"2":1}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/duration.ts": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/duration.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":3}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":57}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":60}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":3}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":3}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":62}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":3}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":56}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":20}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":19}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":18}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":16}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":16}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":15}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":12}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":2}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":55}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":3}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":46}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":14}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":25}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":0}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":3}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":80}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":39}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":2}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":45}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":46}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":2}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":11}},"33":{"start":{"line":34,"column":0},"end":{"line":34,"column":58}},"34":{"start":{"line":35,"column":0},"end":{"line":35,"column":60}},"35":{"start":{"line":36,"column":0},"end":{"line":36,"column":60}},"36":{"start":{"line":37,"column":0},"end":{"line":37,"column":66}},"37":{"start":{"line":38,"column":0},"end":{"line":38,"column":3}},"38":{"start":{"line":39,"column":0},"end":{"line":39,"column":64}},"39":{"start":{"line":40,"column":0},"end":{"line":40,"column":49}},"40":{"start":{"line":41,"column":0},"end":{"line":41,"column":47}},"41":{"start":{"line":42,"column":0},"end":{"line":42,"column":47}},"42":{"start":{"line":43,"column":0},"end":{"line":43,"column":33}},"43":{"start":{"line":44,"column":0},"end":{"line":44,"column":1}},"44":{"start":{"line":45,"column":0},"end":{"line":45,"column":0}},"45":{"start":{"line":46,"column":0},"end":{"line":46,"column":3}},"46":{"start":{"line":47,"column":0},"end":{"line":47,"column":75}},"47":{"start":{"line":48,"column":0},"end":{"line":48,"column":2}},"48":{"start":{"line":49,"column":0},"end":{"line":49,"column":32}},"49":{"start":{"line":50,"column":0},"end":{"line":50,"column":63}},"50":{"start":{"line":51,"column":0},"end":{"line":51,"column":35}},"51":{"start":{"line":52,"column":0},"end":{"line":52,"column":2}},"52":{"start":{"line":53,"column":0},"end":{"line":53,"column":11}},"53":{"start":{"line":54,"column":0},"end":{"line":54,"column":33}},"54":{"start":{"line":55,"column":0},"end":{"line":55,"column":31}},"55":{"start":{"line":56,"column":0},"end":{"line":56,"column":37}},"56":{"start":{"line":57,"column":0},"end":{"line":57,"column":3}},"57":{"start":{"line":58,"column":0},"end":{"line":58,"column":70}},"58":{"start":{"line":59,"column":0},"end":{"line":59,"column":58}},"59":{"start":{"line":60,"column":0},"end":{"line":60,"column":1}},"60":{"start":{"line":61,"column":0},"end":{"line":61,"column":0}},"61":{"start":{"line":62,"column":0},"end":{"line":62,"column":3}},"62":{"start":{"line":63,"column":0},"end":{"line":63,"column":65}},"63":{"start":{"line":64,"column":0},"end":{"line":64,"column":51}},"64":{"start":{"line":65,"column":0},"end":{"line":65,"column":2}},"65":{"start":{"line":66,"column":0},"end":{"line":66,"column":45}},"66":{"start":{"line":67,"column":0},"end":{"line":67,"column":47}},"67":{"start":{"line":68,"column":0},"end":{"line":68,"column":2}},"68":{"start":{"line":69,"column":0},"end":{"line":69,"column":11}},"69":{"start":{"line":70,"column":0},"end":{"line":70,"column":38}},"70":{"start":{"line":71,"column":0},"end":{"line":71,"column":37}},"71":{"start":{"line":72,"column":0},"end":{"line":72,"column":40}},"72":{"start":{"line":73,"column":0},"end":{"line":73,"column":39}},"73":{"start":{"line":74,"column":0},"end":{"line":74,"column":3}},"74":{"start":{"line":75,"column":0},"end":{"line":75,"column":58}},"75":{"start":{"line":76,"column":0},"end":{"line":76,"column":34}},"76":{"start":{"line":77,"column":0},"end":{"line":77,"column":28}},"77":{"start":{"line":78,"column":0},"end":{"line":78,"column":49}},"78":{"start":{"line":79,"column":0},"end":{"line":79,"column":47}},"79":{"start":{"line":80,"column":0},"end":{"line":80,"column":5}},"80":{"start":{"line":81,"column":0},"end":{"line":81,"column":3}},"81":{"start":{"line":82,"column":0},"end":{"line":82,"column":39}},"82":{"start":{"line":83,"column":0},"end":{"line":83,"column":1}},"83":{"start":{"line":84,"column":0},"end":{"line":84,"column":0}},"84":{"start":{"line":85,"column":0},"end":{"line":85,"column":3}},"85":{"start":{"line":86,"column":0},"end":{"line":86,"column":49}},"86":{"start":{"line":87,"column":0},"end":{"line":87,"column":2}},"87":{"start":{"line":88,"column":0},"end":{"line":88,"column":69}},"88":{"start":{"line":89,"column":0},"end":{"line":89,"column":37}},"89":{"start":{"line":90,"column":0},"end":{"line":90,"column":2}},"90":{"start":{"line":91,"column":0},"end":{"line":91,"column":11}},"91":{"start":{"line":92,"column":0},"end":{"line":92,"column":76}},"92":{"start":{"line":93,"column":0},"end":{"line":93,"column":3}},"93":{"start":{"line":94,"column":0},"end":{"line":94,"column":42}},"94":{"start":{"line":95,"column":0},"end":{"line":95,"column":20}},"95":{"start":{"line":96,"column":0},"end":{"line":96,"column":26}},"96":{"start":{"line":97,"column":0},"end":{"line":97,"column":12}},"97":{"start":{"line":98,"column":0},"end":{"line":98,"column":63}},"98":{"start":{"line":99,"column":0},"end":{"line":99,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":23,"40":23,"41":23,"42":3,"43":3,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":57,"59":57,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":48,"76":298,"77":30,"78":30,"79":30,"80":298,"81":18,"82":18,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":3,"95":3,"96":3,"97":3,"98":3},"branchMap":{"0":{"type":"branch","line":24,"loc":{"start":{"line":24,"column":8},"end":{"line":24,"column":23}},"locations":[{"start":{"line":24,"column":8},"end":{"line":24,"column":23}}]},"1":{"type":"branch","line":39,"loc":{"start":{"line":39,"column":7},"end":{"line":44,"column":1}},"locations":[{"start":{"line":39,"column":7},"end":{"line":44,"column":1}}]},"2":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":23},"end":{"line":40,"column":49}},"locations":[{"start":{"line":40,"column":23},"end":{"line":40,"column":49}}]},"3":{"type":"branch","line":40,"loc":{"start":{"line":40,"column":30},"end":{"line":41,"column":29}},"locations":[{"start":{"line":40,"column":30},"end":{"line":41,"column":29}}]},"4":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":22},"end":{"line":41,"column":47}},"locations":[{"start":{"line":41,"column":22},"end":{"line":41,"column":47}}]},"5":{"type":"branch","line":41,"loc":{"start":{"line":41,"column":29},"end":{"line":42,"column":29}},"locations":[{"start":{"line":41,"column":29},"end":{"line":42,"column":29}}]},"6":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":22},"end":{"line":44,"column":1}},"locations":[{"start":{"line":42,"column":22},"end":{"line":44,"column":1}}]},"7":{"type":"branch","line":42,"loc":{"start":{"line":42,"column":29},"end":{"line":44,"column":1}},"locations":[{"start":{"line":42,"column":29},"end":{"line":44,"column":1}}]},"8":{"type":"branch","line":58,"loc":{"start":{"line":58,"column":7},"end":{"line":60,"column":1}},"locations":[{"start":{"line":58,"column":7},"end":{"line":60,"column":1}}]},"9":{"type":"branch","line":75,"loc":{"start":{"line":75,"column":7},"end":{"line":83,"column":1}},"locations":[{"start":{"line":75,"column":7},"end":{"line":83,"column":1}}]},"10":{"type":"branch","line":76,"loc":{"start":{"line":76,"column":33},"end":{"line":81,"column":3}},"locations":[{"start":{"line":76,"column":33},"end":{"line":81,"column":3}}]},"11":{"type":"branch","line":77,"loc":{"start":{"line":77,"column":27},"end":{"line":80,"column":5}},"locations":[{"start":{"line":77,"column":27},"end":{"line":80,"column":5}}]},"12":{"type":"branch","line":81,"loc":{"start":{"line":81,"column":2},"end":{"line":83,"column":1}},"locations":[{"start":{"line":81,"column":2},"end":{"line":83,"column":1}}]},"13":{"type":"branch","line":94,"loc":{"start":{"line":94,"column":7},"end":{"line":99,"column":1}},"locations":[{"start":{"line":94,"column":7},"end":{"line":99,"column":1}}]}},"b":{"0":[18],"1":[23],"2":[3],"3":[20],"4":[3],"5":[17],"6":[14],"7":[3],"8":[57],"9":[48],"10":[298],"11":[30],"12":[18],"13":[3]},"fnMap":{"0":{"name":"getDurationClassName","decl":{"start":{"line":39,"column":7},"end":{"line":44,"column":1}},"loc":{"start":{"line":39,"column":7},"end":{"line":44,"column":1}},"line":39},"1":{"name":"formatNumber","decl":{"start":{"line":58,"column":7},"end":{"line":60,"column":1}},"loc":{"start":{"line":58,"column":7},"end":{"line":60,"column":1}},"line":58},"2":{"name":"formatDuration","decl":{"start":{"line":75,"column":7},"end":{"line":83,"column":1}},"loc":{"start":{"line":75,"column":7},"end":{"line":83,"column":1}},"line":75},"3":{"name":"formatSpanDuration","decl":{"start":{"line":94,"column":7},"end":{"line":99,"column":1}},"loc":{"start":{"line":94,"column":7},"end":{"line":99,"column":1}},"line":94}},"f":{"0":23,"1":57,"2":48,"3":3}} +,"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/utils.ts": {"path":"/Users/am/dev/sentry/spotlight/packages/spotlight/registry/spotlight/lib/utils.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":45}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":41}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":0}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":3}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":75}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":78}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":2}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":67}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":31}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":2}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":11}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":62}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":74}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":3}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":45}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":1}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":0}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":3}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":48}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":50}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":2}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":40}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":46}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":31}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":2}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":11}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":49}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":48}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":3}},"30":{"start":{"line":31,"column":0},"end":{"line":31,"column":57}},"31":{"start":{"line":32,"column":0},"end":{"line":32,"column":33}},"32":{"start":{"line":33,"column":0},"end":{"line":33,"column":1}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":110,"16":110,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":24,"32":24},"branchMap":{"0":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":7},"end":{"line":17,"column":1}},"locations":[{"start":{"line":15,"column":7},"end":{"line":17,"column":1}}]},"1":{"type":"branch","line":31,"loc":{"start":{"line":31,"column":7},"end":{"line":33,"column":1}},"locations":[{"start":{"line":31,"column":7},"end":{"line":33,"column":1}}]}},"b":{"0":[110],"1":[24]},"fnMap":{"0":{"name":"cn","decl":{"start":{"line":15,"column":7},"end":{"line":17,"column":1}},"loc":{"start":{"line":15,"column":7},"end":{"line":17,"column":1}},"line":15},"1":{"name":"truncateId","decl":{"start":{"line":31,"column":7},"end":{"line":33,"column":1}},"loc":{"start":{"line":31,"column":7},"end":{"line":33,"column":1}},"line":31}},"f":{"0":110,"1":24}} +} diff --git a/packages/spotlight/registry.json b/packages/spotlight/registry.json index 1b99c08f7..e46a14a82 100644 --- a/packages/spotlight/registry.json +++ b/packages/spotlight/registry.json @@ -42,20 +42,29 @@ ".span-tree": { "position": "relative" }, - ".span-tree ul": { + ".span-tree .span-tree": { + "position": "static" + }, + ".span-tree, .span-tree ul": { "list-style": "none", "margin": "0", "padding": "0" }, + ".span-tree.deep > li > ul": { + "margin-left": "8px" + }, ".span-tree.deep > li": { "border-left": "1px solid hsl(var(--border))", "padding-left": "1rem", "margin-left": "1rem" }, ".span-tree li:last-child": { - "border-color": "transparent" + "border-left": "0" + }, + ".span-tree > li:first-child:before": { + "display": "none" }, - ".span-tree.deep > li:before": { + ".span-tree.deep > li:before, .span-tree .span-tree > li:before": { "content": "\"\"", "display": "inline-block", "position": "absolute", @@ -70,9 +79,9 @@ ".span-tree .node": { "display": "flex", "align-items": "center", - "gap": "0.25rem", + "column-gap": "0.25rem", "overflow": "hidden", - "padding": "0.25rem", + "padding": "0.25rem 0", "padding-left": "0.25rem" }, ".span-tree .waterfall": { @@ -80,7 +89,7 @@ "right": "0", "height": "1.75rem", "border-left": "2px solid hsl(var(--border))", - "padding": "0.25rem", + "padding": "0.25rem 0", "padding-left": "0.25rem" } } diff --git a/packages/spotlight/registry/spotlight/components/span-item.tsx b/packages/spotlight/registry/spotlight/components/span-item.tsx index 91ab69435..7d6dc93f2 100644 --- a/packages/spotlight/registry/spotlight/components/span-item.tsx +++ b/packages/spotlight/registry/spotlight/components/span-item.tsx @@ -94,7 +94,7 @@ export function SpanItem({ className={cn( "node rounded-sm flex items-center gap-1 overflow-hidden", "group-hover:bg-muted/50", - isSelected ? "bg-muted" : "bg-background", + isSelected ? "bg-muted" : "bg-transparent", )} style={{ width: `${spanNodeWidth}%`, paddingRight: "30px" }} > @@ -104,8 +104,8 @@ export function SpanItem({ type="button" className={cn( "z-10 mr-1 flex items-center gap-1 rounded-lg px-1", - "text-xs font-bold bg-muted text-muted-foreground", - "hover:bg-muted/80", + "text-xs font-bold bg-primary text-primary-foreground", + "hover:bg-primary/90", )} onClick={e => { e.stopPropagation(); @@ -132,15 +132,18 @@ export function SpanItem({
    {/* Waterfall column */} -
    +
    {/* Timing bar */}
    diff --git a/packages/spotlight/registry/spotlight/components/trace-item.tsx b/packages/spotlight/registry/spotlight/components/trace-item.tsx index 12990fcfd..e9b7cd104 100644 --- a/packages/spotlight/registry/spotlight/components/trace-item.tsx +++ b/packages/spotlight/registry/spotlight/components/trace-item.tsx @@ -69,7 +69,7 @@ export function TraceItem({ trace, isSelected = false, onSelect, className }: Tr onClick={handleClick} onKeyDown={handleKeyDown} className={cn( - "flex cursor-pointer items-center gap-x-4 px-6 py-3", + "flex cursor-pointer items-center gap-x-4 px-6 py-2", "hover:bg-muted/50 transition-colors", isSelected && "bg-muted", className, @@ -85,9 +85,9 @@ export function TraceItem({ trace, isSelected = false, onSelect, className }: Tr
    {/* Trace ID and Time */} -
    +
    - {truncatedId} + {truncatedId} {trace.environment && }
    diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f57772b2c..8e154a0c3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -97,6 +97,9 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 lucide-react: specifier: ^0.563.0 version: 0.563.0(react@19.2.3) From 0f126e87bd9ec68eceefae7a8b0d6fe449d6a932 Mon Sep 17 00:00:00 2001 From: mathuraditya724 Date: Mon, 26 Jan 2026 20:02:48 +0530 Subject: [PATCH 05/14] wip --- packages/docs/.gitignore | 26 + packages/docs/app/(home)/layout.tsx | 6 + packages/docs/app/(home)/page.tsx | 16 + packages/docs/app/api/search/route.ts | 7 + packages/docs/app/docs/[[...slug]]/page.tsx | 61 + packages/docs/app/docs/layout.tsx | 11 + packages/docs/app/global.css | 3 + packages/docs/app/layout.tsx | 17 + packages/docs/app/llms-full.txt/route.ts | 10 + .../app/llms.mdx/docs/[[...slug]]/route.ts | 20 + packages/docs/app/llms.txt/route.ts | 13 + packages/docs/app/og/docs/[...slug]/route.tsx | 24 + packages/docs/components/ai/page-actions.tsx | 214 +++ packages/docs/content/docs/index.mdx | 13 + packages/docs/content/docs/test.mdx | 17 + packages/docs/lib/cn.ts | 1 + packages/docs/lib/layout.shared.tsx | 9 + packages/docs/lib/source.ts | 27 + packages/docs/mdx-components.tsx | 9 + packages/docs/next.config.mjs | 18 + packages/docs/package.json | 32 + packages/docs/postcss.config.mjs | 5 + packages/docs/source.config.ts | 22 + packages/docs/tsconfig.json | 30 + pnpm-lock.yaml | 1241 ++++++++++++++++- 25 files changed, 1797 insertions(+), 55 deletions(-) create mode 100644 packages/docs/.gitignore create mode 100644 packages/docs/app/(home)/layout.tsx create mode 100644 packages/docs/app/(home)/page.tsx create mode 100644 packages/docs/app/api/search/route.ts create mode 100644 packages/docs/app/docs/[[...slug]]/page.tsx create mode 100644 packages/docs/app/docs/layout.tsx create mode 100644 packages/docs/app/global.css create mode 100644 packages/docs/app/layout.tsx create mode 100644 packages/docs/app/llms-full.txt/route.ts create mode 100644 packages/docs/app/llms.mdx/docs/[[...slug]]/route.ts create mode 100644 packages/docs/app/llms.txt/route.ts create mode 100644 packages/docs/app/og/docs/[...slug]/route.tsx create mode 100644 packages/docs/components/ai/page-actions.tsx create mode 100644 packages/docs/content/docs/index.mdx create mode 100644 packages/docs/content/docs/test.mdx create mode 100644 packages/docs/lib/cn.ts create mode 100644 packages/docs/lib/layout.shared.tsx create mode 100644 packages/docs/lib/source.ts create mode 100644 packages/docs/mdx-components.tsx create mode 100644 packages/docs/next.config.mjs create mode 100644 packages/docs/package.json create mode 100644 packages/docs/postcss.config.mjs create mode 100644 packages/docs/source.config.ts create mode 100644 packages/docs/tsconfig.json diff --git a/packages/docs/.gitignore b/packages/docs/.gitignore new file mode 100644 index 000000000..9e429e498 --- /dev/null +++ b/packages/docs/.gitignore @@ -0,0 +1,26 @@ +# deps +/node_modules + +# generated content +.source + +# test & build +/coverage +/.next/ +/out/ +/build +*.tsbuildinfo + +# misc +.DS_Store +*.pem +/.pnp +.pnp.js +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# others +.env*.local +.vercel +next-env.d.ts \ No newline at end of file diff --git a/packages/docs/app/(home)/layout.tsx b/packages/docs/app/(home)/layout.tsx new file mode 100644 index 000000000..3dd83fedb --- /dev/null +++ b/packages/docs/app/(home)/layout.tsx @@ -0,0 +1,6 @@ +import { baseOptions } from "@/lib/layout.shared"; +import { HomeLayout } from "fumadocs-ui/layouts/home"; + +export default function Layout({ children }: LayoutProps<"/">) { + return {children}; +} diff --git a/packages/docs/app/(home)/page.tsx b/packages/docs/app/(home)/page.tsx new file mode 100644 index 000000000..8412053a5 --- /dev/null +++ b/packages/docs/app/(home)/page.tsx @@ -0,0 +1,16 @@ +import Link from "next/link"; + +export default function HomePage() { + return ( +
    +

    Hello World

    +

    + You can open{" "} + + /docs + {" "} + and see the documentation. +

    +
    + ); +} diff --git a/packages/docs/app/api/search/route.ts b/packages/docs/app/api/search/route.ts new file mode 100644 index 000000000..aa9d5cd0a --- /dev/null +++ b/packages/docs/app/api/search/route.ts @@ -0,0 +1,7 @@ +import { source } from "@/lib/source"; +import { createFromSource } from "fumadocs-core/search/server"; + +export const { GET } = createFromSource(source, { + // https://docs.orama.com/docs/orama-js/supported-languages + language: "english", +}); diff --git a/packages/docs/app/docs/[[...slug]]/page.tsx b/packages/docs/app/docs/[[...slug]]/page.tsx new file mode 100644 index 000000000..cdb109c2f --- /dev/null +++ b/packages/docs/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,61 @@ +import { LLMCopyButton, ViewOptions } from "@/components/ai/page-actions"; +import { getPageImage, source } from "@/lib/source"; +import { getMDXComponents } from "@/mdx-components"; +import { DocsBody, DocsDescription, DocsPage, DocsTitle } from "fumadocs-ui/layouts/docs/page"; +import { createRelativeLink } from "fumadocs-ui/mdx"; +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; + +export default async function Page(props: PageProps<"/docs/[[...slug]]">) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + const MDX = page.data.body; + const gitConfig = { + user: "username", + repo: "repo", + branch: "main", + }; + + return ( + + {page.data.title} + {page.data.description} +
    + + +
    + + + +
    + ); +} + +export async function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata(props: PageProps<"/docs/[[...slug]]">): Promise { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + return { + title: page.data.title, + description: page.data.description, + openGraph: { + images: getPageImage(page).url, + }, + }; +} diff --git a/packages/docs/app/docs/layout.tsx b/packages/docs/app/docs/layout.tsx new file mode 100644 index 000000000..072222233 --- /dev/null +++ b/packages/docs/app/docs/layout.tsx @@ -0,0 +1,11 @@ +import { baseOptions } from "@/lib/layout.shared"; +import { source } from "@/lib/source"; +import { DocsLayout } from "fumadocs-ui/layouts/docs"; + +export default function Layout({ children }: LayoutProps<"/docs">) { + return ( + + {children} + + ); +} diff --git a/packages/docs/app/global.css b/packages/docs/app/global.css new file mode 100644 index 000000000..50b3bc296 --- /dev/null +++ b/packages/docs/app/global.css @@ -0,0 +1,3 @@ +@import 'tailwindcss'; +@import 'fumadocs-ui/css/neutral.css'; +@import 'fumadocs-ui/css/preset.css'; diff --git a/packages/docs/app/layout.tsx b/packages/docs/app/layout.tsx new file mode 100644 index 000000000..cd8c56065 --- /dev/null +++ b/packages/docs/app/layout.tsx @@ -0,0 +1,17 @@ +import { RootProvider } from "fumadocs-ui/provider/next"; +import "./global.css"; +import { Inter } from "next/font/google"; + +const inter = Inter({ + subsets: ["latin"], +}); + +export default function Layout({ children }: LayoutProps<"/">) { + return ( + + + {children} + + + ); +} diff --git a/packages/docs/app/llms-full.txt/route.ts b/packages/docs/app/llms-full.txt/route.ts new file mode 100644 index 000000000..fcccaeefa --- /dev/null +++ b/packages/docs/app/llms-full.txt/route.ts @@ -0,0 +1,10 @@ +import { getLLMText, source } from "@/lib/source"; + +export const revalidate = false; + +export async function GET() { + const scan = source.getPages().map(getLLMText); + const scanned = await Promise.all(scan); + + return new Response(scanned.join("\n\n")); +} diff --git a/packages/docs/app/llms.mdx/docs/[[...slug]]/route.ts b/packages/docs/app/llms.mdx/docs/[[...slug]]/route.ts new file mode 100644 index 000000000..6019bc8c4 --- /dev/null +++ b/packages/docs/app/llms.mdx/docs/[[...slug]]/route.ts @@ -0,0 +1,20 @@ +import { getLLMText, source } from "@/lib/source"; +import { notFound } from "next/navigation"; + +export const revalidate = false; + +export async function GET(_req: Request, { params }: RouteContext<"/llms.mdx/docs/[[...slug]]">) { + const { slug } = await params; + const page = source.getPage(slug); + if (!page) notFound(); + + return new Response(await getLLMText(page), { + headers: { + "Content-Type": "text/markdown", + }, + }); +} + +export function generateStaticParams() { + return source.generateParams(); +} diff --git a/packages/docs/app/llms.txt/route.ts b/packages/docs/app/llms.txt/route.ts new file mode 100644 index 000000000..cc98a1c3a --- /dev/null +++ b/packages/docs/app/llms.txt/route.ts @@ -0,0 +1,13 @@ +import { source } from "@/lib/source"; + +export const revalidate = false; + +export async function GET() { + const lines: string[] = []; + lines.push("# Documentation"); + lines.push(""); + for (const page of source.getPages()) { + lines.push(`- [${page.data.title}](${page.url}): ${page.data.description}`); + } + return new Response(lines.join("\n")); +} diff --git a/packages/docs/app/og/docs/[...slug]/route.tsx b/packages/docs/app/og/docs/[...slug]/route.tsx new file mode 100644 index 000000000..9bb1c4102 --- /dev/null +++ b/packages/docs/app/og/docs/[...slug]/route.tsx @@ -0,0 +1,24 @@ +import { getPageImage, source } from "@/lib/source"; +import { generate as DefaultImage } from "fumadocs-ui/og"; +import { notFound } from "next/navigation"; +import { ImageResponse } from "next/og"; + +export const revalidate = false; + +export async function GET(_req: Request, { params }: RouteContext<"/og/docs/[...slug]">) { + const { slug } = await params; + const page = source.getPage(slug.slice(0, -1)); + if (!page) notFound(); + + return new ImageResponse(, { + width: 1200, + height: 630, + }); +} + +export function generateStaticParams() { + return source.getPages().map(page => ({ + lang: page.locale, + slug: getPageImage(page).segments, + })); +} diff --git a/packages/docs/components/ai/page-actions.tsx b/packages/docs/components/ai/page-actions.tsx new file mode 100644 index 000000000..a4b87aff5 --- /dev/null +++ b/packages/docs/components/ai/page-actions.tsx @@ -0,0 +1,214 @@ +"use client"; +import { cn } from "@/lib/cn"; +import { buttonVariants } from "fumadocs-ui/components/ui/button"; +import { Popover, PopoverContent, PopoverTrigger } from "fumadocs-ui/components/ui/popover"; +import { useCopyButton } from "fumadocs-ui/utils/use-copy-button"; +import { Check, ChevronDown, Copy, ExternalLinkIcon, MessageCircleIcon } from "lucide-react"; +import { useMemo, useState } from "react"; + +const cache = new Map(); + +export function LLMCopyButton({ + /** + * A URL to fetch the raw Markdown/MDX content of page + */ + markdownUrl, +}: { + markdownUrl: string; +}) { + const [isLoading, setLoading] = useState(false); + const [checked, onClick] = useCopyButton(async () => { + const cached = cache.get(markdownUrl); + if (cached) return navigator.clipboard.writeText(cached); + + setLoading(true); + + try { + await navigator.clipboard.write([ + new ClipboardItem({ + "text/plain": fetch(markdownUrl).then(async res => { + const content = await res.text(); + cache.set(markdownUrl, content); + + return content; + }), + }), + ]); + } finally { + setLoading(false); + } + }); + + return ( + + ); +} + +export function ViewOptions({ + markdownUrl, + githubUrl, +}: { + /** + * A URL to the raw Markdown/MDX content of page + */ + markdownUrl: string; + + /** + * Source file URL on GitHub + */ + githubUrl: string; +}) { + const items = useMemo(() => { + const fullMarkdownUrl = typeof window !== "undefined" ? new URL(markdownUrl, window.location.origin) : "loading"; + const q = `Read ${fullMarkdownUrl}, I want to ask questions about it.`; + + return [ + { + title: "Open in GitHub", + href: githubUrl, + icon: ( + + GitHub + + + ), + }, + { + title: "Open in Scira AI", + href: `https://scira.ai/?${new URLSearchParams({ + q, + })}`, + icon: ( + + Scira AI + + + + + + + + + ), + }, + { + title: "Open in ChatGPT", + href: `https://chatgpt.com/?${new URLSearchParams({ + hints: "search", + q, + })}`, + icon: ( + + OpenAI + + + ), + }, + { + title: "Open in Claude", + href: `https://claude.ai/new?${new URLSearchParams({ + q, + })}`, + icon: ( + + Anthropic + + + ), + }, + { + title: "Open in T3 Chat", + href: `https://t3.chat/new?${new URLSearchParams({ + q, + })}`, + icon: , + }, + ]; + }, [githubUrl, markdownUrl]); + + return ( + + + Open + + + + {items.map(item => ( + + {item.icon} + {item.title} + + + ))} + + + ); +} diff --git a/packages/docs/content/docs/index.mdx b/packages/docs/content/docs/index.mdx new file mode 100644 index 000000000..1ede18ec9 --- /dev/null +++ b/packages/docs/content/docs/index.mdx @@ -0,0 +1,13 @@ +--- +title: Hello World +description: Your first document +--- + +Welcome to the docs! You can start writing documents in `/content/docs`. + +## What is Next? + + + + + diff --git a/packages/docs/content/docs/test.mdx b/packages/docs/content/docs/test.mdx new file mode 100644 index 000000000..f475f4a63 --- /dev/null +++ b/packages/docs/content/docs/test.mdx @@ -0,0 +1,17 @@ +--- +title: Components +description: Components +--- + +## Code Block + +```js +console.log('Hello World'); +``` + +## Cards + + + + + diff --git a/packages/docs/lib/cn.ts b/packages/docs/lib/cn.ts new file mode 100644 index 000000000..8e473dac8 --- /dev/null +++ b/packages/docs/lib/cn.ts @@ -0,0 +1 @@ +export { twMerge as cn } from "tailwind-merge"; diff --git a/packages/docs/lib/layout.shared.tsx b/packages/docs/lib/layout.shared.tsx new file mode 100644 index 000000000..6182f8391 --- /dev/null +++ b/packages/docs/lib/layout.shared.tsx @@ -0,0 +1,9 @@ +import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared"; + +export function baseOptions(): BaseLayoutProps { + return { + nav: { + title: "My App", + }, + }; +} diff --git a/packages/docs/lib/source.ts b/packages/docs/lib/source.ts new file mode 100644 index 000000000..4a98fa41d --- /dev/null +++ b/packages/docs/lib/source.ts @@ -0,0 +1,27 @@ +import { docs } from "fumadocs-mdx:collections/server"; +import { type InferPageType, loader } from "fumadocs-core/source"; +import { lucideIconsPlugin } from "fumadocs-core/source/lucide-icons"; + +// See https://fumadocs.dev/docs/headless/source-api for more info +export const source = loader({ + baseUrl: "/docs", + source: docs.toFumadocsSource(), + plugins: [lucideIconsPlugin()], +}); + +export function getPageImage(page: InferPageType) { + const segments = [...page.slugs, "image.png"]; + + return { + segments, + url: `/og/docs/${segments.join("/")}`, + }; +} + +export async function getLLMText(page: InferPageType) { + const processed = await page.data.getText("processed"); + + return `# ${page.data.title} + +${processed}`; +} diff --git a/packages/docs/mdx-components.tsx b/packages/docs/mdx-components.tsx new file mode 100644 index 000000000..b21a16183 --- /dev/null +++ b/packages/docs/mdx-components.tsx @@ -0,0 +1,9 @@ +import defaultMdxComponents from "fumadocs-ui/mdx"; +import type { MDXComponents } from "mdx/types"; + +export function getMDXComponents(components?: MDXComponents): MDXComponents { + return { + ...defaultMdxComponents, + ...components, + }; +} diff --git a/packages/docs/next.config.mjs b/packages/docs/next.config.mjs new file mode 100644 index 000000000..91c6ac171 --- /dev/null +++ b/packages/docs/next.config.mjs @@ -0,0 +1,18 @@ +import { createMDX } from 'fumadocs-mdx/next'; + +const withMDX = createMDX(); + +/** @type {import('next').NextConfig} */ +const config = { + reactStrictMode: true, + async rewrites() { + return [ + { + source: '/docs/:path*.mdx', + destination: '/llms.mdx/docs/:path*', + }, + ]; + }, +}; + +export default withMDX(config); diff --git a/packages/docs/package.json b/packages/docs/package.json new file mode 100644 index 000000000..4b32e27f7 --- /dev/null +++ b/packages/docs/package.json @@ -0,0 +1,32 @@ +{ + "name": "docs", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "next build", + "dev": "next dev", + "start": "next start", + "types:check": "fumadocs-mdx && next typegen && tsc --noEmit", + "postinstall": "fumadocs-mdx" + }, + "dependencies": { + "fumadocs-core": "16.4.8", + "fumadocs-mdx": "14.2.6", + "fumadocs-ui": "16.4.8", + "lucide-react": "^0.563.0", + "next": "16.1.4", + "react": "^19.2.3", + "react-dom": "^19.2.3", + "tailwind-merge": "^3.4.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.1.18", + "@types/mdx": "^2.0.13", + "@types/node": "^25.0.10", + "@types/react": "^19.2.9", + "@types/react-dom": "^19.2.3", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.18", + "typescript": "^5.9.3" + } +} diff --git a/packages/docs/postcss.config.mjs b/packages/docs/postcss.config.mjs new file mode 100644 index 000000000..a34a3d560 --- /dev/null +++ b/packages/docs/postcss.config.mjs @@ -0,0 +1,5 @@ +export default { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; diff --git a/packages/docs/source.config.ts b/packages/docs/source.config.ts new file mode 100644 index 000000000..d6e0a83e7 --- /dev/null +++ b/packages/docs/source.config.ts @@ -0,0 +1,22 @@ +import { defineConfig, defineDocs, frontmatterSchema, metaSchema } from "fumadocs-mdx/config"; + +// You can customise Zod schemas for frontmatter and `meta.json` here +// see https://fumadocs.dev/docs/mdx/collections +export const docs = defineDocs({ + dir: "content/docs", + docs: { + schema: frontmatterSchema, + postprocess: { + includeProcessedMarkdown: true, + }, + }, + meta: { + schema: metaSchema, + }, +}); + +export default defineConfig({ + mdxOptions: { + // MDX options + }, +}); diff --git a/packages/docs/tsconfig.json b/packages/docs/tsconfig.json new file mode 100644 index 000000000..ff00a09ae --- /dev/null +++ b/packages/docs/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "target": "ESNext", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "paths": { + "@/*": ["./*"], + "fumadocs-mdx:collections/*": [".source/*"] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e154a0c3..03117ade3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,6 +89,58 @@ importers: specifier: 'catalog:' version: 5.9.2 + packages/docs: + dependencies: + fumadocs-core: + specifier: 16.4.8 + version: 16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6) + fumadocs-mdx: + specifier: 14.2.6 + version: 14.2.6(@types/react@19.2.9)(fumadocs-core@16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) + fumadocs-ui: + specifier: 16.4.8 + version: 16.4.8(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(fumadocs-core@16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18) + lucide-react: + specifier: ^0.563.0 + version: 0.563.0(react@19.2.3) + next: + specifier: ^15.4.8 + version: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: + specifier: ^19.2.3 + version: 19.2.3 + react-dom: + specifier: ^19.2.3 + version: 19.2.3(react@19.2.3) + tailwind-merge: + specifier: ^3.4.0 + version: 3.4.0 + devDependencies: + '@tailwindcss/postcss': + specifier: ^4.1.18 + version: 4.1.18 + '@types/mdx': + specifier: ^2.0.13 + version: 2.0.13 + '@types/node': + specifier: ^25.0.10 + version: 25.0.10 + '@types/react': + specifier: ^19.2.9 + version: 19.2.9 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.9) + postcss: + specifier: ^8.5.6 + version: 8.5.6 + tailwindcss: + specifier: ^4.1.18 + version: 4.1.18 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + packages/registry: dependencies: class-variance-authority: @@ -398,25 +450,25 @@ importers: dependencies: '@astrojs/react': specifier: ^4.2.0 - version: 4.2.7(@types/node@24.10.1)(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + version: 4.2.7(@types/node@25.0.10)(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) '@astrojs/starlight': specifier: ^0.32.4 - version: 0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) + version: 0.32.6(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) '@astrojs/starlight-tailwind': specifier: ^3.0.1 - version: 3.0.1(@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)))(@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11))(tailwindcss@4.1.11) + version: 3.0.1(@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)))(@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11))(tailwindcss@4.1.11) '@astrojs/vercel': specifier: ^8.0.8 - version: 8.1.4(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.53.3)(svelte@4.2.19) + version: 8.1.4(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.53.3)(svelte@4.2.19) '@fontsource/raleway': specifier: 'catalog:' version: 5.2.5 '@sentry/astro': specifier: 'catalog:' - version: 10.32.1(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) + version: 10.32.1(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) '@tailwindcss/vite': specifier: 'catalog:' - version: 4.1.11(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) + version: 4.1.11(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) '@types/react': specifier: 'catalog:' version: 18.3.20 @@ -428,7 +480,7 @@ importers: version: 1.6.1(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(svelte@4.2.19) astro: specifier: ^5.15.9 - version: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + version: 5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) react: specifier: 'catalog:' version: 18.3.1 @@ -456,7 +508,7 @@ importers: version: 5.9.2 vite-plugin-inspect: specifier: ^0.7.42 - version: 0.7.42(rollup@4.53.3)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) + version: 0.7.42(rollup@4.53.3)(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) packages: @@ -1517,6 +1569,29 @@ packages: '@fontsource/raleway@5.2.5': resolution: {integrity: sha512-gVFV8Yi8Y5h8sQw0U/F6TQID53DVIWPuRxqBLOBxwLbQma42JAwqTZ+pi3eDjpm20/rjS2XoVJH5hnMx1KFB+g==} + '@formatjs/fast-memoize@3.1.0': + resolution: {integrity: sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg==} + + '@formatjs/intl-localematcher@0.8.0': + resolution: {integrity: sha512-zgMYWdUlmEZpX2Io+v3LHrfq9xZ6khpQVf9UAw2xYWhGerGgI9XgH1HvL/A34jWiruUJpYlP5pk4g8nIcaDrXQ==} + + '@fumadocs/ui@16.4.8': + resolution: {integrity: sha512-PCubUznlfeZ3aTCnG8WwYkbtZsNHMyxwQE4oQW9UoexagC5KtNs07bTx9kJBz8vWbWTGw2W0ZJt+uiaYvixJBw==} + peerDependencies: + '@types/react': '*' + fumadocs-core: 16.4.8 + next: ^15.4.8 + react: ^19.2.0 + react-dom: ^19.2.0 + tailwindcss: ^4.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + next: + optional: true + tailwindcss: + optional: true + '@hono/mcp@0.2.2': resolution: {integrity: sha512-h1yHXsv08OWT8bXyIOoZVXw0qU1UmSDwm014fPnFXiyeS9iMMHftn907wNXTh07IorlGqPbZArev4nBz9Q3oKQ==} peerDependencies: @@ -2171,6 +2246,10 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 + '@orama/orama@3.1.18': + resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==} + engines: {node: '>= 20.0.0'} + '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} @@ -2219,9 +2298,28 @@ packages: peerDependencies: '@opentelemetry/api': ^1.8 + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + '@radix-ui/primitive@1.1.2': resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-accordion@1.2.12': + resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-arrow@1.1.7': resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} peerDependencies: @@ -2235,6 +2333,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-collapsible@1.1.12': + resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-collection@1.1.7': resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} peerDependencies: @@ -2266,6 +2377,19 @@ packages: '@types/react': optional: true + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-direction@1.1.1': resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} peerDependencies: @@ -2288,6 +2412,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-dropdown-menu@2.1.15': resolution: {integrity: sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ==} peerDependencies: @@ -2310,6 +2447,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-focus-scope@1.1.7': resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} peerDependencies: @@ -2345,6 +2491,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-navigation-menu@1.2.14': + resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-popover@1.1.15': + resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-popper@1.2.7': resolution: {integrity: sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==} peerDependencies: @@ -2358,6 +2530,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-popper@1.2.8': + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-portal@1.1.9': resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} peerDependencies: @@ -2384,6 +2569,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@2.1.3': resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: @@ -2410,6 +2608,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-roving-focus@1.1.11': + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-scroll-area@1.2.10': + resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-slot@1.2.3': resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: @@ -2419,6 +2643,28 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.2.4': + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tabs@1.1.13': + resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-tooltip@1.2.7': resolution: {integrity: sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw==} peerDependencies: @@ -2477,6 +2723,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-rect@1.1.1': resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} peerDependencies: @@ -2925,6 +3180,9 @@ packages: '@shikijs/core@3.15.0': resolution: {integrity: sha512-8TOG6yG557q+fMsSVa8nkEDOZNTSxjbbR8l6lF2gyr6Np+jrPlslqDxQkN6rMXCECQ3isNPZAGszAfYoJOPGlg==} + '@shikijs/core@3.21.0': + resolution: {integrity: sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==} + '@shikijs/engine-javascript@1.29.2': resolution: {integrity: sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==} @@ -2934,6 +3192,9 @@ packages: '@shikijs/engine-javascript@3.15.0': resolution: {integrity: sha512-ZedbOFpopibdLmvTz2sJPJgns8Xvyabe2QbmqMTz07kt1pTzfEvKZc5IqPVO/XFiEbbNyaOpjPBkkr1vlwS+qg==} + '@shikijs/engine-javascript@3.21.0': + resolution: {integrity: sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ==} + '@shikijs/engine-oniguruma@1.29.2': resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} @@ -2943,6 +3204,9 @@ packages: '@shikijs/engine-oniguruma@3.15.0': resolution: {integrity: sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==} + '@shikijs/engine-oniguruma@3.21.0': + resolution: {integrity: sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==} + '@shikijs/langs@1.29.2': resolution: {integrity: sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==} @@ -2952,6 +3216,12 @@ packages: '@shikijs/langs@3.15.0': resolution: {integrity: sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==} + '@shikijs/langs@3.21.0': + resolution: {integrity: sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==} + + '@shikijs/rehype@3.21.0': + resolution: {integrity: sha512-fTQvwsZL67QdosMFdTgQ5SNjW3nxaPplRy//312hqOctRbIwviTV0nAbhv3NfnztHXvFli2zLYNKsTz/f9tbpQ==} + '@shikijs/themes@1.29.2': resolution: {integrity: sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==} @@ -2961,9 +3231,15 @@ packages: '@shikijs/themes@3.15.0': resolution: {integrity: sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==} + '@shikijs/themes@3.21.0': + resolution: {integrity: sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==} + '@shikijs/transformers@3.13.0': resolution: {integrity: sha512-833lcuVzcRiG+fXvgslWsM2f4gHpjEgui1ipIknSizRuTgMkNZupiXE5/TVJ6eSYfhNBFhBZKkReKWO2GgYmqA==} + '@shikijs/transformers@3.21.0': + resolution: {integrity: sha512-CZwvCWWIiRRiFk9/JKzdEooakAP8mQDtBOQ1TKiCaS2E1bYtyBCOkUzS8akO34/7ufICQ29oeSfkb3tT5KtrhA==} + '@shikijs/types@1.29.2': resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} @@ -2973,6 +3249,9 @@ packages: '@shikijs/types@3.15.0': resolution: {integrity: sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==} + '@shikijs/types@3.21.0': + resolution: {integrity: sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==} + '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -2983,6 +3262,9 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@stricli/auto-complete@1.1.1': resolution: {integrity: sha512-UGXVgdfaanfJIw5Wtv3fvZjfLTDBNcYuy3VSSSMt8RznJ9YOgK0uFZyQig4tCr2DENb1dVIGMdDAAi3f9oTLcg==} hasBin: true @@ -3398,8 +3680,8 @@ packages: '@types/node@22.18.0': resolution: {integrity: sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==} - '@types/node@24.10.1': - resolution: {integrity: sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==} + '@types/node@25.0.10': + resolution: {integrity: sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -4057,6 +4339,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -4206,6 +4492,9 @@ packages: resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} engines: {node: '>= 10'} + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} @@ -4761,6 +5050,9 @@ packages: estree-util-to-js@2.0.0: resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + estree-util-value-to-estree@3.5.0: + resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==} + estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} @@ -5001,6 +5293,89 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + fumadocs-core@16.4.8: + resolution: {integrity: sha512-DAxldO6Wc6CEgl7NQgqqVD5T2/xnhcg+8X+t107Ug/viQ/ozb6YA7+kzcCDMDKpiqZ5Gjovyy0QYSA8uMdWwsA==} + peerDependencies: + '@mixedbread/sdk': ^0.46.0 + '@orama/core': 1.x.x + '@oramacloud/client': 2.x.x + '@tanstack/react-router': 1.x.x + '@types/react': '*' + algoliasearch: 5.x.x + lucide-react: '*' + next: ^15.4.8 + react: ^19.2.0 + react-dom: ^19.2.0 + react-router: 7.x.x + waku: ^0.26.0 || ^0.27.0 + zod: 4.x.x + peerDependenciesMeta: + '@mixedbread/sdk': + optional: true + '@orama/core': + optional: true + '@oramacloud/client': + optional: true + '@tanstack/react-router': + optional: true + '@types/react': + optional: true + algoliasearch: + optional: true + lucide-react: + optional: true + next: + optional: true + react: + optional: true + react-dom: + optional: true + react-router: + optional: true + waku: + optional: true + zod: + optional: true + + fumadocs-mdx@14.2.6: + resolution: {integrity: sha512-T8i5IllZ6OGaZ3/4Wwjl1zovvypSsr6Cco9ZACvoABLqpqTQ2TDfrW1nBt1o9YUKyfzkwDnjKdrnrq/nDexfcg==} + hasBin: true + peerDependencies: + '@fumadocs/mdx-remote': ^1.4.0 + '@types/react': '*' + fumadocs-core: ^15.0.0 || ^16.0.0 + next: ^15.4.8 + react: '*' + vite: '>=6.3.6' + peerDependenciesMeta: + '@fumadocs/mdx-remote': + optional: true + '@types/react': + optional: true + next: + optional: true + react: + optional: true + vite: + optional: true + + fumadocs-ui@16.4.8: + resolution: {integrity: sha512-y2y/hfUzUUwEJQm2GDqn82pTOzQT5NZc2dxNSVjUd34wRnAtZS1dt9iZNxji8+J87txqAW9H5xojnzR1jU0ePw==} + peerDependencies: + '@types/react': '*' + fumadocs-core: 16.4.8 + next: ^15.4.8 + react: ^19.2.0 + react-dom: ^19.2.0 + tailwindcss: ^4.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + next: + optional: true + tailwindcss: + optional: true + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -5190,12 +5565,18 @@ packages: hast-util-to-estree@3.1.0: resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + hast-util-to-parse5@8.0.0: resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} @@ -5312,6 +5693,11 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + image-size@2.0.2: + resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} + engines: {node: '>=16.x'} + hasBin: true + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -5350,6 +5736,9 @@ packages: inline-style-parser@0.2.4: resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -6252,6 +6641,12 @@ packages: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + next@15.5.9: resolution: {integrity: sha512-agNLK89seZEtC5zUHwtut0+tNrc0Xw4FT/Dg+B/VLEo9pAcS9rtTKpek3V6kVcVwsB2YlqMaHdfZL4eLEVYuCg==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} @@ -6349,6 +6744,10 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-to-yarn@3.0.1: + resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -6398,6 +6797,9 @@ packages: oniguruma-to-es@4.3.3: resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} + oniguruma-to-es@4.3.4: + resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} + open@9.1.0: resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} engines: {node: '>=14.16'} @@ -6620,6 +7022,10 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -6777,6 +7183,12 @@ packages: react-lifecycles-compat@3.0.4: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} + react-medium-image-zoom@5.4.0: + resolution: {integrity: sha512-BsE+EnFVQzFIlyuuQrZ9iTwyKpKkqdFZV1ImEQN573QPqGrIUuNni7aF+sZwDcxlsuOMayCr6oO/PZR/yJnbRg==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-refresh@0.17.0: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} @@ -6860,6 +7272,10 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + recast@0.23.11: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} @@ -6925,6 +7341,9 @@ packages: remark-mdx@3.0.1: resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -6938,6 +7357,9 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -7072,6 +7494,9 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} @@ -7137,6 +7562,9 @@ packages: shiki@3.15.0: resolution: {integrity: sha512-kLdkY6iV3dYbtPwS9KXU7mjfmDm25f5m0IPNFnaXO7TBPcvbUOY72PYXSuSqDzwp+vlH/d7MXpHlKO/x+QoLXw==} + shiki@3.21.0: + resolution: {integrity: sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -7339,9 +7767,15 @@ packages: stubborn-fs@1.2.5: resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + style-to-object@0.4.4: resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + style-to-object@1.0.8: resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==} @@ -7635,6 +8069,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} @@ -7702,6 +8141,9 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -8210,6 +8652,9 @@ packages: zod@4.1.13: resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zustand@5.0.3: resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} engines: {node: '>=12.20.0'} @@ -8318,12 +8763,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@4.3.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': + '@astrojs/mdx@4.3.6(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': dependencies: '@astrojs/markdown-remark': 6.3.7 '@mdx-js/mdx': 3.1.1 acorn: 8.15.0 - astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro: 5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) es-module-lexer: 1.7.0 estree-util-visit: 2.0.0 hast-util-to-html: 9.0.5 @@ -8341,15 +8786,15 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/react@4.2.7(@types/node@24.10.1)(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)': + '@astrojs/react@4.2.7(@types/node@25.0.10)(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)': dependencies: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) - '@vitejs/plugin-react': 4.4.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) + '@vitejs/plugin-react': 4.4.1(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) ultrahtml: 1.6.0 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -8370,22 +8815,22 @@ snapshots: stream-replace-string: 2.0.0 zod: 3.25.76 - '@astrojs/starlight-tailwind@3.0.1(@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)))(@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11))(tailwindcss@4.1.11)': + '@astrojs/starlight-tailwind@3.0.1(@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)))(@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11))(tailwindcss@4.1.11)': dependencies: - '@astrojs/starlight': 0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) - '@astrojs/tailwind': 6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11) + '@astrojs/starlight': 0.32.6(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) + '@astrojs/tailwind': 6.0.2(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11) tailwindcss: 4.1.11 - '@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': + '@astrojs/starlight@0.32.6(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': dependencies: - '@astrojs/mdx': 4.3.6(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) + '@astrojs/mdx': 4.3.6(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) '@astrojs/sitemap': 3.6.0 '@pagefind/default-ui': 1.3.0 '@types/hast': 3.0.4 '@types/js-yaml': 4.0.9 '@types/mdast': 4.0.4 - astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) - astro-expressive-code: 0.40.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) + astro: 5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro-expressive-code: 0.40.2(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)) bcp-47: 2.1.0 hast-util-from-html: 2.0.3 hast-util-select: 6.0.2 @@ -8407,9 +8852,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11)': + '@astrojs/tailwind@6.0.2(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(tailwindcss@4.1.11)': dependencies: - astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro: 5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) autoprefixer: 10.4.23(postcss@8.5.6) postcss: 8.5.6 postcss-load-config: 4.0.2(postcss@8.5.6) @@ -8429,14 +8874,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/vercel@8.1.4(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.53.3)(svelte@4.2.19)': + '@astrojs/vercel@8.1.4(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(rollup@4.53.3)(svelte@4.2.19)': dependencies: '@astrojs/internal-helpers': 0.6.1 '@vercel/analytics': 1.6.1(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(svelte@4.2.19) '@vercel/edge': 1.2.1 '@vercel/nft': 0.29.2(rollup@4.53.3) '@vercel/routing-utils': 5.0.4 - astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro: 5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) esbuild: 0.25.3 tinyglobby: 0.2.12 transitivePeerDependencies: @@ -9222,10 +9667,38 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + '@floating-ui/react-dom@2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/dom': 1.7.0 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + '@floating-ui/utils@0.2.9': {} '@fontsource/raleway@5.2.5': {} + '@formatjs/fast-memoize@3.1.0': + dependencies: + tslib: 2.8.1 + + '@formatjs/intl-localematcher@0.8.0': + dependencies: + '@formatjs/fast-memoize': 3.1.0 + tslib: 2.8.1 + + '@fumadocs/ui@16.4.8(@types/react@19.2.9)(fumadocs-core@16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)': + dependencies: + fumadocs-core: 16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6) + next-themes: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + postcss-selector-parser: 7.1.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + tailwind-merge: 3.4.0 + optionalDependencies: + '@types/react': 19.2.9 + next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + tailwindcss: 4.1.18 + '@hono/mcp@0.2.2(@modelcontextprotocol/sdk@1.25.2(hono@4.11.4)(zod@4.1.13))(hono-rate-limiter@0.4.2(hono@4.11.4))(hono@4.11.4)(zod@4.1.13)': dependencies: '@modelcontextprotocol/sdk': 1.25.2(hono@4.11.4)(zod@4.1.13) @@ -9932,6 +10405,8 @@ snapshots: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@orama/orama@3.1.18': {} + '@oslojs/encoding@1.1.0': {} '@pagefind/darwin-arm64@1.3.0': @@ -9967,8 +10442,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@radix-ui/number@1.1.1': {} + '@radix-ui/primitive@1.1.2': {} + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-arrow@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -9978,6 +10474,31 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-collection@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) @@ -9990,24 +10511,76 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.20)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.9)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-context@1.1.2(@types/react@18.3.20)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-context@1.1.2(@types/react@19.2.9)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.9)(react@19.2.3) + aria-hidden: 1.2.6 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-remove-scroll: 2.7.0(@types/react@19.2.9)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-direction@1.1.1(@types/react@18.3.20)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-direction@1.1.1(@types/react@19.2.9)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -10021,6 +10594,19 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-dropdown-menu@2.1.15(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -10042,6 +10628,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.9)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) @@ -10053,6 +10645,17 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-id@1.1.1(@types/react@18.3.20)(react@18.3.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -10060,6 +10663,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-id@1.1.1(@types/react@19.2.9)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-menu@2.1.15(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -10086,6 +10696,51 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.9)(react@19.2.3) + aria-hidden: 1.2.6 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-remove-scroll: 2.7.0(@types/react@19.2.9)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-popper@1.2.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10104,6 +10759,24 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/rect': 1.1.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-portal@1.1.9(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10114,6 +10787,16 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-presence@1.1.4(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) @@ -10124,6 +10807,16 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-slot': 1.2.3(@types/react@18.3.20)(react@18.3.1) @@ -10133,6 +10826,15 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 @@ -10147,15 +10849,79 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 18.3.20 - '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@types/react': 18.3.20 + '@types/react-dom': 18.3.7(@types/react@18.3.20) + + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + + '@radix-ui/react-slot@1.2.3(@types/react@18.3.20)(react@18.3.1)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.20 + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.9)(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + + '@radix-ui/react-slot@1.2.4(@types/react@19.2.9)(react@19.2.3)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 - '@radix-ui/react-slot@1.2.3(@types/react@18.3.20)(react@18.3.1)': + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.20)(react@18.3.1) - react: 18.3.1 + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-context': 1.1.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) optionalDependencies: - '@types/react': 18.3.20 + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) '@radix-ui/react-tooltip@1.2.7(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: @@ -10183,6 +10949,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.9)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.20)(react@18.3.1)': dependencies: '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.20)(react@18.3.1) @@ -10191,6 +10963,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.9)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.20)(react@18.3.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -10198,6 +10978,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.9)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.20)(react@18.3.1)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -10205,12 +10992,31 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.9)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.20)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.9)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.9)(react@19.2.3)': + dependencies: + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-use-rect@1.1.1(@types/react@18.3.20)(react@18.3.1)': dependencies: '@radix-ui/rect': 1.1.1 @@ -10218,6 +11024,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.9)(react@19.2.3)': + dependencies: + '@radix-ui/rect': 1.1.1 + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-use-size@1.1.1(@types/react@18.3.20)(react@18.3.1)': dependencies: '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.20)(react@18.3.1) @@ -10225,6 +11038,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.9)(react@19.2.3)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.9)(react@19.2.3) + react: 19.2.3 + optionalDependencies: + '@types/react': 19.2.9 + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.20))(@types/react@18.3.20)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -10234,6 +11054,15 @@ snapshots: '@types/react': 18.3.20 '@types/react-dom': 18.3.7(@types/react@18.3.20) + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + '@types/react-dom': 19.2.3(@types/react@19.2.9) + '@radix-ui/rect@1.1.1': {} '@remix-run/router@1.23.2': {} @@ -10398,13 +11227,13 @@ snapshots: '@sentry-internal/browser-utils': 10.32.1 '@sentry/core': 10.32.1 - '@sentry/astro@10.32.1(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': + '@sentry/astro@10.32.1(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2))': dependencies: '@sentry/browser': 10.32.1 '@sentry/core': 10.32.1 '@sentry/node': 10.32.1 '@sentry/vite-plugin': 4.6.1 - astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro: 5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) transitivePeerDependencies: - encoding - supports-color @@ -10729,6 +11558,13 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 + '@shikijs/core@3.21.0': + dependencies: + '@shikijs/types': 3.21.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + '@shikijs/engine-javascript@1.29.2': dependencies: '@shikijs/types': 1.29.2 @@ -10747,6 +11583,12 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 + '@shikijs/engine-javascript@3.21.0': + dependencies: + '@shikijs/types': 3.21.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.4 + '@shikijs/engine-oniguruma@1.29.2': dependencies: '@shikijs/types': 1.29.2 @@ -10762,6 +11604,11 @@ snapshots: '@shikijs/types': 3.15.0 '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/engine-oniguruma@3.21.0': + dependencies: + '@shikijs/types': 3.21.0 + '@shikijs/vscode-textmate': 10.0.2 + '@shikijs/langs@1.29.2': dependencies: '@shikijs/types': 1.29.2 @@ -10774,6 +11621,19 @@ snapshots: dependencies: '@shikijs/types': 3.15.0 + '@shikijs/langs@3.21.0': + dependencies: + '@shikijs/types': 3.21.0 + + '@shikijs/rehype@3.21.0': + dependencies: + '@shikijs/types': 3.21.0 + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + shiki: 3.21.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + '@shikijs/themes@1.29.2': dependencies: '@shikijs/types': 1.29.2 @@ -10786,11 +11646,20 @@ snapshots: dependencies: '@shikijs/types': 3.15.0 + '@shikijs/themes@3.21.0': + dependencies: + '@shikijs/types': 3.21.0 + '@shikijs/transformers@3.13.0': dependencies: '@shikijs/core': 3.13.0 '@shikijs/types': 3.13.0 + '@shikijs/transformers@3.21.0': + dependencies: + '@shikijs/core': 3.21.0 + '@shikijs/types': 3.21.0 + '@shikijs/types@1.29.2': dependencies: '@shikijs/vscode-textmate': 10.0.2 @@ -10806,12 +11675,19 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 + '@shikijs/types@3.21.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + '@shikijs/vscode-textmate@10.0.2': {} '@sinclair/typebox@0.27.8': {} '@sindresorhus/is@4.6.0': {} + '@standard-schema/spec@1.1.0': {} + '@stricli/auto-complete@1.1.1': dependencies: '@stricli/core': 1.1.1 @@ -11048,12 +11924,12 @@ snapshots: tailwindcss: 4.1.11 vite: 5.4.21(@types/node@22.15.28)(lightningcss@1.30.2)(terser@5.43.1) - '@tailwindcss/vite@4.1.11(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2))': + '@tailwindcss/vite@4.1.11(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.1.11 '@tailwindcss/oxide': 4.1.11 tailwindcss: 4.1.11 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) '@testing-library/dom@10.4.1': dependencies: @@ -11227,10 +12103,9 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@24.10.1': + '@types/node@25.0.10': dependencies: undici-types: 7.16.0 - optional: true '@types/parse-json@4.0.2': {} @@ -11432,14 +12307,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.4.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2))': + '@vitejs/plugin-react@4.4.1(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2))': dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -11747,12 +12622,12 @@ snapshots: astring@1.9.0: {} - astro-expressive-code@0.40.2(astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)): + astro-expressive-code@0.40.2(astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2)): dependencies: - astro: 5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) + astro: 5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2) rehype-expressive-code: 0.40.2 - astro@5.15.9(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2): + astro@5.15.9(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(rollup@4.53.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.9.2)(yaml@2.8.2): dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/internal-helpers': 0.7.5 @@ -11808,8 +12683,8 @@ snapshots: unist-util-visit: 5.0.0 unstorage: 1.17.2 vfile: 6.0.3 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) - vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) + vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vitefu: 1.1.1(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -12151,6 +13026,10 @@ snapshots: dependencies: readdirp: 4.1.2 + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + chownr@3.0.0: {} chromium-pickle-js@0.2.0: {} @@ -12281,6 +13160,8 @@ snapshots: normalize-path: 3.0.0 readable-stream: 3.6.2 + compute-scroll-into-view@3.1.1: {} + concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 @@ -12321,7 +13202,7 @@ snapshots: config-file-ts@0.2.6: dependencies: glob: 10.4.5 - typescript: 5.9.2 + typescript: 5.9.3 consola@3.4.0: {} @@ -12865,7 +13746,6 @@ snapshots: '@esbuild/win32-arm64': 0.27.2 '@esbuild/win32-ia32': 0.27.2 '@esbuild/win32-x64': 0.27.2 - optional: true escalade@3.2.0: {} @@ -12975,6 +13855,10 @@ snapshots: astring: 1.9.0 source-map: 0.7.6 + estree-util-value-to-estree@3.5.0: + dependencies: + '@types/estree': 1.0.8 + estree-util-visit@2.0.0: dependencies: '@types/estree-jsx': 1.0.5 @@ -13286,6 +14170,93 @@ snapshots: fsevents@2.3.3: optional: true + fumadocs-core@16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6): + dependencies: + '@formatjs/intl-localematcher': 0.8.0 + '@orama/orama': 3.1.18 + '@shikijs/rehype': 3.21.0 + '@shikijs/transformers': 3.21.0 + estree-util-value-to-estree: 3.5.0 + github-slugger: 2.0.0 + hast-util-to-estree: 3.1.3 + hast-util-to-jsx-runtime: 2.3.6 + image-size: 2.0.2 + negotiator: 1.0.0 + npm-to-yarn: 3.0.1 + path-to-regexp: 6.3.0 + remark: 15.0.1 + remark-gfm: 4.0.1 + remark-rehype: 11.1.2 + scroll-into-view-if-needed: 3.1.0 + shiki: 3.21.0 + tinyglobby: 0.2.15 + unist-util-visit: 5.1.0 + optionalDependencies: + '@types/react': 19.2.9 + lucide-react: 0.563.0(react@19.2.3) + next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + zod: 4.3.6 + transitivePeerDependencies: + - supports-color + + fumadocs-mdx@14.2.6(@types/react@19.2.9)(fumadocs-core@16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)): + dependencies: + '@mdx-js/mdx': 3.1.1 + '@standard-schema/spec': 1.1.0 + chokidar: 5.0.0 + esbuild: 0.27.2 + estree-util-value-to-estree: 3.5.0 + fumadocs-core: 16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6) + js-yaml: 4.1.1 + mdast-util-to-markdown: 2.1.2 + picocolors: 1.1.1 + picomatch: 4.0.3 + remark-mdx: 3.1.1 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + zod: 4.3.6 + optionalDependencies: + '@types/react': 19.2.9 + next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + fumadocs-ui@16.4.8(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(fumadocs-core@16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18): + dependencies: + '@fumadocs/ui': 16.4.8(@types/react@19.2.9)(fumadocs-core@16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.9)(react@19.2.3) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.9))(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + class-variance-authority: 0.7.1 + fumadocs-core: 16.4.8(@types/react@19.2.9)(lucide-react@0.563.0(react@19.2.3))(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.6) + lucide-react: 0.563.0(react@19.2.3) + next-themes: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-medium-image-zoom: 5.4.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + scroll-into-view-if-needed: 3.1.0 + optionalDependencies: + '@types/react': 19.2.9 + next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + tailwindcss: 4.1.18 + transitivePeerDependencies: + - '@types/react-dom' + function-bind@1.1.2: {} gensync@1.0.0-beta.2: {} @@ -13597,6 +14568,27 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.8 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 @@ -13631,6 +14623,26 @@ snapshots: transitivePeerDependencies: - supports-color + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.1.3 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + hast-util-to-parse5@8.0.0: dependencies: '@types/hast': 3.0.4 @@ -13766,6 +14778,8 @@ snapshots: ignore@5.3.2: {} + image-size@2.0.2: {} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -13799,6 +14813,8 @@ snapshots: inline-style-parser@0.2.4: {} + inline-style-parser@0.2.7: {} + ipaddr.js@1.9.1: {} iron-webcrypto@1.2.1: {} @@ -14871,6 +15887,11 @@ snapshots: neotraverse@0.6.18: {} + next-themes@0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@next/env': 15.5.9 @@ -14980,6 +16001,8 @@ snapshots: dependencies: path-key: 4.0.0 + npm-to-yarn@3.0.1: {} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -15033,6 +16056,12 @@ snapshots: regex: 6.0.1 regex-recursion: 6.0.2 + oniguruma-to-es@4.3.4: + dependencies: + oniguruma-parser: 0.12.1 + regex: 6.0.1 + regex-recursion: 6.0.2 + open@9.1.0: dependencies: default-browser: 4.0.0 @@ -15261,6 +16290,11 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss-value-parser@4.2.0: {} postcss@8.4.31: @@ -15416,6 +16450,11 @@ snapshots: react-lifecycles-compat@3.0.4: {} + react-medium-image-zoom@5.4.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + dependencies: + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-refresh@0.17.0: {} react-remove-scroll-bar@2.3.8(@types/react@18.3.20)(react@18.3.1): @@ -15426,6 +16465,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + react-remove-scroll-bar@2.3.8(@types/react@19.2.9)(react@19.2.3): + dependencies: + react: 19.2.3 + react-style-singleton: 2.2.3(@types/react@19.2.9)(react@19.2.3) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.9 + react-remove-scroll@2.7.0(@types/react@18.3.20)(react@18.3.1): dependencies: react: 18.3.1 @@ -15437,6 +16484,17 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + react-remove-scroll@2.7.0(@types/react@19.2.9)(react@19.2.3): + dependencies: + react: 19.2.3 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.9)(react@19.2.3) + react-style-singleton: 2.2.3(@types/react@19.2.9)(react@19.2.3) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.9)(react@19.2.3) + use-sidecar: 1.1.3(@types/react@19.2.9)(react@19.2.3) + optionalDependencies: + '@types/react': 19.2.9 + react-router-dom@6.30.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.23.2 @@ -15457,6 +16515,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + react-style-singleton@2.2.3(@types/react@19.2.9)(react@19.2.3): + dependencies: + get-nonce: 1.0.1 + react: 19.2.3 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.9 + react-textarea-autosize@8.5.9(@types/react@18.3.20)(react@18.3.1): dependencies: '@babel/runtime': 7.27.1 @@ -15507,6 +16573,8 @@ snapshots: readdirp@4.1.2: {} + readdirp@5.0.0: {} + recast@0.23.11: dependencies: ast-types: 0.16.1 @@ -15638,6 +16706,13 @@ snapshots: transitivePeerDependencies: - supports-color + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -15668,6 +16743,15 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -15833,6 +16917,10 @@ snapshots: scheduler@0.27.0: {} + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + semver-compare@1.0.0: optional: true @@ -16009,6 +17097,17 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 + shiki@3.21.0: + dependencies: + '@shikijs/core': 3.21.0 + '@shikijs/engine-javascript': 3.21.0 + '@shikijs/engine-oniguruma': 3.21.0 + '@shikijs/langs': 3.21.0 + '@shikijs/themes': 3.21.0 + '@shikijs/types': 3.21.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -16215,10 +17314,18 @@ snapshots: stubborn-fs@1.2.5: {} + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + style-to-object@1.0.8: dependencies: inline-style-parser: 0.2.4 @@ -16494,6 +17601,8 @@ snapshots: typescript@5.9.2: {} + typescript@5.9.3: {} + ufo@1.6.1: {} ufo@1.6.3: {} @@ -16506,8 +17615,7 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.16.0: - optional: true + undici-types@7.16.0: {} unicode-properties@1.4.1: dependencies: @@ -16586,6 +17694,12 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + universalify@0.1.2: {} universalify@2.0.1: {} @@ -16637,6 +17751,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + use-callback-ref@1.3.3(@types/react@19.2.9)(react@19.2.3): + dependencies: + react: 19.2.3 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.9 + use-composed-ref@1.4.0(@types/react@18.3.20)(react@18.3.1): dependencies: react: 18.3.1 @@ -16664,6 +17785,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.20 + use-sidecar@1.1.3(@types/react@19.2.9)(react@19.2.3): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.3 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.9 + usehooks-ts@2.16.0(react@18.3.1): dependencies: lodash.debounce: 4.0.8 @@ -16745,7 +17874,7 @@ snapshots: vite-plugin-electron@0.29.0: {} - vite-plugin-inspect@0.7.42(rollup@4.53.3)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)): + vite-plugin-inspect@0.7.42(rollup@4.53.3)(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.2(rollup@4.53.3) @@ -16755,7 +17884,7 @@ snapshots: open: 9.1.0 picocolors: 1.1.0 sirv: 2.0.4 - vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) transitivePeerDependencies: - rollup - supports-color @@ -16793,7 +17922,7 @@ snapshots: lightningcss: 1.30.2 terser: 5.43.1 - vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2): + vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -16802,7 +17931,7 @@ snapshots: rollup: 4.53.3 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.1 + '@types/node': 25.0.10 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 @@ -16810,9 +17939,9 @@ snapshots: tsx: 4.20.3 yaml: 2.8.2 - vitefu@1.1.1(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)): + vitefu@1.1.1(vite@6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2)): optionalDependencies: - vite: 6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) + vite: 6.4.1(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.2) vitest@0.34.6(happy-dom@20.0.2)(lightningcss@1.30.2)(playwright@1.56.1)(terser@5.43.1): dependencies: @@ -17004,6 +18133,8 @@ snapshots: zod@4.1.13: {} + zod@4.3.6: {} + zustand@5.0.3(@types/react@18.3.20)(react@18.3.1): optionalDependencies: '@types/react': 18.3.20 From b1d71186156b37250e7187aa834d36b3a6cf98c4 Mon Sep 17 00:00:00 2001 From: mathuraditya724 Date: Tue, 27 Jan 2026 01:09:16 +0530 Subject: [PATCH 06/14] wip --- packages/docs/.gitignore | 2 + packages/docs/.vscode/settings.json | 6 + packages/docs/app/(home)/layout.tsx | 6 - packages/docs/app/(home)/page.tsx | 16 - packages/docs/app/api/search/route.ts | 7 - packages/docs/app/docs/[[...slug]]/page.tsx | 61 -- packages/docs/app/docs/layout.tsx | 11 - packages/docs/app/global.css | 3 - packages/docs/app/layout.tsx | 17 - packages/docs/app/llms-full.txt/route.ts | 10 - .../app/llms.mdx/docs/[[...slug]]/route.ts | 20 - packages/docs/app/llms.txt/route.ts | 13 - packages/docs/app/og/docs/[...slug]/route.tsx | 24 - packages/docs/components.json | 22 + packages/docs/components/ai/page-actions.tsx | 214 ----- .../docs/content/docs/components/index.mdx | 27 + .../docs/content/docs/components/meta.json | 4 + .../content/docs/components/span-tree.mdx | 148 ++++ .../content/docs/components/trace-item.mdx | 180 ++++ packages/docs/content/docs/index.mdx | 45 +- packages/docs/content/docs/meta.json | 4 + packages/docs/content/docs/setup.mdx | 50 ++ packages/docs/content/docs/test.mdx | 17 - packages/docs/content/docs/usage.mdx | 76 ++ packages/docs/lib/layout.shared.tsx | 9 - packages/docs/lib/source.ts | 27 - packages/docs/mdx-components.tsx | 9 - packages/docs/next.config.mjs | 10 +- packages/docs/package.json | 37 +- packages/docs/postcss.config.mjs | 2 +- packages/docs/public/cover.png | Bin 0 -> 14954 bytes packages/docs/public/favicon.ico | Bin 0 -> 15406 bytes packages/docs/public/logo.png | Bin 0 -> 229765 bytes packages/docs/source.config.ts | 6 +- packages/docs/src/app/(home)/layout.tsx | 7 + packages/docs/src/app/(home)/page.tsx | 170 ++++ .../src/app/docs/[[...slug]]/SponsorPanel.tsx | 91 +++ .../docs/src/app/docs/[[...slug]]/page.tsx | 73 ++ packages/docs/src/app/docs/layout.tsx | 12 + packages/docs/src/app/global.css | 167 ++++ packages/docs/src/app/layout.config.tsx | 24 + packages/docs/src/app/layout.tsx | 51 ++ packages/docs/src/components/Logo.tsx | 28 + .../docs/src/components/YoutubePlayer.tsx | 20 + .../src/components/demos/span-tree-demo.tsx | 133 +++ .../src/components/demos/trace-item-demo.tsx | 107 +++ .../docs/src/components/docs/api-table.tsx | 56 ++ .../src/components/docs/component-preview.tsx | 97 +++ .../src/components/docs/installation-tabs.tsx | 176 ++++ .../docs/src/components/ui/hover-card.tsx | 31 + .../src/components/ui/span-tree/duration.ts | 99 +++ .../docs/src/components/ui/span-tree/index.ts | 5 + .../src/components/ui/span-tree/span-item.tsx | 150 ++++ .../components/ui/span-tree/span-resizer.tsx | 53 ++ .../src/components/ui/span-tree/span-tree.tsx | 47 ++ .../docs/src/components/ui/span-tree/types.ts | 89 ++ packages/docs/src/components/ui/tabs.tsx | 55 ++ .../src/components/ui/trace-item/duration.ts | 52 ++ .../src/components/ui/trace-item/index.ts | 5 + .../components/ui/trace-item/time-since.tsx | 46 ++ .../components/ui/trace-item/trace-badge.tsx | 86 ++ .../components/ui/trace-item/trace-item.tsx | 90 ++ .../src/components/ui/trace-item/types.ts | 102 +++ packages/docs/{ => src}/lib/cn.ts | 0 packages/docs/src/lib/source.ts | 14 + packages/docs/src/lib/utils.ts | 6 + packages/docs/src/mdx-components.tsx | 40 + packages/docs/tsconfig.json | 8 +- packages/registry/package.json | 4 +- packages/registry/registry.json | 37 + .../registry/new-york/span-tree/duration.ts | 99 +++ .../registry/new-york/span-tree/span-item.tsx | 155 ++++ .../new-york/span-tree/span-resizer.tsx | 53 ++ .../registry/new-york/span-tree/span-tree.tsx | 47 ++ .../registry/new-york/span-tree/types.ts | 89 ++ .../registry/new-york/trace-item/duration.ts | 52 ++ .../new-york/trace-item/time-since.tsx | 46 ++ .../new-york/trace-item/trace-badge.tsx | 86 ++ .../new-york/trace-item/trace-item.tsx | 90 ++ .../registry/new-york/trace-item/types.ts | 102 +++ pnpm-lock.yaml | 767 ++++++++++++------ 81 files changed, 4165 insertions(+), 735 deletions(-) create mode 100644 packages/docs/.vscode/settings.json delete mode 100644 packages/docs/app/(home)/layout.tsx delete mode 100644 packages/docs/app/(home)/page.tsx delete mode 100644 packages/docs/app/api/search/route.ts delete mode 100644 packages/docs/app/docs/[[...slug]]/page.tsx delete mode 100644 packages/docs/app/docs/layout.tsx delete mode 100644 packages/docs/app/global.css delete mode 100644 packages/docs/app/layout.tsx delete mode 100644 packages/docs/app/llms-full.txt/route.ts delete mode 100644 packages/docs/app/llms.mdx/docs/[[...slug]]/route.ts delete mode 100644 packages/docs/app/llms.txt/route.ts delete mode 100644 packages/docs/app/og/docs/[...slug]/route.tsx create mode 100644 packages/docs/components.json delete mode 100644 packages/docs/components/ai/page-actions.tsx create mode 100644 packages/docs/content/docs/components/index.mdx create mode 100644 packages/docs/content/docs/components/meta.json create mode 100644 packages/docs/content/docs/components/span-tree.mdx create mode 100644 packages/docs/content/docs/components/trace-item.mdx create mode 100644 packages/docs/content/docs/meta.json create mode 100644 packages/docs/content/docs/setup.mdx delete mode 100644 packages/docs/content/docs/test.mdx create mode 100644 packages/docs/content/docs/usage.mdx delete mode 100644 packages/docs/lib/layout.shared.tsx delete mode 100644 packages/docs/lib/source.ts delete mode 100644 packages/docs/mdx-components.tsx create mode 100644 packages/docs/public/cover.png create mode 100644 packages/docs/public/favicon.ico create mode 100644 packages/docs/public/logo.png create mode 100644 packages/docs/src/app/(home)/layout.tsx create mode 100644 packages/docs/src/app/(home)/page.tsx create mode 100644 packages/docs/src/app/docs/[[...slug]]/SponsorPanel.tsx create mode 100644 packages/docs/src/app/docs/[[...slug]]/page.tsx create mode 100644 packages/docs/src/app/docs/layout.tsx create mode 100644 packages/docs/src/app/global.css create mode 100644 packages/docs/src/app/layout.config.tsx create mode 100644 packages/docs/src/app/layout.tsx create mode 100644 packages/docs/src/components/Logo.tsx create mode 100644 packages/docs/src/components/YoutubePlayer.tsx create mode 100644 packages/docs/src/components/demos/span-tree-demo.tsx create mode 100644 packages/docs/src/components/demos/trace-item-demo.tsx create mode 100644 packages/docs/src/components/docs/api-table.tsx create mode 100644 packages/docs/src/components/docs/component-preview.tsx create mode 100644 packages/docs/src/components/docs/installation-tabs.tsx create mode 100644 packages/docs/src/components/ui/hover-card.tsx create mode 100644 packages/docs/src/components/ui/span-tree/duration.ts create mode 100644 packages/docs/src/components/ui/span-tree/index.ts create mode 100644 packages/docs/src/components/ui/span-tree/span-item.tsx create mode 100644 packages/docs/src/components/ui/span-tree/span-resizer.tsx create mode 100644 packages/docs/src/components/ui/span-tree/span-tree.tsx create mode 100644 packages/docs/src/components/ui/span-tree/types.ts create mode 100644 packages/docs/src/components/ui/tabs.tsx create mode 100644 packages/docs/src/components/ui/trace-item/duration.ts create mode 100644 packages/docs/src/components/ui/trace-item/index.ts create mode 100644 packages/docs/src/components/ui/trace-item/time-since.tsx create mode 100644 packages/docs/src/components/ui/trace-item/trace-badge.tsx create mode 100644 packages/docs/src/components/ui/trace-item/trace-item.tsx create mode 100644 packages/docs/src/components/ui/trace-item/types.ts rename packages/docs/{ => src}/lib/cn.ts (100%) create mode 100644 packages/docs/src/lib/source.ts create mode 100644 packages/docs/src/lib/utils.ts create mode 100644 packages/docs/src/mdx-components.tsx create mode 100644 packages/registry/registry.json create mode 100644 packages/registry/registry/new-york/span-tree/duration.ts create mode 100644 packages/registry/registry/new-york/span-tree/span-item.tsx create mode 100644 packages/registry/registry/new-york/span-tree/span-resizer.tsx create mode 100644 packages/registry/registry/new-york/span-tree/span-tree.tsx create mode 100644 packages/registry/registry/new-york/span-tree/types.ts create mode 100644 packages/registry/registry/new-york/trace-item/duration.ts create mode 100644 packages/registry/registry/new-york/trace-item/time-since.tsx create mode 100644 packages/registry/registry/new-york/trace-item/trace-badge.tsx create mode 100644 packages/registry/registry/new-york/trace-item/trace-item.tsx create mode 100644 packages/registry/registry/new-york/trace-item/types.ts diff --git a/packages/docs/.gitignore b/packages/docs/.gitignore index 9e429e498..55a12ae71 100644 --- a/packages/docs/.gitignore +++ b/packages/docs/.gitignore @@ -2,6 +2,8 @@ /node_modules # generated content +.contentlayer +.content-collections .source # test & build diff --git a/packages/docs/.vscode/settings.json b/packages/docs/.vscode/settings.json new file mode 100644 index 000000000..fdaee720f --- /dev/null +++ b/packages/docs/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "editor.codeActionsOnSave": { + "source.organizeImports.biome": "explicit", + "source.fixAll.biome": "explicit" + } +} diff --git a/packages/docs/app/(home)/layout.tsx b/packages/docs/app/(home)/layout.tsx deleted file mode 100644 index 3dd83fedb..000000000 --- a/packages/docs/app/(home)/layout.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { baseOptions } from "@/lib/layout.shared"; -import { HomeLayout } from "fumadocs-ui/layouts/home"; - -export default function Layout({ children }: LayoutProps<"/">) { - return {children}; -} diff --git a/packages/docs/app/(home)/page.tsx b/packages/docs/app/(home)/page.tsx deleted file mode 100644 index 8412053a5..000000000 --- a/packages/docs/app/(home)/page.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import Link from "next/link"; - -export default function HomePage() { - return ( -
    -

    Hello World

    -

    - You can open{" "} - - /docs - {" "} - and see the documentation. -

    -
    - ); -} diff --git a/packages/docs/app/api/search/route.ts b/packages/docs/app/api/search/route.ts deleted file mode 100644 index aa9d5cd0a..000000000 --- a/packages/docs/app/api/search/route.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { source } from "@/lib/source"; -import { createFromSource } from "fumadocs-core/search/server"; - -export const { GET } = createFromSource(source, { - // https://docs.orama.com/docs/orama-js/supported-languages - language: "english", -}); diff --git a/packages/docs/app/docs/[[...slug]]/page.tsx b/packages/docs/app/docs/[[...slug]]/page.tsx deleted file mode 100644 index cdb109c2f..000000000 --- a/packages/docs/app/docs/[[...slug]]/page.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import { LLMCopyButton, ViewOptions } from "@/components/ai/page-actions"; -import { getPageImage, source } from "@/lib/source"; -import { getMDXComponents } from "@/mdx-components"; -import { DocsBody, DocsDescription, DocsPage, DocsTitle } from "fumadocs-ui/layouts/docs/page"; -import { createRelativeLink } from "fumadocs-ui/mdx"; -import type { Metadata } from "next"; -import { notFound } from "next/navigation"; - -export default async function Page(props: PageProps<"/docs/[[...slug]]">) { - const params = await props.params; - const page = source.getPage(params.slug); - if (!page) notFound(); - - const MDX = page.data.body; - const gitConfig = { - user: "username", - repo: "repo", - branch: "main", - }; - - return ( - - {page.data.title} - {page.data.description} -
    - - -
    - - - -
    - ); -} - -export async function generateStaticParams() { - return source.generateParams(); -} - -export async function generateMetadata(props: PageProps<"/docs/[[...slug]]">): Promise { - const params = await props.params; - const page = source.getPage(params.slug); - if (!page) notFound(); - - return { - title: page.data.title, - description: page.data.description, - openGraph: { - images: getPageImage(page).url, - }, - }; -} diff --git a/packages/docs/app/docs/layout.tsx b/packages/docs/app/docs/layout.tsx deleted file mode 100644 index 072222233..000000000 --- a/packages/docs/app/docs/layout.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { baseOptions } from "@/lib/layout.shared"; -import { source } from "@/lib/source"; -import { DocsLayout } from "fumadocs-ui/layouts/docs"; - -export default function Layout({ children }: LayoutProps<"/docs">) { - return ( - - {children} - - ); -} diff --git a/packages/docs/app/global.css b/packages/docs/app/global.css deleted file mode 100644 index 50b3bc296..000000000 --- a/packages/docs/app/global.css +++ /dev/null @@ -1,3 +0,0 @@ -@import 'tailwindcss'; -@import 'fumadocs-ui/css/neutral.css'; -@import 'fumadocs-ui/css/preset.css'; diff --git a/packages/docs/app/layout.tsx b/packages/docs/app/layout.tsx deleted file mode 100644 index cd8c56065..000000000 --- a/packages/docs/app/layout.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { RootProvider } from "fumadocs-ui/provider/next"; -import "./global.css"; -import { Inter } from "next/font/google"; - -const inter = Inter({ - subsets: ["latin"], -}); - -export default function Layout({ children }: LayoutProps<"/">) { - return ( - - - {children} - - - ); -} diff --git a/packages/docs/app/llms-full.txt/route.ts b/packages/docs/app/llms-full.txt/route.ts deleted file mode 100644 index fcccaeefa..000000000 --- a/packages/docs/app/llms-full.txt/route.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { getLLMText, source } from "@/lib/source"; - -export const revalidate = false; - -export async function GET() { - const scan = source.getPages().map(getLLMText); - const scanned = await Promise.all(scan); - - return new Response(scanned.join("\n\n")); -} diff --git a/packages/docs/app/llms.mdx/docs/[[...slug]]/route.ts b/packages/docs/app/llms.mdx/docs/[[...slug]]/route.ts deleted file mode 100644 index 6019bc8c4..000000000 --- a/packages/docs/app/llms.mdx/docs/[[...slug]]/route.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { getLLMText, source } from "@/lib/source"; -import { notFound } from "next/navigation"; - -export const revalidate = false; - -export async function GET(_req: Request, { params }: RouteContext<"/llms.mdx/docs/[[...slug]]">) { - const { slug } = await params; - const page = source.getPage(slug); - if (!page) notFound(); - - return new Response(await getLLMText(page), { - headers: { - "Content-Type": "text/markdown", - }, - }); -} - -export function generateStaticParams() { - return source.generateParams(); -} diff --git a/packages/docs/app/llms.txt/route.ts b/packages/docs/app/llms.txt/route.ts deleted file mode 100644 index cc98a1c3a..000000000 --- a/packages/docs/app/llms.txt/route.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { source } from "@/lib/source"; - -export const revalidate = false; - -export async function GET() { - const lines: string[] = []; - lines.push("# Documentation"); - lines.push(""); - for (const page of source.getPages()) { - lines.push(`- [${page.data.title}](${page.url}): ${page.data.description}`); - } - return new Response(lines.join("\n")); -} diff --git a/packages/docs/app/og/docs/[...slug]/route.tsx b/packages/docs/app/og/docs/[...slug]/route.tsx deleted file mode 100644 index 9bb1c4102..000000000 --- a/packages/docs/app/og/docs/[...slug]/route.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { getPageImage, source } from "@/lib/source"; -import { generate as DefaultImage } from "fumadocs-ui/og"; -import { notFound } from "next/navigation"; -import { ImageResponse } from "next/og"; - -export const revalidate = false; - -export async function GET(_req: Request, { params }: RouteContext<"/og/docs/[...slug]">) { - const { slug } = await params; - const page = source.getPage(slug.slice(0, -1)); - if (!page) notFound(); - - return new ImageResponse(, { - width: 1200, - height: 630, - }); -} - -export function generateStaticParams() { - return source.getPages().map(page => ({ - lang: page.locale, - slug: getPageImage(page).segments, - })); -} diff --git a/packages/docs/components.json b/packages/docs/components.json new file mode 100644 index 000000000..779ec9a09 --- /dev/null +++ b/packages/docs/components.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/app/global.css", + "baseColor": "zinc", + "cssVariables": true, + "prefix": "" + }, + "iconLibrary": "lucide", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "registries": {} +} diff --git a/packages/docs/components/ai/page-actions.tsx b/packages/docs/components/ai/page-actions.tsx deleted file mode 100644 index a4b87aff5..000000000 --- a/packages/docs/components/ai/page-actions.tsx +++ /dev/null @@ -1,214 +0,0 @@ -"use client"; -import { cn } from "@/lib/cn"; -import { buttonVariants } from "fumadocs-ui/components/ui/button"; -import { Popover, PopoverContent, PopoverTrigger } from "fumadocs-ui/components/ui/popover"; -import { useCopyButton } from "fumadocs-ui/utils/use-copy-button"; -import { Check, ChevronDown, Copy, ExternalLinkIcon, MessageCircleIcon } from "lucide-react"; -import { useMemo, useState } from "react"; - -const cache = new Map(); - -export function LLMCopyButton({ - /** - * A URL to fetch the raw Markdown/MDX content of page - */ - markdownUrl, -}: { - markdownUrl: string; -}) { - const [isLoading, setLoading] = useState(false); - const [checked, onClick] = useCopyButton(async () => { - const cached = cache.get(markdownUrl); - if (cached) return navigator.clipboard.writeText(cached); - - setLoading(true); - - try { - await navigator.clipboard.write([ - new ClipboardItem({ - "text/plain": fetch(markdownUrl).then(async res => { - const content = await res.text(); - cache.set(markdownUrl, content); - - return content; - }), - }), - ]); - } finally { - setLoading(false); - } - }); - - return ( - - ); -} - -export function ViewOptions({ - markdownUrl, - githubUrl, -}: { - /** - * A URL to the raw Markdown/MDX content of page - */ - markdownUrl: string; - - /** - * Source file URL on GitHub - */ - githubUrl: string; -}) { - const items = useMemo(() => { - const fullMarkdownUrl = typeof window !== "undefined" ? new URL(markdownUrl, window.location.origin) : "loading"; - const q = `Read ${fullMarkdownUrl}, I want to ask questions about it.`; - - return [ - { - title: "Open in GitHub", - href: githubUrl, - icon: ( - - GitHub - - - ), - }, - { - title: "Open in Scira AI", - href: `https://scira.ai/?${new URLSearchParams({ - q, - })}`, - icon: ( - - Scira AI - - - - - - - - - ), - }, - { - title: "Open in ChatGPT", - href: `https://chatgpt.com/?${new URLSearchParams({ - hints: "search", - q, - })}`, - icon: ( - - OpenAI - - - ), - }, - { - title: "Open in Claude", - href: `https://claude.ai/new?${new URLSearchParams({ - q, - })}`, - icon: ( - - Anthropic - - - ), - }, - { - title: "Open in T3 Chat", - href: `https://t3.chat/new?${new URLSearchParams({ - q, - })}`, - icon: , - }, - ]; - }, [githubUrl, markdownUrl]); - - return ( - - - Open - - - - {items.map(item => ( - - {item.icon} - {item.title} - - - ))} - - - ); -} diff --git a/packages/docs/content/docs/components/index.mdx b/packages/docs/content/docs/components/index.mdx new file mode 100644 index 000000000..29e89dbf4 --- /dev/null +++ b/packages/docs/content/docs/components/index.mdx @@ -0,0 +1,27 @@ +--- +title: Components +description: Explore all the components available in Spotlight UI +--- + +# Components + +Explore all the components available in Spotlight UI. Each component is designed for building observability and distributed tracing experiences. + + + + Hierarchical waterfall visualization for distributed trace spans. Perfect for displaying the timing and hierarchy of spans within a trace. + + + Summary row component for displaying distributed trace information. Ideal for trace lists and overviews. + + + +## Installation + +All components can be installed using the shadcn CLI with our custom registry: + +```bash +pnpm dlx shadcn@latest add -r https://spotlightjs.com/registry.json +``` + +Or you can manually copy the component files. See each component's documentation for specific installation instructions. diff --git a/packages/docs/content/docs/components/meta.json b/packages/docs/content/docs/components/meta.json new file mode 100644 index 000000000..125faac27 --- /dev/null +++ b/packages/docs/content/docs/components/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Components", + "pages": ["span-tree", "trace-item"] +} diff --git a/packages/docs/content/docs/components/span-tree.mdx b/packages/docs/content/docs/components/span-tree.mdx new file mode 100644 index 000000000..de185befd --- /dev/null +++ b/packages/docs/content/docs/components/span-tree.mdx @@ -0,0 +1,148 @@ +--- +title: SpanTree +description: Hierarchical waterfall visualization for distributed trace spans +--- + +# SpanTree + +A hierarchical waterfall visualization component for distributed trace spans. Displays timing information and parent-child relationships between spans. + + + + + +## Installation + + + +## Usage + +```tsx +import { SpanTree } from "@/components/ui/span-tree"; +``` + +```tsx + setSelectedId(spanId)} +/> +``` + +## Examples + +### Basic Usage + +```tsx +import { SpanTree } from "@/components/ui/span-tree"; +import type { SpanData } from "@/components/ui/span-tree/types"; + +const spans: SpanData[] = [ + { + span_id: "span-001", + op: "http.server", + description: "GET /api/users", + start_timestamp: 1700000000000, + timestamp: 1700000000450, + status: "ok", + children: [], + }, +]; + +export function BasicExample() { + return ( + + ); +} +``` + +### With Selection + +```tsx +import { SpanTree } from "@/components/ui/span-tree"; +import { useState } from "react"; + +export function SelectionExample() { + const [selectedSpanId, setSelectedSpanId] = useState(); + + return ( + { + setSelectedSpanId(spanId); + console.log("Selected span:", span); + }} + /> + ); +} +``` + +### With Highlighting + +```tsx +import { SpanTree } from "@/components/ui/span-tree"; + +const highlightedIds = new Set(["span-002", "span-003"]); + +export function HighlightExample() { + return ( + + ); +} +``` + +## API Reference + +### SpanTree + +The main component for rendering a span tree visualization. + + void", description: "Callback when a span is clicked" }, + { name: "highlightedSpanIds", type: "Set", description: "Set of span IDs to highlight" }, + { name: "initialNodeWidth", type: "number", default: "50", description: "Initial width percentage of span name column" }, + { name: "className", type: "string", description: "Custom class name for the root element" } +]} /> + +### SpanData Type + +```tsx +interface SpanData { + span_id: string; + trace_id?: string; + parent_span_id?: string | null; + op?: string | null; + description?: string | null; + start_timestamp: number; + timestamp: number; + status?: "ok" | "error" | string; + children?: SpanData[]; + data?: Record; + tags?: Record; +} +``` + +## Notes + +- The component uses a resizable column layout - drag the divider between the span name and waterfall columns +- Spans with many children (more than 10) or deep nesting (depth 10 or more) are auto-collapsed for performance +- Duration colors indicate performance: green (under 100ms), yellow (100-500ms), orange (500ms-1s), red (over 1s) +- The component is fully keyboard accessible - use Tab to navigate and Enter/Space to select diff --git a/packages/docs/content/docs/components/trace-item.mdx b/packages/docs/content/docs/components/trace-item.mdx new file mode 100644 index 000000000..dd9d1b9a0 --- /dev/null +++ b/packages/docs/content/docs/components/trace-item.mdx @@ -0,0 +1,180 @@ +--- +title: TraceItem +description: Summary row component for displaying distributed trace information +--- + +# TraceItem + +A summary row component for displaying distributed trace information. Perfect for trace lists and overviews. + + + + + +## Installation + + + +## Usage + +```tsx +import { TraceItem } from "@/components/ui/trace-item"; +``` + +```tsx + setSelectedId(traceId)} +/> +``` + +## Examples + +### Basic Usage + +```tsx +import { TraceItem } from "@/components/ui/trace-item"; +import type { TraceData } from "@/components/ui/trace-item/types"; + +const trace: TraceData = { + trace_id: "abc123def456", + start_timestamp: Date.now() - 120000, + timestamp: Date.now() - 119550, + status: "ok", + spans: new Map(), + spanTree: [], + rootTransactionName: "/api/users", + rootTransactionMethod: "GET", + environment: "production", +}; + +export function BasicExample() { + return ; +} +``` + +### With Selection + +```tsx +import { TraceItem } from "@/components/ui/trace-item"; +import { useState } from "react"; + +export function SelectionExample() { + const [selectedId, setSelectedId] = useState(); + + return ( + { + setSelectedId(traceId); + console.log("Selected trace:", trace); + }} + /> + ); +} +``` + +### Trace List + +```tsx +import { TraceItem } from "@/components/ui/trace-item"; +import { useState } from "react"; + +export function TraceList({ traces }) { + const [selectedId, setSelectedId] = useState(); + + return ( +
    + {traces.map((trace) => ( + setSelectedId(traceId)} + /> + ))} +
    + ); +} +``` + +## API Reference + +### TraceItem + +The main component for rendering a trace summary row. + + void", description: "Callback when trace is clicked" }, + { name: "className", type: "string", description: "Custom class name" } +]} /> + +### TraceData Type + +```tsx +interface TraceData { + trace_id: string; + start_timestamp: number; + timestamp: number; + status?: "ok" | "error" | string; + spans: Map; + spanTree: SpanData[]; + rootTransactionName: string; + rootTransactionMethod?: string; + transactionCount?: number; + spanCount?: number; + platform?: string; + environment?: string; +} +``` + +### Additional Components + +The trace-item package also includes helper components: + +#### StatusBadge + +```tsx +import { StatusBadge } from "@/components/ui/trace-item"; + + + +``` + +#### MethodBadge + +```tsx +import { MethodBadge } from "@/components/ui/trace-item"; + + + +``` + +#### EnvironmentBadge + +```tsx +import { EnvironmentBadge } from "@/components/ui/trace-item"; + + + +``` + +#### TimeSince + +```tsx +import { TimeSince } from "@/components/ui/trace-item"; + + +``` + +## Notes + +- The component displays a truncated trace ID (first 8 characters) +- Relative time ("2 minutes ago") updates automatically every 5 seconds by default +- Error traces are highlighted with a red icon and status badge +- The component is fully keyboard accessible - use Tab to navigate and Enter/Space to select +- Duration is calculated from `timestamp - start_timestamp` diff --git a/packages/docs/content/docs/index.mdx b/packages/docs/content/docs/index.mdx index 1ede18ec9..d1c1f9329 100644 --- a/packages/docs/content/docs/index.mdx +++ b/packages/docs/content/docs/index.mdx @@ -1,13 +1,46 @@ --- -title: Hello World -description: Your first document +title: Introduction +description: Beautiful UI components for observability and distributed tracing --- -Welcome to the docs! You can start writing documents in `/content/docs`. +# Spotlight UI -## What is Next? +Spotlight UI is a component library built on top of shadcn/ui to help you build observability and distributed tracing experiences faster. It provides pre-built components for trace visualization, span trees, and more. + +Components are available via the shadcn CLI with our custom registry. + +```bash +pnpm dlx shadcn@latest add span-tree -r https://spotlightjs.com/registry.json +``` + +For example, to install the SpanTree component, you can run: + +```bash +pnpm dlx shadcn@latest add span-tree -r https://spotlightjs.com/registry.json +``` + +## Features + +- **Trace Visualization** - Display distributed traces with hierarchical span trees +- **Interactive Components** - Click, select, and explore trace data +- **Customizable** - Built with Tailwind CSS and fully customizable +- **shadcn/ui Compatible** - Uses the same design tokens and patterns + +## Getting Started + +1. **Setup your project** - Make sure you have shadcn/ui set up in your project +2. **Install components** - Use the CLI to add components to your project +3. **Use components** - Import and use components in your application + +Check out the [Setup](/docs/setup) guide to get started. + +## Components - - + + Hierarchical waterfall visualization for distributed trace spans + + + Summary row component for displaying distributed trace information + diff --git a/packages/docs/content/docs/meta.json b/packages/docs/content/docs/meta.json new file mode 100644 index 000000000..6eb768e39 --- /dev/null +++ b/packages/docs/content/docs/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Documentation", + "pages": ["---Getting Started---", "index", "setup", "usage", "---Components---", "components"] +} diff --git a/packages/docs/content/docs/setup.mdx b/packages/docs/content/docs/setup.mdx new file mode 100644 index 000000000..a0e439440 --- /dev/null +++ b/packages/docs/content/docs/setup.mdx @@ -0,0 +1,50 @@ +--- +title: Setup +description: Getting started with Spotlight UI +--- + +# Setup + +Getting started with Spotlight UI components is straightforward. You can use the shadcn CLI with our custom registry for the fastest setup, or manually copy the component files. + +## Prerequisites + +Before installing Spotlight UI, make sure your environment meets the following requirements: + +- [Node.js](https://nodejs.org/) version 18 or later +- A [Next.js](https://nextjs.org/) project (or any React framework) +- [shadcn/ui](https://ui.shadcn.com/) setup in your project + +If you don't have shadcn/ui set up, running any install command will set it up for you. + +## Installing components + +You can install Spotlight UI components using the shadcn CLI with our custom registry: + +```bash +pnpm dlx shadcn@latest add -r https://spotlightjs.com/registry.json +``` + +For example, to install the SpanTree component: + +```bash +pnpm dlx shadcn@latest add span-tree -r https://spotlightjs.com/registry.json +``` + +The CLI will download the component's code and integrate it into your project's directory (usually under your components folder). + +After running the command, you should see a confirmation in your terminal that the files were added. You can then proceed to use the component in your code. + +## Manual Installation + +If you prefer to manually install components, you can: + +1. Copy the component files from the registry +2. Install any required dependencies +3. Update import paths to match your project structure + +See each component's documentation page for specific manual installation instructions. + +## Next Steps + +Once you have components installed, check out the [Usage](/docs/usage) guide to learn how to use them in your application. diff --git a/packages/docs/content/docs/test.mdx b/packages/docs/content/docs/test.mdx deleted file mode 100644 index f475f4a63..000000000 --- a/packages/docs/content/docs/test.mdx +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: Components -description: Components ---- - -## Code Block - -```js -console.log('Hello World'); -``` - -## Cards - - - - - diff --git a/packages/docs/content/docs/usage.mdx b/packages/docs/content/docs/usage.mdx new file mode 100644 index 000000000..9f9b60510 --- /dev/null +++ b/packages/docs/content/docs/usage.mdx @@ -0,0 +1,76 @@ +--- +title: Usage +description: How to use Spotlight UI components in your application +--- + +# Usage + +Once a Spotlight UI component is installed, you can import it and use it in your application like any other React component. The components are added as part of your codebase (not hidden in a library), so you can edit them to suit your specific needs. + +## Example + +After installing Spotlight UI components, you can use them in your application. Here's an example using the SpanTree component: + +```tsx +"use client"; + +import { SpanTree } from "@/components/ui/span-tree"; +import type { SpanData } from "@/components/ui/span-tree/types"; +import { useState } from "react"; + +const spans: SpanData[] = [ + { + span_id: "span-001", + op: "http.server", + description: "GET /api/users", + start_timestamp: 1700000000000, + timestamp: 1700000000450, + status: "ok", + children: [ + { + span_id: "span-002", + op: "db.query", + description: "SELECT * FROM users", + start_timestamp: 1700000000050, + timestamp: 1700000000200, + status: "ok", + }, + ], + }, +]; + +export default function TracePage() { + const [selectedSpanId, setSelectedSpanId] = useState(); + + return ( + setSelectedSpanId(spanId)} + /> + ); +} +``` + +## Customization + +Since the component code is added directly to your project, you can customize it as needed: + +- **Styling** - Modify Tailwind classes to match your design system +- **Behavior** - Add new props or change existing behavior +- **Types** - Extend the TypeScript interfaces for your use case + +## TypeScript Support + +All components come with full TypeScript support. Types are exported from each component's `types.ts` file: + +```tsx +import type { SpanData, SpanTreeProps } from "@/components/ui/span-tree/types"; +import type { TraceData, TraceItemProps } from "@/components/ui/trace-item/types"; +``` + +## Server Components + +Most Spotlight UI components are client components (marked with `"use client"`) because they require interactivity. Make sure to use them within client component boundaries in your Next.js app. diff --git a/packages/docs/lib/layout.shared.tsx b/packages/docs/lib/layout.shared.tsx deleted file mode 100644 index 6182f8391..000000000 --- a/packages/docs/lib/layout.shared.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared"; - -export function baseOptions(): BaseLayoutProps { - return { - nav: { - title: "My App", - }, - }; -} diff --git a/packages/docs/lib/source.ts b/packages/docs/lib/source.ts deleted file mode 100644 index 4a98fa41d..000000000 --- a/packages/docs/lib/source.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { docs } from "fumadocs-mdx:collections/server"; -import { type InferPageType, loader } from "fumadocs-core/source"; -import { lucideIconsPlugin } from "fumadocs-core/source/lucide-icons"; - -// See https://fumadocs.dev/docs/headless/source-api for more info -export const source = loader({ - baseUrl: "/docs", - source: docs.toFumadocsSource(), - plugins: [lucideIconsPlugin()], -}); - -export function getPageImage(page: InferPageType) { - const segments = [...page.slugs, "image.png"]; - - return { - segments, - url: `/og/docs/${segments.join("/")}`, - }; -} - -export async function getLLMText(page: InferPageType) { - const processed = await page.data.getText("processed"); - - return `# ${page.data.title} - -${processed}`; -} diff --git a/packages/docs/mdx-components.tsx b/packages/docs/mdx-components.tsx deleted file mode 100644 index b21a16183..000000000 --- a/packages/docs/mdx-components.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import defaultMdxComponents from "fumadocs-ui/mdx"; -import type { MDXComponents } from "mdx/types"; - -export function getMDXComponents(components?: MDXComponents): MDXComponents { - return { - ...defaultMdxComponents, - ...components, - }; -} diff --git a/packages/docs/next.config.mjs b/packages/docs/next.config.mjs index 91c6ac171..50894e976 100644 --- a/packages/docs/next.config.mjs +++ b/packages/docs/next.config.mjs @@ -1,18 +1,10 @@ -import { createMDX } from 'fumadocs-mdx/next'; +import { createMDX } from "fumadocs-mdx/next"; const withMDX = createMDX(); /** @type {import('next').NextConfig} */ const config = { reactStrictMode: true, - async rewrites() { - return [ - { - source: '/docs/:path*.mdx', - destination: '/llms.mdx/docs/:path*', - }, - ]; - }, }; export default withMDX(config); diff --git a/packages/docs/package.json b/packages/docs/package.json index 4b32e27f7..fe834033e 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -4,29 +4,40 @@ "private": true, "scripts": { "build": "next build", - "dev": "next dev", + "dev": "next dev --turbo", + "format": "biome check --write .", "start": "next start", - "types:check": "fumadocs-mdx && next typegen && tsc --noEmit", "postinstall": "fumadocs-mdx" }, "dependencies": { - "fumadocs-core": "16.4.8", - "fumadocs-mdx": "14.2.6", - "fumadocs-ui": "16.4.8", - "lucide-react": "^0.563.0", - "next": "16.1.4", + "@radix-ui/react-hover-card": "^1.1.14", + "@radix-ui/react-tabs": "^1.1.12", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "fumadocs-core": "15.6.1", + "fumadocs-mdx": "11.6.10", + "fumadocs-typescript": "^4.0.6", + "fumadocs-ui": "15.6.1", + "lucide-react": "^0.525.0", + "next": "15.3.8", "react": "^19.2.3", "react-dom": "^19.2.3", - "tailwind-merge": "^3.4.0" + "react-icons": "^5.5.0", + "shiki": "^3.7.0", + "ts-morph": "^26.0.0" }, "devDependencies": { - "@tailwindcss/postcss": "^4.1.18", + "@biomejs/biome": "^2.0.6", + "@tailwindcss/postcss": "^4.1.11", "@types/mdx": "^2.0.13", - "@types/node": "^25.0.10", - "@types/react": "^19.2.9", + "@types/node": "24.0.7", + "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "postcss": "^8.5.6", - "tailwindcss": "^4.1.18", - "typescript": "^5.9.3" + "tailwind-merge": "^3.4.0", + "tailwindcss": "^4.1.11", + "tw-animate-css": "^1.4.0", + "typescript": "^5.8.3" } } diff --git a/packages/docs/postcss.config.mjs b/packages/docs/postcss.config.mjs index a34a3d560..c2ddf7482 100644 --- a/packages/docs/postcss.config.mjs +++ b/packages/docs/postcss.config.mjs @@ -1,5 +1,5 @@ export default { plugins: { - '@tailwindcss/postcss': {}, + "@tailwindcss/postcss": {}, }, }; diff --git a/packages/docs/public/cover.png b/packages/docs/public/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..8e729c41a7dfc50d5c37ba0c20cebd42a2c0f9a7 GIT binary patch literal 14954 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

    j{*iUTwr?P3GSI@WXuKoSZ5xw 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 literal 0 HcmV?d00001 diff --git a/packages/docs/source.config.ts b/packages/docs/source.config.ts index d6e0a83e7..0a9078f36 100644 --- a/packages/docs/source.config.ts +++ b/packages/docs/source.config.ts @@ -1,14 +1,10 @@ import { defineConfig, defineDocs, frontmatterSchema, metaSchema } from "fumadocs-mdx/config"; // You can customise Zod schemas for frontmatter and `meta.json` here -// see https://fumadocs.dev/docs/mdx/collections +// see https://fumadocs.vercel.app/docs/mdx/collections#define-docs export const docs = defineDocs({ - dir: "content/docs", docs: { schema: frontmatterSchema, - postprocess: { - includeProcessedMarkdown: true, - }, }, meta: { schema: metaSchema, diff --git a/packages/docs/src/app/(home)/layout.tsx b/packages/docs/src/app/(home)/layout.tsx new file mode 100644 index 000000000..d21adf63d --- /dev/null +++ b/packages/docs/src/app/(home)/layout.tsx @@ -0,0 +1,7 @@ +import { baseOptions } from "@/app/layout.config"; +import { HomeLayout } from "fumadocs-ui/layouts/home"; +import type { ReactNode } from "react"; + +export default function Layout({ children }: { children: ReactNode }) { + return {children}; +} diff --git a/packages/docs/src/app/(home)/page.tsx b/packages/docs/src/app/(home)/page.tsx new file mode 100644 index 000000000..5ed2a61e8 --- /dev/null +++ b/packages/docs/src/app/(home)/page.tsx @@ -0,0 +1,170 @@ +"use client"; + +import { cn } from "@/lib/utils"; +import { Activity, ArrowRight, Check, Copy, GitBranch, Paintbrush } from "lucide-react"; +import Link from "next/link"; +import { useState } from "react"; + +function CopyButton({ text }: { text: string }) { + const [copied, setCopied] = useState(false); + + const handleCopy = async () => { + await navigator.clipboard.writeText(text); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + + return ( + + ); +} + +const installCommand = "pnpm dlx shadcn@latest add span-tree -r https://spotlightjs.com/registry.json"; + +const components = [ + { + name: "SpanTree", + description: "Hierarchical waterfall visualization for distributed trace spans", + href: "/docs/components/span-tree", + }, + { + name: "TraceItem", + description: "Summary row component for displaying trace information", + href: "/docs/components/trace-item", + }, +]; + +const features = [ + { + icon: Activity, + title: "Trace Visualization", + description: "Display distributed traces with hierarchical span trees and timing waterfalls", + }, + { + icon: GitBranch, + title: "shadcn/ui Compatible", + description: "Built on the same patterns - install via CLI and customize to your needs", + }, + { + icon: Paintbrush, + title: "Fully Customizable", + description: "Components are added to your codebase - modify styles and behavior freely", + }, +]; + +export default function HomePage() { + return ( +

    + {/* Hero Section */} +
    +

    Spotlight UI

    +

    + Beautiful, customizable components for building observability and distributed tracing experiences. Built on + shadcn/ui. +

    + + {/* Install Command */} +
    + $ + {installCommand} + +
    + + {/* CTA Buttons */} +
    + + Get Started + + + + View Components + +
    +
    + + {/* Components Section */} +
    +
    +

    Components

    +

    + Production-ready components for your observability UI +

    + +
    + {components.map(component => ( + +

    {component.name}

    +

    {component.description}

    + + ))} +
    +
    +
    + + {/* Features Section */} +
    +
    +
    + {features.map(feature => ( +
    +
    + +
    +

    {feature.title}

    +

    {feature.description}

    +
    + ))} +
    +
    +
    + + {/* Footer */} +
    +
    + ); +} diff --git a/packages/docs/src/app/docs/[[...slug]]/SponsorPanel.tsx b/packages/docs/src/app/docs/[[...slug]]/SponsorPanel.tsx new file mode 100644 index 000000000..5f82f4da3 --- /dev/null +++ b/packages/docs/src/app/docs/[[...slug]]/SponsorPanel.tsx @@ -0,0 +1,91 @@ +import { cn } from "@/lib/cn"; +import { MoveRight } from "lucide-react"; +import Image from "next/image"; + +type SponsorTier = "gold" | "silver" | "bronze"; + +export type Sponsor = { + name: string; + url: string; + image: string | React.ReactNode; + tier: SponsorTier; +}; + +export default async function SponsorPanel() { + const sponsors: Sponsor[] = []; + + const [fullSizeSponsors, smallSizeSponsors] = sponsors.reduce( + (acc, sponsor) => { + if (sponsor.tier === "bronze") { + acc[1].push(sponsor); + } else { + acc[0].push(sponsor); + } + return acc; + }, + [[], []] as [Sponsor[], (Sponsor | undefined)[]], + ); + + if (smallSizeSponsors.length % 2 === 1) { + smallSizeSponsors.push(undefined); + } + + return ( + <> + {sponsors.length > 0 && ( +
    + {fullSizeSponsors.map(sponsor => ( + + ))} + {smallSizeSponsors.length > 0 && ( +
    + {smallSizeSponsors.map((sponsor, index) => ( + + ))} +
    + )} +
    + )} + + Become a sponsor + + + ); +} + +function SponsorBlock(props: { sponsor?: Sponsor }) { + const { sponsor } = props; + + if (!sponsor) return
    ; + + return ( + +
    + {typeof sponsor.image === "string" ? ( + {sponsor.name} + ) : ( + sponsor.image + )} +
    +
    + ); +} diff --git a/packages/docs/src/app/docs/[[...slug]]/page.tsx b/packages/docs/src/app/docs/[[...slug]]/page.tsx new file mode 100644 index 000000000..aa79174f2 --- /dev/null +++ b/packages/docs/src/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,73 @@ +import path from "node:path"; +import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card"; +import { source } from "@/lib/source"; +import { getMDXComponents } from "@/mdx-components"; +import Link from "fumadocs-core/link"; +import { DocsBody, DocsDescription, DocsPage, DocsTitle } from "fumadocs-ui/page"; +import { notFound } from "next/navigation"; +import SponsorPanel from "./SponsorPanel"; + +export default async function Page(props: { + params: Promise<{ slug?: string[] }>; +}) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + const MDXContent = page.data.body; + + return ( + , + }} + > + {page.data.title} + {page.data.description} + + { + const found = source.getPageByHref(href ?? "", { + dir: path.dirname(page.path), + }); + + if (!found) return ; + + return ( + + + + + +

    {found.page.data.title}

    +

    {found.page.data.description}

    +
    +
    + ); + }, + })} + /> +
    +
    + ); +} + +export async function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata(props: { + params: Promise<{ slug?: string[] }>; +}) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + return { + title: page.data.title, + description: page.data.description, + }; +} diff --git a/packages/docs/src/app/docs/layout.tsx b/packages/docs/src/app/docs/layout.tsx new file mode 100644 index 000000000..0eb0f4e10 --- /dev/null +++ b/packages/docs/src/app/docs/layout.tsx @@ -0,0 +1,12 @@ +import { baseOptions } from "@/app/layout.config"; +import { source } from "@/lib/source"; +import { DocsLayout } from "fumadocs-ui/layouts/docs"; +import type { ReactNode } from "react"; + +export default function Layout({ children }: { children: ReactNode }) { + return ( + + {children} + + ); +} diff --git a/packages/docs/src/app/global.css b/packages/docs/src/app/global.css new file mode 100644 index 000000000..31b460adf --- /dev/null +++ b/packages/docs/src/app/global.css @@ -0,0 +1,167 @@ +@import "tailwindcss"; +@import "fumadocs-ui/css/neutral.css"; +@import "fumadocs-ui/css/preset.css"; +@import "tw-animate-css"; + +@custom-variant dark (&:is(.dark *)); + +@theme inline { + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --radius-2xl: calc(var(--radius) + 8px); + --radius-3xl: calc(var(--radius) + 12px); + --radius-4xl: calc(var(--radius) + 16px); + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +:root { + --radius: 0.625rem; + --background: oklch(1 0 0); + --foreground: oklch(0.141 0.005 285.823); + --card: oklch(1 0 0); + --card-foreground: oklch(0.141 0.005 285.823); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.141 0.005 285.823); + --primary: oklch(0.21 0.006 285.885); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.967 0.001 286.375); + --secondary-foreground: oklch(0.21 0.006 285.885); + --muted: oklch(0.967 0.001 286.375); + --muted-foreground: oklch(0.552 0.016 285.938); + --accent: oklch(0.967 0.001 286.375); + --accent-foreground: oklch(0.21 0.006 285.885); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.92 0.004 286.32); + --input: oklch(0.92 0.004 286.32); + --ring: oklch(0.705 0.015 286.067); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.141 0.005 285.823); + --sidebar-primary: oklch(0.21 0.006 285.885); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.967 0.001 286.375); + --sidebar-accent-foreground: oklch(0.21 0.006 285.885); + --sidebar-border: oklch(0.92 0.004 286.32); + --sidebar-ring: oklch(0.705 0.015 286.067); +} + +.dark { + --background: oklch(0.141 0.005 285.823); + --foreground: oklch(0.985 0 0); + --card: oklch(0.21 0.006 285.885); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.21 0.006 285.885); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.92 0.004 286.32); + --primary-foreground: oklch(0.21 0.006 285.885); + --secondary: oklch(0.274 0.006 286.033); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.274 0.006 286.033); + --muted-foreground: oklch(0.705 0.015 286.067); + --accent: oklch(0.274 0.006 286.033); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.552 0.016 285.938); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.21 0.006 285.885); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.274 0.006 286.033); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.552 0.016 285.938); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} + +/* SpanTree component styles */ +.span-tree { + list-style: none; + padding: 0; + margin: 0; + width: 100%; + overflow: hidden; +} + +.span-tree > li { + position: relative; + width: 100%; +} + +.span-tree.deep > li::before { + content: ""; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 1px; + background: var(--border); +} + +.span-tree > li > .span-tree { + padding-left: 1rem; +} + +.span-tree .node { + position: relative; + padding: 0.25rem 0.5rem; + flex-shrink: 0; +} + +.span-tree .waterfall { + position: relative; + flex: 1; + min-width: 0; + height: 1.5rem; + overflow: hidden; +} diff --git a/packages/docs/src/app/layout.config.tsx b/packages/docs/src/app/layout.config.tsx new file mode 100644 index 000000000..11e1d4b46 --- /dev/null +++ b/packages/docs/src/app/layout.config.tsx @@ -0,0 +1,24 @@ +import Logo from "@/components/Logo"; +import type { BaseLayoutProps } from "fumadocs-ui/layouts/shared"; +import { FaDiscord, FaXTwitter } from "react-icons/fa6"; + +export const baseOptions: BaseLayoutProps = { + nav: { + title: , + }, + links: [ + { + type: "icon", + icon: , + text: "X", + url: "https://x.com/gaborcsapo", + }, + { + type: "icon", + icon: , + text: "Discord", + url: "https://discord.gg/sentry", + }, + ], + githubUrl: "https://github.com/getsentry/spotlight", +}; diff --git a/packages/docs/src/app/layout.tsx b/packages/docs/src/app/layout.tsx new file mode 100644 index 000000000..7acd1b7af --- /dev/null +++ b/packages/docs/src/app/layout.tsx @@ -0,0 +1,51 @@ +import "./global.css"; +import { RootProvider } from "fumadocs-ui/provider"; +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; +import type { ReactNode } from "react"; + +const inter = Inter({ + subsets: ["latin"], +}); + +export function generateMetadata(): Metadata { + const title = { + template: "%s | Spotlight UI", + default: "Spotlight UI - Observability Components", + }; + const description = "Beautiful UI components for observability and distributed tracing. Built on shadcn/ui."; + + return { + title, + description, + keywords: ["observability", "tracing", "components", "react", "typescript", "shadcn", "spotlight"], + metadataBase: new URL("https://spotlightjs.com"), + category: "development", + twitter: { + card: "summary_large_image", + title, + description, + }, + openGraph: { + title, + description, + siteName: "Spotlight UI", + url: "/", + locale: "en_US", + type: "website", + }, + }; +} + +export default function Layout({ children }: { children: ReactNode }) { + return ( + + + + + + {children} + + + ); +} diff --git a/packages/docs/src/components/Logo.tsx b/packages/docs/src/components/Logo.tsx new file mode 100644 index 000000000..f2e6a92dd --- /dev/null +++ b/packages/docs/src/components/Logo.tsx @@ -0,0 +1,28 @@ +import { cn } from "@/lib/utils"; + +interface LogoProps { + className?: string; +} + +export function Logo({ className }: LogoProps) { + return ( +
    + + Spotlight Logo + + + + + Spotlight UI +
    + ); +} + +export default Logo; diff --git a/packages/docs/src/components/YoutubePlayer.tsx b/packages/docs/src/components/YoutubePlayer.tsx new file mode 100644 index 000000000..617f33cbc --- /dev/null +++ b/packages/docs/src/components/YoutubePlayer.tsx @@ -0,0 +1,20 @@ +interface YoutubePlayerProps { + videoId: string; + title?: string; +} + +export function YoutubePlayer({ videoId, title = "YouTube video" }: YoutubePlayerProps) { + return ( +
    +