@chuvenger/devdock 0.7.0 → 0.9.0

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.
Files changed (38) hide show
  1. package/README.md +7 -7
  2. package/dist/{chunk-2IQRWZ7T.js → chunk-RO4CY6GJ.js} +3 -3
  3. package/dist/{chunk-2IQRWZ7T.js.map → chunk-RO4CY6GJ.js.map} +1 -1
  4. package/dist/{chunk-2YX4DI2D.js → chunk-V47DEXPS.js} +120 -29
  5. package/dist/chunk-V47DEXPS.js.map +1 -0
  6. package/dist/{dock-C7wZ8pQb.d.cts → dock-ClU_Wn2a.d.cts} +1 -1
  7. package/dist/{dock-DJZuGmih.d.ts → dock-DKknJBIF.d.ts} +1 -1
  8. package/dist/index.cjs +119 -26
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.d.cts +19 -3
  11. package/dist/index.d.ts +19 -3
  12. package/dist/index.js +1 -1
  13. package/dist/{match-C8MsaP6h.d.ts → match-gTnXtOUP.d.ts} +1 -1
  14. package/dist/{match-Dw1CSS0G.d.cts → match-zABwk1Ai.d.cts} +1 -1
  15. package/dist/react-router.cjs +117 -26
  16. package/dist/react-router.cjs.map +1 -1
  17. package/dist/react-router.d.cts +2 -2
  18. package/dist/react-router.d.ts +2 -2
  19. package/dist/react-router.js +2 -2
  20. package/dist/react.cjs +117 -26
  21. package/dist/react.cjs.map +1 -1
  22. package/dist/react.d.cts +2 -2
  23. package/dist/react.d.ts +2 -2
  24. package/dist/react.js +2 -2
  25. package/dist/svelte.cjs +117 -26
  26. package/dist/svelte.cjs.map +1 -1
  27. package/dist/svelte.d.cts +3 -3
  28. package/dist/svelte.d.ts +3 -3
  29. package/dist/svelte.js +2 -2
  30. package/dist/sveltekit.cjs +117 -26
  31. package/dist/sveltekit.cjs.map +1 -1
  32. package/dist/sveltekit.d.cts +4 -4
  33. package/dist/sveltekit.d.ts +4 -4
  34. package/dist/sveltekit.js +2 -2
  35. package/dist/{types-B8WgSe7o.d.cts → types-D9BBBI7v.d.cts} +16 -4
  36. package/dist/{types-B8WgSe7o.d.ts → types-D9BBBI7v.d.ts} +16 -4
  37. package/package.json +1 -1
  38. package/dist/chunk-2YX4DI2D.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/hotkey.ts","../src/core/theme.ts","../src/core/dock.ts","../src/react/DevDock.tsx","../src/core/match.ts","../src/react/react-router.tsx"],"names":["cn","useRef","useState","useMemo","useEffect","createPortal","useContext","DataRouterContext","useNavigate","jsx"],"mappings":";;;;;;;;;;;AACO,SAAS,WAAA,CAAY,MAAc,CAAA,EAA2B;AACnE,EAAA,MAAM,KAAA,GAAQ,IAAA,CACX,WAAA,EAAY,CACZ,MAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,OAAO,OAAO,CAAA;AACjB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAE/B,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAClC,EAAA,MAAM,OAAO,IAAI,GAAA,CAAI,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAEvC,EAAA,MAAM,QACJ,OAAO,SAAA,KAAc,eAAe,MAAA,CAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAEpE,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAK,KAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,IAAM,IAAA,CAAK,GAAA,CAAI,KAAK,KAAK,CAAC,KAAA;AACjF,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAClC,EAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,IAAK,IAAA,CAAK,IAAI,QAAQ,CAAA;AAEpD,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU,OAAO,KAAA;AACnC,EAAA,IAAI,CAAA,CAAE,OAAA,KAAY,QAAA,EAAU,OAAO,KAAA;AACnC,EAAA,IAAI,CAAA,CAAE,QAAA,KAAa,SAAA,EAAW,OAAO,KAAA;AACrC,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,OAAA,EAAS,OAAO,KAAA;AAEjC,EAAA,OAAO,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA;AACjC;;;ACbO,IAAM,SAAA,GAAsC;AAAA,EACjD,IAAA,EAAM,cAAA;AAAA,EACN,MAAA,EAAQ,gBAAA;AAAA,EACR,GAAA,EAAK,aAAA;AAAA,EACL,WAAA,EAAa,sBAAA;AAAA,EACb,KAAA,EAAO,eAAA;AAAA,EACP,KAAA,EAAO,eAAA;AAAA,EACP,SAAA,EAAW,oBAAA;AAAA,EACX,KAAA,EAAO,eAAA;AAAA,EACP,IAAA,EAAM,cAAA;AAAA,EACN,IAAA,EAAM,cAAA;AAAA,EACN,OAAA,EAAS,iBAAA;AAAA,EACT,KAAA,EAAO,eAAA;AAAA,EACP,GAAA,EAAK,aAAA;AAAA,EACL,SAAA,EAAW,EAAA;AAAA,EACX,QAAA,EAAU,mBAAA;AAAA,EACV,OAAA,EAAS,kBAAA;AAAA,EACT,KAAA,EAAO,eAAA;AAAA,EACP,KAAA,EAAO,eAAA;AAAA,EACP,SAAA,EAAW,oBAAA;AAAA,EACX,IAAA,EAAM;AACR,CAAA;AAGO,IAAM,YAAA,GAAe,qBAAA;AAE5B,IAAM,IAAA,GACJ,uEAAA;AA+BK,IAAM,QAAA,GAAW;AAAA,iDAAA,EAC2B,IAAI,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAmJhD,IAAM,aAAA,GAAgB,SAAA;AAYtB,SAAS,WAAW,KAAA,EAA+B;AACxD,EAAA,IAAI,CAAC,OAAO,OAAO,QAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,CAAA,OAAA,EAAU,KAAK,CAAA,EAAA,EAAK,QAAQ,CAAA;AAAA,CAAA;AAI1C,EAAA,IAAI,KAAA,KAAU,eAAe,OAAO,KAAA;AACpC,EAAA,MAAM,KAAA,GAAQ,mCAAmC,KAAK,CAAA,YAAA,CAAA;AACtD,EAAA,OAAO,GAAG,KAAK;AAAA,EAAK,KAAK,CAAA,CAAA;AAC3B;;;ACtNA,IAAM,cAAc,MAA2B;AAC7C,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,SAAY,CAAI,QAAQ,SAAA,EAAW,OAAO,SAAY,CAAI,GAAA;AAAA,EACvE,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,MAAA;AACT,CAAA;AAEA,IAAM,aAAa,MAAe;AAGhC,EAAA,MAAM,OAAO,WAAA,EAAY;AACzB,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,IAAA;AAK/B,EAAA,IAAI;AACF,IAAA,OAAO,OAAA,CAAQ,IAAI,QAAA,KAAa,YAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAGA,IAAM,WAAA,GAAc,CAAC,IAAA,KAA0B;AAC7C,EAAA,MAAM,KAAA,GAAQ,0CAAA,CAA2C,IAAA,CAAK,IAAI,CAAA;AAClE,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AACzB,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AACzB,EAAA,OACE,CAAA,KAAM,GAAA,IACN,CAAA,KAAM,EAAA,IACL,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IACnB,CAAA,KAAM,GAAA,IAAO,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,EAAA;AAElC,CAAA;AAWA,IAAM,YAAY,MAAe;AAC/B,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAE5C,EAAA,MAAM,OAAO,QAAA,CAAS,QAAA,CAAS,aAAY,CAAE,OAAA,CAAQ,YAAY,EAAE,CAAA;AAEnE,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OACE,IAAA,KAAS,WAAA,IACT,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,IAC1B,IAAA,CAAK,QAAA,CAAS,QAAQ,KACtB,IAAA,KAAS,KAAA,IACT,IAAA,KAAS,SAAA,IACT,YAAY,IAAI,CAAA;AAEpB,CAAA;AAoBA,SAAS,EAAA,CACP,KACA,KAAA,EAC0B;AAC1B,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,EAAA,IAAI,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AACpC,EAAA,OAAO,IAAA;AACT;AAGA,IAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAEnC,SAAS,YAAY,QAAA,EAAgC;AACnD,EAAA,MAAM,GAAA,GAAM,MAAA;AACZ,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,aAAA;AACH,MAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,IAAA,EAAM,GAAA,EAAI;AAAA,IAClC,KAAK,UAAA;AACH,MAAA,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,GAAA,EAAI;AAAA,IAC/B,KAAK,WAAA;AACH,MAAA,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA,IAChC;AACE,MAAA,OAAO,EAAE,MAAA,EAAQ,GAAA,EAAK,KAAA,EAAO,GAAA,EAAI;AAAA;AAEvC;AAEA,SAAS,YAAY,QAAA,EAAgC;AACnD,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA;AACzC,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,UAAA;AAAA,IACV,CAAC,KAAA,GAAQ,KAAA,GAAQ,QAAQ,GAAG,kBAAA;AAAA,IAC5B,CAAC,OAAA,GAAU,OAAA,GAAU,MAAM,GAAG;AAAA,GAChC;AACF;AAaO,SAAS,SACd,KAAA,EAC4B;AAC5B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,KAAM;AAC5B,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,EAAA,IAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAC1B,IAAA,OAAO,IAAA,CAAK,IAAI,GAAG,CAAA,QAAS,CAAA,EAAG,GAAG,IAAI,CAAC,CAAA,CAAA;AACvC,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,OAAO,EAAE,MAAM,GAAA,EAAI;AAAA,EACrB,CAAC,CAAA;AACH;AAOO,SAAS,aAAA,CAAc,OAAA,GAA0B,EAAC,EAAoB;AAC3E,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACnC,IAAA,OAAO,EAAE,MAAA,GAAS;AAAA,IAAC,GAAG,OAAA,GAAU;AAAA,IAAC,CAAA,EAAE;AAAA,EACrC;AAEA,EAAA,IAAI,IAAA,GAAuB,EAAE,GAAG,OAAA,EAAQ;AAWxC,EAAA,MAAM,MAAM,CAAA,GAAI,KAAA,KACdA,KAAA,CAAG,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,CAAC,SAAA,CAAU,IAAI,CAAA,EAAG,IAAA,CAAK,aAAa,IAAI,CAAC,CAAC,CAAC,CAAA;AAKpE,EAAA,MAAM,QAAA,GAAW,MACf,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAMA,KAAA,CAAG,IAAA,CAAK,UAAA,GAAa,CAAC,CAAC,CAAC,CAAA,CAAE,KAAK,IAAQ,CAAA;AAE1D,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,OAAA,GAAU,KAAA;AAKd,EAAA,MAAM,IAAA,GAAO,GAAG,KAAK,CAAA;AACrB,EAAA,IAAA,CAAK,YAAA,CAAa,gBAAgB,EAAE,CAAA;AAIpC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,KAAW,OAAA,CAAQ,aAAa,SAAA,GAAY,IAAA,CAAA;AACvE,EAAA,MAAM,SAAA,GACJ,UAAA,KAAe,KAAA,IAAS,OAAO,KAAK,YAAA,KAAiB,UAAA;AACvD,EAAA,MAAM,UAAA,GAAa,YAAY,IAAA,CAAK,YAAA,CAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,GAAI,IAAA;AACrE,EAAA,MAAM,aAAmB,UAAA,IAAc,IAAA;AAMvC,EAAA,MAAM,SAAA,GAAY,GAAG,OAAA,EAAS;AAAA,IAC5B,WAAA,EAAa,UAAA,CAAW,OAAA,CAAQ,QAAA,IAAY,aAAa;AAAA,GAC1D,CAAA;AACD,EAAA,SAAA,CAAU,YAAA,CAAa,cAAc,EAAE,CAAA;AACvC,EAAA,IAAI,UAAA,EAAY,UAAA,CAAW,WAAA,CAAY,SAAS,CAAA;AAMhD,EAAA,MAAM,YAAY,UAAA,IAAc,UAAA,KAAe,SAAA,GAAY,EAAA,CAAG,KAAK,CAAA,GAAI,IAAA;AACvE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,SAAA,CAAU,MAAM,OAAA,GAAU,UAAA;AAC1B,IAAA,UAAA,CAAW,YAAY,SAAS,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,IAAA,GAAO,GAAG,KAAK,CAAA;AACrB,EAAA,UAAA,CAAW,YAAY,IAAI,CAAA;AAE3B,EAAA,MAAM,KAAA,GAAQ,GAAG,KAAK,CAAA;AACtB,EAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,QAAQ,CAAA;AAEnC,EAAA,MAAM,OAAA,GAAU,GAAG,KAAK,CAAA;AAExB,EAAA,MAAM,SAAA,GAAY,GAAG,KAAK,CAAA;AAC1B,EAAA,MAAM,KAAA,GAAQ,GAAG,OAAO,CAAA;AACxB,EAAA,KAAA,CAAM,WAAA,GAAc,cAAA;AACpB,EAAA,SAAA,CAAU,YAAY,KAAK,CAAA;AAE3B,EAAA,MAAM,IAAA,GAAO,GAAG,KAAK,CAAA;AACrB,EAAA,IAAA,CAAK,YAAA,CAAa,qBAAqB,EAAE,CAAA;AAEzC,EAAA,MAAM,WAAA,GAAc,GAAG,KAAK,CAAA;AAC5B,EAAA,WAAA,CAAY,YAAA,CAAa,sBAAsB,QAAQ,CAAA;AACvD,EAAA,MAAM,UAAA,GAAa,GAAG,KAAK,CAAA;AAC3B,EAAA,UAAA,CAAW,YAAA,CAAa,sBAAsB,OAAO,CAAA;AAIrD,EAAA,MAAM,IAAA,GAAO,GAAG,KAAK,CAAA;AACrB,EAAA,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,IAAA,EAAM,UAAU,CAAA;AAEzC,EAAA,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,SAAA,EAAW,IAAI,CAAA;AAErC,EAAA,MAAM,MAAA,GAAS,GAAG,QAAQ,CAAA;AAC1B,EAAA,MAAA,CAAO,IAAA,GAAO,QAAA;AACd,EAAA,MAAA,CAAO,YAAA,CAAa,cAAc,iBAAiB,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,GAAG,MAAM,CAAA;AACrB,EAAA,MAAM,WAAA,GAAc,GAAG,MAAM,CAAA;AAC7B,EAAA,MAAA,CAAO,MAAA,CAAO,KAAK,WAAW,CAAA;AAE9B,EAAA,IAAA,CAAK,YAAY,MAAM,CAAA;AAGvB,EAAA,MAAM,cAAA,GAAiB,CAAC,IAAA,KACtB,EAAA,CAAG,KAAA,EAAO,EAAE,SAAA,EAAW,GAAA,CAAI,OAAO,CAAA,EAAG,WAAA,EAAa,IAAA,EAAM,CAAA;AAG1D,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,KACjB,EAAA,CAAG,KAAA,EAAO,EAAE,SAAA,EAAW,GAAA,CAAI,WAAW,CAAA,EAAG,WAAA,EAAa,IAAA,EAAM,CAAA;AAG9D,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,MAAM,CAAA;AAC3B,IAAA,MAAA,CAAO,SAAA,GAAY,IAAI,QAAQ,CAAA;AAC/B,IAAA,GAAA,CAAI,SAAA,GAAY,IAAI,KAAK,CAAA;AACzB,IAAA,WAAA,CAAY,SAAA,GAAY,IAAI,aAAa,CAAA;AACzC,IAAA,KAAA,CAAM,SAAA,GAAY,IAAI,OAAO,CAAA;AAC7B,IAAA,OAAA,CAAQ,SAAA,GAAY,IAAI,OAAO,CAAA;AAC/B,IAAA,SAAA,CAAU,SAAA,GAAY,IAAI,WAAW,CAAA;AACrC,IAAA,KAAA,CAAM,SAAA,GAAY,IAAI,OAAO,CAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,MAAM,CAAA;AAC3B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,MAAM,CAAA;AAAA,EAC7B,CAAA;AAIA,EAAA,MAAM,UAAU,MAAe;AAC7B,IAAA,MAAM,IAAI,IAAA,CAAK,OAAA;AACf,IAAA,IAAI,OAAO,CAAA,KAAM,UAAA,EAAY,OAAO,CAAA,EAAE;AACtC,IAAA,IAAI,CAAA,IAAK,MAAM,OAAO,CAAA;AAGtB,IAAA,OAAO,UAAA,EAAW,KAAM,IAAA,CAAK,WAAA,KAAgB,SAAS,SAAA,EAAU,CAAA;AAAA,EAClE,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAiB;AACjC,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAAA,SAAA,IAChC,OAAO,MAAA,KAAW,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,OAAO,IAAI,CAAA;AAAA,EACrE,CAAA;AAEA,EAAA,MAAM,aAAa,MAAc;AAC/B,IAAA,MAAM,MAAc,EAAC;AACrB,IAAA,CAAC,KAAK,MAAA,IAAU,IAAI,OAAA,CAAQ,CAAC,GAAG,CAAA,KAAM;AACpC,MAAA,MAAM,GAAA,GAAM,CAAA,MAAA,EAAS,CAAA,CAAE,IAAI,IAAI,CAAC,CAAA,CAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,IAAA;AAC3B,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,GAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA,EAAO,EAAE,KAAA,IAAS,QAAA;AAAA,QAClB,GAAA,EAAK,CAAC,GAAA,EAAK,CAAA,CAAE,KAAA,IAAS,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAQ,CAAA;AAAA,QAC5D,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,CAAC,KAAK,QAAA,IAAY,IAAI,OAAA,CAAQ,CAAC,GAAG,CAAA,KAAM;AAMtC,MAAA,MAAM,IAAA,GAAO,OAAO,CAAA,CAAE,KAAA,KAAU,UAAA;AAChC,MAAA,MAAM,KAAA,GAAQ,OAAO,CAAA,CAAE,KAAA,KAAU,aAAa,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,KAAA;AAC5D,MAAA,MAAM,UAAU,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA,OAAc,IAAA,GAAO,IAAA;AACnD,MAAA,MAAM,GAAA,GAAM,OAAO,CAAA,CAAE,EAAA,KAAO,OAAO,EAAA,GAAK,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA;AACnD,MAAA,MAAM,KAAA,GAAQ,EAAE,KAAA,IAAS,UAAA;AACzB,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,IAAA,EAAM,SAAA;AAAA,QACN,GAAA;AAAA,QACA,KAAA;AAAA,QACA,KAAA;AAAA,QACA,GAAA,EAAK;AAAA,UACH,GAAA;AAAA,UACA,KAAA;AAAA,UACA,OAAO,QAAA,GAAe,KAAA;AAAA,UACtB,OAAA,KAAY,OAAO,EAAA,GAAK;AAAA,SAC1B,CAAE,KAAK,IAAQ,CAAA;AAAA,QACf,OAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,cAAc,MAAc;AAChC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,IAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,IAAA,IAAI,CAAC,GAAG,OAAO,KAAA;AACf,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,MACX,CAAC,EAAA,KACC,EAAA,CAAG,MAAM,WAAA,EAAY,CAAE,SAAS,CAAC,CAAA,IAChC,EAAA,CAAG,IAAA,KAAS,WAAW,EAAA,CAAG,KAAA,CAAM,KAAK,WAAA,EAAY,CAAE,SAAS,CAAC;AAAA,KAClE;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,OAAO,EAAA,KAAa;AAClC,IAAA,IAAI,EAAA,CAAG,SAAS,OAAA,EAAS;AACvB,MAAA,QAAA,CAAS,EAAA,CAAG,MAAM,IAAI,CAAA;AACtB,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,CAAG,QAAQ,GAAA,EAAI;AAAA,IACvB,CAAA,SAAE;AACA,MAAA,IAAI,CAAC,EAAA,CAAG,OAAA,CAAQ,QAAA,UAAkB,KAAK,CAAA;AAAA,IACzC;AAAA,EACF,CAAA;AAcA,EAAA,IAAI,OAAc,EAAC;AAGnB,EAAA,IAAI,OAAA,GAAyB,IAAA;AAO7B,EAAA,MAAM,OAAA,GAAU,CAAC,EAAA,KAAqB,EAAA,CAAG,GAAA;AAGzC,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAa;AAC7B,IAAA,MAAM,KAAK,GAAA,CAAI,IAAA;AACf,IAAA,IAAI,GAAA,CAAI,SAAA,CAAU,WAAA,KAAgB,EAAA,CAAG,KAAA;AACnC,MAAA,GAAA,CAAI,SAAA,CAAU,cAAc,EAAA,CAAG,KAAA;AACjC,IAAA,IAAI,GAAA,CAAI,SAAA,IAAa,EAAA,CAAG,IAAA,KAAS,SAAA,EAAW;AAC1C,MAAA,MAAM,EAAA,GAAK,GAAG,OAAA,KAAY,IAAA;AAC1B,MAAA,GAAA,CAAI,SAAA,CAAU,WAAA,GAAc,EAAA,GAAK,QAAA,GAAW,EAAA;AAC5C,MAAA,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,IAClD;AAAA,EACF,CAAA;AAKA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACzB,MAAA,MAAM,WAAW,GAAA,KAAQ,MAAA;AACzB,MAAA,IAAI,QAAA,EAAU,GAAA,CAAI,IAAA,CAAK,YAAA,CAAa,eAAe,EAAE,CAAA;AAAA,WAChD,GAAA,CAAI,IAAA,CAAK,eAAA,CAAgB,aAAa,CAAA;AAC3C,MAAA,GAAA,CAAI,IAAA,CAAK,YAAY,QAAA,GAAW,GAAA,CAAI,OAAO,WAAW,CAAA,GAAI,IAAI,KAAK,CAAA;AAAA,IACrE,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,IAAA,EAAc,MAAA,GAAS,KAAA,KAAU;AAClD,IAAA,IAAI,SAAS,MAAA,IAAU,IAAA,GAAO,CAAA,IAAK,IAAA,IAAQ,KAAK,MAAA,EAAQ;AACxD,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,WAAA,EAAY;AAEZ,IAAA,IAAI,MAAA,OAAa,MAAM,CAAA,EAAG,KAAK,cAAA,GAAiB,EAAE,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,EACtE,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,IAAA,MAAA,GAAS,IAAA,CAAK,IAAI,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,QAAA,CAAS,MAAA,GAAS,CAAC,CAAC,CAAA;AAE1D,IAAA,MAAM,GAAA,GAAM,CAAC,QAAA,EAAS,EAAG,GAAG,QAAA,CAAS,GAAA,CAAI,OAAO,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC5D,IAAA,IAAI,QAAQ,OAAA,EAAS;AAKnB,MAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAA,EAAI,GAAA,KAAQ;AAC5B,QAAA,MAAM,GAAA,GAAM,KAAK,GAAG,CAAA;AACpB,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,GAAA,CAAI,IAAA,GAAO,EAAA;AACX,QAAA,QAAA,CAAS,GAAG,CAAA;AAAA,MACd,CAAC,CAAA;AACD,MAAA,WAAA,EAAY;AACZ,MAAA;AAAA,IACF;AACA,IAAA,OAAA,GAAU,GAAA;AACV,IAAA,IAAA,GAAO,EAAC;AACR,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,WAAA;AAAA,QACH,EAAA,CAAG,OAAO,EAAE,SAAA,EAAW,IAAI,OAAO,CAAA,EAAG,WAAA,EAAa,eAAA,EAAiB;AAAA,OACrE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,MAAM,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,KAAK,KAAK,EAAC;AACrC,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,KAAA,EAAO,GAAG,CAAA;AAAA,IAC1B;AAEA,IAAA,KAAA,MAAW,CAAC,SAAA,EAAW,UAAU,CAAA,IAAK,MAAA,EAAQ;AAC5C,MAAA,MAAM,OAAA,GAAU,GAAG,KAAA,EAAO,EAAE,WAAW,GAAA,CAAI,SAAS,GAAG,CAAA;AACvD,MAAA,OAAA,CAAQ,WAAA,CAAY,cAAA,CAAe,SAAS,CAAC,CAAA;AAE7C,MAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA;AAC/B,QAAA,MAAM,GAAA,GAAM,GAAG,QAAA,EAAU,EAAE,WAAW,GAAA,CAAI,KAAK,GAAG,CAAA;AAClD,QAAA,GAAA,CAAI,IAAA,GAAO,QAAA;AAEX,QAAA,MAAM,SAAA,GAAY,GAAG,MAAA,EAAQ,EAAE,WAAW,GAAA,CAAI,UAAU,GAAG,CAAA;AAC3D,QAAA,GAAA,CAAI,YAAY,SAAS,CAAA;AAEzB,QAAA,IAAI,QAAA,GAAmC,IAAA;AACvC,QAAA,IAAI,GAAG,IAAA,KAAS,OAAA,IAAW,GAAG,KAAA,CAAM,IAAA,KAAS,GAAG,KAAA,EAAO;AACrD,UAAA,QAAA,GAAW,GAAG,MAAA,EAAQ;AAAA,YACpB,SAAA,EAAW,IAAI,SAAS,CAAA;AAAA,YACxB,WAAA,EAAa,GAAG,KAAA,CAAM;AAAA,WACvB,CAAA;AACD,UAAA,GAAA,CAAI,YAAY,QAAQ,CAAA;AAAA,QAC1B;AAKA,QAAA,IAAI,SAAA,GAAoC,IAAA;AACxC,QAAA,IAAI,EAAA,CAAG,IAAA,KAAS,SAAA,IAAa,EAAA,CAAG,YAAY,IAAA,EAAM;AAChD,UAAA,GAAA,CAAI,YAAA,CAAa,QAAQ,UAAU,CAAA;AACnC,UAAA,SAAA,GAAY,GAAG,MAAA,EAAQ,EAAE,WAAW,GAAA,CAAI,OAAO,GAAG,CAAA;AAClD,UAAA,GAAA,CAAI,YAAY,SAAS,CAAA;AAAA,QAC3B;AAEA,QAAA,MAAM,GAAA,GAAW,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,GAAA,EAAK,SAAA,EAAW,UAAU,SAAA,EAAU;AACvE,QAAA,IAAA,CAAK,GAAG,CAAA,GAAI,GAAA;AACZ,QAAA,QAAA,CAAS,GAAG,CAAA;AAEZ,QAAA,GAAA,CAAI,gBAAA,CAAiB,YAAA,EAAc,MAAM,SAAA,CAAU,GAAG,CAAC,CAAA;AACvD,QAAA,GAAA,CAAI,iBAAiB,OAAA,EAAS,MAAM,KAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AAC1D,QAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAAA,MACzB;AACA,MAAA,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,IAC1B;AAEA,IAAA,WAAA,EAAY;AAAA,EACd,CAAA;AASA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAyB;AAKlD,EAAA,IAAI,QAAA,GAA0B,IAAA;AAI9B,EAAA,MAAM,YAAY,CAAC,CAAA,KACjB,CAAA,CAAE,KAAA,KAAU,UAAU,OAAA,GAAU,QAAA;AAElC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,KAAA,MAAW,EAAA,IAAM,YAAA,CAAa,MAAA,EAAO,EAAG;AACtC,MAAA,EAAA,CAAG,QAAA,IAAW;AACd,MAAA,EAAA,CAAG,KAAK,MAAA,EAAO;AAAA,IACjB;AACA,IAAA,YAAA,CAAa,KAAA,EAAM;AACnB,IAAA,WAAA,CAAY,eAAA,EAAgB;AAC5B,IAAA,UAAA,CAAW,eAAA,EAAgB;AAC3B,IAAA,QAAA,GAAW,IAAA;AAAA,EACb,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AACvC,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,QAAA,EAAS;AAAA,MACT,GAAG,KAAA,CAAM,GAAA;AAAA,QAAI,CAAC,EAAE,IAAA,EAAM,GAAA,EAAI,KACxB,CAAC,GAAA,EAAK,SAAA,CAAU,IAAI,CAAA,EAAG,KAAK,KAAA,IAAS,EAAA,EAAI,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA,CAAE,IAAA;AAAA,UACzD;AAAA;AACF;AACF,KACF,CAAE,KAAK,IAAI,CAAA;AACX,IAAA,IAAI,QAAQ,QAAA,EAAU;AACtB,IAAA,QAAA,GAAW,GAAA;AAEX,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,GAAA,EAAI,KAAM,GAAG,CAAC,CAAA;AAChD,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,CAAA,IAAK,YAAA,EAAc;AACpC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,MAAA,EAAA,CAAG,QAAA,IAAW;AACd,MAAA,EAAA,CAAG,KAAK,MAAA,EAAO;AACf,MAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AAAA,IACzB;AAEA,IAAA,WAAA,CAAY,eAAA,EAAgB;AAC5B,IAAA,UAAA,CAAW,eAAA,EAAgB;AAI3B,IAAA,MAAM,UAAiD,EAAC;AAExD,IAAA,KAAA,MAAW,SAAA,IAAa,CAAC,QAAA,EAAU,OAAO,CAAA,EAAY;AACpD,MAAA,MAAM,SAAA,GAAY,SAAA,KAAc,QAAA,GAAW,WAAA,GAAc,UAAA;AACzD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,CAAC,EAAE,MAAK,KAAM,SAAA,CAAU,IAAI,CAAA,KAAM,SAAS,CAAA;AAIrE,MAAA,MAAM,QAAA,uBAAe,GAAA,EAGnB;AACF,MAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,QAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,CAAA,EAAA,EAAS,MAAM,GAAG,CAAA,CAAA;AACvD,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AACrC,QAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA;AAEnC,UAAA,QAAA,CAAS,IAAI,QAAA,EAAU;AAAA,YACrB,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,KAAA,IAAS,MAAM,IAAA,CAAK,KAAA;AAAA,YACxC,KAAA,EAAO,CAAC,KAAK;AAAA,WACd,CAAA;AAAA,MACL;AAEA,MAAA,KAAA,MAAW,OAAA,IAAW,QAAA,CAAS,MAAA,EAAO,EAAG;AACvC,QAAA,MAAM,IAAA,GAAO,GAAG,KAAA,EAAO,EAAE,WAAW,GAAA,CAAI,SAAS,GAAG,CAAA;AACpD,QAAA,IAAI,QAAQ,OAAA,EAAS,IAAA,CAAK,YAAY,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAC,CAAA;AACrE,QAAA,KAAA,MAAW,EAAE,IAAA,EAAM,GAAA,EAAI,IAAK,QAAQ,KAAA,EAAO;AACzC,UAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,IAAQ,IAAA,CAAK,KAAA;AAC7B,YAAA,IAAA,CAAK,WAAA,CAAY,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA;AACxC,UAAA,MAAM,QAAA,GAAW,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AACrC,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,IAAA,CAAK,WAAA,CAAY,SAAS,IAAI,CAAA;AAC9B,YAAA;AAAA,UACF;AACA,UAAA,MAAM,QAAA,GAAW,GAAG,KAAA,EAAO,EAAE,WAAW,GAAA,CAAI,MAAM,GAAG,CAAA;AACrD,UAAA,QAAA,CAAS,YAAA,CAAa,mBAAA,EAAqB,IAAA,CAAK,EAAA,IAAM,EAAE,CAAA;AACxD,UAAA,IAAA,CAAK,YAAY,QAAQ,CAAA;AACzB,UAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,UAAU,CAAA;AAAA,QAC5C;AACA,QAAA,SAAA,CAAU,YAAY,IAAI,CAAA;AAAA,MAC5B;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,EAAE,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,QAAA,MAAc,OAAA,EAAS;AACnD,MAAA,MAAM,EAAA,GAAkB,EAAE,IAAA,EAAM,QAAA,EAAS;AACzC,MAAA,YAAA,CAAa,GAAA,CAAI,KAAK,EAAE,CAAA;AACxB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACpC,MAAA,IAAI,OAAO,QAAA,KAAa,UAAA,EAAY,EAAA,CAAG,QAAA,GAAW,QAAA;AAAA,IACpD;AAAA,EACF,CAAA;AAMA,EAAA,IAAI,SAAA,GAA2B,IAAA;AAQ/B,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,UAAA,EAAY;AAE/B,IAAA,MAAM,UACJ,QAAA,CACA,kBAAA;AACF,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,GAAK,UAAA;AAGX,QAAA,EAAA,CAAG,kBAAA,GAAqB,CAAC,GAAG,OAAO,CAAA;AAAA,MACrC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAIA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAG,QAAA,CAAS,gBAAA;AAAA,QACV,cAAc,YAAY,CAAA,6BAAA;AAAA;AAC5B,KACF;AACA,IAAA,MAAM,MAAM,MAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,EAAE,OAAO,CAAA,EAAA,EAAS,CAAA,CAAE,YAAA,CAAa,MAAM,CAAA,IAAK,CAAA,CAAE,WAAW,CAAA,CAAE,CAAA,CACzE,KAAK,IAAI,CAAA;AACZ,IAAA,IAAI,QAAQ,SAAA,EAAW;AACvB,IAAA,SAAA,GAAY,GAAA;AACZ,IAAA,SAAA,CAAU,eAAA,CAAgB,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAAA,EACnE,CAAA;AAIA,EAAA,IAAI,aAAA,GAAyC,IAAA;AAC7C,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IACE,CAAC,SAAA,IACD,aAAA,IACA,CAAC,QAAA,CAAS,IAAA,IACV,OAAO,gBAAA,KAAqB,WAAA;AAE5B,MAAA;AACF,IAAA,aAAA,GAAgB,IAAI,iBAAiB,MAAM;AACzC,MAAA,IAAI,UAAA,EAAY;AAChB,MAAA,UAAA,GAAa,IAAA;AAEb,MAAA,cAAA,CAAe,MAAM;AACnB,QAAA,UAAA,GAAa,KAAA;AACb,QAAA,UAAA,EAAW;AAAA,MACb,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,aAAA,CAAc,OAAA,CAAQ,SAAS,IAAA,EAAM;AAAA,MACnC,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,IAAA;AAAA,MACT,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,aAAA,EAAe,UAAA,EAAW;AAC1B,IAAA,aAAA,GAAgB,IAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,cAAA;AAClC,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,SAAA;AAE9B,IAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAA,EAAO;AAAA,MACxB,QAAA,EAAU,OAAA;AAAA,MACV,MAAA,EAAQ,OAAO,MAAM,CAAA;AAAA,MACrB,GAAA,EAAK,EAAA;AAAA,MACL,MAAA,EAAQ,EAAA;AAAA,MACR,IAAA,EAAM,EAAA;AAAA,MACN,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,WAAA,CAAY,QAAQ,CAAC,CAAA;AAE/C,IAAA,OAAA,CAAQ,WAAA,GAAc,KAAK,KAAA,IAAS,UAAA;AACpC,IAAA,KAAA,CAAM,YAAA,CAAa,YAAA,EAAc,IAAA,CAAK,KAAA,IAAS,UAAU,CAAA;AACzD,IAAA,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,KAAA,EAAO,WAAA,CAAY,QAAQ,CAAC,CAAA;AAEhD,IAAA,WAAA,CAAY,WAAA,GAAc,KAAK,KAAA,IAAS,KAAA;AAGxC,IAAA,MAAA,CAAO,YAAA,CAAa,eAAA,EAAiB,MAAA,CAAO,IAAI,CAAC,CAAA;AACjD,IAAA,YAAA,EAAa;AAAA,EACf,CAAA;AAEA,EAAA,SAAS,QAAQ,IAAA,EAAe;AAC9B,IAAA,IAAI,SAAS,IAAA,EAAM;AACnB,IAAA,IAAA,GAAO,IAAA;AACP,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,KAAA,GAAQ,EAAA;AACR,MAAA,KAAA,CAAM,KAAA,GAAQ,EAAA;AACd,MAAA,MAAA,GAAS,CAAA;AACT,MAAA,KAAA,CAAM,WAAA,IAAe,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,MAAM,CAAA;AACpD,MAAA,WAAA,EAAY;AACZ,MAAA,UAAA,EAAW;AAGX,MAAA,UAAA,EAAW;AACX,MAAA,WAAA,EAAY;AACZ,MAAA,qBAAA,CAAsB,MAAM,KAAA,CAAM,KAAA,EAAO,CAAA;AAAA,IAC3C,CAAA,MAAO;AAGL,MAAA,YAAA,EAAa;AACb,MAAA,IAAI,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,MAAA,EAAO;AAAA,IACtC;AACA,IAAA,WAAA,EAAY;AAAA,EACd;AAIA,EAAA,KAAA,CAAM,gBAAA,CAAiB,SAAS,MAAM;AACpC,IAAA,KAAA,GAAQ,KAAA,CAAM,KAAA;AACd,IAAA,MAAA,GAAS,CAAA;AACT,IAAA,UAAA,EAAW;AAAA,EACb,CAAC,CAAA;AAED,EAAA,KAAA,CAAM,gBAAA,CAAiB,SAAA,EAAW,CAAC,CAAA,KAAM;AACvC,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa;AAChC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,SAAA,CAAU,IAAA,CAAK,IAAI,MAAA,GAAS,CAAA,EAAG,KAAK,MAAA,GAAS,CAAC,GAAG,IAAI,CAAA;AAAA,IACvD,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,SAAA,EAAW;AAC9B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,SAAA,CAAU,KAAK,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,CAAC,GAAG,IAAI,CAAA;AAAA,IACzC,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS;AAC5B,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA;AACzB,MAAA,IAAI,EAAA,EAAI,KAAK,OAAA,CAAQ,EAAE,CAAA;AAAA,IACzB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,IAAI,CAAC,CAAA;AAErD,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAkB;AAGxC,IAAA,IAAI,IAAA,IAAQ,CAAC,CAAA,CAAE,YAAA,GAAe,QAAA,CAAS,IAAI,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA;AAAA,EAC7D,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAqB;AACtC,IAAA,IAAI,KAAK,MAAA,IAAU,WAAA,CAAY,IAAA,CAAK,MAAA,EAAQ,CAAC,CAAA,EAAG;AAC9C,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,OAAA,CAAQ,CAAC,IAAI,CAAA;AAAA,IACf;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,cAAc,CAAA;AACrD,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAAA,EAC9C,CAAA;AACA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,cAAc,CAAA;AACxD,IAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,EACjD,CAAA;AAEA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,IAAI,OAAA,EAAS;AAGb,IAAA,IAAI,CAAC,UAAA;AACH,MAAA,CAAC,QAAA,CAAS,IAAA,IAAQ,QAAA,CAAS,eAAA,EAAiB,QAAQ,SAAS,CAAA;AAC/D,IAAA,CAAC,IAAA,CAAK,SAAA,IAAa,QAAA,CAAS,IAAA,EAAM,YAAY,IAAI,CAAA;AAClD,IAAA,YAAA,EAAa;AACb,IAAA,UAAA,EAAW;AACX,IAAA,WAAA,EAAY;AACZ,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ,CAAA;AACA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,eAAA,EAAgB;AAChB,IAAA,aAAA,EAAc;AACd,IAAA,IAAI,CAAC,UAAA,EAAY,SAAA,CAAU,MAAA,EAAO;AAClC,IAAA,IAAA,CAAK,MAAA,EAAO;AACZ,IAAA,OAAA,GAAU,KAAA;AAAA,EACZ,CAAA;AAIA,EAAA,WAAA,EAAY;AACZ,EAAA,IAAI,OAAA,IAAW,KAAA,EAAM;AAErB,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,EAAsB;AAC3B,MAAA,IAAA,GAAO,EAAE,GAAG,IAAA,EAAM,GAAG,IAAA,EAAK;AAC1B,MAAA,IAAI,SAAQ,EAAG;AACb,QAAA,KAAA,EAAM;AACN,QAAA,WAAA,EAAY;AACZ,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,UAAA,EAAW;AACX,UAAA,WAAA,EAAY;AAAA,QACd;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,GACF;AACF;AC9yBA,IAAM,WAA0B,EAAC;AAQ1B,SAAS,QAAQ,EAAE,KAAA,GAAQ,QAAA,EAAU,GAAG,SAAQ,EAAiB;AACtE,EAAA,MAAM,QAAA,GAAWC,aAA+B,IAAI,CAAA;AAIpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,cAAA;AAAA,IACxB,0BAAU,GAAA;AAAI,GAChB;AAGA,EAAA,MAAM,KAAA,GAAQD,aAAO,IAAI,CAAA;AAIzB,EAAA,MAAM,KAAA,GAAQE,cAAQ,MAAM,QAAA,CAAS,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEpD,EAAA,MAAM,SAAA,GAAYA,aAAA;AAAA,IAChB,MACE,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,MAAK,MAAO;AAAA,MAC5B,EAAA,EAAI,GAAA;AAAA,MACJ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,KAAA,EAAO,CAAC,IAAA,KAAS;AACf,QAAA,QAAA,CAAS,CAAC,SAAS,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,GAAA,CAAI,GAAA,EAAK,IAAI,CAAC,CAAA;AAC/C,QAAA,OAAO,MAAM;AACX,UAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AACpB,UAAA,QAAA,CAAS,CAAC,IAAA,KAAS;AACjB,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,YAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,YAAA,OAAO,IAAA;AAAA,UACT,CAAC,CAAA;AAAA,QACH,CAAA;AAAA,MACF;AAAA,KACF,CAAE,CAAA;AAAA,IACJ,CAAC,KAAK;AAAA,GACR;AAKA,EAAA,MAAM,MAAA,GAASF,YAAA,CAAO,EAAE,OAAA,EAAS,WAAW,CAAA;AAC5C,EAAA,MAAA,CAAO,OAAA,GAAU,EAAE,OAAA,EAAS,SAAA,EAAU;AAEtC,EAAAG,eAAA,CAAU,MAAM;AACd,IAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,IAAA,MAAM,OAAO,aAAA,CAAc;AAAA,MACzB,GAAG,OAAO,OAAA,CAAQ,OAAA;AAAA,MAClB,KAAA,EAAO,OAAO,OAAA,CAAQ;AAAA,KACvB,CAAA;AACD,IAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,CAAM,OAAA,GAAU,KAAA;AAChB,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,SAAS,MAAA,CAAO,EAAE,GAAG,OAAA,EAAS,KAAA,EAAO,WAAW,CAAA;AAAA,EAC3D,CAAC,CAAA;AAED,EAAA,6DAEK,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,MAAK,KAAM;AAC5B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,OAAOC,qBAAA,CAAa,IAAA,CAAK,QAAO,EAAG,IAAA,EAAM,GAAG,CAAA,GAAI,IAAA;AAAA,EACzD,CAAC,CAAA,EACH,CAAA;AAEJ;;;AClGA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,CAAQ,mBAAA,EAAqB,MAAM,CAAA,CAAE,OAAA,CAAQ,OAAO,IAAI,CAAA;AAC7E,EAAA,OAAO,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA;AAClC;AAGO,SAAS,YAAY,KAAA,EAAmD;AAC7E,EAAA,IAAI,OAAO,KAAA,KAAU,UAAA,EAAY,OAAO,KAAA;AACxC,EAAA,MAAM,EAAA,GAAK,KAAA,YAAiB,MAAA,GAAS,KAAA,GAAQ,aAAa,KAAK,CAAA;AAC/D,EAAA,OAAO,CAAC,KAAA,KAAU,EAAA,CAAG,IAAA,CAAK,MAAM,IAAI,CAAA;AACtC;AAEO,SAAS,UAAU,KAAA,EAAqD;AAC7E,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,OAAO,KAAA,KAAU,cACjB,KAAA,YAAiB,MAAA;AAErB;AAMO,SAAS,UAAU,IAAA,EAAuB;AAC/C,EAAA,OAAO,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA;AACnD;AAGO,SAAS,aAAa,MAAA,EAAgC;AAC3D,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IAAO,CAAC,CAAA,KACpB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,GAAI,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG,IAAA;AAAA,GAChD;AACF;ACcA,SAAS,QAAA,CAAS,QAAgB,KAAA,EAAuB;AACvD,EAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,MAAA,IAAU,GAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,OAAO,QAAA,CAAS,GAAG,IAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAC1D,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AACzB;AAGA,SAAS,YAAY,MAAA,EAAoC;AACvD,EAAA,OACE,QAAQ,GAAA,KAAQ,IAAA,IAAQ,QAAQ,QAAA,IAAY,IAAA,IAAQ,QAAQ,QAAA,IAAY,IAAA;AAE5E;AAkDO,SAAS,cACd,MAAA,EACA,MAAA,GAAS,EAAA,EACT,OAAA,GAA+C,EAAC,EACpC;AACZ,EAAA,OAAO,IAAA,CAAK,QAAQ,MAAA,EAAQ,OAAA,CAAQ,iBAAiB,IAAA,EAAM,EAAE,GAAA,EAAK,KAAA,EAAO,CAAA;AAC3E;AAEA,SAAS,IAAA,CACP,MAAA,EACA,MAAA,EACA,YAAA,EACA,SAAA,EACY;AACZ,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,IAAA,GAAO,EAAE,KAAA,GAAQ,MAAA,GAAS,SAAS,MAAA,EAAQ,CAAA,CAAE,QAAQ,EAAE,CAAA;AAI7D,IAAA,MAAM,GAAA,GAAM,UAAU,GAAA,IAAO,WAAA,CAAY,EAAE,MAAM,CAAA,IAAK,UAAU,IAAI,CAAA;AACpE,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,EAAQ,QAAA,IAAY,SAAA,CAAU,KAAA;AAC9C,IAAA,MAAM,SAAA,GACJ,CAAC,CAAA,CAAE,KAAA,IACH,EAAE,IAAA,IAAQ,IAAA,IACV,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,IAClB,CAAC,KAAK,QAAA,CAAS,GAAG,KAClB,CAAA,CAAE,MAAA,EAAQ,MAAA,KAAW,IAAA,KACpB,GAAA,IAAO,YAAA,CAAA;AACV,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,MAAM,IAAA,IAAQ,GAAA;AAAA,QACd,KAAA,EAAO,CAAA,CAAE,MAAA,EAAQ,QAAA,KAAa,IAAA,IAAQ,GAAA,CAAA;AAAA,QACtC;AAAA,OACD,CAAA;AAAA,IACH;AACA,IAAA,IAAI,EAAE,QAAA,EAAU,MAAA;AACd,MAAA,GAAA,CAAI,IAAA,CAAK,GAAG,IAAA,CAAK,CAAA,CAAE,QAAA,EAAU,IAAA,EAAM,YAAA,EAAc,EAAE,GAAA,EAAK,KAAA,EAAO,CAAC,CAAA;AAAA,EACpE;AACA,EAAA,OAAO,GAAA;AACT;AAIA,IAAM,YAAuB,EAAC;AAC9B,IAAM,UAAA,uBAAkD,GAAA,EAAI;AAG5D,SAAS,aAAa,KAAA,EAAqD;AACzE,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA;AACnB,EAAA,IAAI,OAAO,IAAA,KAAS,UAAA,SAAmB,YAAA,CAAa,MAAM,MAAK,GAAI,MAAA;AACnE,EAAA,OAAO,OAAO,IAAA,EAAM,MAAA,KAAW,UAAA,GAAa,KAAK,MAAA,GAAS,MAAA;AAC5D;AAEA,eAAe,eAAe,KAAA,EAAgD;AAC5E,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,YAAA,CAAa,KAAK,CAAA,IAAI;AAAA,EACrC,CAAA,CAAA,MAAQ;AAGN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAA,CAAY,MAAA,EAAmB,GAAA,GAAiB,EAAC,EAAc;AACtE,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AAEtB,IAAA,IAAI,CAAA,CAAE,UAAU,IAAA,IAAQ,YAAA,CAAa,CAAC,CAAA,IAAK,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AAC3D,IAAA,IAAI,EAAE,QAAA,EAAU,MAAA,EAAQ,WAAA,CAAY,CAAA,CAAE,UAAU,GAAG,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,GAAA;AACT;AAUA,SAAS,SAAA,CAAU,MAAA,EAAmB,GAAA,GAAgB,EAAC,EAAa;AAClE,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,IAAA,GAAA,CAAI,IAAA;AAAA,MACF,CAAA,EAAG,CAAA,CAAE,IAAA,IAAQ,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,QAAQ,CAAA,CAAA,EACrD,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,YAAA,CAAa,CAAC,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAAA,KAC3D;AACA,IAAA,IAAI,EAAE,QAAA,EAAU,MAAA,EAAQ,SAAA,CAAU,CAAA,CAAE,UAAU,GAAG,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,GAAA;AACT;AAQA,SAAS,aAAa,MAAA,EAAmD;AACvE,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,SAAA;AACjC,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIH,cAAAA,CAAS,MAAM,SAAA,CAAU,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AACjE,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAQ,SAAA,EAAW;AACxB,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,MAAM,OAAO,SAAA,CAAU,MAAA,CAAO,UAAU,SAAS,CAAA,CAAE,KAAK,IAAI,CAAA;AAC5D,MAAA,MAAA,CAAO,CAAC,IAAA,KAAU,IAAA,KAAS,IAAA,GAAO,OAAO,IAAK,CAAA;AAAA,IAChD,CAAA;AAEA,IAAA,KAAA,EAAM;AACN,IAAA,OAAO,MAAA,CAAO,UAAU,KAAK,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAA,OAAO,CAAC,QAAQ,GAAG,CAAA;AACrB;AAGA,SAAS,cAAA,CACP,MAAA,EACA,GAAA,EACA,OAAA,EACiC;AACjC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIF,eAAS,UAAU,CAAA;AAKjD,EAAA,MAAM,OAAA,GAAUD,YAAAA;AAAA,wBACV,OAAA;AAAiD,GACvD;AACA,EAAAG,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,OAAA,GAAU,YAAY,MAAM,CAAA;AAClC,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAK,OAAA,CAAQ,GAAA;AAAA,MACX,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU;AACrB,QAAA,IAAI,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AACvC,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAA,GAAU,eAAe,KAAK,CAAA;AAC9B,UAAA,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,QACpC;AACA,QAAA,OAAO,QAAQ,IAAA,CAAK,CAAC,WAAW,CAAC,KAAA,EAAO,MAAM,CAAU,CAAA;AAAA,MAC1D,CAAC;AAAA,KACH,CAAE,IAAA,CAAK,CAAC,QAAA,KAAa;AACnB,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AAAA,QACrB,CAAC,KAAA,KAAyC,KAAA,CAAM,CAAC,CAAA,IAAK;AAAA,OACxD;AACA,MAAA,UAAA;AAAA,QAAW,CAAC,SACV,KAAA,CAAM,IAAA,CAAK,CAAC,CAAC,KAAA,EAAO,MAAM,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,KAAM,MAAM,CAAA,GACtD,IAAI,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,GAAG,KAAK,CAAC,CAAA,GAC3B;AAAA,OACN;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,GAAA,EAAK,OAAO,CAAC,CAAA;AACzB,EAAA,OAAO,OAAA;AACT;AAOA,SAAS,YAAA,CACP,QACA,OAAA,EACW;AACX,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAC/B,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,IAAU,OAAA,CAAQ,IAAI,CAAC,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,EAAE,QAAA,GACf,YAAA,CAAa,EAAE,QAAA,EAAU,OAAO,IAChC,CAAA,CAAE,QAAA;AACN,IAAA,IAAI,WAAW,CAAA,CAAE,MAAA,IAAU,QAAA,KAAa,CAAA,CAAE,UAAU,OAAO,CAAA;AAC3D,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,QAAA,EAAS;AAAA,EAClC,CAAC,CAAA;AACD,EAAA,OAAO,UAAU,MAAA,GAAS,MAAA;AAC5B;AAcO,SAAS,iBAAA,CACd,OAAA,GAAwC,EAAC,EAC7B;AACZ,EAAA,MAAM,OAAsB,SAAA,CAAU,OAAO,IAAI,EAAE,KAAA,EAAO,SAAQ,GAAI,OAAA;AACtE,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAc,WAAA,EAAY,GAAI,IAAA;AAC7C,EAAA,MAAM,GAAA,GAAME,iBAAWC,oCAAiB,CAAA;AACxC,EAAA,MAAM,CAAC,MAAA,EAAQ,GAAG,CAAA,GAAI,YAAA,CAAa,KAAK,MAA8B,CAAA;AACtE,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,EAAQ,GAAA,EAAK,gBAAgB,IAAI,CAAA;AAEhE,EAAA,OAAOJ,cAAQ,MAAM;AACnB,IAAA,MAAM,OAAO,OAAA,CAAQ,IAAA,GAAO,IAAI,YAAA,CAAa,MAAA,EAAQ,OAAO,CAAA,GAAI,MAAA;AAChE,IAAA,MAAM,OAAA,GAAU,aAAa,aAAA,CAAc,IAAA,EAAM,IAAI,EAAE,YAAA,EAAc,CAAC,CAAA;AACtE,IAAA,OAAO,QAAQ,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY,KAAK,CAAC,CAAA,GAAI,OAAA;AAAA,EACtD,GAAG,CAAC,MAAA,EAAQ,KAAK,OAAA,EAAS,KAAA,EAAO,YAAY,CAAC,CAAA;AAChD;AA2BO,SAAS,kBAAA,CAAmB;AAAA,EACjC,KAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA4B;AAC1B,EAAA,MAAM,WAAWK,uBAAA,EAAY;AAC7B,EAAA,MAAM,WAAW,iBAAA,CAAkB,EAAE,KAAA,EAAO,YAAA,EAAc,aAAa,CAAA;AACvE,EAAA,MAAM,MAAA,GAASL,aAAAA;AAAA,IACb,MAAM,CAAC,GAAG,QAAA,EAAU,GAAI,KAAA,CAAM,MAAA,IAAU,EAAG,CAAA;AAAA,IAC3C,CAAC,QAAA,EAAU,KAAA,CAAM,MAAM;AAAA,GACzB;AACA,EAAA,uBACEM,cAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACE,GAAG,KAAA;AAAA,MACJ,MAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA,KAAe,CAAC,IAAA,KAAS,SAAS,IAAI,CAAA;AAAA;AAAA,GAC1D;AAEJ","file":"react-router.cjs","sourcesContent":["/** Parse a hotkey string like \"mod+.\" into a matcher predicate. */\nexport function matchHotkey(spec: string, e: KeyboardEvent): boolean {\n const parts = spec\n .toLowerCase()\n .split(\"+\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length === 0) return false;\n\n const key = parts[parts.length - 1];\n const mods = new Set(parts.slice(0, -1));\n\n const isMac =\n typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n\n const wantMeta = mods.has(\"meta\") || mods.has(\"cmd\") || (mods.has(\"mod\") && isMac);\n const wantCtrl = mods.has(\"ctrl\") || mods.has(\"control\") || (mods.has(\"mod\") && !isMac);\n const wantShift = mods.has(\"shift\");\n const wantAlt = mods.has(\"alt\") || mods.has(\"option\");\n\n if (e.metaKey !== wantMeta) return false;\n if (e.ctrlKey !== wantCtrl) return false;\n if (e.shiftKey !== wantShift) return false;\n if (e.altKey !== wantAlt) return false;\n\n return e.key.toLowerCase() === key;\n}\n","import type { DevDockClassNames } from \"./types\";\n\n/** One styleable piece of the dock. See {@link DevDockClassNames}. */\nexport type DockPart = keyof DevDockClassNames;\n\n/**\n * The class every part carries, whatever you pass in `classNames`. Stable\n * API: target `.devdock-row` from your own stylesheet if you'd rather not\n * thread class names through the options.\n *\n * `rowActive` has no class of its own — the highlighted row is marked with\n * `data-active`, so a base rule can reach it without one.\n */\nexport const partClass: Record<DockPart, string> = {\n root: \"devdock-root\",\n button: \"devdock-button\",\n dot: \"devdock-dot\",\n buttonLabel: \"devdock-button-label\",\n panel: \"devdock-panel\",\n title: \"devdock-title\",\n inputWrap: \"devdock-input-wrap\",\n input: \"devdock-input\",\n body: \"devdock-body\",\n list: \"devdock-list\",\n section: \"devdock-section\",\n group: \"devdock-group\",\n row: \"devdock-row\",\n rowActive: \"\",\n rowLabel: \"devdock-row-label\",\n rowPath: \"devdock-row-path\",\n check: \"devdock-check\",\n empty: \"devdock-empty\",\n viewLabel: \"devdock-view-label\",\n view: \"devdock-view\",\n};\n\n/** Marks the dock's own stylesheet, so the style-inheriting code can skip it. */\nexport const STYLE_MARKER = \"data-devdock-styles\";\n\nconst FONT =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\n\n/**\n * The dock's own styles.\n *\n * Two things make `classNames` work without `!important`:\n *\n * 1. **A cascade layer** (see {@link dockStyles}). Layered rules lose to\n * unlayered ones whatever their specificity, and Tailwind v4 puts its\n * utilities in `@layer utilities` — so the sheet declares a layer order\n * that sits the dock's layer after Tailwind's `base` (its reset can't strip\n * the dock's chrome) and before `utilities` (your classes land).\n * 2. **Exactly one class per rule** — one bare `.devdock-*`, with any state\n * selector tucked inside `:where()`, which contributes nothing. That is\n * what settles ties against unlayered CSS, which is the whole cascade when\n * the layer is turned off (`cssLayer: false`): a page-level reset\n * (`button { … }`, `*`) is worth less and loses, a class you pass is worth\n * the same and wins on order, because this sheet goes in first.\n *\n * Colours, sizes and the font come from `--devdock-*` custom properties, each\n * written as a `var(…, default)` fallback rather than declared anywhere. That\n * is the point: a property the page sets — on `:root`, or on the\n * `[data-devdock]` host for one dock — inherits *through* the shadow boundary\n * and is used, while a default of ours declared inside the shadow tree would\n * have beaten it. It also means retheming needs none of the machinery above:\n * no inherited stylesheet, no layer, no change to the isolation.\n *\n * What stays inline, and so can't be overridden by either: the corner\n * placement, the z-index, and the popup's anchoring — all of them computed\n * from `position`/`zIndex` rather than themed.\n */\nexport const BASE_CSS = `\n.devdock-root { font-family: var(--devdock-font, ${FONT}); }\n\n.devdock-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.6px;\n color: var(--devdock-button-fg, #fff);\n background: var(--devdock-button-bg, #111317);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: 999px;\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.35);\n cursor: pointer;\n}\n.devdock-button:where([aria-expanded=\"true\"]) {\n background: var(--devdock-accent, #2563eb);\n}\n\n.devdock-dot {\n width: 8px;\n height: 8px;\n border-radius: 999px;\n background: var(--devdock-success, #22c55e);\n display: inline-block;\n}\n\n.devdock-panel {\n width: var(--devdock-width, 280px);\n max-height: var(--devdock-max-height, 70vh);\n display: flex;\n flex-direction: column;\n background: var(--devdock-bg, #16181d);\n color: var(--devdock-fg, #e7e9ee);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: var(--devdock-radius, 12px);\n box-shadow: var(--devdock-shadow, 0 12px 40px rgba(0, 0, 0, 0.45));\n overflow: hidden;\n}\n\n.devdock-title {\n padding: 10px 12px;\n border-bottom: 1px solid var(--devdock-border, #2a2e37);\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.4px;\n text-transform: uppercase;\n color: var(--devdock-muted, #8b909c);\n}\n\n.devdock-input-wrap { padding: 8px; }\n\n.devdock-input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n font-size: 13px;\n color: var(--devdock-fg, #e7e9ee);\n background: var(--devdock-input-bg, #0f1115);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: var(--devdock-radius-sm, 8px);\n outline: none;\n}\n\n.devdock-body {\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.devdock-list { padding: 0 6px 8px; }\n\n.devdock-section { margin-top: 6px; }\n\n.devdock-group {\n padding: 6px 8px 2px;\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.6px;\n text-transform: uppercase;\n color: var(--devdock-subtle, #6b7280);\n}\n\n.devdock-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n text-align: left;\n padding: 8px 10px;\n font-size: 13px;\n color: var(--devdock-fg, #e7e9ee);\n background: transparent;\n border: none;\n border-radius: var(--devdock-radius-sm, 8px);\n cursor: pointer;\n}\n.devdock-row:where([data-active]) {\n background: var(--devdock-accent, #2563eb);\n color: var(--devdock-accent-fg, #e7e9ee);\n}\n\n.devdock-row-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.devdock-row-path {\n font-size: 11px;\n color: var(--devdock-subtle, #6b7280);\n font-family: ui-monospace, SFMono-Regular, monospace;\n flex-shrink: 0;\n}\n:where(.devdock-row[data-active]) .devdock-row-path {\n /* Whatever colour the row ended up with, stepped back: currentColor in the\n color property means the inherited one, so this tracks the row however it\n was set - a token, a class of yours - instead of guessing at the accent. */\n color: color-mix(in oklab, currentColor 75%, transparent);\n}\n\n.devdock-check {\n flex-shrink: 0;\n width: 12px;\n text-align: center;\n color: var(--devdock-success, #22c55e);\n}\n\n.devdock-empty {\n padding: 12px;\n font-size: 13px;\n color: var(--devdock-subtle, #6b7280);\n}\n\n.devdock-view-label {\n padding: 4px 8px 0;\n font-size: 11px;\n color: var(--devdock-muted, #8b909c);\n}\n\n.devdock-view { padding: 2px 8px 6px; }\n`;\n\n/** The layer the dock's styles go in when `cssLayer` is left alone. */\nexport const DEFAULT_LAYER = \"devdock\";\n\n/**\n * The sheet text: {@link BASE_CSS}, in a cascade layer unless `layer` is\n * `false`.\n *\n * For the default layer the statement names Tailwind's four layers around\n * ours, which both fixes the relative order and is inert for a page that has\n * none of them — layer names are declared here, in a sheet that always goes in\n * first, so this is the order that stands. A layer *you* name gets no such\n * statement: put it where you want it in your own `@layer` line.\n */\nexport function dockStyles(layer: string | false): string {\n if (!layer) return BASE_CSS;\n const block = `@layer ${layer} {${BASE_CSS}}\\n`;\n // A layer you named is a layer you're placing yourself — ordering it from\n // in here, against names we'd be guessing at, is how the dock would end up\n // under your reset. Only the default layer gets an opinion.\n if (layer !== DEFAULT_LAYER) return block;\n const order = `@layer theme, base, components, ${layer}, utilities;`;\n return `${order}\\n${block}`;\n}\n","import { cn } from \"cn\";\nimport { matchHotkey } from \"./hotkey\";\nimport {\n DEFAULT_LAYER,\n STYLE_MARKER,\n dockStyles,\n partClass,\n type DockPart,\n} from \"./theme\";\nimport type {\n DevCommand,\n DevDockInstance,\n DevDockOptions,\n DevRoute,\n DevView,\n DockPosition,\n} from \"./types\";\n\n/**\n * Vite's own build-time flag. The Vite family (Vite, SvelteKit, React Router\n * 7, Astro…) statically replaces the full `import.meta.env.DEV` token with a\n * literal, so this collapses to a constant there. Anywhere else the read\n * throws — `import.meta.env` is undefined in plain Node and in our CJS build,\n * where esbuild rewrites `import.meta` to `{}` — and we report \"no opinion\"\n * so the caller can fall back to `NODE_ENV`.\n */\nconst viteDevFlag = (): boolean | undefined => {\n try {\n if (typeof import.meta.env.DEV === \"boolean\") return import.meta.env.DEV;\n } catch {\n // Not a Vite-built bundle.\n }\n return undefined;\n};\n\nconst isDevBuild = (): boolean => {\n // Vite knows better than NODE_ENV: `vite build` leaves NODE_ENV unreplaced\n // in some setups, and its dev server is a dev build regardless of NODE_ENV.\n const vite = viteDevFlag();\n if (vite !== undefined) return vite;\n // Bundlers (webpack, Next, esbuild…) statically replace the full\n // `process.env.NODE_ENV` token, even in browser builds where `process`\n // itself is undefined. Reading it directly lets that replacement work;\n // the try/catch covers runtimes where it's left as a real (missing) global.\n try {\n return process.env.NODE_ENV !== \"production\";\n } catch {\n return false;\n }\n};\n\n/** Loopback IPv4 (127/8) and the private LAN ranges 10/8, 172.16/12, 192.168/16. */\nconst isLocalIPv4 = (host: string): boolean => {\n const parts = /^(\\d{1,3})\\.(\\d{1,3})\\.\\d{1,3}\\.\\d{1,3}$/.exec(host);\n if (!parts) return false;\n const a = Number(parts[1]);\n const b = Number(parts[2]);\n return (\n a === 127 ||\n a === 10 ||\n (a === 192 && b === 168) ||\n (a === 172 && b >= 16 && b <= 31)\n );\n};\n\n/**\n * Whether the page is served from a developer's own machine. The build check\n * alone can't tell: a development build deployed somewhere real (a preview\n * URL, a staging box) still reports itself as a dev build.\n *\n * Dev hosts are loopback, mDNS `.local` names, and private LAN addresses — so\n * hitting the dev server from a phone on the same Wi-Fi still counts. Any\n * other hostname is treated as a deployed site.\n */\nconst isDevHost = (): boolean => {\n if (typeof location === \"undefined\") return true;\n // IPv6 literals arrive bracketed, e.g. \"[::1]\".\n const host = location.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n // No hostname at all (file://, about:blank…) is not a deployed site.\n if (!host) return true;\n return (\n host === \"localhost\" ||\n host.endsWith(\".localhost\") ||\n host.endsWith(\".local\") ||\n host === \"::1\" ||\n host === \"0.0.0.0\" ||\n isLocalIPv4(host)\n );\n};\n\n/**\n * A row in the list, resolved for this render. `label` and `checked` are\n * snapshots of whatever the caller's functions returned just now, while `sig`\n * is deliberately stable across those values — see {@link itemSig}.\n */\ntype Item = {\n key: string;\n label: string;\n group: string;\n /** Identity of the row's *shape*, not its live values. */\n sig: string;\n} & (\n | { kind: \"route\"; route: DevRoute }\n | { kind: \"command\"; checked: boolean | null; command: DevCommand }\n);\n\ntype Styles = Partial<CSSStyleDeclaration>;\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n props?: Partial<HTMLElementTagNameMap[K]>,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (props) Object.assign(node, props);\n return node;\n}\n\n/** Every part `classNames` can address, in a fixed order. */\nconst PARTS = Object.keys(partClass) as DockPart[];\n\nfunction cornerStyle(position: DockPosition): Styles {\n const gap = \"16px\";\n switch (position) {\n case \"bottom-left\":\n return { bottom: gap, left: gap };\n case \"top-left\":\n return { top: gap, left: gap };\n case \"top-right\":\n return { top: gap, right: gap };\n default:\n return { bottom: gap, right: gap };\n }\n}\n\nfunction panelAnchor(position: DockPosition): Styles {\n const isTop = position.startsWith(\"top\");\n const isRight = position.endsWith(\"right\");\n return {\n position: \"absolute\",\n [isTop ? \"top\" : \"bottom\"]: \"calc(100% + 8px)\",\n [isRight ? \"right\" : \"left\"]: \"0\",\n } as Styles;\n}\n\n/**\n * Pair each view with the key it is reconciled by: its `id`, or its index.\n * Duplicate ids are a caller mistake, but a silent one — two views sharing a\n * key would share a host element, so the collision is broken here instead.\n *\n * Generic over the view shape because the adapters have their own (React's\n * takes `render` in place of `mount`) and have to key their side of a view —\n * a portal, say — exactly the way the core keys its host. Not public API.\n *\n * @internal\n */\nexport function keyViews<T extends { id?: string }>(\n views: readonly T[],\n): { view: T; key: string }[] {\n const used = new Set<string>();\n return views.map((view, i) => {\n let key = view.id ?? `#${i}`;\n while (used.has(key)) key = `${key}#${i}`;\n used.add(key);\n return { view, key };\n });\n}\n\n/**\n * Create a framework-agnostic dev dock: a floating button that opens a popup\n * to jump between routes and run commands. Returns a handle to update its\n * options or tear it down. No-ops on the server (when there is no `document`).\n */\nexport function createDevDock(initial: DevDockOptions = {}): DevDockInstance {\n if (typeof document === \"undefined\") {\n return { update() {}, destroy() {} };\n }\n\n let opts: DevDockOptions = { ...initial };\n /**\n * A part's classes: the `devdock-*` one it always carries, then whatever\n * the caller passed for it. Read from `opts` at paint time, so `update()`\n * can change a class without rebuilding anything.\n *\n * `cn` rather than a plain join, because the merge is between Tailwind\n * classes and the last one has to win: `rowActive: \"text-emerald-900\"` over\n * `row: \"text-slate-700\"` is a conflict the class attribute can't settle on\n * its own — the stylesheet's order decides, and that isn't ours.\n */\n const cls = (...parts: DockPart[]): string =>\n cn(parts.map((part) => [partClass[part], opts.classNames?.[part]]));\n /**\n * Identity of the caller's classes, folded into the signatures that decide\n * whether the per-render DOM (rows, sections, view wrappers) is reusable.\n */\n const classSig = (): string =>\n PARTS.map((p) => cn(opts.classNames?.[p])).join(\"\\u0000\");\n\n let open = false;\n let query = \"\";\n let active = 0;\n let mounted = false;\n\n // Light-DOM host that gets appended to the page. When shadow DOM is used,\n // the actual UI lives inside its shadow root — fully isolated from the host\n // page's CSS. `data-devdock` stays on the host so it's discoverable.\n const host = el(\"div\");\n host.setAttribute(\"data-devdock\", \"\");\n // Classes are defined by a stylesheet of the caller's, which an isolated\n // shadow root would keep out — so passing `classNames` flips the default to\n // `\"inherit\"`. An explicit `shadow` still wins.\n const shadowMode = initial.shadow ?? (initial.classNames ? \"inherit\" : true);\n const useShadow =\n shadowMode !== false && typeof host.attachShadow === \"function\";\n const shadowRoot = useShadow ? host.attachShadow({ mode: \"open\" }) : null;\n const mountPoint: Node = shadowRoot ?? host;\n\n // The dock's own styles. They go in *first* — ahead of the inherited clones\n // below, at the top of `<head>` in light-DOM mode — because that is what\n // fixes the cascade layer order, and what settles a specificity tie in the\n // caller's favour. See `dockStyles`.\n const baseStyle = el(\"style\", {\n textContent: dockStyles(initial.cssLayer ?? DEFAULT_LAYER),\n });\n baseStyle.setAttribute(STYLE_MARKER, \"\");\n if (shadowRoot) mountPoint.appendChild(baseStyle);\n\n // `shadow: \"inherit\"` keeps the isolation boundary but copies the page's\n // styles across it, so a view can render the host app's own components.\n // The clones live in one wrapper so re-syncing is a single replaceChildren;\n // `display: contents` keeps it out of the layout.\n const styleSlot = shadowRoot && shadowMode === \"inherit\" ? el(\"div\") : null;\n if (styleSlot) {\n styleSlot.style.display = \"contents\";\n mountPoint.appendChild(styleSlot);\n }\n\n const root = el(\"div\");\n mountPoint.appendChild(root);\n\n const panel = el(\"div\");\n panel.setAttribute(\"role\", \"dialog\");\n\n const heading = el(\"div\");\n\n const inputWrap = el(\"div\");\n const input = el(\"input\");\n input.placeholder = \"Filter…\";\n inputWrap.appendChild(input);\n\n const list = el(\"div\");\n list.setAttribute(\"data-devdock-list\", \"\");\n\n const viewsBefore = el(\"div\");\n viewsBefore.setAttribute(\"data-devdock-views\", \"before\");\n const viewsAfter = el(\"div\");\n viewsAfter.setAttribute(\"data-devdock-views\", \"after\");\n\n // One scroller around the views and the list, so a tall view can't push the\n // panel past its max height.\n const body = el(\"div\");\n body.append(viewsBefore, list, viewsAfter);\n\n panel.append(heading, inputWrap, body);\n\n const button = el(\"button\");\n button.type = \"button\";\n button.setAttribute(\"aria-label\", \"Toggle dev menu\");\n const dot = el(\"span\");\n const buttonLabel = el(\"span\");\n button.append(dot, buttonLabel);\n\n root.appendChild(button);\n\n /** The small uppercase heading above a group of rows, or above a view. */\n const sectionHeading = (text: string) =>\n el(\"div\", { className: cls(\"group\"), textContent: text });\n\n /** A view's own label, when several views share one `group` heading. */\n const viewLabel = (text: string) =>\n el(\"div\", { className: cls(\"viewLabel\"), textContent: text });\n\n /** Classes for the parts that live as long as the dock does. */\n const paintClasses = () => {\n root.className = cls(\"root\");\n button.className = cls(\"button\");\n dot.className = cls(\"dot\");\n buttonLabel.className = cls(\"buttonLabel\");\n panel.className = cls(\"panel\");\n heading.className = cls(\"title\");\n inputWrap.className = cls(\"inputWrap\");\n input.className = cls(\"input\");\n body.className = cls(\"body\");\n list.className = cls(\"list\");\n };\n\n // ---- behavior ---------------------------------------------------------\n\n const enabled = (): boolean => {\n const e = opts.enabled;\n if (typeof e === \"function\") return e();\n if (e != null) return e;\n // Default gate: a dev build, served from a dev machine. `devHostOnly:\n // false` keeps the build check but allows any hostname.\n return isDevBuild() && (opts.devHostOnly === false || isDevHost());\n };\n\n const navigate = (path: string) => {\n if (opts.onNavigate) opts.onNavigate(path);\n else if (typeof window !== \"undefined\") window.location.assign(path);\n };\n\n const buildItems = (): Item[] => {\n const out: Item[] = [];\n (opts.routes ?? []).forEach((r, i) => {\n const key = `route:${r.path}:${i}`;\n const label = r.label ?? r.path;\n out.push({\n kind: \"route\",\n key,\n label,\n group: r.group ?? \"Routes\",\n sig: [key, r.group ?? \"Routes\", label, r.path].join(\"\\u0000\"),\n route: r,\n });\n });\n (opts.commands ?? []).forEach((c, i) => {\n // A function label is read fresh here, on every render of the open\n // panel. The row's signature uses a placeholder in its place so the new\n // text lands on the existing node instead of rebuilding the list — see\n // `renderList`. The same goes for `checked`: its presence is part of the\n // shape, its value isn't.\n const live = typeof c.label === \"function\";\n const label = typeof c.label === \"function\" ? c.label() : c.label;\n const checked = c.checked ? c.checked() === true : null;\n const key = `cmd:${c.id ?? (live ? \"\" : label)}:${i}`;\n const group = c.group ?? \"Commands\";\n out.push({\n kind: \"command\",\n key,\n label,\n group,\n sig: [\n key,\n group,\n live ? \"\\u0000live\" : label,\n checked === null ? \"\" : \"\\u0000checkable\",\n ].join(\"\\u0000\"),\n checked,\n command: c,\n });\n });\n return out;\n };\n\n const getFiltered = (): Item[] => {\n const q = query.trim().toLowerCase();\n const items = buildItems();\n if (!q) return items;\n return items.filter(\n (it) =>\n it.label.toLowerCase().includes(q) ||\n (it.kind === \"route\" && it.route.path.toLowerCase().includes(q)),\n );\n };\n\n const runItem = async (it: Item) => {\n if (it.kind === \"route\") {\n navigate(it.route.path);\n setOpen(false);\n return;\n }\n try {\n await it.command.run();\n } finally {\n if (!it.command.keepOpen) setOpen(false);\n }\n };\n\n type Row = {\n item: Item;\n node: HTMLButtonElement;\n labelSpan: HTMLSpanElement;\n pathSpan: HTMLSpanElement | null;\n checkSpan: HTMLSpanElement | null;\n };\n\n // The rendered rows, parallel to the current filtered list. They are kept\n // around so hovering or arrowing only repaints the highlight: rebuilding the\n // rows would destroy the node under the pointer, and the browser then never\n // dispatches a `click` on it (mousedown/mouseup retarget to the parent).\n let rows: Row[] = [];\n // Signature of the item list the rows were built from; identical signature\n // means the existing nodes can be reused as-is.\n let rowsSig: string | null = null;\n\n // Identity of a row's *shape*. Values that can change between renders\n // without changing the shape — a function `label`'s text, a `checked`\n // state — are excluded on purpose: those are written onto the existing node\n // by `paintRow`, because rebuilding the row would destroy the node under\n // the pointer and swallow the click.\n const itemSig = (it: Item): string => it.sig;\n\n /** Write a row's live values (dynamic label, check mark) onto its node. */\n const paintRow = (row: Row) => {\n const it = row.item;\n if (row.labelSpan.textContent !== it.label)\n row.labelSpan.textContent = it.label;\n if (row.checkSpan && it.kind === \"command\") {\n const on = it.checked === true;\n row.checkSpan.textContent = on ? \"\\u2713\" : \"\";\n row.node.setAttribute(\"aria-checked\", String(on));\n }\n };\n\n // The highlight is an attribute, not an inline colour: that keeps it in the\n // stylesheet, where `classNames.rowActive` (or a rule of your own on\n // `.devdock-row[data-active]`) can take it over.\n const paintActive = () => {\n rows.forEach((row, idx) => {\n const isActive = idx === active;\n if (isActive) row.node.setAttribute(\"data-active\", \"\");\n else row.node.removeAttribute(\"data-active\");\n row.node.className = isActive ? cls(\"row\", \"rowActive\") : cls(\"row\");\n });\n };\n\n const setActive = (next: number, scroll = false) => {\n if (next === active || next < 0 || next >= rows.length) return;\n active = next;\n paintActive();\n // `scrollIntoView` is absent in jsdom, hence the optional call.\n if (scroll) rows[active]?.node.scrollIntoView?.({ block: \"nearest\" });\n };\n\n const renderList = () => {\n const filtered = getFiltered();\n active = Math.min(active, Math.max(0, filtered.length - 1));\n\n const sig = [classSig(), ...filtered.map(itemSig)].join(\"\\n\");\n if (sig === rowsSig) {\n // Same items in the same order: keep the nodes, refresh the highlight.\n // The items themselves are rebuilt on every call, so re-point each row\n // at its current one (its `run`/`route` may have been swapped by\n // `update()`).\n filtered.forEach((it, idx) => {\n const row = rows[idx];\n if (!row) return;\n row.item = it;\n paintRow(row);\n });\n paintActive();\n return;\n }\n rowsSig = sig;\n rows = [];\n list.replaceChildren();\n\n if (filtered.length === 0) {\n list.appendChild(\n el(\"div\", { className: cls(\"empty\"), textContent: \"Nothing here.\" }),\n );\n return;\n }\n\n const groups = new Map<string, Item[]>();\n for (const it of filtered) {\n const arr = groups.get(it.group) ?? [];\n arr.push(it);\n groups.set(it.group, arr);\n }\n\n for (const [groupName, groupItems] of groups) {\n const section = el(\"div\", { className: cls(\"section\") });\n section.appendChild(sectionHeading(groupName));\n\n for (const it of groupItems) {\n const idx = filtered.indexOf(it);\n const row = el(\"button\", { className: cls(\"row\") });\n row.type = \"button\";\n\n const labelSpan = el(\"span\", { className: cls(\"rowLabel\") });\n row.appendChild(labelSpan);\n\n let pathSpan: HTMLSpanElement | null = null;\n if (it.kind === \"route\" && it.route.path !== it.label) {\n pathSpan = el(\"span\", {\n className: cls(\"rowPath\"),\n textContent: it.route.path,\n });\n row.appendChild(pathSpan);\n }\n\n // A command with `checked` is a toggle, not a one-shot action: say so\n // to assistive tech, and keep the mark's box reserved either way so\n // the label doesn't shift when it flips.\n let checkSpan: HTMLSpanElement | null = null;\n if (it.kind === \"command\" && it.checked !== null) {\n row.setAttribute(\"role\", \"checkbox\");\n checkSpan = el(\"span\", { className: cls(\"check\") });\n row.appendChild(checkSpan);\n }\n\n const rec: Row = { item: it, node: row, labelSpan, pathSpan, checkSpan };\n rows[idx] = rec;\n paintRow(rec);\n\n row.addEventListener(\"mouseenter\", () => setActive(idx));\n row.addEventListener(\"click\", () => void runItem(rec.item));\n section.appendChild(row);\n }\n list.appendChild(section);\n }\n\n paintActive();\n };\n\n // ---- views -------------------------------------------------------------\n\n type MountedView = { host: HTMLElement; teardown?: () => void };\n\n // Views live only while the panel is open: `setOpen(true)` mounts them and\n // `setOpen(false)` runs their teardowns, which is what makes a rAF loop or\n // an event listener inside a view correct rather than a leak.\n const mountedViews = new Map<string, MountedView>();\n // Shape of the view list the current DOM was built from — keys, placement\n // and headings, but nothing a view renders itself. An `update()` that\n // leaves this unchanged is a no-op, so a view is never remounted (or even\n // reparented) just because the options object is new.\n let viewsSig: string | null = null;\n\n type KeyedView = { view: DevView; key: string };\n\n const viewOrder = (v: DevView): \"before\" | \"after\" =>\n v.order === \"after\" ? \"after\" : \"before\";\n\n const unmountViews = () => {\n for (const mv of mountedViews.values()) {\n mv.teardown?.();\n mv.host.remove();\n }\n mountedViews.clear();\n viewsBefore.replaceChildren();\n viewsAfter.replaceChildren();\n viewsSig = null;\n };\n\n const renderViews = () => {\n const keyed = keyViews(opts.views ?? []);\n const sig = [\n classSig(),\n ...keyed.map(({ view, key }) =>\n [key, viewOrder(view), view.group ?? \"\", view.label ?? \"\"].join(\n \"\\u0000\",\n ),\n ),\n ].join(\"\\n\");\n if (sig === viewsSig) return;\n viewsSig = sig;\n\n const live = new Set(keyed.map(({ key }) => key));\n for (const [key, mv] of mountedViews) {\n if (live.has(key)) continue;\n mv.teardown?.();\n mv.host.remove();\n mountedViews.delete(key);\n }\n\n viewsBefore.replaceChildren();\n viewsAfter.replaceChildren();\n\n // Hosts are appended first and mounted afterwards, so `mount` is handed a\n // host that is already connected to the document.\n const pending: (KeyedView & { host: HTMLElement })[] = [];\n\n for (const placement of [\"before\", \"after\"] as const) {\n const container = placement === \"before\" ? viewsBefore : viewsAfter;\n const here = keyed.filter(({ view }) => viewOrder(view) === placement);\n\n // One section per `group`, in first-appearance order; a view without a\n // group gets its own section headed by its `label`.\n const sections = new Map<\n string,\n { heading?: string; items: KeyedView[] }\n >();\n for (const entry of here) {\n const groupKey = entry.view.group ?? `\\u0000${entry.key}`;\n const section = sections.get(groupKey);\n if (section) section.items.push(entry);\n else\n sections.set(groupKey, {\n heading: entry.view.group ?? entry.view.label,\n items: [entry],\n });\n }\n\n for (const section of sections.values()) {\n const wrap = el(\"div\", { className: cls(\"section\") });\n if (section.heading) wrap.appendChild(sectionHeading(section.heading));\n for (const { view, key } of section.items) {\n if (view.group != null && view.label)\n wrap.appendChild(viewLabel(view.label));\n const existing = mountedViews.get(key);\n if (existing) {\n wrap.appendChild(existing.host);\n continue;\n }\n const viewHost = el(\"div\", { className: cls(\"view\") });\n viewHost.setAttribute(\"data-devdock-view\", view.id ?? \"\");\n wrap.appendChild(viewHost);\n pending.push({ view, key, host: viewHost });\n }\n container.appendChild(wrap);\n }\n }\n\n for (const { view, key, host: viewHost } of pending) {\n const mv: MountedView = { host: viewHost };\n mountedViews.set(key, mv);\n const teardown = view.mount(viewHost);\n if (typeof teardown === \"function\") mv.teardown = teardown;\n }\n };\n\n // ---- inherited styles --------------------------------------------------\n\n // What the current clones were made from, so an unrelated head mutation\n // doesn't re-clone every <link> (and make the browser re-fetch it).\n let clonesSig: string | null = null;\n\n /**\n * Copy the document's styles into the shadow root (`shadow: \"inherit\"`).\n * Constructed sheets come across by reference; `<style>` and\n * `<link rel=\"stylesheet\">` nodes are cloned, which re-reads the style's\n * text or re-fetches the link's href inside the shadow tree.\n */\n const syncStyles = () => {\n if (!styleSlot || !shadowRoot) return;\n\n const adopted = (\n document as Document & { adoptedStyleSheets?: readonly unknown[] }\n ).adoptedStyleSheets;\n if (Array.isArray(adopted)) {\n try {\n const sr = shadowRoot as ShadowRoot & {\n adoptedStyleSheets: unknown[];\n };\n sr.adoptedStyleSheets = [...adopted];\n } catch {\n // A sheet the document adopted but this root may not (cross-document).\n }\n }\n\n // `:not([data-devdock-styles])`: in light-DOM mode a dock puts its own\n // sheet in the document, and re-cloning it here would be noise.\n const sheets = [\n ...document.querySelectorAll(\n `style:not([${STYLE_MARKER}]), link[rel~=\"stylesheet\" i]`,\n ),\n ];\n const sig = sheets\n .map((n) => `${n.tagName}\\u0000${n.getAttribute(\"href\") ?? n.textContent}`)\n .join(\"\\n\");\n if (sig === clonesSig) return;\n clonesSig = sig;\n styleSlot.replaceChildren(...sheets.map((n) => n.cloneNode(true)));\n };\n\n // Bundlers inject and mutate <style> tags in `document.head` as you edit —\n // without watching, an HMR'd stylesheet would stop reaching the views.\n let styleObserver: MutationObserver | null = null;\n let syncQueued = false;\n const watchStyles = () => {\n if (\n !styleSlot ||\n styleObserver ||\n !document.head ||\n typeof MutationObserver === \"undefined\"\n )\n return;\n styleObserver = new MutationObserver(() => {\n if (syncQueued) return;\n syncQueued = true;\n // Coalesce a burst of injections into one re-clone.\n queueMicrotask(() => {\n syncQueued = false;\n syncStyles();\n });\n });\n styleObserver.observe(document.head, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n };\n const unwatchStyles = () => {\n styleObserver?.disconnect();\n styleObserver = null;\n };\n\n const renderShell = () => {\n const position = opts.position ?? \"bottom-right\";\n const zIndex = opts.zIndex ?? 2147483000;\n\n Object.assign(root.style, {\n position: \"fixed\",\n zIndex: String(zIndex),\n top: \"\",\n bottom: \"\",\n left: \"\",\n right: \"\",\n });\n Object.assign(root.style, cornerStyle(position));\n\n heading.textContent = opts.title ?? \"Dev Menu\";\n panel.setAttribute(\"aria-label\", opts.title ?? \"Dev Menu\");\n Object.assign(panel.style, panelAnchor(position));\n\n buttonLabel.textContent = opts.label ?? \"DEV\";\n // The open state is `aria-expanded`, which the stylesheet also paints —\n // see `BASE_CSS`.\n button.setAttribute(\"aria-expanded\", String(open));\n paintClasses();\n };\n\n function setOpen(next: boolean) {\n if (open === next) return;\n open = next;\n if (open) {\n query = \"\";\n input.value = \"\";\n active = 0;\n panel.isConnected || root.insertBefore(panel, button);\n renderShell();\n renderList();\n // The panel is connected, so views mount into a live document; styles\n // may have changed while it was closed.\n syncStyles();\n renderViews();\n requestAnimationFrame(() => input.focus());\n } else {\n // Teardown runs while the panel is still in the document, so a view can\n // read the DOM it is about to lose.\n unmountViews();\n if (panel.isConnected) panel.remove();\n }\n renderShell();\n }\n\n // ---- listeners --------------------------------------------------------\n\n input.addEventListener(\"input\", () => {\n query = input.value;\n active = 0;\n renderList();\n });\n\n panel.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActive(Math.min(active + 1, rows.length - 1), true);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive(Math.max(active - 1, 0), true);\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const it = rows[active]?.item;\n if (it) void runItem(it);\n }\n });\n\n button.addEventListener(\"click\", () => setOpen(!open));\n\n const onDocMouseDown = (e: MouseEvent) => {\n // composedPath() sees through the shadow boundary; a plain\n // `contains(e.target)` would miss clicks inside the shadow root.\n if (open && !e.composedPath().includes(root)) setOpen(false);\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (opts.hotkey && matchHotkey(opts.hotkey, e)) {\n e.preventDefault();\n setOpen(!open);\n }\n };\n\n const addListeners = () => {\n document.addEventListener(\"mousedown\", onDocMouseDown);\n window.addEventListener(\"keydown\", onKeyDown);\n };\n const removeListeners = () => {\n document.removeEventListener(\"mousedown\", onDocMouseDown);\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n\n const mount = () => {\n if (mounted) return;\n // Light DOM: the sheet can't ride along inside the host, so it goes at the\n // very top of <head>, ahead of the page's own styles.\n if (!shadowRoot)\n (document.head ?? document.documentElement).prepend(baseStyle);\n (opts.container ?? document.body).appendChild(host);\n addListeners();\n syncStyles();\n watchStyles();\n mounted = true;\n };\n const unmount = () => {\n if (!mounted) return;\n removeListeners();\n unwatchStyles();\n if (!shadowRoot) baseStyle.remove();\n host.remove();\n mounted = false;\n };\n\n // ---- init -------------------------------------------------------------\n\n renderShell();\n if (enabled()) mount();\n\n return {\n update(next: DevDockOptions) {\n opts = { ...opts, ...next };\n if (enabled()) {\n mount();\n renderShell();\n if (open) {\n renderList();\n renderViews();\n }\n } else {\n setOpen(false);\n unmount();\n }\n },\n destroy() {\n setOpen(false);\n unmount();\n },\n };\n}\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { createDevDock, keyViews } from \"../core/dock\";\nimport type {\n DevDockInstance,\n DevDockOptions,\n DevView,\n} from \"../core/types\";\n\n/**\n * A custom panel rendered by React inside the dock's popup. Same contract as\n * the core's {@link DevView}, with `render` in place of `mount`: the component\n * is portaled into the dock, mounted when the popup opens and unmounted when\n * it closes.\n *\n * A view renders inside the dock's shadow root, which the document's\n * stylesheets don't cross — pass `shadow=\"inherit\"` (or `shadow={false}`) if\n * it uses your app's CSS.\n */\nexport interface DevDockView extends Omit<DevView, \"mount\"> {\n /** The view's content. Called on every render of the host `<DevDock>`. */\n render: () => ReactNode;\n}\n\nexport type DevDockProps = Omit<DevDockOptions, \"views\"> & {\n /** Custom panels rendered inside the popup. See {@link DevDockView}. */\n views?: DevDockView[];\n};\n\nconst NO_VIEWS: DevDockView[] = [];\n\n/**\n * React wrapper around the framework-agnostic core. The dock itself mounts\n * into `document.body` (or `container`) and is torn down on unmount; this\n * component renders only the portals for any `views` you pass, so with none it\n * renders nothing. Safe to leave mounted; it renders nothing in production.\n */\nexport function DevDock({ views = NO_VIEWS, ...options }: DevDockProps) {\n const instance = useRef<DevDockInstance | null>(null);\n // The host elements the core created for our views, keyed the same way it\n // keys them. React draws into these with a portal, which keeps the core free\n // of any React import.\n const [hosts, setHosts] = useState<ReadonlyMap<string, HTMLElement>>(\n () => new Map(),\n );\n // `destroy()` tears views down, which would otherwise ask an unmounting\n // component to set state.\n const alive = useRef(true);\n\n // Keyed exactly the way the core keys the host elements, so each portal\n // finds its own.\n const keyed = useMemo(() => keyViews(views), [views]);\n\n const coreViews = useMemo<DevView[]>(\n () =>\n keyed.map(({ key, view }) => ({\n id: key,\n label: view.label,\n group: view.group,\n order: view.order,\n mount: (host) => {\n setHosts((prev) => new Map(prev).set(key, host));\n return () => {\n if (!alive.current) return;\n setHosts((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n },\n })),\n [keyed],\n );\n\n // The core reconciles views by id and no-ops when their shape is unchanged,\n // so handing it a fresh array on every render costs nothing and never\n // remounts a view.\n const latest = useRef({ options, coreViews });\n latest.current = { options, coreViews };\n\n useEffect(() => {\n alive.current = true;\n const inst = createDevDock({\n ...latest.current.options,\n views: latest.current.coreViews,\n });\n instance.current = inst;\n return () => {\n alive.current = false;\n inst.destroy();\n instance.current = null;\n };\n }, []);\n\n useEffect(() => {\n instance.current?.update({ ...options, views: coreViews });\n });\n\n return (\n <>\n {keyed.map(({ key, view }) => {\n const host = hosts.get(key);\n return host ? createPortal(view.render(), host, key) : null;\n })}\n </>\n );\n}\n","import type { DevRoute } from \"./types\";\n\n/**\n * Restricts which auto-detected routes appear. A string is treated as a glob\n * where `*` matches any characters (e.g. `\"/dev/*\"`, `\"/admin/*\"`); or pass a\n * `RegExp` tested against the path, or a predicate for full control.\n */\nexport type RouteMatcher = string | RegExp | ((route: DevRoute) => boolean);\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`);\n}\n\n/** Normalize any {@link RouteMatcher} into a predicate. */\nexport function toPredicate(match: RouteMatcher): (route: DevRoute) => boolean {\n if (typeof match === \"function\") return match;\n const re = match instanceof RegExp ? match : globToRegExp(match);\n return (route) => re.test(route.path);\n}\n\nexport function isMatcher(value: object | RouteMatcher): value is RouteMatcher {\n return (\n typeof value === \"string\" ||\n typeof value === \"function\" ||\n value instanceof RegExp\n );\n}\n\n/**\n * Convention shared by every adapter: `/dev` and everything under it is a dev\n * destination, so a dev section needs no extra marker.\n */\nexport function isDevPath(path: string): boolean {\n return path === \"/dev\" || path.startsWith(\"/dev/\");\n}\n\n/** Drop later routes that repeat an earlier route's path. */\nexport function dedupeByPath(routes: DevRoute[]): DevRoute[] {\n const seen = new Set<string>();\n return routes.filter((r) =>\n seen.has(r.path) ? false : (seen.add(r.path), true),\n );\n}\n","import { useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useNavigate,\n // UNSAFE_DataRouterContext is the supported way to reach the active\n // router instance (and its full route tree) for data routers. Imported\n // from `react-router` (not `react-router-dom`) so this works on v6, v7\n // and v8 — v8 dropped the `react-router-dom` package entirely.\n UNSAFE_DataRouterContext as DataRouterContext,\n} from \"react-router\";\nimport { DevDock, type DevDockProps } from \"./DevDock\";\nimport type { DevRoute } from \"../core/types\";\nimport {\n dedupeByPath,\n isDevPath,\n isMatcher,\n toPredicate,\n type RouteMatcher,\n} from \"../core/match\";\n\nexport type { RouteMatcher };\n\n/** The `handle` fields the dock reads off a route. */\ninterface DevHandle {\n dev?: boolean;\n devLabel?: string;\n devGroup?: string;\n hidden?: boolean;\n /** Whatever else the app puts on `handle`; the dock ignores it. */\n [key: string]: unknown;\n}\n\n/** `handle` loader for one route property, as lazy route objects expose it. */\ntype LazyProperty<T> = () => Promise<T | undefined>;\n\n/** Minimal shape of a react-router route object we care about. */\ninterface RRRoute {\n path?: string;\n index?: boolean;\n children?: RRRoute[];\n handle?: DevHandle;\n /**\n * Set while the route's module is still unloaded. Two shapes exist: a\n * function resolving to the module, whose exports are the route's properties\n * (`lazy: () => import(\"./route\")`, v6.19+), and an object with one loader\n * per property (v7.5+, and what framework mode builds for every route).\n * `handle` rides along in both.\n */\n lazy?:\n LazyProperty<{ handle?: DevHandle }> | { handle?: LazyProperty<DevHandle> };\n}\n\n/** The slice of the data router the adapter uses, across v6/v7/v8. */\ninterface RRRouter {\n routes?: RRRoute[];\n subscribe?: (listener: () => void) => () => void;\n}\n\nfunction joinPath(parent: string, child: string): string {\n if (child.startsWith(\"/\")) return child;\n if (!child) return parent || \"/\";\n const base = parent.endsWith(\"/\") ? parent.slice(0, -1) : parent;\n return `${base}/${child}`;\n}\n\n/** Opt-in markers that make a route a dev destination. */\nfunction isDevMarked(handle: RRRoute[\"handle\"]): boolean {\n return (\n handle?.dev === true || handle?.devLabel != null || handle?.devGroup != null\n );\n}\n\nexport interface DetectOptions {\n /**\n * Only keep routes that match. A glob string (`*` = any characters), a\n * `RegExp`, or a predicate.\n */\n match?: RouteMatcher;\n /**\n * Also list the app's ordinary static routes, not just the dev ones.\n * Default: `false`.\n */\n staticRoutes?: boolean;\n /**\n * Import lazy route modules to read their `handle`.\n *\n * In framework mode (`app/routes.ts`) every route is lazy, so `handle` is\n * not on the route object the router exposes — it lives in the route module\n * and only reaches the route once that module loads, i.e. once you visit the\n * page. Without this, framework-mode routes are detected by the `/dev/*`\n * path convention alone and `handle.dev` / `devLabel` / `devGroup` /\n * `hidden` are silently ignored.\n *\n * Opt-in because reading a handle up front means importing the module up\n * front — dev only, but that is still every lazy route's module, and any\n * import side effects with it. Default: `false`.\n */\n loadHandles?: boolean;\n}\n\n/** State handed down to descendants of a dev-marked route. */\ninterface Inherited {\n dev: boolean;\n group?: string;\n}\n\n/**\n * Flatten a react-router route tree into navigable {@link DevRoute}s.\n *\n * Only dev destinations are returned: routes under `/dev`, routes marked with\n * `handle.dev`, `handle.devLabel` or `handle.devGroup`, and everything nested\n * under them. Pass `{ staticRoutes: true }` to list every static route instead.\n *\n * Dynamic (`:param`) and splat (`*`) segments are skipped since they can't be\n * navigated to without arguments. Mark a route with `handle.hidden` to exclude\n * it, or `handle.devLabel` to rename it.\n *\n * Reads `handle` straight off each route object, so a tree whose routes are\n * still lazy has no handles to read — see {@link DetectOptions.loadHandles}.\n */\nexport function flattenRoutes(\n routes: RRRoute[],\n parent = \"\",\n options: Pick<DetectOptions, \"staticRoutes\"> = {},\n): DevRoute[] {\n return walk(routes, parent, options.staticRoutes === true, { dev: false });\n}\n\nfunction walk(\n routes: RRRoute[],\n parent: string,\n staticRoutes: boolean,\n inherited: Inherited,\n): DevRoute[] {\n const out: DevRoute[] = [];\n for (const r of routes) {\n const full = r.index ? parent : joinPath(parent, r.path ?? \"\");\n // A dev route makes its whole subtree dev, so marking a section's layout\n // route is enough to surface the pages inside it. The `/dev` check reads\n // the joined path, which also catches flat routes like `dev/inspector`.\n const dev = inherited.dev || isDevMarked(r.handle) || isDevPath(full);\n const group = r.handle?.devGroup ?? inherited.group;\n const navigable =\n !r.index &&\n r.path != null &&\n !full.includes(\":\") &&\n !full.includes(\"*\") &&\n r.handle?.hidden !== true &&\n (dev || staticRoutes);\n if (navigable) {\n out.push({\n path: full || \"/\",\n label: r.handle?.devLabel ?? (full || \"/\"),\n group,\n });\n }\n if (r.children?.length)\n out.push(...walk(r.children, full, staticRoutes, { dev, group }));\n }\n return out;\n}\n\n// ---- lazy handles ---------------------------------------------------------\n\nconst NO_ROUTES: RRRoute[] = [];\nconst NO_HANDLES: ReadonlyMap<RRRoute, DevHandle> = new Map();\n\n/** The route's `handle` loader, whichever `lazy` shape it uses. */\nfunction lazyHandleOf(route: RRRoute): LazyProperty<DevHandle> | undefined {\n const lazy = route.lazy;\n if (typeof lazy === \"function\") return async () => (await lazy())?.handle;\n return typeof lazy?.handle === \"function\" ? lazy.handle : undefined;\n}\n\nasync function readLazyHandle(route: RRRoute): Promise<DevHandle | undefined> {\n try {\n return await lazyHandleOf(route)?.();\n } catch {\n // A route module that won't load is the app's problem, not the dock's.\n // Fall back to listing the route by path.\n return undefined;\n }\n}\n\nfunction collectLazy(routes: RRRoute[], out: RRRoute[] = []): RRRoute[] {\n for (const r of routes) {\n // A `handle` already on the route is the router's own resolved value.\n if (r.handle == null && lazyHandleOf(r) != null) out.push(r);\n if (r.children?.length) collectLazy(r.children, out);\n }\n return out;\n}\n\n/**\n * Everything the dock reads out of the route tree, as a comparable string.\n *\n * Neither the tree's identity nor its contents are a reliable change signal on\n * their own: the router resolves `lazy` by mutating route objects in place, and\n * patches discovered branches into the arrays it already handed out. Only some\n * versions swap the top-level array. So compare what we actually read.\n */\nfunction signature(routes: RRRoute[], out: string[] = []): string[] {\n for (const r of routes) {\n const h = r.handle;\n out.push(\n `${r.path ?? \"\"}|${r.index ? 1 : 0}|${h?.dev}|${h?.devLabel}` +\n `|${h?.devGroup}|${h?.hidden}|${lazyHandleOf(r) ? 1 : 0}`,\n );\n if (r.children?.length) signature(r.children, out);\n }\n return out;\n}\n\n/**\n * The router's route tree, plus a signature that changes whenever the tree\n * does. Routes arrive late in framework mode — `lazy` modules resolve on\n * navigation and lazy route discovery patches whole branches in as links\n * render — and both land as a router state update.\n */\nfunction useRouteTree(router: RRRouter | undefined): [RRRoute[], string] {\n const routes = router?.routes ?? NO_ROUTES;\n const [sig, setSig] = useState(() => signature(routes).join(\"\\n\"));\n useEffect(() => {\n if (!router?.subscribe) return;\n const check = () => {\n const next = signature(router.routes ?? NO_ROUTES).join(\"\\n\");\n setSig((prev) => (prev === next ? prev : next));\n };\n // The tree can have moved between render and effect.\n check();\n return router.subscribe(check);\n }, [router]);\n return [routes, sig];\n}\n\n/** Handles read out of lazy route modules, keyed by route object. */\nfunction useLazyHandles(\n routes: RRRoute[],\n sig: string,\n enabled: boolean,\n): ReadonlyMap<RRRoute, DevHandle> {\n const [handles, setHandles] = useState(NO_HANDLES);\n // Promises, not values, and keyed by the route objects the router reuses: a\n // module is imported once no matter how often the effect re-runs, and an\n // effect that was cleaned up mid-flight (StrictMode's double invoke) can\n // re-await the same work instead of dropping it.\n const started = useRef(\n new WeakMap<RRRoute, Promise<DevHandle | undefined>>(),\n );\n useEffect(() => {\n if (!enabled) return;\n const targets = collectLazy(routes);\n if (targets.length === 0) return;\n let cancelled = false;\n void Promise.all(\n targets.map((route) => {\n let pending = started.current.get(route);\n if (!pending) {\n pending = readLazyHandle(route);\n started.current.set(route, pending);\n }\n return pending.then((handle) => [route, handle] as const);\n }),\n ).then((resolved) => {\n if (cancelled) return;\n const found = resolved.filter(\n (entry): entry is [RRRoute, DevHandle] => entry[1] != null,\n );\n setHandles((prev) =>\n found.some(([route, handle]) => prev.get(route) !== handle)\n ? new Map([...prev, ...found])\n : prev,\n );\n });\n return () => {\n cancelled = true;\n };\n }, [routes, sig, enabled]);\n return handles;\n}\n\n/**\n * The tree with lazily-read handles filled in. A copy rather than a mutation:\n * assigning `route.handle` ourselves makes the router warn about a \"static\n * property\" and skip its own resolution of the lazy one.\n */\nfunction mergeHandles(\n routes: RRRoute[],\n handles: ReadonlyMap<RRRoute, DevHandle>,\n): RRRoute[] {\n let changed = false;\n const merged = routes.map((r) => {\n const handle = r.handle ?? handles.get(r);\n const children = r.children\n ? mergeHandles(r.children, handles)\n : r.children;\n if (handle === r.handle && children === r.children) return r;\n changed = true;\n return { ...r, handle, children };\n });\n return changed ? merged : routes;\n}\n\n/**\n * Read the dev routes off the active react-router data router — anything under\n * `/dev` or marked with `handle.dev` / `devLabel` / `devGroup`, plus their\n * children.\n * Pass `{ staticRoutes: true }` to include the app's ordinary routes too,\n * `{ match }` to scope the results, and `{ loadHandles: true }` to read\n * `handle` from routes whose module hasn't loaded yet (framework mode). A bare\n * matcher is accepted as shorthand.\n *\n * Re-reads the tree as the router grows it, so routes that are discovered or\n * resolved after the first render show up on their own.\n */\nexport function useDetectedRoutes(\n options: DetectOptions | RouteMatcher = {},\n): DevRoute[] {\n const opts: DetectOptions = isMatcher(options) ? { match: options } : options;\n const { match, staticRoutes, loadHandles } = opts;\n const ctx = useContext(DataRouterContext);\n const [routes, sig] = useRouteTree(ctx?.router as RRRouter | undefined);\n const handles = useLazyHandles(routes, sig, loadHandles === true);\n // `sig` is a dep because the tree is mutated in place (see useRouteTree).\n return useMemo(() => {\n const tree = handles.size > 0 ? mergeHandles(routes, handles) : routes;\n const deduped = dedupeByPath(flattenRoutes(tree, \"\", { staticRoutes }));\n return match ? deduped.filter(toPredicate(match)) : deduped;\n }, [routes, sig, handles, match, staticRoutes]);\n}\n\nexport interface ReactRouterDevDockProps extends DevDockProps {\n /**\n * Only auto-detect routes that match. A glob string (`*` = any characters,\n * e.g. `\"/dev/*\"`), a `RegExp`, or a predicate. Manual `routes` are always\n * included regardless of this filter.\n */\n match?: RouteMatcher;\n /**\n * List the app's ordinary static routes alongside the dev ones.\n * Off by default, so the dock only shows what you opted in.\n */\n staticRoutes?: boolean;\n /**\n * Import lazy route modules so their `handle` is visible. Needed for\n * `handle.dev` / `devLabel` / `devGroup` / `hidden` in React Router\n * framework mode. See {@link DetectOptions.loadHandles}.\n */\n loadHandles?: boolean;\n}\n\n/**\n * Drop-in {@link DevDock} for react-router apps: navigates via the SPA router\n * and auto-detects the dev routes from the active data router. Any `routes`\n * you pass are appended to the detected ones.\n */\nexport function ReactRouterDevDock({\n match,\n staticRoutes,\n loadHandles,\n ...props\n}: ReactRouterDevDockProps) {\n const navigate = useNavigate();\n const detected = useDetectedRoutes({ match, staticRoutes, loadHandles });\n const routes = useMemo(\n () => [...detected, ...(props.routes ?? [])],\n [detected, props.routes],\n );\n return (\n <DevDock\n {...props}\n routes={routes}\n onNavigate={props.onNavigate ?? ((path) => navigate(path))}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/core/hotkey.ts","../src/core/theme.ts","../src/core/dock.ts","../src/react/DevDock.tsx","../src/core/match.ts","../src/react/react-router.tsx"],"names":["cn","useRef","useState","useMemo","useEffect","createPortal","useContext","DataRouterContext","useNavigate","jsx"],"mappings":"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","file":"react-router.cjs","sourcesContent":["/** Whether \"mod\" means ⌘ rather than Ctrl. */\nconst isMac = (): boolean =>\n typeof navigator !== \"undefined\" && /mac/i.test(navigator.platform);\n\n/**\n * `event.code` for the keys a spec can name, so an Alt combo can be matched by\n * physical key. Letters and digits are derived; these are the rest.\n */\nconst KEY_CODES: Record<string, string> = {\n \".\": \"Period\",\n \",\": \"Comma\",\n \"/\": \"Slash\",\n \"\\\\\": \"Backslash\",\n \";\": \"Semicolon\",\n \"'\": \"Quote\",\n \"[\": \"BracketLeft\",\n \"]\": \"BracketRight\",\n \"-\": \"Minus\",\n \"=\": \"Equal\",\n \"`\": \"Backquote\",\n \" \": \"Space\",\n space: \"Space\",\n};\n\nconst codeFor = (key: string): string | undefined => {\n if (/^[a-z]$/.test(key)) return `Key${key.toUpperCase()}`;\n if (/^[0-9]$/.test(key)) return `Digit${key}`;\n return KEY_CODES[key];\n};\n\n/** Parse a hotkey string like \"mod+.\" into a matcher predicate. */\nexport function matchHotkey(spec: string, e: KeyboardEvent): boolean {\n const parts = spec\n .toLowerCase()\n .split(\"+\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length === 0) return false;\n\n const key = parts[parts.length - 1];\n const mods = new Set(parts.slice(0, -1));\n\n const mac = isMac();\n\n const wantMeta = mods.has(\"meta\") || mods.has(\"cmd\") || (mods.has(\"mod\") && mac);\n const wantCtrl = mods.has(\"ctrl\") || mods.has(\"control\") || (mods.has(\"mod\") && !mac);\n const wantShift = mods.has(\"shift\");\n const wantAlt = mods.has(\"alt\") || mods.has(\"option\");\n\n if (e.metaKey !== wantMeta) return false;\n if (e.ctrlKey !== wantCtrl) return false;\n if (e.shiftKey !== wantShift) return false;\n if (e.altKey !== wantAlt) return false;\n\n if (e.key.toLowerCase() === key) return true;\n\n // With \\u2325 held, macOS hands the browser the composed character \\u2014 \\u2325\\u21e7D\n // arrives as \"\\u00ce\", not \"d\" \\u2014 so an Alt combo has to be matched by physical\n // key instead. Only when Alt is wanted: `code` ignores the layout, and\n // matching it everywhere would fire \\u2318+a for \\u2318+q on AZERTY.\n return wantAlt && e.code === codeFor(key);\n}\n\n/**\n * The shortcut the dock listens for when `hotkey` is left unset: ⌥⇧D on Mac,\n * Alt+Shift+D elsewhere.\n *\n * Deliberately off the beaten path. ⌘/Ctrl combos are the contested space —\n * ⌘K is Firefox's search bar and most apps' own palette, ⌘⇧I is devtools,\n * ⌘. is \"cancel\" in some Mac apps — while Alt+Shift+letter is claimed by\n * neither the browser chrome nor the OS, and an app's own bindings rarely\n * reach for it.\n */\nexport const DEFAULT_HOTKEY = \"alt+shift+d\";\n\nconst MAC_SYMBOL: Record<string, string> = {\n meta: \"⌘\",\n cmd: \"⌘\",\n ctrl: \"⌃\",\n control: \"⌃\",\n shift: \"⇧\",\n alt: \"⌥\",\n option: \"⌥\",\n};\n\nconst PC_NAME: Record<string, string> = {\n meta: \"Win\",\n cmd: \"Win\",\n ctrl: \"Ctrl\",\n control: \"Ctrl\",\n shift: \"Shift\",\n alt: \"Alt\",\n option: \"Alt\",\n};\n\n/**\n * Human-readable form of a hotkey spec — \"⌥⇧D\" on Mac, \"Alt+Shift+D\"\n * elsewhere.\n */\nexport function formatHotkey(spec: string): string {\n const parts = spec\n .toLowerCase()\n .split(\"+\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length === 0) return \"\";\n\n const key = parts[parts.length - 1];\n const mods = parts.slice(0, -1);\n const mac = isMac();\n\n const label = key.length === 1 ? key.toUpperCase() : key;\n const shown = mods.map((m) =>\n mac\n ? (MAC_SYMBOL[m] ?? (m === \"mod\" ? \"⌘\" : m))\n : (PC_NAME[m] ?? (m === \"mod\" ? \"Ctrl\" : m)),\n );\n\n // Mac stacks the glyphs (⌘⇧K); everywhere else they're joined with \"+\".\n return mac ? [...shown, label].join(\"\") : [...shown, label].join(\"+\");\n}\n","import type { DevDockClassNames } from \"./types\";\n\n/** One styleable piece of the dock. See {@link DevDockClassNames}. */\nexport type DockPart = keyof DevDockClassNames;\n\n/**\n * The class every part carries, whatever you pass in `classNames`. Stable\n * API: target `.devdock-row` from your own stylesheet if you'd rather not\n * thread class names through the options.\n *\n * `rowActive` has no class of its own — the highlighted row is marked with\n * `data-active`, so a base rule can reach it without one.\n */\nexport const partClass: Record<DockPart, string> = {\n root: \"devdock-root\",\n button: \"devdock-button\",\n dot: \"devdock-dot\",\n buttonLabel: \"devdock-button-label\",\n panel: \"devdock-panel\",\n title: \"devdock-title\",\n hotkeyHint: \"devdock-hotkey-hint\",\n inputWrap: \"devdock-input-wrap\",\n input: \"devdock-input\",\n body: \"devdock-body\",\n list: \"devdock-list\",\n section: \"devdock-section\",\n group: \"devdock-group\",\n row: \"devdock-row\",\n rowActive: \"\",\n rowLabel: \"devdock-row-label\",\n rowPath: \"devdock-row-path\",\n check: \"devdock-check\",\n empty: \"devdock-empty\",\n viewLabel: \"devdock-view-label\",\n view: \"devdock-view\",\n};\n\n/** Marks the dock's own stylesheet, so the style-inheriting code can skip it. */\nexport const STYLE_MARKER = \"data-devdock-styles\";\n\nconst FONT =\n \"ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, sans-serif\";\n\n/**\n * The dock's own styles.\n *\n * Two things make `classNames` work without `!important`:\n *\n * 1. **A cascade layer** (see {@link dockStyles}). Layered rules lose to\n * unlayered ones whatever their specificity, and Tailwind v4 puts its\n * utilities in `@layer utilities` — so the sheet declares a layer order\n * that sits the dock's layer after Tailwind's `base` (its reset can't strip\n * the dock's chrome) and before `utilities` (your classes land).\n * 2. **Exactly one class per rule** — one bare `.devdock-*`, with any state\n * selector tucked inside `:where()`, which contributes nothing. That is\n * what settles ties against unlayered CSS, which is the whole cascade when\n * the layer is turned off (`cssLayer: false`): a page-level reset\n * (`button { … }`, `*`) is worth less and loses, a class you pass is worth\n * the same and wins on order, because this sheet goes in first.\n *\n * Colours, sizes and the font come from `--devdock-*` custom properties, each\n * written as a `var(…, default)` fallback rather than declared anywhere. That\n * is the point: a property the page sets — on `:root`, or on the\n * `[data-devdock]` host for one dock — inherits *through* the shadow boundary\n * and is used, while a default of ours declared inside the shadow tree would\n * have beaten it. It also means retheming needs none of the machinery above:\n * no inherited stylesheet, no layer, no change to the isolation.\n *\n * What stays inline, and so can't be overridden by either: the corner\n * placement, the z-index, and the popup's anchoring — all of them computed\n * from `position`/`zIndex` rather than themed.\n */\nexport const BASE_CSS = `\n.devdock-root { font-family: var(--devdock-font, ${FONT}); }\n\n.devdock-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 12px;\n font-weight: 700;\n letter-spacing: 0.6px;\n color: var(--devdock-button-fg, #fff);\n background: var(--devdock-button-bg, #111317);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: 999px;\n box-shadow: 0 4px 14px rgba(0, 0, 0, 0.35);\n cursor: pointer;\n}\n.devdock-button:where([aria-expanded=\"true\"]) {\n background: var(--devdock-accent, #2563eb);\n}\n\n.devdock-dot {\n width: 8px;\n height: 8px;\n border-radius: 999px;\n background: var(--devdock-success, #22c55e);\n display: inline-block;\n}\n\n.devdock-panel {\n width: var(--devdock-width, 280px);\n max-height: var(--devdock-max-height, 70vh);\n display: flex;\n flex-direction: column;\n background: var(--devdock-bg, #16181d);\n color: var(--devdock-fg, #e7e9ee);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: var(--devdock-radius, 12px);\n box-shadow: var(--devdock-shadow, 0 12px 40px rgba(0, 0, 0, 0.45));\n overflow: hidden;\n}\n\n.devdock-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 10px 12px;\n border-bottom: 1px solid var(--devdock-border, #2a2e37);\n font-size: 12px;\n font-weight: 600;\n letter-spacing: 0.4px;\n text-transform: uppercase;\n color: var(--devdock-muted, #8b909c);\n}\n\n.devdock-hotkey-hint {\n flex-shrink: 0;\n padding: 1px 5px;\n font-family: inherit;\n font-size: 10px;\n font-weight: 600;\n /* The heading's tracking and casing are for words, not for a key cap. */\n letter-spacing: 0;\n text-transform: none;\n color: var(--devdock-subtle, #6b7280);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: var(--devdock-radius-xs, 4px);\n}\n\n.devdock-input-wrap { padding: 8px; }\n\n.devdock-input {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n font-size: 13px;\n color: var(--devdock-fg, #e7e9ee);\n background: var(--devdock-input-bg, #0f1115);\n border: 1px solid var(--devdock-border, #2a2e37);\n border-radius: var(--devdock-radius-sm, 8px);\n outline: none;\n}\n\n.devdock-body {\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n}\n\n.devdock-list { padding: 0 6px 8px; }\n\n.devdock-section { margin-top: 6px; }\n\n.devdock-group {\n padding: 6px 8px 2px;\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.6px;\n text-transform: uppercase;\n color: var(--devdock-subtle, #6b7280);\n}\n\n.devdock-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n width: 100%;\n text-align: left;\n padding: 8px 10px;\n font-size: 13px;\n color: var(--devdock-fg, #e7e9ee);\n background: transparent;\n border: none;\n border-radius: var(--devdock-radius-sm, 8px);\n cursor: pointer;\n}\n.devdock-row:where([data-active]) {\n background: var(--devdock-accent, #2563eb);\n color: var(--devdock-accent-fg, #e7e9ee);\n}\n\n.devdock-row-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.devdock-row-path {\n font-size: 11px;\n color: var(--devdock-subtle, #6b7280);\n font-family: ui-monospace, SFMono-Regular, monospace;\n flex-shrink: 0;\n}\n:where(.devdock-row[data-active]) .devdock-row-path {\n /* Whatever colour the row ended up with, stepped back: currentColor in the\n color property means the inherited one, so this tracks the row however it\n was set - a token, a class of yours - instead of guessing at the accent. */\n color: color-mix(in oklab, currentColor 75%, transparent);\n}\n\n.devdock-check {\n flex-shrink: 0;\n width: 12px;\n text-align: center;\n color: var(--devdock-success, #22c55e);\n}\n\n.devdock-empty {\n padding: 12px;\n font-size: 13px;\n color: var(--devdock-subtle, #6b7280);\n}\n\n.devdock-view-label {\n padding: 4px 8px 0;\n font-size: 11px;\n color: var(--devdock-muted, #8b909c);\n}\n\n.devdock-view { padding: 2px 8px 6px; }\n`;\n\n/** The layer the dock's styles go in when `cssLayer` is left alone. */\nexport const DEFAULT_LAYER = \"devdock\";\n\n/**\n * The sheet text: {@link BASE_CSS}, in a cascade layer unless `layer` is\n * `false`.\n *\n * For the default layer the statement names Tailwind's four layers around\n * ours, which both fixes the relative order and is inert for a page that has\n * none of them — layer names are declared here, in a sheet that always goes in\n * first, so this is the order that stands. A layer *you* name gets no such\n * statement: put it where you want it in your own `@layer` line.\n */\nexport function dockStyles(layer: string | false): string {\n if (!layer) return BASE_CSS;\n const block = `@layer ${layer} {${BASE_CSS}}\\n`;\n // A layer you named is a layer you're placing yourself — ordering it from\n // in here, against names we'd be guessing at, is how the dock would end up\n // under your reset. Only the default layer gets an opinion.\n if (layer !== DEFAULT_LAYER) return block;\n const order = `@layer theme, base, components, ${layer}, utilities;`;\n return `${order}\\n${block}`;\n}\n","import { cn } from \"cn\";\nimport { DEFAULT_HOTKEY, formatHotkey, matchHotkey } from \"./hotkey\";\nimport {\n DEFAULT_LAYER,\n STYLE_MARKER,\n dockStyles,\n partClass,\n type DockPart,\n} from \"./theme\";\nimport type {\n DevCommand,\n DevDockInstance,\n DevDockOptions,\n DevRoute,\n DevView,\n DockPosition,\n} from \"./types\";\n\n/**\n * Vite's own build-time flag. The Vite family (Vite, SvelteKit, React Router\n * 7, Astro…) statically replaces the full `import.meta.env.DEV` token with a\n * literal, so this collapses to a constant there. Anywhere else the read\n * throws — `import.meta.env` is undefined in plain Node and in our CJS build,\n * where esbuild rewrites `import.meta` to `{}` — and we report \"no opinion\"\n * so the caller can fall back to `NODE_ENV`.\n */\nconst viteDevFlag = (): boolean | undefined => {\n try {\n if (typeof import.meta.env.DEV === \"boolean\") return import.meta.env.DEV;\n } catch {\n // Not a Vite-built bundle.\n }\n return undefined;\n};\n\nconst isDevBuild = (): boolean => {\n // Vite knows better than NODE_ENV: `vite build` leaves NODE_ENV unreplaced\n // in some setups, and its dev server is a dev build regardless of NODE_ENV.\n const vite = viteDevFlag();\n if (vite !== undefined) return vite;\n // Bundlers (webpack, Next, esbuild…) statically replace the full\n // `process.env.NODE_ENV` token, even in browser builds where `process`\n // itself is undefined. Reading it directly lets that replacement work;\n // the try/catch covers runtimes where it's left as a real (missing) global.\n try {\n return process.env.NODE_ENV !== \"production\";\n } catch {\n return false;\n }\n};\n\n/** Loopback IPv4 (127/8) and the private LAN ranges 10/8, 172.16/12, 192.168/16. */\nconst isLocalIPv4 = (host: string): boolean => {\n const parts = /^(\\d{1,3})\\.(\\d{1,3})\\.\\d{1,3}\\.\\d{1,3}$/.exec(host);\n if (!parts) return false;\n const a = Number(parts[1]);\n const b = Number(parts[2]);\n return (\n a === 127 ||\n a === 10 ||\n (a === 192 && b === 168) ||\n (a === 172 && b >= 16 && b <= 31)\n );\n};\n\n/**\n * Whether the page is served from a developer's own machine. The build check\n * alone can't tell: a development build deployed somewhere real (a preview\n * URL, a staging box) still reports itself as a dev build.\n *\n * Dev hosts are loopback, mDNS `.local` names, and private LAN addresses — so\n * hitting the dev server from a phone on the same Wi-Fi still counts. Any\n * other hostname is treated as a deployed site.\n */\nconst isDevHost = (): boolean => {\n if (typeof location === \"undefined\") return true;\n // IPv6 literals arrive bracketed, e.g. \"[::1]\".\n const host = location.hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n // No hostname at all (file://, about:blank…) is not a deployed site.\n if (!host) return true;\n return (\n host === \"localhost\" ||\n host.endsWith(\".localhost\") ||\n host.endsWith(\".local\") ||\n host === \"::1\" ||\n host === \"0.0.0.0\" ||\n isLocalIPv4(host)\n );\n};\n\n/**\n * A row in the list, resolved for this render. `label` and `checked` are\n * snapshots of whatever the caller's functions returned just now, while `sig`\n * is deliberately stable across those values — see {@link itemSig}.\n */\ntype Item = {\n key: string;\n label: string;\n group: string;\n /** Identity of the row's *shape*, not its live values. */\n sig: string;\n} & (\n | { kind: \"route\"; route: DevRoute }\n | { kind: \"command\"; checked: boolean | null; command: DevCommand }\n);\n\ntype Styles = Partial<CSSStyleDeclaration>;\n\nfunction el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n props?: Partial<HTMLElementTagNameMap[K]>,\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (props) Object.assign(node, props);\n return node;\n}\n\n/** Every part `classNames` can address, in a fixed order. */\nconst PARTS = Object.keys(partClass) as DockPart[];\n\ntype Edge = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/**\n * Split a position into the edges it hugs. A corner hugs two; a bare edge hugs\n * one and is centered along it.\n */\nfunction edgesOf(position: DockPosition): Edge[] {\n return position.split(\"-\") as Edge[];\n}\n\nconst CENTER_ALONG: Record<Edge, Styles> = {\n top: { left: \"50%\", transform: \"translateX(-50%)\" },\n bottom: { left: \"50%\", transform: \"translateX(-50%)\" },\n left: { top: \"50%\", transform: \"translateY(-50%)\" },\n right: { top: \"50%\", transform: \"translateY(-50%)\" },\n};\n\nconst CLEAR: Styles = { top: \"\", bottom: \"\", left: \"\", right: \"\", transform: \"\" };\n\nfunction cornerStyle(position: DockPosition): Styles {\n const gap = \"16px\";\n const edges = edgesOf(position);\n const styles: Styles = { ...CLEAR };\n for (const edge of edges) styles[edge] = gap;\n if (edges.length === 1) Object.assign(styles, CENTER_ALONG[edges[0]!]);\n return styles;\n}\n\nfunction panelAnchor(position: DockPosition): Styles {\n const edges = edgesOf(position);\n // Start from a clean slate so moving between positions leaves nothing stale.\n const styles: Styles = { ...CLEAR, position: \"absolute\" };\n if (edges.length === 2) {\n // Corner: open away from the vertical edge, aligned to the horizontal one.\n const [vertical, horizontal] = edges as [\"top\" | \"bottom\", \"left\" | \"right\"];\n styles[vertical] = \"calc(100% + 8px)\";\n styles[horizontal] = \"0\";\n return styles;\n }\n // Edge: open inward, centered on the button.\n const edge = edges[0]!;\n styles[edge] = \"calc(100% + 8px)\";\n Object.assign(styles, CENTER_ALONG[edge]);\n return styles;\n}\n\n/**\n * Pair each view with the key it is reconciled by: its `id`, or its index.\n * Duplicate ids are a caller mistake, but a silent one — two views sharing a\n * key would share a host element, so the collision is broken here instead.\n *\n * Generic over the view shape because the adapters have their own (React's\n * takes `render` in place of `mount`) and have to key their side of a view —\n * a portal, say — exactly the way the core keys its host. Not public API.\n *\n * @internal\n */\nexport function keyViews<T extends { id?: string }>(\n views: readonly T[],\n): { view: T; key: string }[] {\n const used = new Set<string>();\n return views.map((view, i) => {\n let key = view.id ?? `#${i}`;\n while (used.has(key)) key = `${key}#${i}`;\n used.add(key);\n return { view, key };\n });\n}\n\n/**\n * Create a framework-agnostic dev dock: a floating button that opens a popup\n * to jump between routes and run commands. Returns a handle to update its\n * options or tear it down. No-ops on the server (when there is no `document`).\n */\nexport function createDevDock(initial: DevDockOptions = {}): DevDockInstance {\n if (typeof document === \"undefined\") {\n return { update() {}, destroy() {} };\n }\n\n let opts: DevDockOptions = { ...initial };\n /**\n * A part's classes: the `devdock-*` one it always carries, then whatever\n * the caller passed for it. Read from `opts` at paint time, so `update()`\n * can change a class without rebuilding anything.\n *\n * `cn` rather than a plain join, because the merge is between Tailwind\n * classes and the last one has to win: `rowActive: \"text-emerald-900\"` over\n * `row: \"text-slate-700\"` is a conflict the class attribute can't settle on\n * its own — the stylesheet's order decides, and that isn't ours.\n */\n const cls = (...parts: DockPart[]): string =>\n cn(parts.map((part) => [partClass[part], opts.classNames?.[part]]));\n /**\n * Identity of the caller's classes, folded into the signatures that decide\n * whether the per-render DOM (rows, sections, view wrappers) is reusable.\n */\n const classSig = (): string =>\n PARTS.map((p) => cn(opts.classNames?.[p])).join(\"\\u0000\");\n\n let open = false;\n let query = \"\";\n let active = 0;\n let mounted = false;\n\n // Light-DOM host that gets appended to the page. When shadow DOM is used,\n // the actual UI lives inside its shadow root — fully isolated from the host\n // page's CSS. `data-devdock` stays on the host so it's discoverable.\n const host = el(\"div\");\n host.setAttribute(\"data-devdock\", \"\");\n // Classes are defined by a stylesheet of the caller's, which an isolated\n // shadow root would keep out — so passing `classNames` flips the default to\n // `\"inherit\"`. An explicit `shadow` still wins.\n const shadowMode = initial.shadow ?? (initial.classNames ? \"inherit\" : true);\n const useShadow =\n shadowMode !== false && typeof host.attachShadow === \"function\";\n const shadowRoot = useShadow ? host.attachShadow({ mode: \"open\" }) : null;\n const mountPoint: Node = shadowRoot ?? host;\n\n // The dock's own styles. They go in *first* — ahead of the inherited clones\n // below, at the top of `<head>` in light-DOM mode — because that is what\n // fixes the cascade layer order, and what settles a specificity tie in the\n // caller's favour. See `dockStyles`.\n const baseStyle = el(\"style\", {\n textContent: dockStyles(initial.cssLayer ?? DEFAULT_LAYER),\n });\n baseStyle.setAttribute(STYLE_MARKER, \"\");\n if (shadowRoot) mountPoint.appendChild(baseStyle);\n\n // `shadow: \"inherit\"` keeps the isolation boundary but copies the page's\n // styles across it, so a view can render the host app's own components.\n // The clones live in one wrapper so re-syncing is a single replaceChildren;\n // `display: contents` keeps it out of the layout.\n const styleSlot = shadowRoot && shadowMode === \"inherit\" ? el(\"div\") : null;\n if (styleSlot) {\n styleSlot.style.display = \"contents\";\n mountPoint.appendChild(styleSlot);\n }\n\n const root = el(\"div\");\n mountPoint.appendChild(root);\n\n const panel = el(\"div\");\n panel.setAttribute(\"role\", \"dialog\");\n\n // The heading is a row: the title, and the shortcut as a key cap. A tooltip\n // on the button only pays off for someone hovering a button they were about\n // to click, so the hint goes where it is read instead.\n const heading = el(\"div\");\n const headingText = el(\"span\");\n const hotkeyHint = el(\"kbd\");\n heading.append(headingText, hotkeyHint);\n\n const inputWrap = el(\"div\");\n const input = el(\"input\");\n input.placeholder = \"Filter…\";\n inputWrap.appendChild(input);\n\n const list = el(\"div\");\n list.setAttribute(\"data-devdock-list\", \"\");\n\n const viewsBefore = el(\"div\");\n viewsBefore.setAttribute(\"data-devdock-views\", \"before\");\n const viewsAfter = el(\"div\");\n viewsAfter.setAttribute(\"data-devdock-views\", \"after\");\n\n // One scroller around the views and the list, so a tall view can't push the\n // panel past its max height.\n const body = el(\"div\");\n body.append(viewsBefore, list, viewsAfter);\n\n panel.append(heading, inputWrap, body);\n\n const button = el(\"button\");\n button.type = \"button\";\n button.setAttribute(\"aria-label\", \"Toggle dev menu\");\n const dot = el(\"span\");\n const buttonLabel = el(\"span\");\n button.append(dot, buttonLabel);\n\n root.appendChild(button);\n\n /** The small uppercase heading above a group of rows, or above a view. */\n const sectionHeading = (text: string) =>\n el(\"div\", { className: cls(\"group\"), textContent: text });\n\n /** A view's own label, when several views share one `group` heading. */\n const viewLabel = (text: string) =>\n el(\"div\", { className: cls(\"viewLabel\"), textContent: text });\n\n /** Classes for the parts that live as long as the dock does. */\n const paintClasses = () => {\n root.className = cls(\"root\");\n button.className = cls(\"button\");\n dot.className = cls(\"dot\");\n buttonLabel.className = cls(\"buttonLabel\");\n panel.className = cls(\"panel\");\n heading.className = cls(\"title\");\n hotkeyHint.className = cls(\"hotkeyHint\");\n inputWrap.className = cls(\"inputWrap\");\n input.className = cls(\"input\");\n body.className = cls(\"body\");\n list.className = cls(\"list\");\n };\n\n // ---- behavior ---------------------------------------------------------\n\n /**\n * The toggle shortcut. Unset means the default; `null` (or an empty string)\n * means the dock claims no key at all.\n */\n const hotkey = (): string | null =>\n opts.hotkey === undefined ? DEFAULT_HOTKEY : opts.hotkey;\n\n const enabled = (): boolean => {\n const e = opts.enabled;\n if (typeof e === \"function\") return e();\n if (e != null) return e;\n // Default gate: a dev build, served from a dev machine. `devHostOnly:\n // false` keeps the build check but allows any hostname.\n return isDevBuild() && (opts.devHostOnly === false || isDevHost());\n };\n\n const navigate = (path: string) => {\n if (opts.onNavigate) opts.onNavigate(path);\n else if (typeof window !== \"undefined\") window.location.assign(path);\n };\n\n const buildItems = (): Item[] => {\n const out: Item[] = [];\n (opts.routes ?? []).forEach((r, i) => {\n const key = `route:${r.path}:${i}`;\n const label = r.label ?? r.path;\n out.push({\n kind: \"route\",\n key,\n label,\n group: r.group ?? \"Routes\",\n sig: [key, r.group ?? \"Routes\", label, r.path].join(\"\\u0000\"),\n route: r,\n });\n });\n (opts.commands ?? []).forEach((c, i) => {\n // A function label is read fresh here, on every render of the open\n // panel. The row's signature uses a placeholder in its place so the new\n // text lands on the existing node instead of rebuilding the list — see\n // `renderList`. The same goes for `checked`: its presence is part of the\n // shape, its value isn't.\n const live = typeof c.label === \"function\";\n const label = typeof c.label === \"function\" ? c.label() : c.label;\n const checked = c.checked ? c.checked() === true : null;\n const key = `cmd:${c.id ?? (live ? \"\" : label)}:${i}`;\n const group = c.group ?? \"Commands\";\n out.push({\n kind: \"command\",\n key,\n label,\n group,\n sig: [\n key,\n group,\n live ? \"\\u0000live\" : label,\n checked === null ? \"\" : \"\\u0000checkable\",\n ].join(\"\\u0000\"),\n checked,\n command: c,\n });\n });\n return out;\n };\n\n const getFiltered = (): Item[] => {\n const q = query.trim().toLowerCase();\n const items = buildItems();\n if (!q) return items;\n return items.filter(\n (it) =>\n it.label.toLowerCase().includes(q) ||\n (it.kind === \"route\" && it.route.path.toLowerCase().includes(q)),\n );\n };\n\n const runItem = async (it: Item) => {\n if (it.kind === \"route\") {\n navigate(it.route.path);\n setOpen(false);\n return;\n }\n try {\n await it.command.run();\n } finally {\n if (!it.command.keepOpen) setOpen(false);\n }\n };\n\n type Row = {\n item: Item;\n node: HTMLButtonElement;\n labelSpan: HTMLSpanElement;\n pathSpan: HTMLSpanElement | null;\n checkSpan: HTMLSpanElement | null;\n };\n\n // The rendered rows, parallel to the current filtered list. They are kept\n // around so hovering or arrowing only repaints the highlight: rebuilding the\n // rows would destroy the node under the pointer, and the browser then never\n // dispatches a `click` on it (mousedown/mouseup retarget to the parent).\n let rows: Row[] = [];\n // Signature of the item list the rows were built from; identical signature\n // means the existing nodes can be reused as-is.\n let rowsSig: string | null = null;\n\n // Identity of a row's *shape*. Values that can change between renders\n // without changing the shape — a function `label`'s text, a `checked`\n // state — are excluded on purpose: those are written onto the existing node\n // by `paintRow`, because rebuilding the row would destroy the node under\n // the pointer and swallow the click.\n const itemSig = (it: Item): string => it.sig;\n\n /** Write a row's live values (dynamic label, check mark) onto its node. */\n const paintRow = (row: Row) => {\n const it = row.item;\n if (row.labelSpan.textContent !== it.label)\n row.labelSpan.textContent = it.label;\n if (row.checkSpan && it.kind === \"command\") {\n const on = it.checked === true;\n row.checkSpan.textContent = on ? \"\\u2713\" : \"\";\n row.node.setAttribute(\"aria-checked\", String(on));\n }\n };\n\n // The highlight is an attribute, not an inline colour: that keeps it in the\n // stylesheet, where `classNames.rowActive` (or a rule of your own on\n // `.devdock-row[data-active]`) can take it over.\n const paintActive = () => {\n rows.forEach((row, idx) => {\n const isActive = idx === active;\n if (isActive) row.node.setAttribute(\"data-active\", \"\");\n else row.node.removeAttribute(\"data-active\");\n row.node.className = isActive ? cls(\"row\", \"rowActive\") : cls(\"row\");\n });\n };\n\n const setActive = (next: number, scroll = false) => {\n if (next === active || next < 0 || next >= rows.length) return;\n active = next;\n paintActive();\n // `scrollIntoView` is absent in jsdom, hence the optional call.\n if (scroll) rows[active]?.node.scrollIntoView?.({ block: \"nearest\" });\n };\n\n const renderList = () => {\n const filtered = getFiltered();\n active = Math.min(active, Math.max(0, filtered.length - 1));\n\n const sig = [classSig(), ...filtered.map(itemSig)].join(\"\\n\");\n if (sig === rowsSig) {\n // Same items in the same order: keep the nodes, refresh the highlight.\n // The items themselves are rebuilt on every call, so re-point each row\n // at its current one (its `run`/`route` may have been swapped by\n // `update()`).\n filtered.forEach((it, idx) => {\n const row = rows[idx];\n if (!row) return;\n row.item = it;\n paintRow(row);\n });\n paintActive();\n return;\n }\n rowsSig = sig;\n rows = [];\n list.replaceChildren();\n\n if (filtered.length === 0) {\n list.appendChild(\n el(\"div\", { className: cls(\"empty\"), textContent: \"Nothing here.\" }),\n );\n return;\n }\n\n const groups = new Map<string, Item[]>();\n for (const it of filtered) {\n const arr = groups.get(it.group) ?? [];\n arr.push(it);\n groups.set(it.group, arr);\n }\n\n for (const [groupName, groupItems] of groups) {\n const section = el(\"div\", { className: cls(\"section\") });\n section.appendChild(sectionHeading(groupName));\n\n for (const it of groupItems) {\n const idx = filtered.indexOf(it);\n const row = el(\"button\", { className: cls(\"row\") });\n row.type = \"button\";\n\n const labelSpan = el(\"span\", { className: cls(\"rowLabel\") });\n row.appendChild(labelSpan);\n\n let pathSpan: HTMLSpanElement | null = null;\n if (it.kind === \"route\" && it.route.path !== it.label) {\n pathSpan = el(\"span\", {\n className: cls(\"rowPath\"),\n textContent: it.route.path,\n });\n row.appendChild(pathSpan);\n }\n\n // A command with `checked` is a toggle, not a one-shot action: say so\n // to assistive tech, and keep the mark's box reserved either way so\n // the label doesn't shift when it flips.\n let checkSpan: HTMLSpanElement | null = null;\n if (it.kind === \"command\" && it.checked !== null) {\n row.setAttribute(\"role\", \"checkbox\");\n checkSpan = el(\"span\", { className: cls(\"check\") });\n row.appendChild(checkSpan);\n }\n\n const rec: Row = { item: it, node: row, labelSpan, pathSpan, checkSpan };\n rows[idx] = rec;\n paintRow(rec);\n\n row.addEventListener(\"mouseenter\", () => setActive(idx));\n row.addEventListener(\"click\", () => void runItem(rec.item));\n section.appendChild(row);\n }\n list.appendChild(section);\n }\n\n paintActive();\n };\n\n // ---- views -------------------------------------------------------------\n\n type MountedView = { host: HTMLElement; teardown?: () => void };\n\n // Views live only while the panel is open: `setOpen(true)` mounts them and\n // `setOpen(false)` runs their teardowns, which is what makes a rAF loop or\n // an event listener inside a view correct rather than a leak.\n const mountedViews = new Map<string, MountedView>();\n // Shape of the view list the current DOM was built from — keys, placement\n // and headings, but nothing a view renders itself. An `update()` that\n // leaves this unchanged is a no-op, so a view is never remounted (or even\n // reparented) just because the options object is new.\n let viewsSig: string | null = null;\n\n type KeyedView = { view: DevView; key: string };\n\n const viewOrder = (v: DevView): \"before\" | \"after\" =>\n v.order === \"after\" ? \"after\" : \"before\";\n\n const unmountViews = () => {\n for (const mv of mountedViews.values()) {\n mv.teardown?.();\n mv.host.remove();\n }\n mountedViews.clear();\n viewsBefore.replaceChildren();\n viewsAfter.replaceChildren();\n viewsSig = null;\n };\n\n const renderViews = () => {\n const keyed = keyViews(opts.views ?? []);\n const sig = [\n classSig(),\n ...keyed.map(({ view, key }) =>\n [key, viewOrder(view), view.group ?? \"\", view.label ?? \"\"].join(\n \"\\u0000\",\n ),\n ),\n ].join(\"\\n\");\n if (sig === viewsSig) return;\n viewsSig = sig;\n\n const live = new Set(keyed.map(({ key }) => key));\n for (const [key, mv] of mountedViews) {\n if (live.has(key)) continue;\n mv.teardown?.();\n mv.host.remove();\n mountedViews.delete(key);\n }\n\n viewsBefore.replaceChildren();\n viewsAfter.replaceChildren();\n\n // Hosts are appended first and mounted afterwards, so `mount` is handed a\n // host that is already connected to the document.\n const pending: (KeyedView & { host: HTMLElement })[] = [];\n\n for (const placement of [\"before\", \"after\"] as const) {\n const container = placement === \"before\" ? viewsBefore : viewsAfter;\n const here = keyed.filter(({ view }) => viewOrder(view) === placement);\n\n // One section per `group`, in first-appearance order; a view without a\n // group gets its own section headed by its `label`.\n const sections = new Map<\n string,\n { heading?: string; items: KeyedView[] }\n >();\n for (const entry of here) {\n const groupKey = entry.view.group ?? `\\u0000${entry.key}`;\n const section = sections.get(groupKey);\n if (section) section.items.push(entry);\n else\n sections.set(groupKey, {\n heading: entry.view.group ?? entry.view.label,\n items: [entry],\n });\n }\n\n for (const section of sections.values()) {\n const wrap = el(\"div\", { className: cls(\"section\") });\n if (section.heading) wrap.appendChild(sectionHeading(section.heading));\n for (const { view, key } of section.items) {\n if (view.group != null && view.label)\n wrap.appendChild(viewLabel(view.label));\n const existing = mountedViews.get(key);\n if (existing) {\n wrap.appendChild(existing.host);\n continue;\n }\n const viewHost = el(\"div\", { className: cls(\"view\") });\n viewHost.setAttribute(\"data-devdock-view\", view.id ?? \"\");\n wrap.appendChild(viewHost);\n pending.push({ view, key, host: viewHost });\n }\n container.appendChild(wrap);\n }\n }\n\n for (const { view, key, host: viewHost } of pending) {\n const mv: MountedView = { host: viewHost };\n mountedViews.set(key, mv);\n const teardown = view.mount(viewHost);\n if (typeof teardown === \"function\") mv.teardown = teardown;\n }\n };\n\n // ---- inherited styles --------------------------------------------------\n\n // What the current clones were made from, so an unrelated head mutation\n // doesn't re-clone every <link> (and make the browser re-fetch it).\n let clonesSig: string | null = null;\n\n /**\n * Copy the document's styles into the shadow root (`shadow: \"inherit\"`).\n * Constructed sheets come across by reference; `<style>` and\n * `<link rel=\"stylesheet\">` nodes are cloned, which re-reads the style's\n * text or re-fetches the link's href inside the shadow tree.\n */\n const syncStyles = () => {\n if (!styleSlot || !shadowRoot) return;\n\n const adopted = (\n document as Document & { adoptedStyleSheets?: readonly unknown[] }\n ).adoptedStyleSheets;\n if (Array.isArray(adopted)) {\n try {\n const sr = shadowRoot as ShadowRoot & {\n adoptedStyleSheets: unknown[];\n };\n sr.adoptedStyleSheets = [...adopted];\n } catch {\n // A sheet the document adopted but this root may not (cross-document).\n }\n }\n\n // `:not([data-devdock-styles])`: in light-DOM mode a dock puts its own\n // sheet in the document, and re-cloning it here would be noise.\n const sheets = [\n ...document.querySelectorAll(\n `style:not([${STYLE_MARKER}]), link[rel~=\"stylesheet\" i]`,\n ),\n ];\n const sig = sheets\n .map((n) => `${n.tagName}\\u0000${n.getAttribute(\"href\") ?? n.textContent}`)\n .join(\"\\n\");\n if (sig === clonesSig) return;\n clonesSig = sig;\n styleSlot.replaceChildren(...sheets.map((n) => n.cloneNode(true)));\n };\n\n // Bundlers inject and mutate <style> tags in `document.head` as you edit —\n // without watching, an HMR'd stylesheet would stop reaching the views.\n let styleObserver: MutationObserver | null = null;\n let syncQueued = false;\n const watchStyles = () => {\n if (\n !styleSlot ||\n styleObserver ||\n !document.head ||\n typeof MutationObserver === \"undefined\"\n )\n return;\n styleObserver = new MutationObserver(() => {\n if (syncQueued) return;\n syncQueued = true;\n // Coalesce a burst of injections into one re-clone.\n queueMicrotask(() => {\n syncQueued = false;\n syncStyles();\n });\n });\n styleObserver.observe(document.head, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n };\n const unwatchStyles = () => {\n styleObserver?.disconnect();\n styleObserver = null;\n };\n\n const renderShell = () => {\n const position = opts.position ?? \"bottom-right\";\n const zIndex = opts.zIndex ?? 2147483000;\n\n Object.assign(root.style, {\n position: \"fixed\",\n zIndex: String(zIndex),\n top: \"\",\n bottom: \"\",\n });\n Object.assign(root.style, cornerStyle(position));\n\n headingText.textContent = opts.title ?? \"Dev Menu\";\n panel.setAttribute(\"aria-label\", opts.title ?? \"Dev Menu\");\n Object.assign(panel.style, panelAnchor(position));\n\n buttonLabel.textContent = opts.label ?? \"DEV\";\n\n // An unguessable default is only as good as its hint: the heading shows\n // the chord while the panel is open, the tooltip while it is shut.\n const spec = hotkey();\n const chord = spec ? formatHotkey(spec) : \"\";\n hotkeyHint.textContent = chord;\n hotkeyHint.hidden = !chord;\n button.title = chord\n ? `${opts.title ?? \"Dev Menu\"} (${chord})`\n : (opts.title ?? \"Dev Menu\");\n // The open state is `aria-expanded`, which the stylesheet also paints —\n // see `BASE_CSS`.\n button.setAttribute(\"aria-expanded\", String(open));\n paintClasses();\n };\n\n function setOpen(next: boolean) {\n if (open === next) return;\n open = next;\n if (open) {\n query = \"\";\n input.value = \"\";\n active = 0;\n panel.isConnected || root.insertBefore(panel, button);\n renderShell();\n renderList();\n // The panel is connected, so views mount into a live document; styles\n // may have changed while it was closed.\n syncStyles();\n renderViews();\n requestAnimationFrame(() => input.focus());\n } else {\n // Teardown runs while the panel is still in the document, so a view can\n // read the DOM it is about to lose.\n unmountViews();\n if (panel.isConnected) panel.remove();\n }\n renderShell();\n }\n\n // ---- listeners --------------------------------------------------------\n\n input.addEventListener(\"input\", () => {\n query = input.value;\n active = 0;\n renderList();\n });\n\n panel.addEventListener(\"keydown\", (e) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n setOpen(false);\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActive(Math.min(active + 1, rows.length - 1), true);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive(Math.max(active - 1, 0), true);\n } else if (e.key === \"Enter\") {\n e.preventDefault();\n const it = rows[active]?.item;\n if (it) void runItem(it);\n }\n });\n\n button.addEventListener(\"click\", () => setOpen(!open));\n\n const onDocMouseDown = (e: MouseEvent) => {\n // composedPath() sees through the shadow boundary; a plain\n // `contains(e.target)` would miss clicks inside the shadow root.\n if (open && !e.composedPath().includes(root)) setOpen(false);\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const spec = hotkey();\n if (spec && matchHotkey(spec, e)) {\n e.preventDefault();\n setOpen(!open);\n }\n };\n\n const addListeners = () => {\n document.addEventListener(\"mousedown\", onDocMouseDown);\n window.addEventListener(\"keydown\", onKeyDown);\n };\n const removeListeners = () => {\n document.removeEventListener(\"mousedown\", onDocMouseDown);\n window.removeEventListener(\"keydown\", onKeyDown);\n };\n\n const mount = () => {\n if (mounted) return;\n // Light DOM: the sheet can't ride along inside the host, so it goes at the\n // very top of <head>, ahead of the page's own styles.\n if (!shadowRoot)\n (document.head ?? document.documentElement).prepend(baseStyle);\n (opts.container ?? document.body).appendChild(host);\n addListeners();\n syncStyles();\n watchStyles();\n mounted = true;\n };\n const unmount = () => {\n if (!mounted) return;\n removeListeners();\n unwatchStyles();\n if (!shadowRoot) baseStyle.remove();\n host.remove();\n mounted = false;\n };\n\n // ---- init -------------------------------------------------------------\n\n renderShell();\n if (enabled()) mount();\n\n return {\n update(next: DevDockOptions) {\n opts = { ...opts, ...next };\n if (enabled()) {\n mount();\n renderShell();\n if (open) {\n renderList();\n renderViews();\n }\n } else {\n setOpen(false);\n unmount();\n }\n },\n destroy() {\n setOpen(false);\n unmount();\n },\n };\n}\n","import { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { createDevDock, keyViews } from \"../core/dock\";\nimport type {\n DevDockInstance,\n DevDockOptions,\n DevView,\n} from \"../core/types\";\n\n/**\n * A custom panel rendered by React inside the dock's popup. Same contract as\n * the core's {@link DevView}, with `render` in place of `mount`: the component\n * is portaled into the dock, mounted when the popup opens and unmounted when\n * it closes.\n *\n * A view renders inside the dock's shadow root, which the document's\n * stylesheets don't cross — pass `shadow=\"inherit\"` (or `shadow={false}`) if\n * it uses your app's CSS.\n */\nexport interface DevDockView extends Omit<DevView, \"mount\"> {\n /** The view's content. Called on every render of the host `<DevDock>`. */\n render: () => ReactNode;\n}\n\nexport type DevDockProps = Omit<DevDockOptions, \"views\"> & {\n /** Custom panels rendered inside the popup. See {@link DevDockView}. */\n views?: DevDockView[];\n};\n\nconst NO_VIEWS: DevDockView[] = [];\n\n/**\n * React wrapper around the framework-agnostic core. The dock itself mounts\n * into `document.body` (or `container`) and is torn down on unmount; this\n * component renders only the portals for any `views` you pass, so with none it\n * renders nothing. Safe to leave mounted; it renders nothing in production.\n */\nexport function DevDock({ views = NO_VIEWS, ...options }: DevDockProps) {\n const instance = useRef<DevDockInstance | null>(null);\n // The host elements the core created for our views, keyed the same way it\n // keys them. React draws into these with a portal, which keeps the core free\n // of any React import.\n const [hosts, setHosts] = useState<ReadonlyMap<string, HTMLElement>>(\n () => new Map(),\n );\n // `destroy()` tears views down, which would otherwise ask an unmounting\n // component to set state.\n const alive = useRef(true);\n\n // Keyed exactly the way the core keys the host elements, so each portal\n // finds its own.\n const keyed = useMemo(() => keyViews(views), [views]);\n\n const coreViews = useMemo<DevView[]>(\n () =>\n keyed.map(({ key, view }) => ({\n id: key,\n label: view.label,\n group: view.group,\n order: view.order,\n mount: (host) => {\n setHosts((prev) => new Map(prev).set(key, host));\n return () => {\n if (!alive.current) return;\n setHosts((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n },\n })),\n [keyed],\n );\n\n // The core reconciles views by id and no-ops when their shape is unchanged,\n // so handing it a fresh array on every render costs nothing and never\n // remounts a view.\n const latest = useRef({ options, coreViews });\n latest.current = { options, coreViews };\n\n useEffect(() => {\n alive.current = true;\n const inst = createDevDock({\n ...latest.current.options,\n views: latest.current.coreViews,\n });\n instance.current = inst;\n return () => {\n alive.current = false;\n inst.destroy();\n instance.current = null;\n };\n }, []);\n\n useEffect(() => {\n instance.current?.update({ ...options, views: coreViews });\n });\n\n return (\n <>\n {keyed.map(({ key, view }) => {\n const host = hosts.get(key);\n return host ? createPortal(view.render(), host, key) : null;\n })}\n </>\n );\n}\n","import type { DevRoute } from \"./types\";\n\n/**\n * Restricts which auto-detected routes appear. A string is treated as a glob\n * where `*` matches any characters (e.g. `\"/dev/*\"`, `\"/admin/*\"`); or pass a\n * `RegExp` tested against the path, or a predicate for full control.\n */\nexport type RouteMatcher = string | RegExp | ((route: DevRoute) => boolean);\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`);\n}\n\n/** Normalize any {@link RouteMatcher} into a predicate. */\nexport function toPredicate(match: RouteMatcher): (route: DevRoute) => boolean {\n if (typeof match === \"function\") return match;\n const re = match instanceof RegExp ? match : globToRegExp(match);\n return (route) => re.test(route.path);\n}\n\nexport function isMatcher(value: object | RouteMatcher): value is RouteMatcher {\n return (\n typeof value === \"string\" ||\n typeof value === \"function\" ||\n value instanceof RegExp\n );\n}\n\n/**\n * Convention shared by every adapter: `/dev` and everything under it is a dev\n * destination, so a dev section needs no extra marker.\n */\nexport function isDevPath(path: string): boolean {\n return path === \"/dev\" || path.startsWith(\"/dev/\");\n}\n\n/** Drop later routes that repeat an earlier route's path. */\nexport function dedupeByPath(routes: DevRoute[]): DevRoute[] {\n const seen = new Set<string>();\n return routes.filter((r) =>\n seen.has(r.path) ? false : (seen.add(r.path), true),\n );\n}\n","import { useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useNavigate,\n // UNSAFE_DataRouterContext is the supported way to reach the active\n // router instance (and its full route tree) for data routers. Imported\n // from `react-router` (not `react-router-dom`) so this works on v6, v7\n // and v8 — v8 dropped the `react-router-dom` package entirely.\n UNSAFE_DataRouterContext as DataRouterContext,\n} from \"react-router\";\nimport { DevDock, type DevDockProps } from \"./DevDock\";\nimport type { DevRoute } from \"../core/types\";\nimport {\n dedupeByPath,\n isDevPath,\n isMatcher,\n toPredicate,\n type RouteMatcher,\n} from \"../core/match\";\n\nexport type { RouteMatcher };\n\n/** The `handle` fields the dock reads off a route. */\ninterface DevHandle {\n dev?: boolean;\n devLabel?: string;\n devGroup?: string;\n hidden?: boolean;\n /** Whatever else the app puts on `handle`; the dock ignores it. */\n [key: string]: unknown;\n}\n\n/** `handle` loader for one route property, as lazy route objects expose it. */\ntype LazyProperty<T> = () => Promise<T | undefined>;\n\n/** Minimal shape of a react-router route object we care about. */\ninterface RRRoute {\n path?: string;\n index?: boolean;\n children?: RRRoute[];\n handle?: DevHandle;\n /**\n * Set while the route's module is still unloaded. Two shapes exist: a\n * function resolving to the module, whose exports are the route's properties\n * (`lazy: () => import(\"./route\")`, v6.19+), and an object with one loader\n * per property (v7.5+, and what framework mode builds for every route).\n * `handle` rides along in both.\n */\n lazy?:\n LazyProperty<{ handle?: DevHandle }> | { handle?: LazyProperty<DevHandle> };\n}\n\n/** The slice of the data router the adapter uses, across v6/v7/v8. */\ninterface RRRouter {\n routes?: RRRoute[];\n subscribe?: (listener: () => void) => () => void;\n}\n\nfunction joinPath(parent: string, child: string): string {\n if (child.startsWith(\"/\")) return child;\n if (!child) return parent || \"/\";\n const base = parent.endsWith(\"/\") ? parent.slice(0, -1) : parent;\n return `${base}/${child}`;\n}\n\n/** Opt-in markers that make a route a dev destination. */\nfunction isDevMarked(handle: RRRoute[\"handle\"]): boolean {\n return (\n handle?.dev === true || handle?.devLabel != null || handle?.devGroup != null\n );\n}\n\nexport interface DetectOptions {\n /**\n * Only keep routes that match. A glob string (`*` = any characters), a\n * `RegExp`, or a predicate.\n */\n match?: RouteMatcher;\n /**\n * Also list the app's ordinary static routes, not just the dev ones.\n * Default: `false`.\n */\n staticRoutes?: boolean;\n /**\n * Import lazy route modules to read their `handle`.\n *\n * In framework mode (`app/routes.ts`) every route is lazy, so `handle` is\n * not on the route object the router exposes — it lives in the route module\n * and only reaches the route once that module loads, i.e. once you visit the\n * page. Without this, framework-mode routes are detected by the `/dev/*`\n * path convention alone and `handle.dev` / `devLabel` / `devGroup` /\n * `hidden` are silently ignored.\n *\n * Opt-in because reading a handle up front means importing the module up\n * front — dev only, but that is still every lazy route's module, and any\n * import side effects with it. Default: `false`.\n */\n loadHandles?: boolean;\n}\n\n/** State handed down to descendants of a dev-marked route. */\ninterface Inherited {\n dev: boolean;\n group?: string;\n}\n\n/**\n * Flatten a react-router route tree into navigable {@link DevRoute}s.\n *\n * Only dev destinations are returned: routes under `/dev`, routes marked with\n * `handle.dev`, `handle.devLabel` or `handle.devGroup`, and everything nested\n * under them. Pass `{ staticRoutes: true }` to list every static route instead.\n *\n * Dynamic (`:param`) and splat (`*`) segments are skipped since they can't be\n * navigated to without arguments. Mark a route with `handle.hidden` to exclude\n * it, or `handle.devLabel` to rename it.\n *\n * Reads `handle` straight off each route object, so a tree whose routes are\n * still lazy has no handles to read — see {@link DetectOptions.loadHandles}.\n */\nexport function flattenRoutes(\n routes: RRRoute[],\n parent = \"\",\n options: Pick<DetectOptions, \"staticRoutes\"> = {},\n): DevRoute[] {\n return walk(routes, parent, options.staticRoutes === true, { dev: false });\n}\n\nfunction walk(\n routes: RRRoute[],\n parent: string,\n staticRoutes: boolean,\n inherited: Inherited,\n): DevRoute[] {\n const out: DevRoute[] = [];\n for (const r of routes) {\n const full = r.index ? parent : joinPath(parent, r.path ?? \"\");\n // A dev route makes its whole subtree dev, so marking a section's layout\n // route is enough to surface the pages inside it. The `/dev` check reads\n // the joined path, which also catches flat routes like `dev/inspector`.\n const dev = inherited.dev || isDevMarked(r.handle) || isDevPath(full);\n const group = r.handle?.devGroup ?? inherited.group;\n const navigable =\n !r.index &&\n r.path != null &&\n !full.includes(\":\") &&\n !full.includes(\"*\") &&\n r.handle?.hidden !== true &&\n (dev || staticRoutes);\n if (navigable) {\n out.push({\n path: full || \"/\",\n label: r.handle?.devLabel ?? (full || \"/\"),\n group,\n });\n }\n if (r.children?.length)\n out.push(...walk(r.children, full, staticRoutes, { dev, group }));\n }\n return out;\n}\n\n// ---- lazy handles ---------------------------------------------------------\n\nconst NO_ROUTES: RRRoute[] = [];\nconst NO_HANDLES: ReadonlyMap<RRRoute, DevHandle> = new Map();\n\n/** The route's `handle` loader, whichever `lazy` shape it uses. */\nfunction lazyHandleOf(route: RRRoute): LazyProperty<DevHandle> | undefined {\n const lazy = route.lazy;\n if (typeof lazy === \"function\") return async () => (await lazy())?.handle;\n return typeof lazy?.handle === \"function\" ? lazy.handle : undefined;\n}\n\nasync function readLazyHandle(route: RRRoute): Promise<DevHandle | undefined> {\n try {\n return await lazyHandleOf(route)?.();\n } catch {\n // A route module that won't load is the app's problem, not the dock's.\n // Fall back to listing the route by path.\n return undefined;\n }\n}\n\nfunction collectLazy(routes: RRRoute[], out: RRRoute[] = []): RRRoute[] {\n for (const r of routes) {\n // A `handle` already on the route is the router's own resolved value.\n if (r.handle == null && lazyHandleOf(r) != null) out.push(r);\n if (r.children?.length) collectLazy(r.children, out);\n }\n return out;\n}\n\n/**\n * Everything the dock reads out of the route tree, as a comparable string.\n *\n * Neither the tree's identity nor its contents are a reliable change signal on\n * their own: the router resolves `lazy` by mutating route objects in place, and\n * patches discovered branches into the arrays it already handed out. Only some\n * versions swap the top-level array. So compare what we actually read.\n */\nfunction signature(routes: RRRoute[], out: string[] = []): string[] {\n for (const r of routes) {\n const h = r.handle;\n out.push(\n `${r.path ?? \"\"}|${r.index ? 1 : 0}|${h?.dev}|${h?.devLabel}` +\n `|${h?.devGroup}|${h?.hidden}|${lazyHandleOf(r) ? 1 : 0}`,\n );\n if (r.children?.length) signature(r.children, out);\n }\n return out;\n}\n\n/**\n * The router's route tree, plus a signature that changes whenever the tree\n * does. Routes arrive late in framework mode — `lazy` modules resolve on\n * navigation and lazy route discovery patches whole branches in as links\n * render — and both land as a router state update.\n */\nfunction useRouteTree(router: RRRouter | undefined): [RRRoute[], string] {\n const routes = router?.routes ?? NO_ROUTES;\n const [sig, setSig] = useState(() => signature(routes).join(\"\\n\"));\n useEffect(() => {\n if (!router?.subscribe) return;\n const check = () => {\n const next = signature(router.routes ?? NO_ROUTES).join(\"\\n\");\n setSig((prev) => (prev === next ? prev : next));\n };\n // The tree can have moved between render and effect.\n check();\n return router.subscribe(check);\n }, [router]);\n return [routes, sig];\n}\n\n/** Handles read out of lazy route modules, keyed by route object. */\nfunction useLazyHandles(\n routes: RRRoute[],\n sig: string,\n enabled: boolean,\n): ReadonlyMap<RRRoute, DevHandle> {\n const [handles, setHandles] = useState(NO_HANDLES);\n // Promises, not values, and keyed by the route objects the router reuses: a\n // module is imported once no matter how often the effect re-runs, and an\n // effect that was cleaned up mid-flight (StrictMode's double invoke) can\n // re-await the same work instead of dropping it.\n const started = useRef(\n new WeakMap<RRRoute, Promise<DevHandle | undefined>>(),\n );\n useEffect(() => {\n if (!enabled) return;\n const targets = collectLazy(routes);\n if (targets.length === 0) return;\n let cancelled = false;\n void Promise.all(\n targets.map((route) => {\n let pending = started.current.get(route);\n if (!pending) {\n pending = readLazyHandle(route);\n started.current.set(route, pending);\n }\n return pending.then((handle) => [route, handle] as const);\n }),\n ).then((resolved) => {\n if (cancelled) return;\n const found = resolved.filter(\n (entry): entry is [RRRoute, DevHandle] => entry[1] != null,\n );\n setHandles((prev) =>\n found.some(([route, handle]) => prev.get(route) !== handle)\n ? new Map([...prev, ...found])\n : prev,\n );\n });\n return () => {\n cancelled = true;\n };\n }, [routes, sig, enabled]);\n return handles;\n}\n\n/**\n * The tree with lazily-read handles filled in. A copy rather than a mutation:\n * assigning `route.handle` ourselves makes the router warn about a \"static\n * property\" and skip its own resolution of the lazy one.\n */\nfunction mergeHandles(\n routes: RRRoute[],\n handles: ReadonlyMap<RRRoute, DevHandle>,\n): RRRoute[] {\n let changed = false;\n const merged = routes.map((r) => {\n const handle = r.handle ?? handles.get(r);\n const children = r.children\n ? mergeHandles(r.children, handles)\n : r.children;\n if (handle === r.handle && children === r.children) return r;\n changed = true;\n return { ...r, handle, children };\n });\n return changed ? merged : routes;\n}\n\n/**\n * Read the dev routes off the active react-router data router — anything under\n * `/dev` or marked with `handle.dev` / `devLabel` / `devGroup`, plus their\n * children.\n * Pass `{ staticRoutes: true }` to include the app's ordinary routes too,\n * `{ match }` to scope the results, and `{ loadHandles: true }` to read\n * `handle` from routes whose module hasn't loaded yet (framework mode). A bare\n * matcher is accepted as shorthand.\n *\n * Re-reads the tree as the router grows it, so routes that are discovered or\n * resolved after the first render show up on their own.\n */\nexport function useDetectedRoutes(\n options: DetectOptions | RouteMatcher = {},\n): DevRoute[] {\n const opts: DetectOptions = isMatcher(options) ? { match: options } : options;\n const { match, staticRoutes, loadHandles } = opts;\n const ctx = useContext(DataRouterContext);\n const [routes, sig] = useRouteTree(ctx?.router as RRRouter | undefined);\n const handles = useLazyHandles(routes, sig, loadHandles === true);\n // `sig` is a dep because the tree is mutated in place (see useRouteTree).\n return useMemo(() => {\n const tree = handles.size > 0 ? mergeHandles(routes, handles) : routes;\n const deduped = dedupeByPath(flattenRoutes(tree, \"\", { staticRoutes }));\n return match ? deduped.filter(toPredicate(match)) : deduped;\n }, [routes, sig, handles, match, staticRoutes]);\n}\n\nexport interface ReactRouterDevDockProps extends DevDockProps {\n /**\n * Only auto-detect routes that match. A glob string (`*` = any characters,\n * e.g. `\"/dev/*\"`), a `RegExp`, or a predicate. Manual `routes` are always\n * included regardless of this filter.\n */\n match?: RouteMatcher;\n /**\n * List the app's ordinary static routes alongside the dev ones.\n * Off by default, so the dock only shows what you opted in.\n */\n staticRoutes?: boolean;\n /**\n * Import lazy route modules so their `handle` is visible. Needed for\n * `handle.dev` / `devLabel` / `devGroup` / `hidden` in React Router\n * framework mode. See {@link DetectOptions.loadHandles}.\n */\n loadHandles?: boolean;\n}\n\n/**\n * Drop-in {@link DevDock} for react-router apps: navigates via the SPA router\n * and auto-detects the dev routes from the active data router. Any `routes`\n * you pass are appended to the detected ones.\n */\nexport function ReactRouterDevDock({\n match,\n staticRoutes,\n loadHandles,\n ...props\n}: ReactRouterDevDockProps) {\n const navigate = useNavigate();\n const detected = useDetectedRoutes({ match, staticRoutes, loadHandles });\n const routes = useMemo(\n () => [...detected, ...(props.routes ?? [])],\n [detected, props.routes],\n );\n return (\n <DevDock\n {...props}\n routes={routes}\n onNavigate={props.onNavigate ?? ((path) => navigate(path))}\n />\n );\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { DevDockProps } from './react.cjs';
3
- import { d as DevRoute } from './types-B8WgSe7o.cjs';
4
- import { R as RouteMatcher } from './match-Dw1CSS0G.cjs';
3
+ import { d as DevRoute } from './types-D9BBBI7v.cjs';
4
+ import { R as RouteMatcher } from './match-zABwk1Ai.cjs';
5
5
  import 'cn';
6
6
 
7
7
  /** The `handle` fields the dock reads off a route. */
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import { DevDockProps } from './react.js';
3
- import { d as DevRoute } from './types-B8WgSe7o.js';
4
- import { R as RouteMatcher } from './match-C8MsaP6h.js';
3
+ import { d as DevRoute } from './types-D9BBBI7v.js';
4
+ import { R as RouteMatcher } from './match-gTnXtOUP.js';
5
5
  import 'cn';
6
6
 
7
7
  /** The `handle` fields the dock reads off a route. */
@@ -1,6 +1,6 @@
1
- import { DevDock } from './chunk-2IQRWZ7T.js';
1
+ import { DevDock } from './chunk-RO4CY6GJ.js';
2
2
  import { isDevPath, isMatcher, dedupeByPath, toPredicate } from './chunk-NRBOZ6H5.js';
3
- import './chunk-2YX4DI2D.js';
3
+ import './chunk-V47DEXPS.js';
4
4
  import { useContext, useMemo, useState, useEffect, useRef } from 'react';
5
5
  import { UNSAFE_DataRouterContext, useNavigate } from 'react-router';
6
6
  import { jsx } from 'react/jsx-runtime';