beads-map 0.3.0 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +2 -2
- package/.next/app-path-routes-manifest.json +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +1 -1
- package/.next/server/app/api/beads.body +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/page.js +3 -3
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app-paths-manifest.json +5 -5
- package/.next/server/functions-config-manifest.json +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/app/page-4a4f07fcb5bd4637.js +1 -0
- package/.next/static/css/df2737696baac0fa.css +3 -0
- package/README.md +21 -11
- package/app/page.tsx +113 -7
- package/components/BeadTooltip.tsx +26 -2
- package/components/BeadsGraph.tsx +460 -234
- package/components/DescriptionModal.tsx +48 -18
- package/components/HelpPanel.tsx +336 -0
- package/components/NodeDetail.tsx +33 -8
- package/components/TutorialOverlay.tsx +187 -0
- package/lib/types.ts +67 -0
- package/lib/utils.ts +23 -0
- package/package.json +1 -1
- package/.next/static/chunks/app/page-68492e6aaf15a6dd.js +0 -1
- package/.next/static/css/c854bc2280bc4b27.css +0 -3
- /package/.next/static/{ac0cLw5kGBDWoceTBnu21 → bsmkR-2y8Ra7VuoNZWLzB}/_buildManifest.js +0 -0
- /package/.next/static/{ac0cLw5kGBDWoceTBnu21 → bsmkR-2y8Ra7VuoNZWLzB}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*
|
|
2
|
+
! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
|
|
3
|
+
*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:JetBrains Mono,Fira Code,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body,html{height:100%;overflow:hidden}body{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity,1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"rlig" 1,"calt" 1}.\!container{width:100%!important}.container{width:100%}@media (min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media (min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media (min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media (min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media (min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.status-badge{display:inline-flex;align-items:center;border-radius:9999px;padding:.125rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500}.custom-scrollbar::-webkit-scrollbar{width:4px}.custom-scrollbar::-webkit-scrollbar-track{background-color:transparent}.custom-scrollbar::-webkit-scrollbar-thumb{border-radius:9999px;--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity,1))}.custom-scrollbar::-webkit-scrollbar-thumb:hover{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity,1))}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.bottom-0{bottom:0}.bottom-2{bottom:.5rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-2{left:.5rem}.left-3{left:.75rem}.left-4{left:1rem}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.top-0{top:0}.top-2{top:.5rem}.top-3{top:.75rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[1\]{z-index:1}.z-\[55\]{z-index:55}.z-\[56\]{z-index:56}.z-\[60\]{z-index:60}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-mr-0\.5{margin-right:-.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1\.5{margin-right:.375rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-5{margin-top:1.25rem}.mt-\[6px\]{margin-top:6px}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-40{max-height:10rem}.max-h-72{max-height:18rem}.max-h-\[260px\]{max-height:260px}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.min-h-\[300px\]{min-height:300px}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-44{width:11rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-\[360px\]{width:360px}.w-\[90vw\]{width:90vw}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0}.min-w-\[18px\]{min-width:18px}.min-w-\[280px\]{min-width:280px}.max-w-2xl{max-width:42rem}.max-w-\[100px\]{max-width:100px}.max-w-\[140px\]{max-width:140px}.max-w-\[480px\]{max-width:480px}.max-w-\[80px\]{max-width:80px}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.translate-x-0{--tw-translate-x:0px}.translate-x-0,.translate-x-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x:100%}.translate-y-0{--tw-translate-y:0px}.translate-y-0,.translate-y-full{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-full{--tw-translate-y:100%}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-crosshair{cursor:crosshair}.cursor-e-resize{cursor:e-resize}.cursor-n-resize{cursor:n-resize}.cursor-ne-resize{cursor:ne-resize}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.gap-y-1\.5{row-gap:.375rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-zinc-50>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(250 250 250/var(--tw-divide-opacity,1))}.self-stretch{align-self:stretch}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.rounded-t-lg{border-top-left-radius:.5rem}.rounded-t-lg,.rounded-tr-lg{border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-t{border-top-width:1px}.border-emerald-200{--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-zinc-100{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity,1))}.border-zinc-100\/60{border-color:hsla(240,5%,96%,.6)}.border-zinc-100\/80{border-color:hsla(240,5%,96%,.8)}.border-zinc-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity,1))}.border-zinc-200\/60{border-color:hsla(240,6%,90%,.6)}.border-zinc-200\/80{border-color:hsla(240,6%,90%,.8)}.border-zinc-50{--tw-border-opacity:1;border-color:rgb(250 250 250/var(--tw-border-opacity,1))}.border-t-emerald-500{--tw-border-opacity:1;border-top-color:rgb(16 185 129/var(--tw-border-opacity,1))}.border-t-zinc-400{--tw-border-opacity:1;border-top-color:rgb(161 161 170/var(--tw-border-opacity,1))}.bg-amber-400{--tw-bg-opacity:1;background-color:rgb(251 191 36/var(--tw-bg-opacity,1))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity,1))}.bg-black\/20{background-color:rgba(0,0,0,.2)}.bg-black\/40{background-color:rgba(0,0,0,.4)}.bg-blue-400{--tw-bg-opacity:1;background-color:rgb(96 165 250/var(--tw-bg-opacity,1))}.bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity,1))}.bg-emerald-400{--tw-bg-opacity:1;background-color:rgb(52 211 153/var(--tw-bg-opacity,1))}.bg-emerald-50{--tw-bg-opacity:1;background-color:rgb(236 253 245/var(--tw-bg-opacity,1))}.bg-emerald-50\/30{background-color:rgba(236,253,245,.3)}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.bg-emerald-600{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.bg-red-300{--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity,1))}.bg-red-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-rose-300{--tw-bg-opacity:1;background-color:rgb(253 164 175/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-violet-500{--tw-bg-opacity:1;background-color:rgb(139 92 246/var(--tw-bg-opacity,1))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/90{background-color:hsla(0,0%,100%,.9)}.bg-white\/95{background-color:hsla(0,0%,100%,.95)}.bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity,1))}.bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity,1))}.bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity,1))}.bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity,1))}.bg-zinc-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity,1))}.bg-zinc-50\/30{background-color:hsla(0,0%,98%,.3)}.bg-zinc-50\/50{background-color:hsla(0,0%,98%,.5)}.bg-zinc-50\/80{background-color:hsla(0,0%,98%,.8)}.bg-zinc-50\/95{background-color:hsla(0,0%,98%,.95)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-6{padding:1.5rem}.p-\[18px_20px\]{padding:18px 20px}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-6{padding-bottom:1.5rem}.pl-3{padding-left:.75rem}.pr-1{padding-right:.25rem}.pr-3{padding-right:.75rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-\[20vh\]{padding-top:20vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,Fira Code,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[7px\]{font-size:7px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-500{--tw-text-opacity:1;color:rgb(245 158 11/var(--tw-text-opacity,1))}.text-blue-500{--tw-text-opacity:1;color:rgb(59 130 246/var(--tw-text-opacity,1))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity,1))}.text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-rose-400{--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity,1))}.text-rose-500{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity,1))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity,1))}.text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.placeholder-zinc-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(161 161 170/var(--tw-placeholder-opacity,1))}.placeholder-zinc-400::placeholder{--tw-placeholder-opacity:1;color:rgb(161 161 170/var(--tw-placeholder-opacity,1))}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.opacity-\[0\.03\]{opacity:.03}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-2xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25);--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-emerald-400\/60{--tw-ring-color:rgba(52,211,153,.6)}.ring-zinc-100{--tw-ring-opacity:1;--tw-ring-color:rgb(244 244 245/var(--tw-ring-opacity,1))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[right\]{transition-property:right;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.animate-fade-in{animation:fadeIn .3s ease-out forwards}@keyframes pulseSoft{0%,to{opacity:1}50%{opacity:.6}}.animate-pulse-soft{animation:pulseSoft 2s ease-in-out infinite}@keyframes beadTooltipFade{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.description-markdown h1,.description-markdown h2,.description-markdown h3,.description-markdown h4{margin-top:.5rem;margin-bottom:.25rem;font-weight:600;--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.description-markdown h1{font-size:.85rem}.description-markdown h2{font-size:.8rem}.description-markdown h3{font-size:.75rem}.description-markdown h4{font-size:.7rem}.description-markdown p{margin-bottom:.375rem}.description-markdown p:last-child{margin-bottom:0}.description-markdown ol,.description-markdown ul{margin-bottom:.375rem}.description-markdown ol>:not([hidden])~:not([hidden]),.description-markdown ul>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.description-markdown ol,.description-markdown ul{padding-left:1rem}.description-markdown ul{list-style-type:disc}.description-markdown ol{list-style-type:decimal}.description-markdown code{border-radius:.25rem;background-color:hsla(240,6%,90%,.6);padding:.125rem .25rem;font-family:JetBrains Mono,Fira Code,monospace;font-size:10px;--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.description-markdown pre{margin-bottom:.375rem;overflow-x:auto;border-radius:.375rem;background-color:hsla(240,6%,90%,.6);padding:.5rem}.description-markdown pre code{background-color:transparent;padding:0;font-size:10px}.description-markdown a{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1));text-decoration-line:underline;text-underline-offset:2px}.description-markdown a:hover{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.description-markdown blockquote{margin-top:.375rem;margin-bottom:.375rem;border-left-width:2px;--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity,1));padding-left:.5rem;font-style:italic;--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.description-markdown table{margin-bottom:.375rem;width:100%;border-collapse:collapse;font-size:10px}.description-markdown th{border-bottom-width:1px;--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity,1));padding-bottom:.125rem;padding-right:.5rem;text-align:left;font-weight:600;--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.description-markdown td{border-bottom-width:1px;--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity,1));padding-top:.125rem;padding-bottom:.125rem;padding-right:.5rem}.description-markdown hr{margin-top:.5rem;margin-bottom:.5rem;--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity,1))}.description-markdown strong{font-weight:600;--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.description-markdown img{max-width:100%;border-radius:.25rem}.timeline-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;cursor:pointer}.timeline-slider::-webkit-slider-runnable-track{height:4px;background:#e4e4e7;border-radius:2px}.timeline-slider::-webkit-slider-thumb{-webkit-appearance:none;width:12px;height:12px;background:#10b981;border-radius:50%;margin-top:-4px;cursor:pointer;-webkit-transition:transform .1s ease;transition:transform .1s ease}.timeline-slider::-webkit-slider-thumb:hover{transform:scale(1.2)}.timeline-slider::-moz-range-track{height:4px;background:#e4e4e7;border-radius:2px;border:none}.timeline-slider::-moz-range-thumb{width:12px;height:12px;background:#10b981;border-radius:50%;border:none;cursor:pointer}.force-graph-container canvas{border-radius:.5rem;touch-action:none}.placeholder\:text-zinc-300::-moz-placeholder{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.placeholder\:text-zinc-300::placeholder{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.placeholder\:text-zinc-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.placeholder\:text-zinc-400::placeholder{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.first\:mt-0:first-child{margin-top:0}.hover\:border-zinc-200:hover{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity,1))}.hover\:border-zinc-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity,1))}.hover\:bg-emerald-100:hover{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity,1))}.hover\:bg-emerald-600:hover{--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.hover\:bg-emerald-700:hover{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.hover\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity,1))}.hover\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.hover\:bg-zinc-100:hover{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity,1))}.hover\:bg-zinc-100\/50:hover{background-color:hsla(240,5%,96%,.5)}.hover\:bg-zinc-200\/60:hover{background-color:hsla(240,6%,90%,.6)}.hover\:bg-zinc-300\/40:hover{background-color:hsla(240,5%,84%,.4)}.hover\:bg-zinc-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity,1))}.hover\:bg-zinc-50\/50:hover{background-color:hsla(0,0%,98%,.5)}.hover\:bg-zinc-50\/60:hover{background-color:hsla(0,0%,98%,.6)}.hover\:text-emerald-600:hover{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.hover\:text-emerald-700:hover{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.hover\:text-red-400:hover{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.hover\:text-rose-500:hover{--tw-text-opacity:1;color:rgb(244 63 94/var(--tw-text-opacity,1))}.hover\:text-zinc-500:hover{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.hover\:text-zinc-600:hover{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.hover\:text-zinc-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.hover\:text-zinc-900:hover{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:border-emerald-400:focus{--tw-border-opacity:1;border-color:rgb(52 211 153/var(--tw-border-opacity,1))}.focus\:border-emerald-500:focus{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-1:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-emerald-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity,1))}.focus\:ring-emerald-500\/30:focus{--tw-ring-color:rgba(16,185,129,.3)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:scale-105{--tw-scale-x:1.05;--tw-scale-y:1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity,1))}.group:hover .group-hover\:text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.group:hover .group-hover\:text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width:640px){.sm\:left-4{left:1rem}.sm\:right-4{right:1rem}.sm\:top-4{top:1rem}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:gap-2{gap:.5rem}}@media (min-width:768px){.md\:flex{display:flex}.md\:hidden{display:none}}
|
package/README.md
CHANGED
|
@@ -19,11 +19,18 @@ See your entire project's issues, epics, and dependencies as a live, explorable
|
|
|
19
19
|
- **Cluster** -- Groups nodes spatially by project prefix. Each prefix gets its own cluster center arranged in a circle. Cross-project dependencies stretch visibly between clusters.
|
|
20
20
|
- **Spread** -- Like Force but maximally spaced for readability and screenshots. Stronger repulsion, wider link distances.
|
|
21
21
|
- **Collapse / Expand** -- Collapse all epics at once with a single button, or right-click individual epics to collapse/uncollapse them. Shows collapsed task count on each epic node.
|
|
22
|
-
- **Visual encoding** -- Node size = dependency importance (connection count), fill color =
|
|
22
|
+
- **Visual encoding** -- Node size = dependency importance (connection count), fill color = configurable via legend (see below), ring color = project prefix ([Catppuccin Latte](https://github.com/catppuccin/palette) palette). Larger nodes are more connected; epics get a size boost.
|
|
23
|
+
- **Legend color modes** -- Switch node fill color between 5 modes via the bottom-right legend panel:
|
|
24
|
+
- **Status** (default) -- Open (green), In Progress (amber), Blocked (red), Deferred (zinc), Closed (emerald)
|
|
25
|
+
- **Priority** -- P0 Critical (red), P1 High (orange), P2 Medium (blue), P3 Low (zinc), P4 Backlog (zinc-300)
|
|
26
|
+
- **Owner** -- Color by `createdBy` field using Catppuccin Latte accent palette (14 colors)
|
|
27
|
+
- **Assignee** -- Color by `assignee` field using Catppuccin Latte accent palette
|
|
28
|
+
- **Prefix** -- Color by project prefix using Catppuccin Latte accent palette
|
|
29
|
+
- **Catppuccin Latte palette** -- All prefix-colored elements (node rings, cluster circles, tooltip accent bars, prefix fill mode) use the [Catppuccin Latte](https://github.com/catppuccin/palette) accent palette (14 saturated colors optimized for light backgrounds). Person/prefix mapping is deterministic via FNV-1a hash.
|
|
23
30
|
- **Dependency arrows** -- Solid emerald arrows with flow particles for blocking relationships, dashed zinc lines for parent-child hierarchy. Curved links with configurable curvature.
|
|
24
|
-
- **Semantic zoom** -- When zooming out, individual nodes smoothly fade and are replaced by epic cluster labels at each cluster's centroid. Clusters show the epic title, ID, and member count, surrounded by a dashed circle in the project's prefix color.
|
|
31
|
+
- **Semantic zoom** -- When zooming out, individual nodes smoothly fade and are replaced by epic cluster labels at each cluster's centroid. Clusters show the epic title, ID, and member count, surrounded by a dashed circle in the project's prefix color. Cluster visibility can be toggled with the "Clusters" button in the top-left toolbar.
|
|
25
32
|
- **Spawn & exit animations** -- New nodes pop in with an overshoot easing (easeOutBack), removed nodes shrink out, and status changes trigger a ripple animation. New links flash bright emerald on arrival.
|
|
26
|
-
- **Hover tooltips** -- Hover over any node to see a tooltip card with the issue title, creation date, blocker list, priority, owner, and assignee. Smart viewport clamping (prefers above cursor, flips below).
|
|
33
|
+
- **Hover tooltips** -- Hover over any node to see a tooltip card with the project prefix, issue ID, title, creation date, blocker list, priority, owner, and assignee. Smart viewport clamping (prefers above cursor, flips below).
|
|
27
34
|
- **Resizable minimap** -- Always-visible minimap (bottom-left) showing all nodes, links, claimed avatars, and the current viewport rectangle. Click to navigate. Drag the top, right, or top-right corner handles to resize (100-500px wide, 80-400px tall).
|
|
28
35
|
|
|
29
36
|
### Live Updates
|
|
@@ -69,7 +76,9 @@ See your entire project's issues, epics, and dependencies as a live, explorable
|
|
|
69
76
|
- Dates: created, updated, closed (with hour:minute precision)
|
|
70
77
|
- Owner attribution
|
|
71
78
|
- Full description rendered as Markdown (with GFM support)
|
|
79
|
+
- Copy-to-clipboard button for descriptions (copies raw markdown with a header showing project prefix, issue ID, and GitHub repo URL)
|
|
72
80
|
- Threaded comment section (see below)
|
|
81
|
+
- **Description modal** -- "View in window" opens a full-screen modal with the rendered description and a copy button. Also accessible via right-click context menu "Show description".
|
|
73
82
|
- **Mobile drawer** -- On small screens, the detail panel slides up as a bottom drawer instead of a sidebar.
|
|
74
83
|
|
|
75
84
|
### ATProto Authentication & Comments
|
|
@@ -85,8 +94,8 @@ See your entire project's issues, epics, and dependencies as a live, explorable
|
|
|
85
94
|
### Multi-Repo Support
|
|
86
95
|
|
|
87
96
|
- **Automatic aggregation** -- If your `.beads/config.yaml` lists additional repositories, beads-map loads all of them into a unified graph.
|
|
88
|
-
- **Per-project colors** -- Each project prefix gets a deterministic color
|
|
89
|
-
- **GitHub repo links** -- Auto-detects git remote URLs for each repository (primary + additional). Shown in the node detail card as a clickable GitHub link.
|
|
97
|
+
- **Per-project colors** -- Each project prefix gets a deterministic color from the Catppuccin Latte palette (14 accent colors). Shown as node rings, prefix badges, cluster borders, and tooltip accent bars.
|
|
98
|
+
- **GitHub repo links** -- Auto-detects git remote URLs for each repository (primary + additional). Shown in the node detail card as a clickable GitHub link. Also included in copied description text.
|
|
90
99
|
|
|
91
100
|
### Header / Navbar
|
|
92
101
|
|
|
@@ -95,9 +104,9 @@ See your entire project's issues, epics, and dependencies as a live, explorable
|
|
|
95
104
|
- **Pill navigation** -- Replay and Comments toggle buttons styled as rounded-full pill items. Auth button with rounded avatar dropdown.
|
|
96
105
|
- **Centered search** -- Rounded-full search bar with keyboard shortcut hint and dropdown results panel.
|
|
97
106
|
|
|
98
|
-
### Info Panel
|
|
107
|
+
### Info Panel & Legend
|
|
99
108
|
|
|
100
|
-
- **Bottom-right info panel** -- Shows issue count, dependency count, project count,
|
|
109
|
+
- **Bottom-right info panel** -- Shows issue count, dependency count, project count, color mode selector (Status / Priority / Owner / Assignee / Prefix), dynamic legend dots for the active mode, and visual encoding hints. Hidden during timeline replay. Legend shows only items present in visible nodes for owner/assignee/prefix modes.
|
|
101
110
|
|
|
102
111
|
---
|
|
103
112
|
|
|
@@ -200,10 +209,10 @@ beads-map/
|
|
|
200
209
|
│ ├── AuthButton.tsx # Sign-in modal + avatar dropdown (rounded-full pill style)
|
|
201
210
|
│ ├── BeadsGraph.tsx # Force graph: paintNode/paintLink, minimap, semantic zoom, avatars
|
|
202
211
|
│ ├── BeadsLogo.tsx # Animated hexagonal network SVG logo
|
|
203
|
-
│ ├── BeadTooltip.tsx # Hover tooltip: title, date, blockers, priority, owner
|
|
212
|
+
│ ├── BeadTooltip.tsx # Hover tooltip: prefix, ID, title, date, blockers, priority, owner
|
|
204
213
|
│ ├── CommentTooltip.tsx # Floating right-click comment tooltip
|
|
205
214
|
│ ├── ContextMenu.tsx # Right-click context menu: description, comment, claim/unclaim
|
|
206
|
-
│ ├── DescriptionModal.tsx # Full-screen markdown description modal
|
|
215
|
+
│ ├── DescriptionModal.tsx # Full-screen markdown description modal with copy button
|
|
207
216
|
│ ├── HeartIcon.tsx # Shared heart SVG (outline/filled)
|
|
208
217
|
│ ├── NodeDetail.tsx # Sidebar detail: metadata, deps, comments, repo link
|
|
209
218
|
│ ├── TimelineBar.tsx # Timeline replay: play/pause, scrubber, speed toggle
|
|
@@ -219,11 +228,11 @@ beads-map/
|
|
|
219
228
|
│ ├── env.ts # Environment variable validation
|
|
220
229
|
│ ├── discover.ts # .beads/ auto-discovery + git remote URL detection
|
|
221
230
|
│ ├── parse-beads.ts # JSONL parser, multi-repo hydration, graph builder
|
|
222
|
-
│ ├── types.ts # GraphNode, GraphLink,
|
|
231
|
+
│ ├── types.ts # GraphNode, GraphLink, ColorMode, Catppuccin palette, color helpers
|
|
223
232
|
│ ├── diff-beads.ts # Diff engine for detecting added/removed/changed nodes/links
|
|
224
233
|
│ ├── watch-beads.ts # fs.watch wrapper with debounce for JSONL file changes
|
|
225
234
|
│ ├── timeline.ts # buildTimelineEvents + filterDataAtTime for replay
|
|
226
|
-
│ └── utils.ts # formatRelativeTime
|
|
235
|
+
│ └── utils.ts # formatRelativeTime, buildDescriptionCopyText, shared utilities
|
|
227
236
|
├── bin/
|
|
228
237
|
│ └── beads-map.mjs # CLI entry point
|
|
229
238
|
├── scripts/
|
|
@@ -260,6 +269,7 @@ beads-map/
|
|
|
260
269
|
- [Next.js 14](https://nextjs.org/) (App Router)
|
|
261
270
|
- [react-force-graph-2d](https://github.com/vasturiano/react-force-graph) for canvas-based graph rendering
|
|
262
271
|
- [d3-force](https://github.com/d3/d3-force) (forceCollide, forceRadial, forceX, forceY for layout modes)
|
|
272
|
+
- [Catppuccin Latte](https://github.com/catppuccin/palette) accent palette for prefix/person coloring (14 colors)
|
|
263
273
|
- [Tailwind CSS](https://tailwindcss.com/) for styling
|
|
264
274
|
- [TypeScript](https://www.typescriptlang.org/) throughout
|
|
265
275
|
- [@atproto/oauth-client-node](https://github.com/bluesky-social/atproto) + [@atproto/api](https://github.com/bluesky-social/atproto) for ATProto authentication and record CRUD
|
package/app/page.tsx
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import { useEffect, useState, useCallback, useMemo, useRef } from "react";
|
|
4
|
-
import type { BeadsApiResponse, GraphNode, GraphLink } from "@/lib/types";
|
|
5
|
-
import {
|
|
4
|
+
import type { BeadsApiResponse, GraphNode, GraphLink, ColorMode } from "@/lib/types";
|
|
5
|
+
import { getCatppuccinPrefixColor } from "@/lib/types";
|
|
6
6
|
import { diffBeadsData, linkKey } from "@/lib/diff-beads";
|
|
7
7
|
import type { BeadsDiff } from "@/lib/diff-beads";
|
|
8
8
|
import BeadsGraph from "@/components/BeadsGraph";
|
|
@@ -18,6 +18,8 @@ import { BeadTooltip } from "@/components/BeadTooltip";
|
|
|
18
18
|
import AllCommentsPanel from "@/components/AllCommentsPanel";
|
|
19
19
|
import { ActivityOverlay } from "@/components/ActivityOverlay";
|
|
20
20
|
import { ActivityPanel } from "@/components/ActivityPanel";
|
|
21
|
+
import { HelpPanel } from "@/components/HelpPanel";
|
|
22
|
+
import { TutorialOverlay, TUTORIAL_STEPS } from "@/components/TutorialOverlay";
|
|
21
23
|
import { useBeadsComments } from "@/hooks/useBeadsComments";
|
|
22
24
|
import type { BeadsComment } from "@/hooks/useBeadsComments";
|
|
23
25
|
import { useAuth } from "@/lib/auth";
|
|
@@ -189,6 +191,7 @@ export default function Home() {
|
|
|
189
191
|
const [selectedNode, setSelectedNode] = useState<GraphNode | null>(null);
|
|
190
192
|
const [hoveredNode, setHoveredNode] = useState<GraphNode | null>(null);
|
|
191
193
|
const [collapsedEpicIds, setCollapsedEpicIds] = useState<Set<string>>(new Set());
|
|
194
|
+
const [colorMode, setColorMode] = useState<ColorMode>("status");
|
|
192
195
|
const [projectName, setProjectName] = useState("Beads");
|
|
193
196
|
const [repoCount, setRepoCount] = useState(0);
|
|
194
197
|
const [repoUrls, setRepoUrls] = useState<Record<string, string>>({});
|
|
@@ -246,6 +249,8 @@ export default function Home() {
|
|
|
246
249
|
const [activityFeed, setActivityFeed] = useState<ActivityEvent[]>([]);
|
|
247
250
|
const [activityPanelOpen, setActivityPanelOpen] = useState(false);
|
|
248
251
|
const [activityOverlayCollapsed, setActivityOverlayCollapsed] = useState(false);
|
|
252
|
+
const [helpPanelOpen, setHelpPanelOpen] = useState(false);
|
|
253
|
+
const [tutorialStep, setTutorialStep] = useState<number | null>(null);
|
|
249
254
|
|
|
250
255
|
// Rebuild historical feed when data or comments change
|
|
251
256
|
useEffect(() => {
|
|
@@ -305,6 +310,11 @@ export default function Home() {
|
|
|
305
310
|
const [timelineSpeed, setTimelineSpeed] = useState(1);
|
|
306
311
|
const [timelineData, setTimelineData] = useState<BeadsApiResponse | null>(null);
|
|
307
312
|
|
|
313
|
+
// Auto-fit: when true, graph auto-zooms to fit after data updates and layout changes
|
|
314
|
+
const [autoFit, setAutoFit] = useState(true);
|
|
315
|
+
// Pulse: highlight most recently active node with a ripple animation
|
|
316
|
+
const [showPulse, setShowPulse] = useState(true);
|
|
317
|
+
|
|
308
318
|
const graphRef = useRef<BeadsGraphHandle>(null);
|
|
309
319
|
const searchInputRef = useRef<HTMLInputElement>(null);
|
|
310
320
|
const prevDataRef = useRef<BeadsApiResponse | null>(null);
|
|
@@ -524,6 +534,8 @@ export default function Home() {
|
|
|
524
534
|
setSelectedNode((prev) => (prev?.id === node.id ? null : node));
|
|
525
535
|
setAllCommentsPanelOpen(false);
|
|
526
536
|
setActivityPanelOpen(false);
|
|
537
|
+
setHelpPanelOpen(false);
|
|
538
|
+
setTutorialStep(null);
|
|
527
539
|
}, []);
|
|
528
540
|
|
|
529
541
|
const handleNodeHover = useCallback((node: GraphNode | null, x: number, y: number) => {
|
|
@@ -571,6 +583,34 @@ export default function Home() {
|
|
|
571
583
|
setCollapsedEpicIds(new Set());
|
|
572
584
|
}, []);
|
|
573
585
|
|
|
586
|
+
// --- Tutorial callbacks ---
|
|
587
|
+
const handleStartTutorial = useCallback(() => {
|
|
588
|
+
setHelpPanelOpen(true);
|
|
589
|
+
setSelectedNode(null);
|
|
590
|
+
setAllCommentsPanelOpen(false);
|
|
591
|
+
setActivityPanelOpen(false);
|
|
592
|
+
setTutorialStep(0);
|
|
593
|
+
}, []);
|
|
594
|
+
|
|
595
|
+
const handleNextTutorialStep = useCallback(() => {
|
|
596
|
+
setTutorialStep((prev) => {
|
|
597
|
+
if (prev === null) return null;
|
|
598
|
+
if (prev >= TUTORIAL_STEPS.length - 1) return prev;
|
|
599
|
+
return prev + 1;
|
|
600
|
+
});
|
|
601
|
+
}, []);
|
|
602
|
+
|
|
603
|
+
const handlePrevTutorialStep = useCallback(() => {
|
|
604
|
+
setTutorialStep((prev) => {
|
|
605
|
+
if (prev === null || prev <= 0) return prev;
|
|
606
|
+
return prev - 1;
|
|
607
|
+
});
|
|
608
|
+
}, []);
|
|
609
|
+
|
|
610
|
+
const handleEndTutorial = useCallback(() => {
|
|
611
|
+
setTutorialStep(null);
|
|
612
|
+
}, []);
|
|
613
|
+
|
|
574
614
|
const handleBackgroundClick = useCallback(() => {
|
|
575
615
|
setSelectedNode(null);
|
|
576
616
|
setContextMenu(null);
|
|
@@ -975,7 +1015,7 @@ export default function Home() {
|
|
|
975
1015
|
|
|
976
1016
|
{/* Center: Search */}
|
|
977
1017
|
<div className="flex-1 flex justify-center px-4">
|
|
978
|
-
<div className="relative w-full max-w-md">
|
|
1018
|
+
<div className="relative w-full max-w-md" data-tutorial="search">
|
|
979
1019
|
{searchOpen ? (
|
|
980
1020
|
<div className="flex flex-col">
|
|
981
1021
|
<div className="flex items-center bg-white rounded-full border border-zinc-200 shadow-sm overflow-hidden">
|
|
@@ -1130,7 +1170,7 @@ export default function Home() {
|
|
|
1130
1170
|
</div>
|
|
1131
1171
|
|
|
1132
1172
|
{/* Right: Nav items */}
|
|
1133
|
-
<div className="hidden md:flex items-center gap-1 shrink-0">
|
|
1173
|
+
<div className="hidden md:flex items-center gap-1 shrink-0" data-tutorial="nav-pills">
|
|
1134
1174
|
{/* Replay pill */}
|
|
1135
1175
|
<button
|
|
1136
1176
|
onClick={handleTimelineToggle}
|
|
@@ -1159,6 +1199,8 @@ export default function Home() {
|
|
|
1159
1199
|
if (!allCommentsPanelOpen) {
|
|
1160
1200
|
setSelectedNode(null);
|
|
1161
1201
|
setActivityPanelOpen(false);
|
|
1202
|
+
setHelpPanelOpen(false);
|
|
1203
|
+
setTutorialStep(null);
|
|
1162
1204
|
}
|
|
1163
1205
|
}}
|
|
1164
1206
|
className={`flex items-center gap-1.5 px-4 py-2 text-sm font-medium rounded-full transition-colors ${
|
|
@@ -1189,6 +1231,8 @@ export default function Home() {
|
|
|
1189
1231
|
if (!activityPanelOpen) {
|
|
1190
1232
|
setSelectedNode(null);
|
|
1191
1233
|
setAllCommentsPanelOpen(false);
|
|
1234
|
+
setHelpPanelOpen(false);
|
|
1235
|
+
setTutorialStep(null);
|
|
1192
1236
|
}
|
|
1193
1237
|
}}
|
|
1194
1238
|
className={`flex items-center gap-1.5 px-4 py-2 text-sm font-medium rounded-full transition-colors ${
|
|
@@ -1209,6 +1253,37 @@ export default function Home() {
|
|
|
1209
1253
|
</svg>
|
|
1210
1254
|
<span className="hidden sm:inline">Activity</span>
|
|
1211
1255
|
</button>
|
|
1256
|
+
{/* Learn pill */}
|
|
1257
|
+
<button
|
|
1258
|
+
onClick={() => {
|
|
1259
|
+
setHelpPanelOpen((prev) => !prev);
|
|
1260
|
+
if (!helpPanelOpen) {
|
|
1261
|
+
setSelectedNode(null);
|
|
1262
|
+
setAllCommentsPanelOpen(false);
|
|
1263
|
+
setActivityPanelOpen(false);
|
|
1264
|
+
}
|
|
1265
|
+
}}
|
|
1266
|
+
className={`flex items-center gap-1.5 px-4 py-2 text-sm font-medium rounded-full transition-colors ${
|
|
1267
|
+
helpPanelOpen
|
|
1268
|
+
? "text-emerald-700 bg-emerald-50"
|
|
1269
|
+
: "text-zinc-500 hover:text-zinc-900 hover:bg-zinc-50"
|
|
1270
|
+
}`}
|
|
1271
|
+
>
|
|
1272
|
+
<svg
|
|
1273
|
+
className="w-3.5 h-3.5"
|
|
1274
|
+
fill="none"
|
|
1275
|
+
viewBox="0 0 24 24"
|
|
1276
|
+
strokeWidth={1.5}
|
|
1277
|
+
stroke="currentColor"
|
|
1278
|
+
>
|
|
1279
|
+
<path
|
|
1280
|
+
strokeLinecap="round"
|
|
1281
|
+
strokeLinejoin="round"
|
|
1282
|
+
d="M12 18v-5.25m0 0a6.01 6.01 0 001.5-.189m-1.5.189a6.01 6.01 0 01-1.5-.189m3.75 7.478a12.06 12.06 0 01-4.5 0m3.75 2.383a14.406 14.406 0 01-3 0M14.25 18v-.192c0-.983.658-1.823 1.508-2.316a7.5 7.5 0 10-7.517 0c.85.493 1.509 1.333 1.509 2.316V18"
|
|
1283
|
+
/>
|
|
1284
|
+
</svg>
|
|
1285
|
+
<span className="hidden sm:inline">Learn</span>
|
|
1286
|
+
</button>
|
|
1212
1287
|
<div className="w-px h-5 bg-zinc-200 mx-2" />
|
|
1213
1288
|
<AuthButton />
|
|
1214
1289
|
</div>
|
|
@@ -1244,10 +1319,17 @@ export default function Home() {
|
|
|
1244
1319
|
onAvatarHover={setAvatarTooltip}
|
|
1245
1320
|
timelineActive={timelineActive}
|
|
1246
1321
|
stats={data.stats}
|
|
1247
|
-
sidebarOpen={!!selectedNode || allCommentsPanelOpen || activityPanelOpen}
|
|
1322
|
+
sidebarOpen={!!selectedNode || allCommentsPanelOpen || activityPanelOpen || helpPanelOpen}
|
|
1248
1323
|
collapsedEpicIds={collapsedEpicIds}
|
|
1249
1324
|
onCollapseAll={handleCollapseAll}
|
|
1250
1325
|
onExpandAll={handleExpandAll}
|
|
1326
|
+
colorMode={colorMode}
|
|
1327
|
+
onColorModeChange={setColorMode}
|
|
1328
|
+
autoFit={autoFit}
|
|
1329
|
+
onAutoFitToggle={() => setAutoFit((v) => !v)}
|
|
1330
|
+
pulseNodeId={activityFeed.length > 0 ? activityFeed[0].nodeId : null}
|
|
1331
|
+
showPulse={showPulse}
|
|
1332
|
+
onShowPulseToggle={() => setShowPulse((v) => !v)}
|
|
1251
1333
|
/>
|
|
1252
1334
|
|
|
1253
1335
|
{/* Timeline bar — replaces legend hint when active */}
|
|
@@ -1270,7 +1352,7 @@ export default function Home() {
|
|
|
1270
1352
|
)}
|
|
1271
1353
|
|
|
1272
1354
|
{/* Activity overlay — top-right of canvas */}
|
|
1273
|
-
{!selectedNode && !allCommentsPanelOpen && !activityPanelOpen && !timelineActive && (
|
|
1355
|
+
{!selectedNode && !allCommentsPanelOpen && !activityPanelOpen && !helpPanelOpen && !timelineActive && (
|
|
1274
1356
|
<div className="absolute top-3 right-3 sm:top-4 sm:right-4 z-10">
|
|
1275
1357
|
<ActivityOverlay
|
|
1276
1358
|
events={activityFeed}
|
|
@@ -1280,6 +1362,7 @@ export default function Home() {
|
|
|
1280
1362
|
setActivityPanelOpen(true);
|
|
1281
1363
|
setSelectedNode(null);
|
|
1282
1364
|
setAllCommentsPanelOpen(false);
|
|
1365
|
+
setHelpPanelOpen(false);
|
|
1283
1366
|
}}
|
|
1284
1367
|
onNodeClick={(nodeId) => {
|
|
1285
1368
|
const node = data?.graphData.nodes.find((n) => n.id === nodeId);
|
|
@@ -1373,6 +1456,7 @@ export default function Home() {
|
|
|
1373
1456
|
<DescriptionModal
|
|
1374
1457
|
node={descriptionModalNode}
|
|
1375
1458
|
onClose={() => setDescriptionModalNode(null)}
|
|
1459
|
+
repoUrl={repoUrls[descriptionModalNode.prefix]}
|
|
1376
1460
|
/>
|
|
1377
1461
|
)}
|
|
1378
1462
|
|
|
@@ -1382,7 +1466,7 @@ export default function Home() {
|
|
|
1382
1466
|
node={nodeTooltip.node}
|
|
1383
1467
|
x={nodeTooltip.x}
|
|
1384
1468
|
y={nodeTooltip.y}
|
|
1385
|
-
prefixColor={
|
|
1469
|
+
prefixColor={getCatppuccinPrefixColor(nodeTooltip.node.prefix)}
|
|
1386
1470
|
allNodes={timelineActive && timelineData ? timelineData.graphData.nodes : data.graphData.nodes}
|
|
1387
1471
|
/>
|
|
1388
1472
|
)}
|
|
@@ -1585,7 +1669,29 @@ export default function Home() {
|
|
|
1585
1669
|
}
|
|
1586
1670
|
}}
|
|
1587
1671
|
/>
|
|
1672
|
+
|
|
1673
|
+
{/* Help panel */}
|
|
1674
|
+
<HelpPanel
|
|
1675
|
+
isOpen={helpPanelOpen}
|
|
1676
|
+
onClose={() => {
|
|
1677
|
+
setHelpPanelOpen(false);
|
|
1678
|
+
setTutorialStep(null);
|
|
1679
|
+
}}
|
|
1680
|
+
tutorialStep={tutorialStep}
|
|
1681
|
+
onStartTutorial={handleStartTutorial}
|
|
1682
|
+
onNextStep={handleNextTutorialStep}
|
|
1683
|
+
onPrevStep={handlePrevTutorialStep}
|
|
1684
|
+
onEndTutorial={handleEndTutorial}
|
|
1685
|
+
/>
|
|
1588
1686
|
</div>
|
|
1687
|
+
|
|
1688
|
+
{/* Tutorial spotlight overlay */}
|
|
1689
|
+
<TutorialOverlay
|
|
1690
|
+
step={tutorialStep}
|
|
1691
|
+
onNext={handleNextTutorialStep}
|
|
1692
|
+
onPrev={handlePrevTutorialStep}
|
|
1693
|
+
onEnd={handleEndTutorial}
|
|
1694
|
+
/>
|
|
1589
1695
|
</div>
|
|
1590
1696
|
);
|
|
1591
1697
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import { useRef, useState, useEffect } from "react";
|
|
4
|
-
import { GraphNode, PRIORITY_LABELS, PRIORITY_COLORS } from "@/lib/types";
|
|
4
|
+
import { GraphNode, PRIORITY_LABELS, PRIORITY_COLORS, getPrefixLabel } from "@/lib/types";
|
|
5
5
|
import { formatRelativeTime } from "@/lib/utils";
|
|
6
6
|
|
|
7
7
|
interface BeadTooltipProps {
|
|
@@ -87,11 +87,35 @@ export function BeadTooltip({ node, x, y, prefixColor, allNodes }: BeadTooltipPr
|
|
|
87
87
|
height: 2,
|
|
88
88
|
background: prefixColor,
|
|
89
89
|
opacity: 0.5,
|
|
90
|
-
marginBottom:
|
|
90
|
+
marginBottom: 8,
|
|
91
91
|
borderRadius: 1,
|
|
92
92
|
}}
|
|
93
93
|
/>
|
|
94
94
|
|
|
95
|
+
{/* Prefix + ID */}
|
|
96
|
+
<div style={{ display: "flex", alignItems: "center", gap: 6, marginBottom: 6 }}>
|
|
97
|
+
<span
|
|
98
|
+
style={{
|
|
99
|
+
fontSize: 10,
|
|
100
|
+
fontWeight: 600,
|
|
101
|
+
color: prefixColor,
|
|
102
|
+
letterSpacing: 0.5,
|
|
103
|
+
textTransform: "uppercase",
|
|
104
|
+
}}
|
|
105
|
+
>
|
|
106
|
+
{getPrefixLabel(node.prefix)}
|
|
107
|
+
</span>
|
|
108
|
+
<span
|
|
109
|
+
style={{
|
|
110
|
+
fontSize: 10,
|
|
111
|
+
fontFamily: "monospace",
|
|
112
|
+
color: COLORS.textDim,
|
|
113
|
+
}}
|
|
114
|
+
>
|
|
115
|
+
{node.id}
|
|
116
|
+
</span>
|
|
117
|
+
</div>
|
|
118
|
+
|
|
95
119
|
{/* Title */}
|
|
96
120
|
<div
|
|
97
121
|
style={{
|