@kb-labs/studio-hooks 2.119.0-canary.e120bc0ee → 2.119.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/page-context.tsx","../src/use-page.ts","../src/use-event-bus.ts","../src/use-data.ts","../src/use-sse.ts","../src/use-elapsed-timer.ts","../src/use-infinite-data.ts","../src/use-websocket.ts","../src/use-permissions.ts","../src/use-navigation.ts","../src/use-notification.ts","../src/use-theme.ts","../src/theme-adapter.ts"],"names":["useRef","useCallback","useEffect","useState","defaultParse","proto"],"mappings":";;;;;;;;;;AAgBA,IAAM,OAAA,GAAU,cAAkC,IAAI,CAAA;AAO/C,SAAS,mBAAA,CAAoB,EAAE,QAAA,EAAU,KAAA,EAAM,EAA6B;AACjF,EAAA,uBAAO,GAAA,CAAC,OAAA,CAAQ,QAAA,EAAR,EAAiB,OAAe,QAAA,EAAS,CAAA;AACnD;AAEO,SAAS,cAAA,GAA8B;AAC5C,EAAA,MAAM,GAAA,GAAM,WAAW,OAAO,CAAA;AAC9B,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,qFAAqF,CAAA;AAAA,EACvG;AACA,EAAA,OAAO,GAAA;AACT;;;ACvBO,SAAS,OAAA,GAAuB;AACrC,EAAA,OAAO,cAAA,EAAe;AACxB;ACSO,SAAS,WAAA,GAAiC;AAC/C,EAAA,MAAM,MAAM,kBAAA,EAAmB;AAC/B,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,cAAA,EAAe;AAC5C,EAAA,MAAM,MAAA,GAAS,MAAA,CAA0B,EAAE,CAAA;AAG3C,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,OAAA,EAAS;AAClC,QAAA,KAAA,EAAM;AAAA,MACR;AACA,MAAA,MAAA,CAAO,UAAU,EAAC;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACd,CAAc,OAAe,OAAA,KAAe;AAC1C,MAAA,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,MAAM,CAAA;AAAA,IAC9C,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,QAAA,EAAU,MAAM;AAAA,GACxB;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAc,OAAe,OAAA,KAA6B;AACxD,MAAA,MAAM,QAAQ,GAAA,CAAI,SAAA,CAAU,KAAA,EAAO,OAAA,EAAS,UAAU,MAAM,CAAA;AAC5D,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,KAAK,CAAA;AACzB,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,QAAA,EAAU,MAAM;AAAA,GACxB;AAEA,EAAA,OAAO,EAAE,SAAS,SAAA,EAAU;AAC9B;ACjBO,SAAS,OAAA,CACd,UACA,OAAA,EACkB;AAClB,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,EAAU,OAAA,EAAS,MAAM,CAAA;AAE9C,EAAA,MAAM,QAAQ,QAAA,CAA4B;AAAA,IACxC,QAAA,EAAU,CAAC,aAAA,EAAe,GAAG,CAAA;AAAA,IAC7B,OAAA,EAAS,MAAM,SAAA,CAAU,GAAG,CAAA;AAAA,IAC5B,SAAS,OAAA,EAAS,OAAA;AAAA,IAClB,WAAW,OAAA,EAAS,SAAA;AAAA,IACpB,eAAA,EAAiB,SAAS,SAAA,IAAa,MAAA;AAAA,IACvC,QAAQ,OAAA,EAAS;AAAA,GAClB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,YAAY,KAAA,CAAM;AAAA,GACpB;AACF;AAoCO,SAAS,aAAA,CACd,QAAA,EACA,eAAA,GAAmF,MAAA,EAC7C;AACtC,EAAA,MAAM,OAAO,OAAO,eAAA,KAAoB,WACpC,EAAE,MAAA,EAAQ,iBAAgB,GAC1B,eAAA;AACJ,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,MAAA;AAC9B,EAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AAErB,EAAA,MAAM,WAAW,WAAA,CAAoC;AAAA,IACnD,UAAA,EAAY,OAAO,KAAA,KAAkB;AACnC,MAAA,MAAM,MAAM,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,CAAS,KAAK,CAAA,GAAI,QAAA;AAC/D,MAAA,MAAM,OAAA,GAAU,OAAA,GAAU,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA;AAC3C,MAAA,MAAM,OAAA,GAAU,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA;AACrD,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,EAAI;AAAA,QACrD,MAAA;AAAA,QACA,SAAS,OAAA,GAAU,EAAE,cAAA,EAAgB,kBAAA,KAAuB,EAAC;AAAA,QAC7D,IAAA,EAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,GAAI;AAAA,OAC3C,CAAA;AACD,MAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,SAAA,EAAY,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,MAC5E;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAE5B,MAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,YAAY,IAAA,IAAQ,IAAA,IAAQ,UAAU,IAAA,EAAM;AACtE,QAAA,OAAO,IAAA,CAAK,IAAA;AAAA,MACd;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,GACD,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAQ,QAAA,CAAS,MAAA;AAAA,IACjB,aAAa,QAAA,CAAS,WAAA;AAAA,IACtB,WAAW,QAAA,CAAS,SAAA;AAAA,IACpB,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,MAAM,QAAA,CAAS;AAAA,GACjB;AACF;AAQA,SAAS,YAAA,GAAuB;AAC9B,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,GAAA,GAAO,OAA8C,sBAAsB,CAAA;AACjF,IAAA,MAAM,OAAO,GAAA,EAAK,eAAA;AAClB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI;AAAE,QAAA,OAAO,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA;AAAA,MAAQ,CAAA,CAAA,MAAQ;AAAA,MAAqB;AAAA,IAClE;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,QAAA,CACP,UACA,MAAA,EACQ;AACR,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AAAE,IAAA,OAAO,QAAA;AAAA,EAAU;AACpE,EAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACrC;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAC3C,EAAA,OAAO,GAAG,QAAQ,CAAA,EAAG,GAAG,CAAA,EAAG,YAAA,CAAa,UAAU,CAAA,CAAA;AACpD;AAEA,eAAe,UAAU,QAAA,EAAoC;AAC3D,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAE,CAAA;AAC1D,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,QAAQ,CAAA,SAAA,EAAY,IAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAE5B,EAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,YAAY,IAAA,IAAQ,IAAA,IAAQ,UAAU,IAAA,EAAM;AACtE,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AACA,EAAA,OAAO,IAAA;AACT;ACnGO,SAAS,MAAA,CACd,QAAA,EACA,OAAA,GAA4B,EAAC,EACZ;AACjB,EAAA,MAAM;AAAA,IACJ,QAAQ,UAAA,GAAa,SAAA;AAAA,IACrB,SAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA,GAAU,IAAA;AAAA,IACV,SAAA,GAAY,KAAA;AAAA,IACZ,aAAA,GAAgB,CAAA;AAAA,IAChB,mBAAA,GAAsB,GAAA;AAAA,IACtB,SAAA,GAAY,CAAA;AAAA,IACZ,KAAA,GAAQ,YAAA;AAAA,IACR,MAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,CAAc,EAAE,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAwB,MAAS,CAAA;AAC7D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAA8B,QAAQ,CAAA;AACtF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,CAAC,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAQA,OAA2B,IAAI,CAAA;AAC7C,EAAA,MAAM,cAAA,GAAiBA,OAA6C,IAAI,CAAA;AACxE,EAAA,MAAM,YAAA,GAAeA,OAAO,KAAK,CAAA;AACjC,EAAA,MAAM,gBAAA,GAAmBA,OAAO,KAAK,CAAA;AAGrC,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,SAAA,GAAYA,OAAO,MAAM,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,SAAA,GAAYA,OAAO,MAAM,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAWA,OAAO,KAAK,CAAA;AAC7B,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAGnB,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACvC,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,SAAA,CAAU,cAAc,CAAA;AAEvD,EAAA,MAAM,KAAA,GAAQC,YAAY,MAAM;AAC9B,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,IAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,MAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AACnC,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,IAC3B;AACA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,KAAA,CAAM,QAAQ,KAAA,EAAM;AACpB,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,IAClB;AACA,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,mBAAA,CAAoB,QAAQ,CAAA;AAC5B,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,SAAA,CAAU,MAAS,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAA,IAAY,CAAC,OAAA,EAAS;AAEzB,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,KAAA,CAAM,QAAQ,KAAA,EAAM;AACpB,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,MAClB;AACA,MAAA,cAAA,CAAe,KAAK,CAAA;AACpB,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,IAAA,gBAAA,CAAiB,OAAA,GAAU,KAAA;AAC3B,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,SAAA,CAAU,MAAS,CAAA;AACnB,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,cAAA,CAAe,KAAK,CAAA;AACpB,IAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,IAAA,mBAAA,CAAoB,YAAY,CAAA;AAEhC,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,SAAS,OAAA,GAAU;AACjB,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,QAAA,EAAW,MAAM,CAAA;AACzC,MAAA,MAAM,EAAA,GAAK,IAAI,WAAA,CAAY,GAAG,CAAA;AAC9B,MAAA,KAAA,CAAM,OAAA,GAAU,EAAA;AAEhB,MAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA,GAAa,CAAC,UAAU,CAAA;AAElE,MAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAoB;AACzC,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AACtC,UAAA,SAAA,CAAU,MAAM,CAAA;AAChB,UAAA,QAAA,CAAS,CAAC,IAAA,KAAS;AACjB,YAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAA,EAAM,MAAM,CAAA;AAC7B,YAAA,OAAO,SAAA,GAAY,KAAK,IAAA,CAAK,MAAA,GAAS,YAAY,IAAA,CAAK,KAAA,CAAM,CAAC,SAAS,CAAA,GAAI,IAAA;AAAA,UAC7E,CAAC,CAAA;AACD,UAAA,UAAA,CAAW,UAAU,MAAM,CAAA;AAAA,QAC7B,SAAS,GAAA,EAAK;AACZ,UAAA,MAAM,aAAa,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,MAAM,gCAAgC,CAAA;AAC1F,UAAA,QAAA,CAAS,UAAU,CAAA;AACnB,UAAA,UAAA,CAAW,UAAU,UAAU,CAAA;AAAA,QACjC;AAAA,MACF,CAAA;AAEA,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,EAAA,CAAG,gBAAA,CAAiB,MAAM,aAA8B,CAAA;AAAA,MAC1D;AAGA,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,GAAI,kBAAkB,EAAC;AAAA,QACvB,GAAI,SAAA,GAAY,CAAC,SAAS,IAAI;AAAC,OACjC;AACA,MAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,QAAA,EAAA,CAAG,gBAAA,CAAiB,MAAM,MAAM;AAC9B,UAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,UAAA,EAAA,CAAG,KAAA,EAAM;AACT,UAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,UAAA,cAAA,CAAe,KAAK,CAAA;AACpB,UAAA,mBAAA,CAAoB,QAAQ,CAAA;AAC5B,UAAA,cAAA,CAAe,IAAI,CAAA;AACnB,UAAA,SAAA,CAAU,OAAA,IAAU;AAAA,QACtB,CAAC,CAAA;AAAA,MACH;AAIA,MAAA,EAAA,CAAG,SAAS,MAAM;AAChB,QAAA,OAAA,GAAU,CAAA;AACV,QAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA,mBAAA,CAAoB,MAAM,CAAA;AAC1B,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,SAAA,CAAU,OAAA,IAAU;AAAA,MACtB,CAAA;AAEA,MAAA,EAAA,CAAG,UAAU,MAAM;AACjB,QAAA,EAAA,CAAG,KAAA,EAAM;AACT,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,QAAA,cAAA,CAAe,KAAK,CAAA;AAGpB,QAAA,IAAI,YAAA,CAAa,OAAA,IAAW,gBAAA,CAAiB,OAAA,EAAS;AACpD,UAAA,mBAAA,CAAoB,QAAQ,CAAA;AAC5B,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,SAAA,GAAY,IAAI,KAAA,CAAM,qBAAqB,CAAA;AACjD,QAAA,QAAA,CAAS,SAAS,CAAA;AAClB,QAAA,UAAA,CAAW,UAAU,SAAS,CAAA;AAE9B,QAAA,IAAI,SAAA,IAAa,UAAU,aAAA,EAAe;AACxC,UAAA,OAAA,EAAA;AACA,UAAA,iBAAA,CAAkB,OAAO,CAAA;AACzB,UAAA,mBAAA,CAAoB,cAAc,CAAA;AAClC,UAAA,MAAM,QAAQ,mBAAA,GAAsB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAC,CAAA;AAC3D,UAAA,cAAA,CAAe,OAAA,GAAU,UAAA,CAAW,OAAA,EAAS,KAAK,CAAA;AAAA,QACpD,CAAA,MAAO;AACL,UAAA,mBAAA,CAAoB,QAAQ,CAAA;AAAA,QAC9B;AAAA,MACF,CAAA;AAAA,IACF;AAEA,IAAA,OAAA,EAAQ;AAER,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,QAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AACnC,QAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,MAC3B;AACA,MAAA,IAAI,MAAM,OAAA,EAAS;AACjB,QAAA,KAAA,CAAM,QAAQ,KAAA,EAAM;AACpB,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,aAAA,EAAe,mBAAA,EAAqB,SAAA,EAAW,aAAA,EAAe,SAAA,EAAW,iBAAiB,CAAC,CAAA;AAExI,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,kBAAkB,WAAA,EAAa,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,cAAA,EAAe;AAClH;AAIA,SAAS,aAAgB,GAAA,EAAgB;AACvC,EAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB;AAEA,SAAS,WAAA,CACP,UACA,MAAA,EACQ;AACR,EAAA,MAAM,OAAO,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,GAAI,QAAA,GAAW,OAAO,QAAQ,CAAA,CAAA;AACrE,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,WAAW,CAAA,EAAG;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAC/B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,MAAA,EAAA,CAAG,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IAC3B;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AACvC,EAAA,OAAO,GAAG,IAAI,CAAA,EAAG,GAAG,CAAA,EAAG,EAAA,CAAG,UAAU,CAAA,CAAA;AACtC;AChSO,SAAS,gBAAgB,SAAA,EAA8C;AAC5E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,QAAAA;AAAA,IAAwB,MACpD,SAAA,GAAY,aAAA,CAAc,SAAS,CAAA,GAAI;AAAA,GACzC;AAEA,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,aAAA,CAAc,SAAS,CAAC,CAAA;AAEnC,IAAA,MAAM,EAAA,GAAK,YAAY,MAAM;AAC3B,MAAA,UAAA,CAAW,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA,IACrC,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM,cAAc,EAAE,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,cAAc,SAAA,EAA2B;AAChD,EAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI,GAAI,IAAI,IAAA,CAAK,SAAS,EAAE,OAAA,EAAQ;AACpD,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAC,CAAA;AAElD,EAAA,IAAI,WAAW,EAAA,EAAI;AACjB,IAAA,OAAO,GAAG,QAAQ,CAAA,CAAA,CAAA;AAAA,EACpB;AACA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,EAAE,CAAA;AACzC,EAAA,IAAI,WAAW,EAAA,EAAI;AACjB,IAAA,MAAM,OAAO,QAAA,GAAW,EAAA;AACxB,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,EACzD;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,EAAE,CAAA;AACtC,EAAA,MAAM,OAAO,QAAA,GAAW,EAAA;AACxB,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,IAAA,CAAK,UAAS,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,CAAA;AACtD;ACsBO,SAAS,eAAA,CACd,UACA,OAAA,EAC0B;AAC1B,EAAA,MAAM;AAAA,IACJ,aAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA,GAAc,QAAA;AAAA,IACd;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAQ,gBAAA,CAAyE;AAAA,IACrF,QAAA,EAAU,CAAC,iBAAA,EAAmB,QAAA,EAAU,MAAM,CAAA;AAAA,IAC9C,OAAA,EAAS,OAAO,EAAE,SAAA,EAAU,KAAM;AAChC,MAAA,MAAM,GAAA,GAAM,gBAAA,CAAiB,QAAA,EAAU,MAAA,EAAQ,aAAa,SAAS,CAAA;AACrE,MAAA,OAAO,UAAa,GAAG,CAAA;AAAA,IACzB,CAAA;AAAA,IACA,gBAAA,EAAkB,aAAA;AAAA,IAClB,gBAAA,EAAkB,aAAA;AAAA,IAClB,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,EAAC;AACpC,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,CAAC,IAAI,CAAE,CAAA;AAE9E,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,IAAA,EAAM,QAAA;AAAA,IACN,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,YAAY,KAAA,CAAM,UAAA;AAAA,IAClB,oBAAoB,KAAA,CAAM,kBAAA;AAAA,IAC1B,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,SAAS,KAAA,CAAM;AAAA,GACjB;AACF;AAIA,SAAS,gBAAA,CACP,QAAA,EACA,MAAA,EACA,WAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,EAAA,GAAK,IAAI,eAAA,EAAgB;AAE/B,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,QAAA,EAAA,CAAG,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,KAAW,MAAA,IAAa,MAAA,KAAW,IAAA,EAAM;AAC3C,IAAA,EAAA,CAAG,GAAA,CAAI,WAAA,EAAa,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,EAAA,GAAK,GAAG,QAAA,EAAS;AACvB,EAAA,MAAM,OAAO,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,GAAI,QAAA,GAAW,OAAO,QAAQ,CAAA,CAAA;AACrE,EAAA,OAAO,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,IAAA;AAChC;AAEA,eAAe,UAAa,GAAA,EAAyB;AACnD,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAG,CAAA;AAC3B,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,IAAA,EAAO,GAAG,CAAA,SAAA,EAAY,IAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,EACtE;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAE5B,EAAA,IAAI,QAAQ,OAAO,IAAA,KAAS,YAAY,IAAA,IAAQ,IAAA,IAAQ,UAAU,IAAA,EAAM;AACtE,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AACA,EAAA,OAAO,IAAA;AACT;AClEO,SAAS,YAAA,CACd,GAAA,EACA,OAAA,GAAyC,EAAC,EACL;AACrC,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,IAAA;AAAA,IACV,SAAA,GAAY,KAAA;AAAA,IACZ,aAAA,GAAgB,CAAA;AAAA,IAChB,mBAAA,GAAsB,GAAA;AAAA,IACtB,SAAA;AAAA,IACA,KAAA,GAAQE,aAAAA;AAAA,IACR,SAAA,GAAY,gBAAA;AAAA,IACZ,WAAA,GAAc,GAAA;AAAA,IACd,SAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAID,QAAAA,CAAqB,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAA+B,MAAS,CAAA;AACpE,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAA0B,cAAc,CAAA;AACpE,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAuB,IAAI,CAAA;AACrD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,CAAC,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAQH,OAAyB,IAAI,CAAA;AAC3C,EAAA,MAAM,cAAA,GAAiBA,OAA6C,IAAI,CAAA;AACxE,EAAA,MAAM,YAAA,GAAeA,OAAO,KAAK,CAAA;AAGjC,EAAA,MAAM,YAAA,GAAeA,OAAO,SAAS,CAAA;AACrC,EAAA,MAAM,SAAA,GAAYA,OAAO,MAAM,CAAA;AAC/B,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,UAAA,GAAaA,OAAO,OAAO,CAAA;AACjC,EAAA,MAAM,QAAA,GAAWA,OAAO,KAAK,CAAA;AAC7B,EAAA,MAAM,YAAA,GAAeA,OAAO,SAAS,CAAA;AACrC,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AACvB,EAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,EAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAEvB,EAAA,MAAM,OAAA,GAAUC,YAAY,MAAM;AAChC,IAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,MAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AACnC,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,IAC3B;AACA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,KAAA,CAAM,QAAQ,KAAA,EAAM;AACpB,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,YAAY,MAAM;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AAAE,MAAA;AAAA,IAAQ;AAEpB,IAAA,OAAA,EAAQ;AACR,IAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,IAAA,SAAA,CAAU,YAAY,CAAA;AACtB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,SAAS,IAAA,GAAO;AACd,MAAA,MAAM,WAAA,GAAc,aAAa,GAAI,CAAA;AACrC,MAAA,MAAM,EAAA,GAAK,YAAY,IAAI,SAAA,CAAU,aAAa,SAAS,CAAA,GAAI,IAAI,SAAA,CAAU,WAAW,CAAA;AACxF,MAAA,KAAA,CAAM,OAAA,GAAU,EAAA;AAEhB,MAAA,EAAA,CAAG,MAAA,GAAS,CAAC,CAAA,KAAM;AACjB,QAAA,OAAA,GAAU,CAAA;AACV,QAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,QAAA,SAAA,CAAU,WAAW,CAAA;AACrB,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,MACvB,CAAA;AAEA,MAAA,EAAA,CAAG,SAAA,GAAY,CAAC,CAAA,KAAoB;AAClC,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,CAAQ,CAAA,CAAE,IAAc,CAAA;AAC9C,UAAA,SAAA,CAAU,IAAI,CAAA;AACd,UAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,YAAA,MAAM,IAAA,GAAO,CAAC,GAAG,IAAA,EAAM,IAAI,CAAA;AAC3B,YAAA,OAAO,WAAA,GAAc,KAAK,IAAA,CAAK,MAAA,GAAS,cAAc,IAAA,CAAK,KAAA,CAAM,CAAC,WAAW,CAAA,GAAI,IAAA;AAAA,UACnF,CAAC,CAAA;AACD,UAAA,YAAA,CAAa,UAAU,IAAI,CAAA;AAAA,QAC7B,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAA;AAEA,MAAA,EAAA,CAAG,OAAA,GAAU,CAAC,CAAA,KAAM;AAClB,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,QAAA,SAAA,CAAU,cAAc,CAAA;AACxB,QAAA,UAAA,CAAW,UAAU,CAAC,CAAA;AAEtB,QAAA,IAAI,aAAa,OAAA,EAAS;AAAE,UAAA;AAAA,QAAQ;AAGpC,QAAA,IAAI,SAAA,IAAa,OAAA,GAAU,aAAA,IAAiB,CAAA,CAAE,SAAS,GAAA,EAAM;AAC3D,UAAA,OAAA,EAAA;AACA,UAAA,iBAAA,CAAkB,OAAO,CAAA;AACzB,UAAA,MAAM,QAAQ,mBAAA,GAAsB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAC,CAAA;AAC3D,UAAA,cAAA,CAAe,OAAA,GAAU,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA;AAAA,QACjD;AAAA,MACF,CAAA;AAEA,MAAA,EAAA,CAAG,OAAA,GAAU,CAAC,CAAA,KAAM;AAClB,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,QAAA,CAAS,CAAC,CAAA;AACV,QAAA,UAAA,CAAW,UAAU,CAAC,CAAA;AAAA,MACxB,CAAA;AAAA,IACF;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA,EAAG,CAAC,GAAA,EAAK,SAAA,EAAW,WAAW,aAAA,EAAe,mBAAA,EAAqB,WAAA,EAAa,OAAO,CAAC,CAAA;AAExF,EAAA,MAAM,UAAA,GAAaA,WAAAA,CAAY,CAAC,IAAA,EAAe,MAAA,KAAoB;AACjE,IAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,IAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,MAAA,YAAA,CAAa,eAAe,OAAO,CAAA;AACnC,MAAA,cAAA,CAAe,OAAA,GAAU,IAAA;AAAA,IAC3B;AACA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAA,EAAM,MAAM,CAAA;AAChC,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,IAClB;AACA,IAAA,SAAA,CAAU,cAAc,CAAA;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,WAAAA,CAAY,CAAC,IAAA,KAAgB;AACxC,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAChD,MAAA,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IAC/C;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAY,CAAC,IAAA,KAA0C;AACrE,IAAA,IAAI,KAAA,CAAM,OAAA,EAAS,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAChD,MAAA,KAAA,CAAM,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,SAAA,CAAU,MAAS,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,OAAA,EAAS;AACpB,MAAA,OAAA,EAAQ;AACR,MAAA,SAAA,CAAU,cAAc,CAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,SAAA,CAAU,MAAS,CAAA;AACnB,IAAA,SAAA,EAAU;AAEV,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,GAAA,EAAK,OAAO,CAAC,CAAA;AAEjB,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAa,MAAA,KAAW,WAAA;AAAA,IACxB,KAAA;AAAA,IACA,OAAA,EAAS,SAAA;AAAA,IACT,UAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAIA,SAASE,cAAgB,GAAA,EAAgB;AACvC,EAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AACvB;AAEA,SAAS,iBAAiB,IAAA,EAAuB;AAC/C,EAAA,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAC5B;AAGA,SAAS,aAAa,GAAA,EAAqB;AACzC,EAAA,IAAI,IAAI,UAAA,CAAW,OAAO,KAAK,GAAA,CAAI,UAAA,CAAW,QAAQ,CAAA,EAAG;AACvD,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAO,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA,GAAM,IAAI,GAAG,CAAA,CAAA;AAEhD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,MAAM,GAAA,GAAO,OAA8C,sBAAsB,CAAA;AACjF,IAAA,MAAM,OAAO,GAAA,EAAK,eAAA;AAClB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA;AAC7B,QAAA,MAAMC,MAAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,OAAO,IAAI,MAAA,GAAS,KAAA;AACpD,QAAA,OAAO,CAAA,EAAGA,MAAK,CAAA,EAAA,EAAK,IAAI,IAAI,MAAM,CAAA,CAAE,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA;AAAA,MACjD,CAAA,CAAA,MAAQ;AAAA,MAAqB;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,QAAA,KAAa,WAAW,MAAA,GAAS,KAAA;AAC/D,EAAA,OAAO,GAAG,KAAK,CAAA,EAAA,EAAK,OAAO,QAAA,CAAS,IAAI,GAAG,IAAI,CAAA,CAAA;AACjD;ACjRO,SAAS,cAAA,GAAuC;AACrD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,cAAA,EAAe;AAEvC,EAAA,MAAM,aAAA,GAAgBJ,WAAAA;AAAA,IACpB,CAAC,UAAA,KAAuB,WAAA,CAAY,QAAA,CAAS,UAAU,CAAA;AAAA,IACvD,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,OAAO,EAAE,eAAe,WAAA,EAAY;AACtC;ACPO,SAAS,aAAA,GAAqC;AACnD,EAAA,MAAM,MAAM,WAAA,EAAY;AACxB,EAAA,MAAM,WAAW,WAAA,EAAY;AAE7B,EAAA,MAAM,QAAA,GAAWA,YAAY,CAAC,IAAA,KAAiB,IAAI,IAAI,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAC/D,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM,GAAA,CAAI,EAAE,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAeA,WAAAA,CAAY,CAAC,GAAA,KAAgB,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA,EAAG,EAAE,CAAA;AAE5F,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,aAAa,QAAA,CAAS,QAAA;AAAA,IACtB,MAAA;AAAA,IACA;AAAA,GACF;AACF;ACTO,SAAS,eAAA,GAAyC;AACvD,EAAA,MAAM,MAAA,GAASA,WAAAA;AAAA,IACb,CAAC,IAAA,KAA+F;AAC9F,MAAA,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,CAAE;AAAA,QACtB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,OAC5B,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,OAAA,GAAUA,WAAAA;AAAA,IACd,CAAC,SAAiB,WAAA,KAAyB,MAAA,CAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,WAAA,EAAa,CAAA;AAAA,IAC3F,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,KAAA,GAAQA,WAAAA;AAAA,IACZ,CAAC,SAAiB,WAAA,KAAyB,MAAA,CAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,WAAA,EAAa,CAAA;AAAA,IACzF,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,OAAA,GAAUA,WAAAA;AAAA,IACd,CAAC,SAAiB,WAAA,KAAyB,MAAA,CAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,WAAA,EAAa,CAAA;AAAA,IAC3F,CAAC,MAAM;AAAA,GACT;AACA,EAAA,MAAM,IAAA,GAAOA,WAAAA;AAAA,IACX,CAAC,SAAiB,WAAA,KAAyB,MAAA,CAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,WAAA,EAAa,CAAA;AAAA,IACxF,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,SAAS,IAAA,EAAK;AACjD;ACJA,IAAM,cAAA,GAAiC;AAAA,EACrC,SAAA,EAAW,oBAAoB,YAAY,CAAA;AAAA,EAC3C,WAAA,EAAa,oBAAoB,cAAc,CAAA;AAAA,EAC/C,UAAA,EAAY,oBAAoB,aAAa,CAAA;AAAA,EAC7C,WAAA,EAAa,oBAAoB,cAAc,CAAA;AAAA,EAC/C,aAAA,EAAe,oBAAoB,gBAAgB,CAAA;AAAA,EACnD,YAAA,EAAc,oBAAoB,eAAe,CAAA;AAAA,EACjD,WAAA,EAAa,oBAAoB,cAAc,CAAA;AAAA,EAC/C,aAAA,EAAe,oBAAoB,gBAAgB,CAAA;AAAA,EACnD,eAAA,EAAiB,oBAAoB,kBAAkB,CAAA;AAAA,EACvD,IAAA,EAAM,oBAAoB,MAAM,CAAA;AAAA,EAChC,SAAA,EAAW,oBAAoB,YAAY,CAAA;AAAA,EAC3C,YAAA,EAAc,oBAAoB,eAAe,CAAA;AAAA,EACjD,OAAA,EAAS,oBAAoB,SAAS,CAAA;AAAA,EACtC,OAAA,EAAS,oBAAoB,SAAS,CAAA;AAAA,EACtC,KAAA,EAAO,oBAAoB,OAAO,CAAA;AAAA,EAClC,IAAA,EAAM,oBAAoB,MAAM,CAAA;AAAA,EAChC,QAAA,EAAU,oBAAoB,UAAU,CAAA;AAAA,EACxC,MAAA,EAAQ,oBAAoB,QAAQ;AACtC,CAAA;AAEA,IAAM,aAAA,GAAgC;AAAA,EACpC,SAAA,EAAW,mBAAmB,YAAY,CAAA;AAAA,EAC1C,WAAA,EAAa,mBAAmB,cAAc,CAAA;AAAA,EAC9C,UAAA,EAAY,mBAAmB,aAAa,CAAA;AAAA,EAC5C,WAAA,EAAa,mBAAmB,cAAc,CAAA;AAAA,EAC9C,aAAA,EAAe,mBAAmB,gBAAgB,CAAA;AAAA,EAClD,YAAA,EAAc,mBAAmB,eAAe,CAAA;AAAA,EAChD,WAAA,EAAa,mBAAmB,cAAc,CAAA;AAAA,EAC9C,aAAA,EAAe,mBAAmB,gBAAgB,CAAA;AAAA,EAClD,eAAA,EAAiB,mBAAmB,kBAAkB,CAAA;AAAA,EACtD,IAAA,EAAM,mBAAmB,MAAM,CAAA;AAAA,EAC/B,SAAA,EAAW,mBAAmB,YAAY,CAAA;AAAA,EAC1C,YAAA,EAAc,mBAAmB,eAAe,CAAA;AAAA,EAChD,OAAA,EAAS,mBAAmB,SAAS,CAAA;AAAA,EACrC,OAAA,EAAS,mBAAmB,SAAS,CAAA;AAAA,EACrC,KAAA,EAAO,mBAAmB,OAAO,CAAA;AAAA,EACjC,IAAA,EAAM,mBAAmB,MAAM,CAAA;AAAA,EAC/B,QAAA,EAAU,mBAAmB,UAAU,CAAA;AAAA,EACvC,MAAA,EAAQ,mBAAmB,QAAQ;AACrC,CAAA;AA2BA,SAAS,gBAAA,GAAqC;AAC5C,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAAE,IAAA,OAAO,OAAA;AAAA,EAAS;AACvD,EAAA,OAAO,SAAS,eAAA,CAAgB,SAAA,CAAU,QAAA,CAAS,MAAM,IAAI,MAAA,GAAS,OAAA;AACxE;AAEO,SAAS,QAAA,GAA2B;AACzC,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,MAAM,QAAA,EAAS;AAE5C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAU,eAA2B,gBAAgB,CAAA;AAEzE,EAAM,gBAAU,MAAM;AACpB,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,CAAiB,MAAM;AAC1C,MAAA,OAAA,CAAQ,kBAAkB,CAAA;AAAA,IAC5B,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,OAAA,CAAQ,SAAS,eAAA,EAAiB;AAAA,MACzC,UAAA,EAAY,IAAA;AAAA,MACZ,eAAA,EAAiB,CAAC,OAAO;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO,MAAM,SAAS,UAAA,EAAW;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA,EAAU,IAAA,KAAS,MAAA,GAAS,aAAA,GAAgB,cAAA;AAAA,IAC5C,QAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,QAAQ,OAAA;AAAQ,GACzD;AACF;ACzIO,SAAS,kBAAA,GAA2C;AAKzD,EAAA,OAAO;AAAA;AAAA,IAEL,YAAA,EAAc,sBAAA;AAAA,IACd,iBAAA,EAAmB,4BAAA;AAAA,IACnB,kBAAA,EAAoB,4BAAA;AAAA,IACpB,cAAA,EAAgB,+BAAA;AAAA;AAAA,IAChB,mBAAA,EAAqB,+BAAA;AAAA,IACrB,kBAAA,EAAoB,sBAAA;AAAA,IACpB,uBAAA,EAAyB,4BAAA;AAAA,IACzB,gBAAA,EAAkB,sBAAA;AAAA,IAClB,qBAAA,EAAuB,4BAAA;AAAA,IACvB,sBAAA,EAAwB,4BAAA;AAAA;AAAA,IAGxB,YAAA,EAAc,yBAAA;AAAA,IACd,iBAAA,EAAmB,yBAAA;AAAA;AAAA,IACnB,kBAAA,EAAoB,yBAAA;AAAA,IACpB,cAAA,EAAgB,6BAAA;AAAA;AAAA,IAChB,mBAAA,EAAqB,6BAAA;AAAA,IACrB,kBAAA,EAAoB,yBAAA;AAAA,IACpB,uBAAA,EAAyB,yBAAA;AAAA,IACzB,gBAAA,EAAkB,yBAAA;AAAA,IAClB,qBAAA,EAAuB,yBAAA;AAAA,IACvB,sBAAA,EAAwB,yBAAA;AAAA;AAAA,IAGxB,YAAA,EAAc,yBAAA;AAAA,IACd,iBAAA,EAAmB,yBAAA;AAAA,IACnB,kBAAA,EAAoB,yBAAA;AAAA,IACpB,cAAA,EAAgB,6BAAA;AAAA,IAChB,mBAAA,EAAqB,6BAAA;AAAA,IACrB,kBAAA,EAAoB,yBAAA;AAAA,IACpB,uBAAA,EAAyB,yBAAA;AAAA,IACzB,gBAAA,EAAkB,yBAAA;AAAA,IAClB,qBAAA,EAAuB,yBAAA;AAAA,IACvB,sBAAA,EAAwB,yBAAA;AAAA,IACxB,mBAAA,EAAqB,yBAAA;AAAA;AAAA;AAAA,IAGrB,UAAA,EAAY,uBAAA;AAAA,IACZ,eAAA,EAAiB,uBAAA;AAAA,IACjB,gBAAA,EAAkB,uBAAA;AAAA,IAClB,YAAA,EAAc,6BAAA;AAAA,IACd,iBAAA,EAAmB,6BAAA;AAAA,IACnB,gBAAA,EAAkB,uBAAA;AAAA,IAClB,qBAAA,EAAuB,uBAAA;AAAA,IACvB,cAAA,EAAgB,uBAAA;AAAA,IAChB,mBAAA,EAAqB,uBAAA;AAAA,IACrB,oBAAA,EAAsB,uBAAA;AAAA,IACtB,iBAAA,EAAmB,wBAAA;AAAA;AAAA;AAAA,IAGnB,SAAA,EAAW,sBAAA;AAAA,IACX,cAAA,EAAgB,sBAAA;AAAA,IAChB,eAAA,EAAiB,sBAAA;AAAA,IACjB,WAAA,EAAa,6BAAA;AAAA,IACb,gBAAA,EAAkB,6BAAA;AAAA,IAClB,eAAA,EAAiB,sBAAA;AAAA,IACjB,oBAAA,EAAsB,sBAAA;AAAA,IACtB,aAAA,EAAe,sBAAA;AAAA,IACf,kBAAA,EAAoB,sBAAA;AAAA,IACpB,mBAAA,EAAqB,sBAAA;AAAA;AAAA,IAGrB,gBAAA,EAAkB,8BAAA;AAAA,IAClB,WAAA,EAAa,4BAAA;AAAA,IACb,eAAA,EAAiB,8BAAA;AAAA,IACjB,aAAA,EAAe,4BAAA;AAAA,IACf,gBAAA,EAAkB,6BAAA;AAAA,IAClB,WAAA,EAAa,qBAAA;AAAA;AAAA,IACb,gBAAA,EAAkB,0BAAA;AAAA;AAAA,IAClB,iBAAA,EAAmB,0BAAA;AAAA;AAAA,IACnB,wBAAA,EAA0B,6BAAA;AAAA;AAAA;AAAA,IAG1B,SAAA,EAAW,8BAAA;AAAA,IACX,aAAA,EAAe,8BAAA;AAAA;AAAA,IACf,kBAAA,EAAoB,gCAAA;AAAA,IACpB,iBAAA,EAAmB,+BAAA;AAAA,IACnB,mBAAA,EAAqB,+BAAA;AAAA;AAAA,IACrB,iBAAA,EAAmB,0BAAA;AAAA,IACnB,gBAAA,EAAkB,8BAAA;AAAA;AAAA,IAClB,cAAA,EAAgB,gCAAA;AAAA;AAAA,IAChB,oBAAA,EAAsB,gCAAA;AAAA;AAAA,IACtB,oBAAA,EAAsB,+BAAA;AAAA;AAAA,IACtB,mBAAA,EAAqB,8BAAA;AAAA;AAAA;AAAA,IAGrB,WAAA,EAAa,gCAAA;AAAA,IACb,oBAAA,EAAsB,kCAAA;AAAA,IACtB,aAAA,EAAe,8BAAA;AAAA;AAAA,IACf,UAAA,EAAY,gCAAA;AAAA;AAAA;AAAA,IAGZ,SAAA,EAAW,6BAAA;AAAA;AAAA,IACX,kBAAA,EAAoB,6BAAA;AAAA;AAAA,IACpB,iBAAA,EAAmB,4BAAA;AAAA;AAAA,IACnB,mBAAA,EAAqB,4BAAA;AAAA,IACrB,gBAAA,EAAkB,0BAAA;AAAA;AAAA,IAClB,qBAAA,EAAuB,0BAAA;AAAA;AAAA,IACvB,cAAA,EAAgB,6BAAA;AAAA;AAAA;AAAA,IAGhB,UAAA,EAAY,SAAA;AAAA;AAAA;AAAA;AAAA,IAIZ,SAAA,EAAW,6BAAA;AAAA,IACX,kBAAA,EAAoB,6BAAA;AAAA,IACpB,iBAAA,EAAmB,6BAAA;AAAA;AAAA;AAAA,IAInB,YAAA,EAAc,EAAA;AAAA,IACd,cAAA,EAAgB,EAAA;AAAA,IAChB,cAAA,EAAgB,CAAA;AAAA,IAChB,cAAA,EAAgB,CAAA;AAAA,IAChB,iBAAA,EAAmB,CAAA;AAAA;AAAA,IAGnB,aAAA,EAAe,EAAA;AAAA,IACf,eAAA,EAAiB,EAAA;AAAA,IACjB,eAAA,EAAiB,EAAA;AAAA,IACjB,eAAA,EAAiB,EAAA;AAAA;AAAA,IAGjB,UAAA,EAAY,wDAAA;AAAA;AAAA,IAGZ,QAAA,EAAU,EAAA;AAAA,IACV,UAAA,EAAY,EAAA;AAAA,IACZ,UAAA,EAAY,EAAA;AAAA,IACZ,UAAA,EAAY,EAAA;AAAA,IACZ,gBAAA,EAAkB,EAAA;AAAA,IAClB,gBAAA,EAAkB,EAAA;AAAA,IAClB,gBAAA,EAAkB,EAAA;AAAA,IAClB,gBAAA,EAAkB,EAAA;AAAA,IAClB,gBAAA,EAAkB,EAAA;AAAA,IAClB,YAAA,EAAc,EAAA;AAAA;AAAA,IAGd,gBAAA,EAAkB,GAAA;AAAA,IAClB,UAAA,EAAY,kBAAA;AAAA,IACZ,YAAA,EAAc,GAAA;AAAA,IACd,YAAA,EAAc,kBAAA;AAAA;AAAA,IAGd,OAAA,EAAS,EAAA;AAAA,IACT,SAAA,EAAW,EAAA;AAAA,IACX,SAAA,EAAW,EAAA;AAAA,IACX,SAAA,EAAW,CAAA;AAAA,IACX,UAAA,EAAY,CAAA;AAAA;AAAA,IAGZ,MAAA,EAAQ,EAAA;AAAA,IACR,QAAA,EAAU,EAAA;AAAA,IACV,QAAA,EAAU,EAAA;AAAA,IACV,QAAA,EAAU,CAAA;AAAA,IACV,SAAA,EAAW,CAAA;AAAA;AAAA,IAGX,kBAAA,EAAoB,MAAA;AAAA,IACpB,iBAAA,EAAmB,MAAA;AAAA,IACnB,kBAAA,EAAoB,MAAA;AAAA,IACpB,eAAA,EAAiB,sCAAA;AAAA,IACjB,aAAA,EAAe,qCAAA;AAAA;AAAA,IAGf,SAAA,EAAW,sBAAA;AAAA,IACX,cAAA,EAAgB,4BAAA;AAAA,IAChB,eAAA,EAAiB,4BAAA;AAAA;AAAA,IAGjB,SAAA,EAAW,gCAAA;AAAA;AAAA,IACX,cAAA,EAAgB,8BAAA;AAAA;AAAA,IAChB,cAAA,EAAgB,sBAAA;AAAA;AAAA;AAAA,IAGhB,cAAA,EAAgB,0BAAA;AAAA;AAAA,IAChB,mBAAA,EAAqB,CAAA;AAAA;AAAA,IACrB,sBAAA,EAAwB,EAAA;AAAA;AAAA,IACxB,kBAAA,EAAoB,0BAAA;AAAA;AAAA,IACpB,mBAAA,EAAqB,+BAAA;AAAA;AAAA,IACrB,wBAAA,EAA0B,+BAAA;AAAA;AAAA,IAC1B,2BAAA,EAA6B,6BAAA;AAAA;AAAA,IAC7B,iBAAA,EAAmB,0BAAA;AAAA;AAAA;AAAA,IAGnB,QAAA,EAAU,GAAA;AAAA,IACV,QAAA,EAAU,GAAA;AAAA,IACV,QAAA,EAAU,GAAA;AAAA,IACV,QAAA,EAAU,GAAA;AAAA,IACV,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW;AAAA,GACb;AACF;AAMO,SAAS,sBAAA,GAAoD;AAClE,EAAA,OAAO;AAAA,IACL,KAAA,EAAO;AAAA;AAAA,MAEL,QAAA,EAAU,oBAAA;AAAA,MACV,WAAA,EAAa,qBAAA;AAAA,MACb,WAAA,EAAa,uBAAA;AAAA,MACb,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA;AAAA,MAGlB,UAAA,EAAY,iBAAA;AAAA,MACZ,aAAA,EAAe,sBAAA;AAAA;AAAA,MACf,kBAAA,EAAoB,sBAAA;AAAA;AAAA,MACpB,aAAA,EAAe,qBAAA;AAAA;AAAA,MACf,UAAA,EAAY,oBAAA;AAAA;AAAA;AAAA,MAGZ,kBAAA,EAAoB,oBAAA;AAAA,MACpB,iBAAA,EAAmB,oBAAA;AAAA,MACnB,mBAAA,EAAqB,oBAAA;AAAA,MACrB,uBAAA,EAAyB,oBAAA;AAAA;AAAA,MAGzB,SAAA,EAAW,uBAAA;AAAA,MACX,cAAA,EAAgB,qBAAA;AAAA,MAChB,YAAA,EAAc,qBAAA;AAAA;AAAA,MAGd,QAAA,EAAU,oBAAA;AAAA;AAAA,MACV,WAAA,EAAa,qBAAA;AAAA;AAAA;AAAA,MAGb,oBAAA,EAAsB,EAAA;AAAA,MACtB,iBAAA,EAAmB,oBAAA;AAAA,MACnB,2BAAA,EAA6B;AAAA,KAC/B;AAAA,IACA,GAAA,EAAK;AAAA,MACH,SAAA,EAAW,oBAAA;AAAA,MACX,YAAA,EAAc,qBAAA;AAAA,MACd,WAAA,EAAa,uBAAA;AAAA,MACb,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,cAAA;AAAA,MACZ,YAAA,EAAc,gBAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAAA,IACA,KAAA,EAAO;AAAA,MACL,UAAA,EAAY,cAAA;AAAA,MACZ,YAAA,EAAc,gBAAA;AAAA,MACd,YAAA,EAAc,gBAAA;AAAA,MACd,SAAA,EAAW,aAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,IACA,KAAA,EAAO;AAAA;AAAA,MAEL,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,cAAA;AAAA,MACZ,YAAA,EAAc,gBAAA;AAAA,MACd,SAAA,EAAW,aAAA;AAAA;AAAA,MAGX,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA;AAAA,MAGb,SAAA,EAAW,uBAAA;AAAA;AAAA,MACX,cAAA,EAAgB,qBAAA;AAAA;AAAA;AAAA,MAGhB,cAAA,EAAgB,oBAAA;AAAA;AAAA,MAChB,YAAA,EAAc,oBAAA;AAAA;AAAA,MACd,cAAA,EAAgB,oBAAA;AAAA;AAAA,MAChB,WAAA,EAAa,oBAAA;AAAA;AAAA;AAAA,MAGb,kBAAA,EAAoB,gBAAA;AAAA;AAAA,MACpB,gBAAA,EAAkB,cAAA;AAAA;AAAA,MAClB,kBAAA,EAAoB,gBAAA;AAAA;AAAA,MACpB,eAAA,EAAiB;AAAA;AAAA,KACnB;AAAA,IACA,IAAA,EAAM;AAAA;AAAA,MAEJ,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,oBAAA,EAAsB,uBAAA;AAAA;AAAA,MAGtB,QAAA,EAAU,qBAAA;AAAA;AAAA,MACV,SAAA,EAAW,oBAAA;AAAA;AAAA,MACX,UAAA,EAAY;AAAA;AAAA,KACd;AAAA,IACA,YAAA,EAAc;AAAA,MACZ,SAAA,EAAW,qBAAA;AAAA,MACX,cAAA,EAAgB,uBAAA;AAAA,MAChB,WAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAQ;AAAA;AAAA,MAEN,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA;AAAA,MAGb,YAAA,EAAc,aAAA;AAAA,MACd,iBAAA,EAAmB,mBAAA;AAAA,MACnB,kBAAA,EAAoB,mBAAA;AAAA,MACpB,YAAA,EAAc,qBAAA;AAAA,MACd,aAAA,EAAe,kCAAA;AAAA;AAAA,MAGf,SAAA,EAAW,qBAAA;AAAA,MACX,YAAA,EAAc,qBAAA;AAAA,MACd,kBAAA,EAAoB,uBAAA;AAAA,MACpB,aAAA,EAAe,8BAAA;AAAA;AAAA,MAGf,cAAA,EAAgB,iBAAA;AAAA,MAChB,iBAAA,EAAmB,qBAAA;AAAA,MACnB,uBAAA,EAAyB,yBAAA;AAAA;AAAA,MAGzB,eAAA,EAAiB,iBAAA;AAAA,MACjB,kBAAA,EAAoB,qBAAA;AAAA,MACpB,wBAAA,EAA0B,yBAAA;AAAA;AAAA,MAG1B,OAAA,EAAS,aAAA;AAAA,MACT,iBAAA,EAAmB,qBAAA;AAAA;AAAA,MACnB,uBAAA,EAAyB,uBAAA;AAAA;AAAA;AAAA;AAAA,MAKzB,mBAAA,EAAqB,uBAAA;AAAA;AAAA,MACrB,wBAAA,EAA0B,oBAAA;AAAA;AAAA;AAAA;AAAA,MAI1B,aAAA,EAAe,uBAAA;AAAA;AAAA,MACf,kBAAA,EAAoB,qBAAA;AAAA;AAAA,MACpB,mBAAA,EAAqB,qBAAA;AAAA;AAAA,MACrB,WAAA,EAAa,sBAAA;AAAA;AAAA;AAAA,MAGb,WAAA,EAAa,aAAA;AAAA,MACb,SAAA,EAAW,aAAA;AAAA,MACX,cAAA,EAAgB,mBAAA;AAAA,MAChB,eAAA,EAAiB,mBAAA;AAAA;AAAA,MAGjB,cAAA,EAAgB,qBAAA;AAAA;AAAA;AAAA,MAGhB,WAAA,EAAa,cAAA;AAAA;AAAA,MACb,YAAA,EAAc,gCAAA;AAAA;AAAA,MAGd,YAAA,EAAc,aAAA;AAAA;AAAA,MACd,iBAAA,EAAmB,iBAAA;AAAA;AAAA,MACnB,gBAAA,EAAkB,cAAA;AAAA;AAAA,MAClB,qBAAA,EAAuB,cAAA;AAAA;AAAA,MACvB,eAAA,EAAiB,cAAA;AAAA;AAAA,MACjB,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,IACA,KAAA,EAAO;AAAA;AAAA,MAEL,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,oBAAA,EAAsB,sBAAA;AAAA;AAAA,MAGtB,gBAAA,EAAkB,yBAAA;AAAA,MAClB,iBAAA,EAAmB,aAAA;AAAA,MACnB,YAAA,EAAc,oCAAA;AAAA;AAAA,MACd,iBAAA,EAAmB,kCAAA;AAAA;AAAA,MACnB,mBAAA,EAAqB,mCAAA;AAAA;AAAA;AAAA,MAGrB,SAAA,EAAW,uBAAA;AAAA;AAAA,MACX,cAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,IACA,MAAA,EAAQ;AAAA;AAAA,MAEN,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA;AAAA,MACb,eAAA,EAAiB,qBAAA;AAAA;AAAA,MACjB,oBAAA,EAAsB,sBAAA;AAAA;AAAA;AAAA,MAGtB,YAAA,EAAc,aAAA;AAAA;AAAA,MACd,iBAAA,EAAmB,mBAAA;AAAA;AAAA;AAAA,MAGnB,gBAAA,EAAkB,sBAAA;AAAA;AAAA,MAClB,mBAAA,EAAqB,aAAA;AAAA;AAAA,MACrB,cAAA,EAAgB,iBAAA;AAAA;AAAA,MAChB,wBAAA,EAA0B,GAAA;AAAA;AAAA;AAAA,MAG1B,cAAA,EAAgB,oBAAA;AAAA;AAAA,MAChB,uBAAA,EAAyB,uBAAA;AAAA;AAAA,MACzB,yBAAA,EAA2B,iBAAA;AAAA;AAAA;AAAA,MAG3B,SAAA,EAAW,uBAAA;AAAA;AAAA,MACX,cAAA,EAAgB,qBAAA;AAAA;AAAA;AAAA,MAGhB,UAAA,EAAY;AAAA;AAAA,KACd;AAAA,IACA,QAAA,EAAU;AAAA;AAAA,MAER,SAAA,EAAW,qBAAA;AAAA,MACX,eAAA,EAAiB,qBAAA;AAAA;AAAA,MACjB,WAAA,EAAa,uBAAA;AAAA,MACb,iBAAA,EAAmB,iBAAA;AAAA;AAAA,MAGnB,kBAAA,EAAoB,iBAAA;AAAA;AAAA,MACpB,mBAAA,EAAqB,sBAAA;AAAA;AAAA,MACrB,wBAAA,EAA0B,sBAAA;AAAA;AAAA;AAAA,MAG1B,YAAA,EAAc,aAAA;AAAA;AAAA,MACd,iBAAA,EAAmB,mBAAA;AAAA;AAAA;AAAA,MAGnB,gBAAA,EAAkB,qBAAA;AAAA;AAAA,MAClB,UAAA,EAAY,uBAAA;AAAA;AAAA;AAAA,MAGZ,YAAA,EAAc,CAAA;AAAA;AAAA,MACd,wBAAA,EAA0B;AAAA;AAAA,KAC5B;AAAA,IACA,IAAA,EAAM;AAAA;AAAA,MAEJ,SAAA,EAAW,qBAAA;AAAA,MACX,kBAAA,EAAoB,uBAAA;AAAA;AAAA,MACpB,gBAAA,EAAkB,mBAAA;AAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA;AAAA,MACb,UAAA,EAAY,uBAAA;AAAA;AAAA;AAAA,MAGZ,SAAA,EAAW,qBAAA;AAAA;AAAA,MACX,MAAA,EAAQ,qBAAA;AAAA;AAAA;AAAA,MAGR,WAAA,EAAa,iBAAA;AAAA;AAAA,MACb,cAAA,EAAgB,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKhB,cAAA,EAAgB,aAAA;AAAA,MAChB,iBAAA,EAAmB,aAAA;AAAA;AAAA;AAAA,MAGnB,YAAA,EAAc,aAAA;AAAA;AAAA,MAGd,UAAA,EAAY,qBAAA;AAAA;AAAA,MACZ,aAAA,EAAe,qBAAA;AAAA;AAAA,MACf,eAAA,EAAiB,iBAAA;AAAA;AAAA,MACjB,kBAAA,EAAoB,aAAA;AAAA;AAAA,MACpB,qBAAA,EAAuB,aAAA;AAAA;AAAA,MACvB,iBAAA,EAAmB,qBAAA;AAAA;AAAA;AAAA,MAGnB,aAAA,EAAe,qBAAA;AAAA;AAAA,MACf,OAAA,EAAS,qBAAA;AAAA;AAAA;AAAA,MAGT,YAAA,EAAc,aAAA;AAAA;AAAA;AAAA,MAGd,SAAA,EAAW,uBAAA;AAAA;AAAA,MACX,cAAA,EAAgB,qBAAA;AAAA;AAAA;AAAA,MAGhB,eAAA,EAAiB,sBAAA;AAAA,MACjB,kBAAA,EAAoB,EAAA;AAAA;AAAA,MAGpB,gBAAA,EAAkB,CAAA;AAAA,MAClB,uBAAA,EAAyB,CAAA;AAAA;AAAA,MAGzB,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA,IAAA,EAAM;AAAA;AAAA,MAEJ,SAAA,EAAW,uBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,oBAAA,EAAsB,uBAAA;AAAA;AAAA,MAGtB,YAAA,EAAc,aAAA;AAAA,MACd,cAAA,EAAgB,aAAA;AAAA;AAAA,MAChB,iBAAA,EAAmB,aAAA;AAAA;AAAA,MACnB,eAAA,EAAiB,aAAA;AAAA;AAAA,MACjB,WAAA,EAAa;AAAA;AAAA,KAEf;AAAA,IACA,KAAA,EAAO;AAAA;AAAA,MAEL,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,eAAA,EAAiB,qBAAA;AAAA,MACjB,WAAA,EAAa,uBAAA;AAAA;AAAA,MAGb,QAAA,EAAU,qBAAA;AAAA;AAAA,MACV,QAAA,EAAU,oBAAA;AAAA;AAAA,MACV,SAAA,EAAW,qBAAA;AAAA;AAAA;AAAA,MAGX,SAAA,EAAW,uBAAA;AAAA;AAAA,MACX,cAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,IACA,MAAA,EAAQ;AAAA;AAAA,MAEN,SAAA,EAAW,qBAAA;AAAA,MACX,eAAA,EAAiB,qBAAA;AAAA,MACjB,WAAA,EAAa,uBAAA;AAAA;AAAA,MAGb,SAAA,EAAW,uBAAA;AAAA;AAAA,MACX,cAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,SAAA,EAAW,qBAAA;AAAA,MACX,eAAA,EAAiB,qBAAA;AAAA,MACjB,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAA,EAAS;AAAA,MACP,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA,IAAA,EAAM;AAAA;AAAA,MAEJ,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,UAAA,EAAY,uBAAA;AAAA,MAEZ,gBAAA,EAAkB,CAAA;AAAA;AAAA,MAClB,iBAAA,EAAmB;AAAA;AAAA,KACrB;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,YAAA,EAAc,aAAA;AAAA,MACd,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA,KAAA,EAAO;AAAA,MACL,YAAA,EAAc,aAAA;AAAA,MACd,SAAA,EAAW,qBAAA;AAAA,MACX,eAAA,EAAiB,aAAA;AAAA,MACjB,uBAAA,EAAyB,iBAAA;AAAA,MACzB,WAAA,EAAa,qBAAA;AAAA,MACb,uBAAA,EAAyB,qBAAA;AAAA,MACzB,oBAAA,EAAsB,aAAA;AAAA,MACtB,yBAAA,EAA2B,mBAAA;AAAA,MAC3B,0BAAA,EAA4B;AAAA,KAC9B;AAAA,IACA,QAAA,EAAU;AAAA,MACR,YAAA,EAAc,aAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAAA,IACA,UAAA,EAAY;AAAA;AAAA,MAEV,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,eAAA,EAAiB,qBAAA;AAAA,MACjB,oBAAA,EAAsB,sBAAA;AAAA,MACtB,iBAAA,EAAmB,iBAAA;AAAA;AAAA,MAGnB,SAAA,EAAW,aAAA;AAAA;AAAA,MACX,cAAA,EAAgB,mBAAA;AAAA;AAAA,MAChB,WAAA,EAAa,iBAAA;AAAA;AAAA,MACb,qBAAA,EAAuB,sBAAA;AAAA;AAAA,MACvB,cAAA,EAAgB,oBAAA;AAAA;AAAA;AAAA,MAGhB,SAAA,EAAW,uBAAA;AAAA;AAAA,MACX,cAAA,EAAgB;AAAA;AAAA,KAClB;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,SAAA,EAAW,qBAAA;AAAA,MACX,cAAA,EAAgB,uBAAA;AAAA,MAChB,UAAA,EAAY,cAAA;AAAA,MACZ,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,UAAA,EAAY;AAAA;AAAA,MAEV,SAAA,EAAW,qBAAA;AAAA,MACX,iBAAA,EAAmB,iBAAA;AAAA,MACnB,gBAAA,EAAkB,qBAAA;AAAA;AAAA,MAGlB,YAAA,EAAc,aAAA;AAAA;AAAA,MACd,iBAAA,EAAmB,mBAAA;AAAA;AAAA,MACnB,MAAA,EAAQ,qBAAA;AAAA;AAAA,MACR,YAAA,EAAc,aAAA;AAAA;AAAA,MACd,oBAAA,EAAsB,oBAAA;AAAA;AAAA,MACtB,WAAA,EAAa,qBAAA;AAAA;AAAA,MACb,UAAA,EAAY,qBAAA;AAAA;AAAA;AAAA,MAGZ,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,IACA,KAAA,EAAO;AAAA,MACL,SAAA,EAAW,qBAAA;AAAA,MACX,oBAAA,EAAsB,uBAAA;AAAA,MACtB,YAAA,EAAc,aAAA;AAAA,MACd,WAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,uBAAA;AAAA,MACX,oBAAA,EAAsB,sBAAA;AAAA,MACtB,SAAA,EAAW,aAAA;AAAA,MACX,cAAA,EAAgB,mBAAA;AAAA,MAChB,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW,qBAAA;AAAA,MACX,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,cAAA;AAAA,MACZ,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW,oBAAA;AAAA,MACX,gBAAA,EAAkB;AAAA,KACpB;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,aAAA;AAAA,MACd,gBAAA,EAAkB;AAAA,KACpB;AAAA,IACA,OAAA,EAAS;AAAA,MACP,UAAA,EAAY,uBAAA;AAAA,MACZ,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,QAAA,EAAU,qBAAA;AAAA,MACV,MAAA,EAAQ,mBAAA;AAAA,MACR,SAAA,EAAW,oBAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,gBAAA,EAAkB,qBAAA;AAAA,MAClB,QAAA,EAAU;AAAA,KACZ;AAAA,IACA,QAAA,EAAU;AAAA,MACR,gBAAA,EAAkB,qBAAA;AAAA,MAClB,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,YAAA,EAAc,aAAA;AAAA,MACd,SAAA,EAAW,uBAAA;AAAA,MACX,gBAAA,EAAkB;AAAA,KACpB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW,qBAAA;AAAA,MACX,oBAAA,EAAsB,uBAAA;AAAA,MACtB,SAAA,EAAW,uBAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACT;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,mBAAA,EAAqB;AAAA,KACvB;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,YAAA,EAAc,aAAA;AAAA,MACd,WAAA,EAAa,iBAAA;AAAA,MACb,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,eAAA,EAAiB,qBAAA;AAAA,MACjB,WAAA,EAAa,iBAAA;AAAA,MACb,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,eAAA,EAAiB,qBAAA;AAAA,MACjB,gBAAA,EAAkB;AAAA,KACpB;AAAA,IACA,SAAA,EAAW;AAAA,MACT,SAAA,EAAW,qBAAA;AAAA,MACX,cAAA,EAAgB,uBAAA;AAAA,MAChB,aAAA,EAAe,oBAAA;AAAA,MACf,cAAA,EAAgB,qBAAA;AAAA,MAChB,iBAAA,EAAmB,aAAA;AAAA,MACnB,WAAA,EAAa;AAAA,KACf;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,SAAA,EAAW;AAAA,KACb;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,YAAA,EAAc,aAAA;AAAA,MACd,kBAAA,EAAoB,aAAA;AAAA,MACpB,OAAA,EAAS,oBAAA;AAAA,MACT,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW,qBAAA;AAAA,MACX,oBAAA,EAAsB,uBAAA;AAAA,MACtB,WAAA,EAAa,uBAAA;AAAA,MACb,cAAA,EAAgB,oBAAA;AAAA,MAChB,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,gBAAA,EAAkB,qBAAA;AAAA,MAClB,WAAA,EAAa,uBAAA;AAAA,MACb,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,KAAA,EAAO;AAAA,MACL,mBAAA,EAAqB,qBAAA;AAAA,MACrB,WAAA,EAAa;AAAA,KACf;AAAA,IACA,SAAA,EAAW;AAAA,MACT,SAAA,EAAW,qBAAA;AAAA,MACX,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,KAAA,EAAO;AAAA,MACL,SAAA,EAAW,uBAAA;AAAA,MACX,oBAAA,EAAsB;AAAA,KACxB;AAAA,IACA,OAAA,EAAS;AAAA;AAAA,MAEP,SAAA,EAAW,qBAAA;AAAA,MACX,eAAA,EAAiB,qBAAA;AAAA;AAAA,MACjB,SAAA,EAAW,qBAAA;AAAA;AAAA,MACX,cAAA,EAAgB,WAAA;AAAA;AAAA;AAAA,MAGhB,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,cAAA;AAAA,MACZ,YAAA,EAAc,gBAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACb;AAAA,IACA,YAAA,EAAc;AAAA;AAAA,MAEZ,SAAA,EAAW,qBAAA;AAAA,MACX,gBAAA,EAAkB,qBAAA;AAAA,MAClB,eAAA,EAAiB,qBAAA;AAAA;AAAA,MACjB,WAAA,EAAa,uBAAA;AAAA;AAAA,MAGb,SAAA,EAAW,uBAAA;AAAA;AAAA,MACX,cAAA,EAAgB,qBAAA;AAAA;AAAA;AAAA,MAGhB,YAAA,EAAc,gBAAA;AAAA,MACd,UAAA,EAAY,cAAA;AAAA,MACZ,YAAA,EAAc,gBAAA;AAAA,MACd,SAAA,EAAW;AAAA;AACb,GACF;AACF","file":"index.js","sourcesContent":["import { createContext, useContext, type ReactNode } from 'react';\n\n/**\n * Page context — provided to every plugin page by the host.\n */\nexport interface PageContext {\n /** Page ID from the manifest */\n pageId: string;\n /** Plugin that owns this page */\n pluginId: string;\n /** Additional config passed to this page instance */\n config: Record<string, unknown>;\n /** User permissions applicable to this page */\n permissions: string[];\n}\n\nconst PageCtx = createContext<PageContext | null>(null);\n\nexport interface PageContextProviderProps {\n children: ReactNode;\n value: PageContext;\n}\n\nexport function PageContextProvider({ children, value }: PageContextProviderProps) {\n return <PageCtx.Provider value={value}>{children}</PageCtx.Provider>;\n}\n\nexport function usePageContext(): PageContext {\n const ctx = useContext(PageCtx);\n if (!ctx) {\n throw new Error('usePage() must be used inside a PageContextProvider (are you inside a Studio page?)');\n }\n return ctx;\n}\n","import { usePageContext, type PageContext } from './page-context.js';\n\n/**\n * Access the current page context.\n *\n * @example\n * ```tsx\n * const { pageId, pluginId, permissions } = usePage();\n * ```\n */\nexport function usePage(): PageContext {\n return usePageContext();\n}\n","import { useEffect, useCallback, useRef } from 'react';\nimport { useEventBusContext, type EventHandler } from '@kb-labs/studio-event-bus';\nimport { usePageContext } from './page-context.js';\n\nexport interface UseEventBusReturn {\n /** Publish an event. pluginId/pageId auto-injected from context. */\n publish: <T = unknown>(event: string, payload: T) => void;\n /** Subscribe to an event. Auto-unsubscribes on unmount. Returns manual unsubscribe fn. */\n subscribe: <T = unknown>(event: string, handler: EventHandler<T>) => () => void;\n}\n\n/**\n * EventBus hook for cross-plugin communication.\n *\n * @example\n * ```tsx\n * const bus = useEventBus();\n * bus.publish('commit:completed', { scope });\n * bus.subscribe('quality:scanDone', (payload) => { ... });\n * ```\n */\nexport function useEventBus(): UseEventBusReturn {\n const bus = useEventBusContext();\n const { pluginId, pageId } = usePageContext();\n const unsubs = useRef<Array<() => void>>([]);\n\n // Auto-cleanup all subscriptions on unmount\n useEffect(() => {\n return () => {\n for (const unsub of unsubs.current) {\n unsub();\n }\n unsubs.current = [];\n };\n }, []);\n\n const publish = useCallback(\n <T = unknown>(event: string, payload: T) => {\n bus.publish(event, payload, pluginId, pageId);\n },\n [bus, pluginId, pageId],\n );\n\n const subscribe = useCallback(\n <T = unknown>(event: string, handler: EventHandler<T>) => {\n const unsub = bus.subscribe(event, handler, pluginId, pageId);\n unsubs.current.push(unsub);\n return unsub;\n },\n [bus, pluginId, pageId],\n );\n\n return { publish, subscribe };\n}\n","import { useQuery, useMutation, type UseQueryOptions, type MutateOptions } from '@tanstack/react-query';\n\n// ─── useData ────────────────────────────────────────────────────────\n\nexport interface UseDataOptions<T> {\n /** Polling interval in ms (0 = no polling) */\n pollingMs?: number;\n /** Enable/disable the query */\n enabled?: boolean;\n /** Stale time override in ms */\n staleTime?: number;\n /** Transform response before returning */\n select?: (data: unknown) => T;\n /** Additional query params appended to endpoint */\n params?: Record<string, string | number | boolean>;\n}\n\nexport interface UseDataReturn<T> {\n data: T | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n refetch: () => Promise<unknown>;\n isFetching: boolean;\n}\n\n/**\n * Data fetching hook wrapping TanStack Query.\n * Fetches from the platform REST API (same origin).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useData<Commit[]>('/v1/plugins/commit/history');\n * const { data: filtered } = useData('/v1/plugins/commit/files', { params: { scope } });\n * ```\n */\nexport function useData<T = unknown>(\n endpoint: string,\n options?: UseDataOptions<T>,\n): UseDataReturn<T> {\n const url = buildUrl(endpoint, options?.params);\n\n const query = useQuery<unknown, Error, T>({\n queryKey: ['studio-data', url],\n queryFn: () => fetchJson(url),\n enabled: options?.enabled,\n staleTime: options?.staleTime,\n refetchInterval: options?.pollingMs || undefined,\n select: options?.select as UseQueryOptions<unknown, Error, T>['select'],\n });\n\n return {\n data: query.data,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n isFetching: query.isFetching,\n };\n}\n\n// ─── useMutateData ──────────────────────────────────────────────────\n\nexport interface MutateDataOptions<TInput> {\n method?: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Transform input before sending as request body (useful with dynamic endpoints) */\n mapBody?: (input: TInput) => unknown;\n}\n\nexport interface UseMutateDataReturn<TInput, TOutput> {\n mutate: (input: TInput, options?: MutateOptions<TOutput, Error, TInput>) => void;\n mutateAsync: (input: TInput) => Promise<TOutput>;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n data: TOutput | undefined;\n}\n\n/**\n * Mutation hook for POST/PUT/PATCH/DELETE.\n *\n * Endpoint can be a string or a function that receives the input and returns the URL.\n * Use a function when the URL depends on runtime values (e.g. a selected entity ID).\n *\n * @example\n * ```tsx\n * const { mutateAsync } = useMutateData<CommitInput, CommitResult>('/v1/plugins/commit/create');\n * await mutateAsync({ scope, message });\n *\n * // Dynamic endpoint:\n * const { mutate } = useMutateData<RunInput, RunResult>(\n * (input) => `/v1/workflows/${input.workflowId}/runs`,\n * );\n * ```\n */\nexport function useMutateData<TInput = unknown, TOutput = unknown>(\n endpoint: string | ((input: TInput) => string),\n methodOrOptions: 'POST' | 'PUT' | 'PATCH' | 'DELETE' | MutateDataOptions<TInput> = 'POST',\n): UseMutateDataReturn<TInput, TOutput> {\n const opts = typeof methodOrOptions === 'string'\n ? { method: methodOrOptions } as MutateDataOptions<TInput>\n : methodOrOptions;\n const method = opts.method ?? 'POST';\n const mapBody = opts.mapBody;\n\n const mutation = useMutation<TOutput, Error, TInput>({\n mutationFn: async (input: TInput) => {\n const url = typeof endpoint === 'function' ? endpoint(input) : endpoint;\n const payload = mapBody ? mapBody(input) : input;\n const hasBody = payload !== undefined && payload !== null;\n const res = await fetch(`${getApiOrigin()}/api${url}`, {\n method,\n headers: hasBody ? { 'Content-Type': 'application/json' } : {},\n body: hasBody ? JSON.stringify(payload) : undefined,\n });\n if (!res.ok) {\n throw new Error(`${method} ${url} failed: ${res.status} ${res.statusText}`);\n }\n const json = await res.json() as Record<string, unknown>;\n // Unwrap platform envelope { ok, data, meta }\n if (json && typeof json === 'object' && 'ok' in json && 'data' in json) {\n return json.data as TOutput;\n }\n return json as TOutput;\n },\n });\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n data: mutation.data,\n };\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────\n\n/**\n * Returns the API gateway origin from the runtime config injected by server.js.\n * Falls back to '' (same-origin) when running with a dev proxy.\n */\nfunction getApiOrigin(): string {\n if (typeof window !== 'undefined') {\n const cfg = (window as unknown as Record<string, unknown>)['__KB_STUDIO_CONFIG__'] as Record<string, string> | undefined;\n const base = cfg?.KB_API_BASE_URL;\n if (base) {\n try { return new URL(base).origin; } catch { /* fall through */ }\n }\n }\n return '';\n}\n\nfunction buildUrl(\n endpoint: string,\n params?: Record<string, string | number | boolean>,\n): string {\n if (!params || Object.keys(params).length === 0) { return endpoint; }\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.set(key, String(value));\n }\n }\n const sep = endpoint.includes('?') ? '&' : '?';\n return `${endpoint}${sep}${searchParams.toString()}`;\n}\n\nasync function fetchJson(endpoint: string): Promise<unknown> {\n const res = await fetch(`${getApiOrigin()}/api${endpoint}`);\n if (!res.ok) {\n throw new Error(`GET ${endpoint} failed: ${res.status} ${res.statusText}`);\n }\n const json = await res.json() as Record<string, unknown>;\n // Unwrap platform envelope { ok, data, meta }\n if (json && typeof json === 'object' && 'ok' in json && 'data' in json) {\n return json.data;\n }\n return json;\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\n\n// ─── Types ─────────────────────────────────────────────────────────\n\nexport type SSEConnectionStatus = 'connecting' | 'live' | 'reconnecting' | 'closed';\n\nexport interface UseSSEOptions<T> {\n /** SSE event name(s) to listen on (default: 'message') */\n events?: string | string[];\n /** Event that signals the stream is done (auto-closes connection) */\n doneEvent?: string;\n /** SSE event names that indicate the stream ended cleanly (no error raised on close) */\n terminalEvents?: string[];\n /** Enable/disable the hook (default: true) */\n enabled?: boolean;\n /** Auto-reconnect on error (default: false) */\n reconnect?: boolean;\n /** Max reconnect attempts (default: 5) */\n maxReconnects?: number;\n /** Base reconnect delay in ms, doubles each attempt (default: 2000) */\n reconnectIntervalMs?: number;\n /** Max events to keep in buffer (0 = unlimited, default: 0) */\n maxEvents?: number;\n /** Parse event data (default: JSON.parse) */\n parse?: (raw: string) => T;\n /** Query params appended to endpoint */\n params?: Record<string, string | number | boolean>;\n /** Called on each incoming event */\n onEvent?: (event: T) => void;\n /** Called on connection open */\n onOpen?: () => void;\n /** Called on error (before reconnect) */\n onError?: (error: Error) => void;\n /** Called when done event received or connection closed cleanly */\n onDone?: () => void;\n}\n\nexport interface UseSSEReturn<T> {\n /** Accumulated events */\n events: T[];\n /** Latest event received */\n latest: T | undefined;\n /** Whether EventSource is connected */\n isConnected: boolean;\n /** Granular connection status */\n connectionStatus: SSEConnectionStatus;\n /** True if stream closed via a terminal/done event (not a network error) */\n closedClean: boolean;\n /** Last error (null when closed cleanly) */\n error: Error | null;\n /** Manually close the connection */\n close: () => void;\n /** Clear the event buffer */\n clear: () => void;\n /** Current reconnect attempt count */\n reconnectCount: number;\n}\n\n// ─── Hook ──────────────────────────────────────────────────────────\n\n/**\n * Generic SSE hook for server-sent event streams.\n *\n * Pass `null` as endpoint to keep the hook mounted but inactive.\n *\n * @example\n * ```tsx\n * // Workflow logs\n * const { events, isConnected } = useSSE<LogEvent>(\n * runId ? `/workflows/runs/${runId}/logs` : null,\n * { events: 'workflow.log', doneEvent: 'workflow.done', params: { follow: '1' } },\n * );\n *\n * // Observability log stream with reconnect\n * const { events, latest } = useSSE<LogRecord>('/logs/stream', {\n * params: { level: 'error' },\n * maxEvents: 500,\n * reconnect: true,\n * });\n * ```\n */\nexport function useSSE<T = unknown>(\n endpoint: string | null,\n options: UseSSEOptions<T> = {},\n): UseSSEReturn<T> {\n const {\n events: eventNames = 'message',\n doneEvent,\n terminalEvents,\n enabled = true,\n reconnect = false,\n maxReconnects = 5,\n reconnectIntervalMs = 2000,\n maxEvents = 0,\n parse = defaultParse,\n params,\n onEvent,\n onOpen,\n onError,\n onDone,\n } = options;\n\n const [items, setItems] = useState<T[]>([]);\n const [latest, setLatest] = useState<T | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [connectionStatus, setConnectionStatus] = useState<SSEConnectionStatus>('closed');\n const [closedClean, setClosedClean] = useState(false);\n const [reconnectCount, setReconnectCount] = useState(0);\n\n const esRef = useRef<EventSource | null>(null);\n const reconnectTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closedByUser = useRef(false);\n const closedByTerminal = useRef(false);\n\n // Stable refs for callbacks to avoid re-subscribing on every render\n const onEventRef = useRef(onEvent);\n const onOpenRef = useRef(onOpen);\n const onErrorRef = useRef(onError);\n const onDoneRef = useRef(onDone);\n const parseRef = useRef(parse);\n onEventRef.current = onEvent;\n onOpenRef.current = onOpen;\n onErrorRef.current = onError;\n onDoneRef.current = onDone;\n parseRef.current = parse;\n\n // Stable serialized deps for objects/arrays — avoids inline JSON.stringify in dep array\n const eventNamesKey = JSON.stringify(eventNames);\n const paramsKey = JSON.stringify(params);\n const terminalEventsKey = JSON.stringify(terminalEvents);\n\n const close = useCallback(() => {\n closedByUser.current = true;\n if (reconnectTimer.current) {\n clearTimeout(reconnectTimer.current);\n reconnectTimer.current = null;\n }\n if (esRef.current) {\n esRef.current.close();\n esRef.current = null;\n }\n setIsConnected(false);\n setConnectionStatus('closed');\n setClosedClean(true);\n }, []);\n\n const clear = useCallback(() => {\n setItems([]);\n setLatest(undefined);\n }, []);\n\n useEffect(() => {\n if (!endpoint || !enabled) {\n // Clean up if we were connected\n if (esRef.current) {\n esRef.current.close();\n esRef.current = null;\n }\n setIsConnected(false);\n return;\n }\n\n closedByUser.current = false;\n closedByTerminal.current = false;\n setItems([]);\n setLatest(undefined);\n setError(null);\n setClosedClean(false);\n setReconnectCount(0);\n setConnectionStatus('connecting');\n\n let attempt = 0;\n\n function connect() {\n const url = buildSSEUrl(endpoint!, params);\n const es = new EventSource(url);\n esRef.current = es;\n\n const names = Array.isArray(eventNames) ? eventNames : [eventNames];\n\n const handleMessage = (e: MessageEvent) => {\n try {\n const parsed = parseRef.current(e.data) as T;\n setLatest(parsed);\n setItems((prev) => {\n const next = [...prev, parsed];\n return maxEvents > 0 && next.length > maxEvents ? next.slice(-maxEvents) : next;\n });\n onEventRef.current?.(parsed);\n } catch (err) {\n const parseError = err instanceof Error ? err : new Error('Failed to parse SSE event data');\n setError(parseError);\n onErrorRef.current?.(parseError);\n }\n };\n\n for (const name of names) {\n es.addEventListener(name, handleMessage as EventListener);\n }\n\n // Terminal events close the stream cleanly — no error raised\n const allTerminal = [\n ...(terminalEvents ?? []),\n ...(doneEvent ? [doneEvent] : []),\n ];\n for (const name of allTerminal) {\n es.addEventListener(name, () => {\n closedByTerminal.current = true;\n es.close();\n esRef.current = null;\n setIsConnected(false);\n setConnectionStatus('closed');\n setClosedClean(true);\n onDoneRef.current?.();\n });\n }\n\n // Legacy doneEvent kept for backward compat (already covered above, but no-op duplicate)\n\n es.onopen = () => {\n attempt = 0;\n setReconnectCount(0);\n setIsConnected(true);\n setConnectionStatus('live');\n setError(null);\n onOpenRef.current?.();\n };\n\n es.onerror = () => {\n es.close();\n esRef.current = null;\n setIsConnected(false);\n\n // Clean close by user or terminal event — suppress error\n if (closedByUser.current || closedByTerminal.current) {\n setConnectionStatus('closed');\n return;\n }\n\n const connError = new Error('SSE connection lost');\n setError(connError);\n onErrorRef.current?.(connError);\n\n if (reconnect && attempt < maxReconnects) {\n attempt++;\n setReconnectCount(attempt);\n setConnectionStatus('reconnecting');\n const delay = reconnectIntervalMs * Math.pow(2, attempt - 1);\n reconnectTimer.current = setTimeout(connect, delay);\n } else {\n setConnectionStatus('closed');\n }\n };\n }\n\n connect();\n\n return () => {\n closedByUser.current = true;\n if (reconnectTimer.current) {\n clearTimeout(reconnectTimer.current);\n reconnectTimer.current = null;\n }\n if (esRef.current) {\n esRef.current.close();\n esRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [endpoint, enabled, doneEvent, reconnect, maxReconnects, reconnectIntervalMs, maxEvents, eventNamesKey, paramsKey, terminalEventsKey]);\n\n return { events: items, latest, isConnected, connectionStatus, closedClean, error, close, clear, reconnectCount };\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────\n\nfunction defaultParse<T>(raw: string): T {\n return JSON.parse(raw) as T;\n}\n\nfunction buildSSEUrl(\n endpoint: string,\n params?: Record<string, string | number | boolean>,\n): string {\n const base = endpoint.startsWith('http') ? endpoint : `/api${endpoint}`;\n if (!params || Object.keys(params).length === 0) {\n return base;\n }\n const sp = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n sp.set(key, String(value));\n }\n }\n const sep = base.includes('?') ? '&' : '?';\n return `${base}${sep}${sp.toString()}`;\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Returns a live-updating elapsed time string starting from `startedAt`.\n * Updates every second while the component is mounted.\n * Returns null if startedAt is not provided (step not yet started).\n *\n * Format: <60s → \"42s\", <1h → \"2m 14s\", ≥1h → \"1h 03m\"\n */\nexport function useElapsedTimer(startedAt: string | undefined): string | null {\n const [elapsed, setElapsed] = useState<string | null>(() =>\n startedAt ? formatElapsed(startedAt) : null,\n );\n\n useEffect(() => {\n if (!startedAt) {\n setElapsed(null);\n return;\n }\n\n setElapsed(formatElapsed(startedAt));\n\n const id = setInterval(() => {\n setElapsed(formatElapsed(startedAt));\n }, 1000);\n\n return () => clearInterval(id);\n }, [startedAt]);\n\n return elapsed;\n}\n\nfunction formatElapsed(startedAt: string): string {\n const ms = Date.now() - new Date(startedAt).getTime();\n const totalSec = Math.max(0, Math.floor(ms / 1000));\n\n if (totalSec < 60) {\n return `${totalSec}s`;\n }\n const totalMin = Math.floor(totalSec / 60);\n if (totalMin < 60) {\n const secs = totalSec % 60;\n return `${totalMin}m ${secs.toString().padStart(2, '0')}s`;\n }\n const hours = Math.floor(totalMin / 60);\n const mins = totalMin % 60;\n return `${hours}h ${mins.toString().padStart(2, '0')}m`;\n}\n","import { useInfiniteQuery, type InfiniteData } from '@tanstack/react-query';\n\n// ─── Types ─────────────────────────────────────────────────────────\n\nexport interface UseInfiniteDataOptions<T, TCursor = string> {\n /** Extract the next-page cursor from the last fetched page. Return undefined to signal \"no more pages\". */\n getNextCursor: (lastPage: T) => TCursor | undefined;\n /** Additional query params (merged with cursor on each request) */\n params?: Record<string, string | number | boolean>;\n /** Enable/disable the query (default: true) */\n enabled?: boolean;\n /** Stale time override in ms */\n staleTime?: number;\n /** Query param name used to pass the cursor (default: 'cursor') */\n cursorParam?: string;\n /** Initial cursor value (default: undefined → first page) */\n initialCursor?: TCursor;\n}\n\nexport interface UseInfiniteDataReturn<T> {\n /** All fetched pages */\n pages: T[];\n /** Flattened data from all pages (requires pages to be arrays) */\n data: T extends Array<infer U> ? U[] : T[];\n /** Loading first page */\n isLoading: boolean;\n /** Fetching any page (initial or next) */\n isFetching: boolean;\n /** Currently fetching next page */\n isFetchingNextPage: boolean;\n /** Whether more pages are available */\n hasNextPage: boolean;\n /** Fetch the next page */\n fetchNextPage: () => Promise<unknown>;\n /** Error if any */\n error: Error | null;\n isError: boolean;\n /** Refetch all pages */\n refetch: () => Promise<unknown>;\n}\n\n// ─── Hook ──────────────────────────────────────────────────────────\n\n/**\n * Infinite/cursor-based pagination hook wrapping TanStack useInfiniteQuery.\n *\n * Works with any cursor-based or offset-based REST endpoint.\n *\n * @example\n * ```tsx\n * // Cursor-based pagination\n * const { data, fetchNextPage, hasNextPage } = useInfiniteData<RunsPage>(\n * '/workflows/runs',\n * {\n * getNextCursor: (page) => page.nextCursor,\n * params: { status: 'running' },\n * },\n * );\n *\n * // Offset-based pagination\n * const { data, fetchNextPage } = useInfiniteData<LogEntry[]>(\n * '/logs',\n * {\n * cursorParam: 'offset',\n * getNextCursor: (page) => page.length === 50 ? String(allLogs.length) : undefined,\n * },\n * );\n * ```\n */\nexport function useInfiniteData<T = unknown, TCursor = string>(\n endpoint: string,\n options: UseInfiniteDataOptions<T, TCursor>,\n): UseInfiniteDataReturn<T> {\n const {\n getNextCursor,\n params,\n enabled,\n staleTime,\n cursorParam = 'cursor',\n initialCursor,\n } = options;\n\n const query = useInfiniteQuery<T, Error, InfiniteData<T, TCursor>, unknown[], TCursor>({\n queryKey: ['studio-infinite', endpoint, params],\n queryFn: async ({ pageParam }) => {\n const url = buildInfiniteUrl(endpoint, params, cursorParam, pageParam);\n return fetchPage<T>(url);\n },\n initialPageParam: initialCursor as TCursor,\n getNextPageParam: getNextCursor,\n enabled,\n staleTime,\n });\n\n const pages = query.data?.pages ?? [];\n const flatData = pages.flatMap((page) => (Array.isArray(page) ? page : [page]));\n\n return {\n pages,\n data: flatData as UseInfiniteDataReturn<T>['data'],\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n isFetchingNextPage: query.isFetchingNextPage,\n hasNextPage: query.hasNextPage,\n fetchNextPage: query.fetchNextPage,\n error: query.error,\n isError: query.isError,\n refetch: query.refetch,\n };\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────\n\nfunction buildInfiniteUrl<TCursor>(\n endpoint: string,\n params: Record<string, string | number | boolean> | undefined,\n cursorParam: string,\n cursor: TCursor | undefined,\n): string {\n const sp = new URLSearchParams();\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n sp.set(key, String(value));\n }\n }\n }\n\n if (cursor !== undefined && cursor !== null) {\n sp.set(cursorParam, String(cursor));\n }\n\n const qs = sp.toString();\n const base = endpoint.startsWith('http') ? endpoint : `/api${endpoint}`;\n return qs ? `${base}?${qs}` : base;\n}\n\nasync function fetchPage<T>(url: string): Promise<T> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`GET ${url} failed: ${res.status} ${res.statusText}`);\n }\n const json = await res.json() as Record<string, unknown>;\n // Unwrap platform envelope { ok, data, meta }\n if (json && typeof json === 'object' && 'ok' in json && 'data' in json) {\n return json.data as T;\n }\n return json as T;\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\n\n// ─── Types ─────────────────────────────────────────────────────────\n\nexport type WebSocketStatus = 'connecting' | 'connected' | 'disconnected' | 'error';\n\nexport interface UseWebSocketOptions<TReceive> {\n /** Enable/disable auto-connect on mount (default: true) */\n enabled?: boolean;\n /** Auto-reconnect on close/error (default: false) */\n reconnect?: boolean;\n /** Max reconnect attempts (default: 5) */\n maxReconnects?: number;\n /** Base reconnect delay in ms, doubles each attempt (default: 2000) */\n reconnectIntervalMs?: number;\n /** WebSocket sub-protocols */\n protocols?: string | string[];\n /** Parse incoming messages (default: JSON.parse) */\n parse?: (raw: string) => TReceive;\n /** Serialize outgoing messages (default: JSON.stringify) */\n serialize?: (data: unknown) => string;\n /** Max messages to keep in history (default: 100) */\n maxMessages?: number;\n /** Called on each received message */\n onMessage?: (data: TReceive) => void;\n /** Called on connection open */\n onOpen?: (event: Event) => void;\n /** Called on connection close */\n onClose?: (event: CloseEvent) => void;\n /** Called on error */\n onError?: (event: Event) => void;\n}\n\nexport interface UseWebSocketReturn<TSend, TReceive> {\n /** Send a typed message (auto-serialized) */\n send: (data: TSend) => void;\n /** Send a raw string */\n sendRaw: (data: string | ArrayBufferLike | Blob) => void;\n /** Received messages (most recent last) */\n messages: TReceive[];\n /** Latest received message */\n latest: TReceive | undefined;\n /** Connection status */\n status: WebSocketStatus;\n /** Shorthand: status === 'connected' */\n isConnected: boolean;\n /** Last error event */\n error: Event | null;\n /** Manually open the connection */\n connect: () => void;\n /** Manually close the connection */\n disconnect: (code?: number, reason?: string) => void;\n /** Clear message history */\n clear: () => void;\n /** Current reconnect attempt count */\n reconnectCount: number;\n}\n\n// ─── Hook ──────────────────────────────────────────────────────────\n\n/**\n * Generic WebSocket hook for bidirectional communication.\n *\n * Pass `null` as url to keep the hook mounted but inactive.\n *\n * @example\n * ```tsx\n * // Agent chat\n * const { send, messages, isConnected } = useWebSocket<UserMsg, AgentMsg>(\n * sessionId ? `ws://localhost:4000/agent/${sessionId}` : null,\n * );\n * send({ type: 'user_message', text: input });\n *\n * // With reconnect and callbacks\n * const { messages, status } = useWebSocket<Command, StatusEvent>(\n * '/ws/deploy',\n * {\n * reconnect: true,\n * onMessage: (msg) => msg.done && showNotification('Deploy finished'),\n * },\n * );\n * ```\n */\nexport function useWebSocket<TSend = unknown, TReceive = unknown>(\n url: string | null,\n options: UseWebSocketOptions<TReceive> = {},\n): UseWebSocketReturn<TSend, TReceive> {\n const {\n enabled = true,\n reconnect = false,\n maxReconnects = 5,\n reconnectIntervalMs = 2000,\n protocols,\n parse = defaultParse,\n serialize = defaultSerialize,\n maxMessages = 100,\n onMessage,\n onOpen,\n onClose,\n onError,\n } = options;\n\n const [messages, setMessages] = useState<TReceive[]>([]);\n const [latest, setLatest] = useState<TReceive | undefined>(undefined);\n const [status, setStatus] = useState<WebSocketStatus>('disconnected');\n const [error, setError] = useState<Event | null>(null);\n const [reconnectCount, setReconnectCount] = useState(0);\n\n const wsRef = useRef<WebSocket | null>(null);\n const reconnectTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closedByUser = useRef(false);\n\n // Stable refs for callbacks\n const onMessageRef = useRef(onMessage);\n const onOpenRef = useRef(onOpen);\n const onCloseRef = useRef(onClose);\n const onErrorRef = useRef(onError);\n const parseRef = useRef(parse);\n const serializeRef = useRef(serialize);\n onMessageRef.current = onMessage;\n onOpenRef.current = onOpen;\n onCloseRef.current = onClose;\n onErrorRef.current = onError;\n parseRef.current = parse;\n serializeRef.current = serialize;\n\n const cleanup = useCallback(() => {\n if (reconnectTimer.current) {\n clearTimeout(reconnectTimer.current);\n reconnectTimer.current = null;\n }\n if (wsRef.current) {\n wsRef.current.close();\n wsRef.current = null;\n }\n }, []);\n\n const doConnect = useCallback(() => {\n if (!url) { return; }\n\n cleanup();\n closedByUser.current = false;\n setStatus('connecting');\n setError(null);\n\n let attempt = 0;\n\n function open() {\n const resolvedUrl = resolveWsUrl(url!);\n const ws = protocols ? new WebSocket(resolvedUrl, protocols) : new WebSocket(resolvedUrl);\n wsRef.current = ws;\n\n ws.onopen = (e) => {\n attempt = 0;\n setReconnectCount(0);\n setStatus('connected');\n setError(null);\n onOpenRef.current?.(e);\n };\n\n ws.onmessage = (e: MessageEvent) => {\n try {\n const data = parseRef.current(e.data as string) as TReceive;\n setLatest(data);\n setMessages((prev) => {\n const next = [...prev, data];\n return maxMessages > 0 && next.length > maxMessages ? next.slice(-maxMessages) : next;\n });\n onMessageRef.current?.(data);\n } catch {\n // Silently ignore parse errors for binary/non-JSON frames\n }\n };\n\n ws.onclose = (e) => {\n wsRef.current = null;\n setStatus('disconnected');\n onCloseRef.current?.(e);\n\n if (closedByUser.current) { return; }\n\n // Reconnect on abnormal close\n if (reconnect && attempt < maxReconnects && e.code !== 1000) {\n attempt++;\n setReconnectCount(attempt);\n const delay = reconnectIntervalMs * Math.pow(2, attempt - 1);\n reconnectTimer.current = setTimeout(open, delay);\n }\n };\n\n ws.onerror = (e) => {\n setStatus('error');\n setError(e);\n onErrorRef.current?.(e);\n };\n }\n\n open();\n }, [url, protocols, reconnect, maxReconnects, reconnectIntervalMs, maxMessages, cleanup]);\n\n const disconnect = useCallback((code?: number, reason?: string) => {\n closedByUser.current = true;\n if (reconnectTimer.current) {\n clearTimeout(reconnectTimer.current);\n reconnectTimer.current = null;\n }\n if (wsRef.current) {\n wsRef.current.close(code, reason);\n wsRef.current = null;\n }\n setStatus('disconnected');\n }, []);\n\n const send = useCallback((data: TSend) => {\n if (wsRef.current?.readyState === WebSocket.OPEN) {\n wsRef.current.send(serializeRef.current(data));\n }\n }, []);\n\n const sendRaw = useCallback((data: string | ArrayBufferLike | Blob) => {\n if (wsRef.current?.readyState === WebSocket.OPEN) {\n wsRef.current.send(data);\n }\n }, []);\n\n const clear = useCallback(() => {\n setMessages([]);\n setLatest(undefined);\n }, []);\n\n // Auto-connect on mount / url change\n useEffect(() => {\n if (!url || !enabled) {\n cleanup();\n setStatus('disconnected');\n return;\n }\n\n setMessages([]);\n setLatest(undefined);\n doConnect();\n\n return () => {\n closedByUser.current = true;\n cleanup();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, enabled]);\n\n return {\n send,\n sendRaw,\n messages,\n latest,\n status,\n isConnected: status === 'connected',\n error,\n connect: doConnect,\n disconnect,\n clear,\n reconnectCount,\n };\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────\n\nfunction defaultParse<T>(raw: string): T {\n return JSON.parse(raw) as T;\n}\n\nfunction defaultSerialize(data: unknown): string {\n return JSON.stringify(data);\n}\n\n/** Resolve relative paths to ws:// or wss:// using the configured API origin */\nfunction resolveWsUrl(url: string): string {\n if (url.startsWith('ws://') || url.startsWith('wss://')) {\n return url;\n }\n const path = url.startsWith('/') ? url : `/${url}`;\n // Use configured API gateway origin when available, otherwise fall back to current origin\n if (typeof window !== 'undefined') {\n const cfg = (window as unknown as Record<string, unknown>)['__KB_STUDIO_CONFIG__'] as Record<string, string> | undefined;\n const base = cfg?.KB_API_BASE_URL;\n if (base) {\n try {\n const origin = new URL(base).origin;\n const proto = origin.startsWith('https') ? 'wss:' : 'ws:';\n return `${proto}//${new URL(origin).host}${path}`;\n } catch { /* fall through */ }\n }\n }\n const proto = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n return `${proto}//${window.location.host}${path}`;\n}\n","import { useCallback } from 'react';\nimport { usePageContext } from './page-context.js';\n\nexport interface UsePermissionsReturn {\n /** Check if the current user has a specific permission */\n hasPermission: (permission: string) => boolean;\n /** All permissions available to this page */\n permissions: string[];\n}\n\n/**\n * Atomic permission checks inside a page.\n * Page-level permissions are enforced by the host before loading.\n * This hook is for fine-grained control within the page.\n *\n * @example\n * ```tsx\n * const { hasPermission } = usePermissions();\n * if (!hasPermission('commit:write')) return <ReadOnlyView />;\n * ```\n */\nexport function usePermissions(): UsePermissionsReturn {\n const { permissions } = usePageContext();\n\n const hasPermission = useCallback(\n (permission: string) => permissions.includes(permission),\n [permissions],\n );\n\n return { hasPermission, permissions };\n}\n","import { useCallback } from 'react';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nexport interface UseNavigationReturn {\n /** Navigate to a route */\n navigate: (path: string) => void;\n /** Current pathname */\n currentPath: string;\n /** Go back in history */\n goBack: () => void;\n /** Open external URL in new tab */\n openExternal: (url: string) => void;\n}\n\n/**\n * Navigation hook for plugin pages.\n *\n * @example\n * ```tsx\n * const { navigate, currentPath } = useNavigation();\n * navigate('/commit/history');\n * ```\n */\nexport function useNavigation(): UseNavigationReturn {\n const nav = useNavigate();\n const location = useLocation();\n\n const navigate = useCallback((path: string) => nav(path), [nav]);\n const goBack = useCallback(() => nav(-1), [nav]);\n const openExternal = useCallback((url: string) => window.open(url, '_blank', 'noopener'), []);\n\n return {\n navigate,\n currentPath: location.pathname,\n goBack,\n openExternal,\n };\n}\n","import { useCallback } from 'react';\nimport { notification } from 'antd';\n\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info';\n\nexport interface UseNotificationReturn {\n notify: (options: {\n type: NotificationType;\n message: string;\n description?: string;\n duration?: number;\n }) => void;\n success: (message: string, description?: string) => void;\n error: (message: string, description?: string) => void;\n warning: (message: string, description?: string) => void;\n info: (message: string, description?: string) => void;\n}\n\n/**\n * Notification hook for plugin pages.\n *\n * @example\n * ```tsx\n * const notify = useNotification();\n * notify.success('Commit created');\n * notify.error('Build failed', 'Check logs for details');\n * ```\n */\nexport function useNotification(): UseNotificationReturn {\n const notify = useCallback(\n (opts: { type: NotificationType; message: string; description?: string; duration?: number }) => {\n notification[opts.type]({\n message: opts.message,\n description: opts.description,\n duration: opts.duration ?? 4.5,\n });\n },\n [],\n );\n\n const success = useCallback(\n (message: string, description?: string) => notify({ type: 'success', message, description }),\n [notify],\n );\n const error = useCallback(\n (message: string, description?: string) => notify({ type: 'error', message, description }),\n [notify],\n );\n const warning = useCallback(\n (message: string, description?: string) => notify({ type: 'warning', message, description }),\n [notify],\n );\n const info = useCallback(\n (message: string, description?: string) => notify({ type: 'info', message, description }),\n [notify],\n );\n\n return { notify, success, error, warning, info };\n}\n","import * as React from 'react';\nimport { theme } from 'antd';\nimport {\n colors,\n spacing,\n typography,\n radius,\n shadows,\n lightSemanticColors,\n darkSemanticColors,\n} from '@kb-labs/studio-ui-core';\n\n/**\n * Semantic tokens — theme-aware colors for backgrounds, text, borders, status.\n * These mirror the CSS variables injected by Studio host (e.g. `var(--bg-primary)`).\n */\nexport interface SemanticTokens {\n bgPrimary: string;\n bgSecondary: string;\n bgTertiary: string;\n textPrimary: string;\n textSecondary: string;\n textTertiary: string;\n textInverse: string;\n borderPrimary: string;\n borderSecondary: string;\n link: string;\n linkHover: string;\n accentSubtle: string;\n success: string;\n warning: string;\n error: string;\n info: string;\n disabled: string;\n shadow: string;\n}\n\nexport interface UseThemeReturn {\n /** Current theme mode */\n mode: 'light' | 'dark';\n /** Ant Design design token */\n antdToken: ReturnType<typeof theme.useToken>['token'];\n /** KB Labs semantic tokens (theme-aware) */\n semantic: SemanticTokens;\n /** Raw design tokens (colors, spacing, typography, radius, shadows) */\n tokens: {\n colors: typeof colors;\n spacing: typeof spacing;\n typography: typeof typography;\n radius: typeof radius;\n shadows: typeof shadows;\n };\n}\n\nconst LIGHT_SEMANTIC: SemanticTokens = {\n bgPrimary: lightSemanticColors['bg-primary'],\n bgSecondary: lightSemanticColors['bg-secondary'],\n bgTertiary: lightSemanticColors['bg-tertiary'],\n textPrimary: lightSemanticColors['text-primary'],\n textSecondary: lightSemanticColors['text-secondary'],\n textTertiary: lightSemanticColors['text-tertiary'],\n textInverse: lightSemanticColors['text-inverse'],\n borderPrimary: lightSemanticColors['border-primary'],\n borderSecondary: lightSemanticColors['border-secondary'],\n link: lightSemanticColors['link'],\n linkHover: lightSemanticColors['link-hover'],\n accentSubtle: lightSemanticColors['accent-subtle'],\n success: lightSemanticColors['success'],\n warning: lightSemanticColors['warning'],\n error: lightSemanticColors['error'],\n info: lightSemanticColors['info'],\n disabled: lightSemanticColors['disabled'],\n shadow: lightSemanticColors['shadow'],\n};\n\nconst DARK_SEMANTIC: SemanticTokens = {\n bgPrimary: darkSemanticColors['bg-primary'],\n bgSecondary: darkSemanticColors['bg-secondary'],\n bgTertiary: darkSemanticColors['bg-tertiary'],\n textPrimary: darkSemanticColors['text-primary'],\n textSecondary: darkSemanticColors['text-secondary'],\n textTertiary: darkSemanticColors['text-tertiary'],\n textInverse: darkSemanticColors['text-inverse'],\n borderPrimary: darkSemanticColors['border-primary'],\n borderSecondary: darkSemanticColors['border-secondary'],\n link: darkSemanticColors['link'],\n linkHover: darkSemanticColors['link-hover'],\n accentSubtle: darkSemanticColors['accent-subtle'],\n success: darkSemanticColors['success'],\n warning: darkSemanticColors['warning'],\n error: darkSemanticColors['error'],\n info: darkSemanticColors['info'],\n disabled: darkSemanticColors['disabled'],\n shadow: darkSemanticColors['shadow'],\n};\n\n/**\n * Theme hook for plugin pages.\n *\n * Three levels of access:\n * - `semantic` — high-level themed tokens (bgPrimary, textPrimary, success, error...)\n * - `antdToken` — Ant Design's full design token for antd component customization\n * - `tokens` — raw design tokens (colors, spacing, typography, radius, shadows)\n *\n * CSS variables (`var(--bg-primary)`, `var(--text-primary)`) are also available\n * in stylesheets — injected by the Studio host into `:root`.\n *\n * @example\n * ```tsx\n * const { semantic, tokens, mode } = useTheme();\n *\n * // Semantic tokens (recommended)\n * <div style={{ color: semantic.textPrimary, background: semantic.bgSecondary }}>\n *\n * // CSS variables in stylesheets\n * // .my-component { color: var(--text-primary); }\n *\n * // Raw tokens for specific shades\n * <div style={{ color: tokens.colors.primary[600] }}>\n * ```\n */\nfunction getResolvedTheme(): 'light' | 'dark' {\n if (typeof document === 'undefined') { return 'light'; }\n return document.documentElement.classList.contains('dark') ? 'dark' : 'light';\n}\n\nexport function useTheme(): UseThemeReturn {\n const { token: antdToken } = theme.useToken();\n\n const [mode, setMode] = React.useState<'light' | 'dark'>(getResolvedTheme);\n\n React.useEffect(() => {\n const observer = new MutationObserver(() => {\n setMode(getResolvedTheme());\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => observer.disconnect();\n }, []);\n\n return {\n mode,\n antdToken,\n semantic: mode === 'dark' ? DARK_SEMANTIC : LIGHT_SEMANTIC,\n tokens: { colors, spacing, typography, radius, shadows },\n };\n}\n","import type { ThemeConfig } from 'antd';\nimport { theme as antdTheme } from 'antd';\n\ntype MappingAlgorithm = typeof antdTheme.defaultAlgorithm;\n\n/**\n * Maps CSS variables from ui-core to Ant Design tokens\n * Uses CSS variables directly via var() for automatic theme switching\n * This adapter maintains framework-agnostic nature of ui-core\n * All Ant Design tokens are mapped to our CSS variables for consistency\n */\nexport function getAntDesignTokens(): ThemeConfig['token'] {\n // CSS variables automatically change based on .light/.dark classes\n // We use var() references so they update reactively\n // Map all Ant Design tokens to our CSS variables for complete theme consistency\n \n return {\n // ============ Primary Colors ============\n colorPrimary: 'var(--link, #0c66ff)',\n colorPrimaryHover: 'var(--link-hover, #0050cc)',\n colorPrimaryActive: 'var(--link-hover, #0050cc)',\n colorPrimaryBg: 'var(--accent-subtle, #dbeafe)', // Light primary background\n colorPrimaryBgHover: 'var(--accent-subtle, #dbeafe)',\n colorPrimaryBorder: 'var(--link, #0c66ff)',\n colorPrimaryBorderHover: 'var(--link-hover, #0050cc)',\n colorPrimaryText: 'var(--link, #0c66ff)',\n colorPrimaryTextHover: 'var(--link-hover, #0050cc)',\n colorPrimaryTextActive: 'var(--link-hover, #0050cc)',\n\n // ============ Success Colors ============\n colorSuccess: 'var(--success, #16A34A)',\n colorSuccessHover: 'var(--success, #16A34A)', // Use same color\n colorSuccessActive: 'var(--success, #16A34A)',\n colorSuccessBg: 'var(--bg-tertiary, #F3F4F6)', // Light background, could be success-specific\n colorSuccessBgHover: 'var(--bg-tertiary, #F3F4F6)',\n colorSuccessBorder: 'var(--success, #16A34A)',\n colorSuccessBorderHover: 'var(--success, #16A34A)',\n colorSuccessText: 'var(--success, #16A34A)',\n colorSuccessTextHover: 'var(--success, #16A34A)',\n colorSuccessTextActive: 'var(--success, #16A34A)',\n\n // ============ Warning Colors ============\n colorWarning: 'var(--warning, #F59E0B)',\n colorWarningHover: 'var(--warning, #F59E0B)',\n colorWarningActive: 'var(--warning, #F59E0B)',\n colorWarningBg: 'var(--bg-tertiary, #F3F4F6)',\n colorWarningBgHover: 'var(--bg-tertiary, #F3F4F6)',\n colorWarningBorder: 'var(--warning, #F59E0B)',\n colorWarningBorderHover: 'var(--warning, #F59E0B)',\n colorWarningText: 'var(--warning, #F59E0B)',\n colorWarningTextHover: 'var(--warning, #F59E0B)',\n colorWarningTextActive: 'var(--warning, #F59E0B)',\n colorWarningOutline: 'rgba(245, 158, 11, 0.2)', // NEW: Warning outline\n\n // ============ Error Colors ============\n colorError: 'var(--error, #DC2626)',\n colorErrorHover: 'var(--error, #DC2626)',\n colorErrorActive: 'var(--error, #DC2626)',\n colorErrorBg: 'var(--bg-tertiary, #F3F4F6)',\n colorErrorBgHover: 'var(--bg-tertiary, #F3F4F6)',\n colorErrorBorder: 'var(--error, #DC2626)',\n colorErrorBorderHover: 'var(--error, #DC2626)',\n colorErrorText: 'var(--error, #DC2626)',\n colorErrorTextHover: 'var(--error, #DC2626)',\n colorErrorTextActive: 'var(--error, #DC2626)',\n colorErrorOutline: 'rgba(220, 38, 38, 0.2)', // NEW: Error outline\n\n // ============ Info Colors ============\n colorInfo: 'var(--info, #0EA5E9)',\n colorInfoHover: 'var(--info, #0EA5E9)',\n colorInfoActive: 'var(--info, #0EA5E9)',\n colorInfoBg: 'var(--bg-tertiary, #F3F4F6)',\n colorInfoBgHover: 'var(--bg-tertiary, #F3F4F6)',\n colorInfoBorder: 'var(--info, #0EA5E9)',\n colorInfoBorderHover: 'var(--info, #0EA5E9)',\n colorInfoText: 'var(--info, #0EA5E9)',\n colorInfoTextHover: 'var(--info, #0EA5E9)',\n colorInfoTextActive: 'var(--info, #0EA5E9)',\n\n // ============ Background Colors ============\n colorBgContainer: 'var(--bg-secondary, #FFFFFF)',\n colorBgBase: 'var(--bg-primary, #F9FAFB)',\n colorBgElevated: 'var(--bg-secondary, #FFFFFF)',\n colorBgLayout: 'var(--bg-primary, #F9FAFB)',\n colorBgSpotlight: 'var(--bg-tertiary, #F3F4F6)',\n colorBgMask: 'rgba(0, 0, 0, 0.45)', // Overlay/modal backdrop - use standard dark overlay\n colorBgTextHover: 'var(--bg-hover, #F3F4F6)', // NEW: Text hover background\n colorBgTextActive: 'var(--bg-hover, #F3F4F6)', // NEW: Text active background\n colorBgContainerDisabled: 'var(--bg-tertiary, #F3F4F6)', // NEW: Disabled container bg\n\n // ============ Text Colors ============\n colorText: 'var(--text-primary, #111827)',\n colorTextBase: 'var(--text-primary, #111827)', // NEW: Base text color\n colorTextSecondary: 'var(--text-secondary, #6B7280)',\n colorTextTertiary: 'var(--text-tertiary, #6B7280)',\n colorTextQuaternary: 'var(--text-tertiary, #6B7280)', // Use tertiary as fallback\n colorTextDisabled: 'var(--disabled, #9CA3AF)',\n colorTextHeading: 'var(--text-primary, #111827)', // Headings use primary text\n colorTextLabel: 'var(--text-secondary, #6B7280)', // Labels use secondary\n colorTextDescription: 'var(--text-secondary, #6B7280)', // Descriptions use secondary\n colorTextPlaceholder: 'var(--text-tertiary, #6B7280)', // Placeholders use tertiary\n colorTextLightSolid: 'var(--text-inverse, #FFFFFF)', // NEW: Text on colored backgrounds\n\n // ============ Border Colors ============\n colorBorder: 'var(--border-primary, #E5E7EB)',\n colorBorderSecondary: 'var(--border-secondary, #D4D4D4)',\n colorBorderBg: 'var(--bg-secondary, #FFFFFF)', // NEW: Background border color\n colorSplit: 'var(--border-primary, #E5E7EB)', // Splitter/divider uses primary border\n\n // ============ Fill Colors (for input backgrounds, etc.) ============\n colorFill: 'var(--bg-tertiary, #F3F4F6)', // Fill uses tertiary background\n colorFillSecondary: 'var(--bg-tertiary, #F3F4F6)', // Used for table row hover\n colorFillTertiary: 'var(--bg-primary, #F9FAFB)', // Used for table header backgrounds\n colorFillQuaternary: 'var(--bg-primary, #F9FAFB)',\n colorFillContent: 'var(--bg-hover, #F3F4F6)', // NEW: Content area fill\n colorFillContentHover: 'var(--bg-hover, #F3F4F6)', // NEW: Content hover fill\n colorFillAlter: 'var(--bg-tertiary, #F3F4F6)', // NEW: Alternative fill\n\n // ============ Neutral Colors ============\n colorWhite: '#FFFFFF', // Always white\n\n // ============ Shadow ============\n // Soft, diffuse shadows (matches kblabs.ru marketing site) instead of antd's tighter default stack\n boxShadow: '0 2px 24px rgba(0,0,0,0.07)',\n boxShadowSecondary: '0 4px 32px rgba(0,0,0,0.08)',\n boxShadowTertiary: '0 8px 48px rgba(0,0,0,0.10)',\n\n // ============ Border Radius ============\n // Matches kblabs.ru radius scale (8/10/12/16/20/24/999) instead of antd's default 6/8/4\n borderRadius: 10,\n borderRadiusLG: 16,\n borderRadiusSM: 8,\n borderRadiusXS: 6,\n borderRadiusOuter: 8,\n\n // ============ Control Heights ============\n controlHeight: 36,\n controlHeightLG: 40,\n controlHeightSM: 28,\n controlHeightXS: 22,\n\n // ============ Font Family ============\n fontFamily: \"var(--font-body, 'Geist Sans', 'Segoe UI', sans-serif)\",\n\n // ============ Font Sizes ============\n fontSize: 14,\n fontSizeLG: 16,\n fontSizeSM: 12,\n fontSizeXL: 20,\n fontSizeHeading1: 38,\n fontSizeHeading2: 30,\n fontSizeHeading3: 24,\n fontSizeHeading4: 20,\n fontSizeHeading5: 16,\n fontSizeIcon: 12,\n\n // ============ Font Weights ============\n fontWeightStrong: 600,\n lineHeight: 1.5714285714285714,\n lineHeightLG: 1.5,\n lineHeightSM: 1.6666666666666667,\n\n // ============ Padding ============\n padding: 16,\n paddingLG: 24,\n paddingSM: 12,\n paddingXS: 8,\n paddingXXS: 4,\n\n // ============ Margin ============\n margin: 16,\n marginLG: 24,\n marginSM: 12,\n marginXS: 8,\n marginXXS: 4,\n\n // ============ Motion ============\n motionDurationFast: '0.1s',\n motionDurationMid: '0.2s',\n motionDurationSlow: '0.3s',\n motionEaseInOut: 'cubic-bezier(0.645, 0.045, 0.355, 1)',\n motionEaseOut: 'cubic-bezier(0.215, 0.61, 0.355, 1)',\n\n // ============ Link ============\n colorLink: 'var(--link, #0c66ff)',\n colorLinkHover: 'var(--link-hover, #0050cc)',\n colorLinkActive: 'var(--link-hover, #0050cc)',\n\n // ============ Icons & Highlights ============\n colorIcon: 'var(--text-secondary, #6B7280)', // NEW: Icon color\n colorIconHover: 'var(--text-primary, #111827)', // NEW: Icon hover\n colorHighlight: 'var(--link, #0c66ff)', // NEW: Highlight color\n\n // ============ Control States (Inputs, Buttons, etc.) ============\n controlOutline: 'rgba(12, 102, 255, 0.15)', // NEW: Input outline on focus\n controlOutlineWidth: 2, // NEW: Outline width\n controlInteractiveSize: 16, // NEW: Interactive hit area size\n controlItemBgHover: 'var(--bg-hover, #F3F4F6)', // NEW: Item hover bg\n controlItemBgActive: 'var(--accent-subtle, #dbeafe)', // NEW: Item active bg\n controlItemBgActiveHover: 'var(--accent-subtle, #dbeafe)', // NEW: Item active hover\n controlItemBgActiveDisabled: 'var(--bg-tertiary, #F3F4F6)', // NEW: Disabled active bg\n controlTmpOutline: 'rgba(12, 102, 255, 0.08)', // NEW: Temporary outline\n\n // ============ Screen Sizes (for responsive) ============\n screenXS: 480,\n screenSM: 576,\n screenMD: 768,\n screenLG: 992,\n screenXL: 1200,\n screenXXL: 1600,\n };\n}\n\n/**\n * Gets component-specific theme configurations\n * Uses Ant Design's components API for proper theming without CSS overrides\n */\nexport function getAntDesignComponents(): ThemeConfig['components'] {\n return {\n Table: {\n // Colors\n headerBg: 'var(--bg-tertiary)',\n headerColor: 'var(--text-primary)',\n borderColor: 'var(--border-primary)',\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n\n // Row states (IMPORTANT for UX)\n rowHoverBg: 'var(--bg-hover)',\n rowSelectedBg: 'var(--accent-subtle)', // NEW: Selected row background\n rowSelectedHoverBg: 'var(--accent-subtle)', // NEW: Selected row hover\n rowExpandedBg: 'var(--bg-secondary)', // NEW: Expanded row background\n bodySortBg: 'var(--bg-tertiary)', // NEW: Sorted column background\n\n // Header states\n headerSortActiveBg: 'var(--bg-tertiary)',\n headerSortHoverBg: 'var(--bg-tertiary)',\n headerFilterHoverBg: 'var(--bg-tertiary)',\n fixedHeaderSortActiveBg: 'var(--bg-tertiary)',\n\n // Icons (IMPORTANT for visibility)\n colorIcon: 'var(--text-secondary)',\n colorIconHover: 'var(--text-primary)',\n expandIconBg: 'var(--bg-secondary)',\n\n // Footer\n footerBg: 'var(--bg-tertiary)', // NEW: Table footer background\n footerColor: 'var(--text-primary)', // NEW: Footer text color\n\n // Sizing\n selectionColumnWidth: 60,\n stickyScrollBarBg: 'var(--bg-tertiary)',\n stickyScrollBarBorderRadius: 4,\n },\n Tag: {\n defaultBg: 'var(--bg-tertiary)',\n defaultColor: 'var(--text-primary)',\n colorBorder: 'var(--border-primary)',\n colorSuccess: 'var(--success)',\n colorError: 'var(--error)',\n colorWarning: 'var(--warning)',\n colorInfo: 'var(--info)',\n },\n Badge: {\n colorError: 'var(--error)',\n colorSuccess: 'var(--success)',\n colorWarning: 'var(--warning)',\n colorInfo: 'var(--info)',\n colorText: 'var(--text-primary)',\n },\n Alert: {\n // ============ Status colors ============\n colorSuccess: 'var(--success)',\n colorError: 'var(--error)',\n colorWarning: 'var(--warning)',\n colorInfo: 'var(--info)',\n\n // ============ Text & background ============\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n\n // ============ Icons (IMPORTANT for close button visibility) ============\n colorIcon: 'var(--text-secondary)', // NEW: Icon color (close button)\n colorIconHover: 'var(--text-primary)', // NEW: Icon hover (close button hover)\n\n // ============ Status-specific backgrounds ============\n colorSuccessBg: 'var(--bg-tertiary)', // NEW: Success alert background\n colorErrorBg: 'var(--bg-tertiary)', // NEW: Error alert background\n colorWarningBg: 'var(--bg-tertiary)', // NEW: Warning alert background\n colorInfoBg: 'var(--bg-tertiary)', // NEW: Info alert background\n\n // ============ Status-specific borders ============\n colorSuccessBorder: 'var(--success)', // NEW: Success alert border\n colorErrorBorder: 'var(--error)', // NEW: Error alert border\n colorWarningBorder: 'var(--warning)', // NEW: Warning alert border\n colorInfoBorder: 'var(--info)', // NEW: Info alert border\n },\n Card: {\n // Colors\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n colorBorderSecondary: 'var(--border-primary)',\n\n // Header & Actions (IMPORTANT for visual hierarchy)\n headerBg: 'var(--bg-secondary)', // NEW: Card header background\n actionsBg: 'var(--bg-tertiary)', // NEW: Card actions background\n extraColor: 'var(--text-secondary)', // NEW: Extra area text color\n },\n Descriptions: {\n colorText: 'var(--text-primary)',\n colorTextLabel: 'var(--text-secondary)',\n colorBorder: 'var(--border-primary)',\n },\n Button: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n\n // ============ Primary button ============\n colorPrimary: 'var(--link)',\n colorPrimaryHover: 'var(--link-hover)',\n colorPrimaryActive: 'var(--link-hover)',\n primaryColor: 'var(--text-inverse)',\n primaryShadow: '0 2px 0 rgba(12, 102, 255, 0.15)',\n\n // ============ Default button (filled style) ============\n defaultBg: 'var(--bg-secondary)',\n defaultColor: 'var(--text-primary)',\n defaultBorderColor: 'var(--border-primary)',\n defaultShadow: '0 2px 0 rgba(0, 0, 0, 0.015)',\n\n // Default button - hover states (IMPORTANT for dark theme)\n defaultHoverBg: 'var(--bg-hover)',\n defaultHoverColor: 'var(--text-primary)',\n defaultHoverBorderColor: 'var(--border-secondary)',\n\n // Default button - active states\n defaultActiveBg: 'var(--bg-hover)',\n defaultActiveColor: 'var(--text-primary)',\n defaultActiveBorderColor: 'var(--border-secondary)',\n\n // ============ Ghost button (transparent with border) ============\n ghostBg: 'transparent',\n defaultGhostColor: 'var(--text-primary)', // Text color\n defaultGhostBorderColor: 'var(--border-primary)', // Border color\n\n // Ghost button - active states\n\n // ============ Dashed button (dashed border) ============\n borderColorDisabled: 'var(--border-primary)', // Dashed border uses this\n colorBgContainerDisabled: 'var(--bg-tertiary)', // Disabled background\n\n // ============ Text button (no background, no border) ============\n // CRITICAL: These control icon-only buttons like notification close button!\n textTextColor: 'var(--text-secondary)', // Base text color for text buttons (icons!)\n textTextHoverColor: 'var(--text-primary)', // Text button hover (icon hover!)\n textTextActiveColor: 'var(--text-primary)', // Text button active (icon active!)\n textHoverBg: 'var(--accent-subtle)', // Text button hover background\n\n // ============ Link button (looks like a link) ============\n linkHoverBg: 'transparent',\n colorLink: 'var(--link)',\n colorLinkHover: 'var(--link-hover)',\n colorLinkActive: 'var(--link-hover)',\n\n // ============ Solid button (filled buttons) ============\n solidTextColor: 'var(--text-primary)', // Text color for solid buttons\n\n // ============ Danger button ============\n dangerColor: 'var(--error)', // Danger button text & border color\n dangerShadow: '0 2px 0 rgba(220, 38, 38, 0.1)',\n\n // Danger ghost button\n colorErrorBg: 'transparent', // Ghost danger background\n colorErrorBgHover: 'var(--bg-hover)', // Ghost danger hover\n colorErrorBorder: 'var(--error)', // Ghost danger border\n colorErrorBorderHover: 'var(--error)', // Ghost danger border hover\n colorErrorHover: 'var(--error)', // Ghost danger text hover\n colorErrorActive: 'var(--error)', // Ghost danger text active\n },\n Input: {\n // Base colors\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n colorTextPlaceholder: 'var(--text-tertiary)',\n\n // Interactive states (IMPORTANT for focus feedback)\n hoverBorderColor: 'var(--border-secondary)',\n activeBorderColor: 'var(--link)',\n activeShadow: '0 0 0 3px rgba(12, 102, 255, 0.12)', // NEW: Focus shadow\n errorActiveShadow: '0 0 0 2px rgba(220, 38, 38, 0.1)', // NEW: Error focus shadow\n warningActiveShadow: '0 0 0 2px rgba(245, 158, 11, 0.1)', // NEW: Warning focus shadow\n\n // Clear icon (IMPORTANT for visibility)\n colorIcon: 'var(--text-secondary)', // NEW: Clear icon color\n colorIconHover: 'var(--text-primary)', // NEW: Clear icon hover\n },\n Select: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)', // Input background\n colorBorder: 'var(--border-primary)', // Input border\n colorBgElevated: 'var(--bg-secondary)', // Dropdown panel background\n colorTextPlaceholder: 'var(--text-tertiary)', // Placeholder text\n\n // ============ Primary & status colors ============\n colorPrimary: 'var(--link)', // Selected item marker color\n colorPrimaryHover: 'var(--link-hover)', // Selected item hover\n\n // ============ Options/items (IMPORTANT for selection feedback) ============\n optionSelectedBg: 'var(--accent-subtle)', // Selected option background\n optionSelectedColor: 'var(--link)', // Selected option text color\n optionActiveBg: 'var(--bg-hover)', // Option hover background\n optionSelectedFontWeight: 600, // Bold for selected items\n\n // ============ Multiple select (tags mode) ============\n multipleItemBg: 'var(--bg-tertiary)', // Tag background\n multipleItemBorderColor: 'var(--border-primary)', // Tag border\n multipleItemColorDisabled: 'var(--disabled)', // Disabled tag color\n\n // ============ Icons (IMPORTANT for visibility) ============\n colorIcon: 'var(--text-secondary)', // Dropdown arrow, clear icon\n colorIconHover: 'var(--text-primary)', // Icon hover\n\n // ============ Selector (input area) ============\n selectorBg: 'var(--bg-secondary)', // Selector background\n },\n Dropdown: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)', // Dropdown panel background\n colorBorder: 'var(--border-primary)',\n colorTextDisabled: 'var(--disabled)',\n\n // ============ Item states (IMPORTANT for visual feedback) ============\n controlItemBgHover: 'var(--bg-hover)', // Item hover background\n controlItemBgActive: 'var(--accent-subtle)', // Selected item background\n controlItemBgActiveHover: 'var(--accent-subtle)', // Selected item hover\n\n // ============ Colors for items ============\n colorPrimary: 'var(--link)', // Primary color for selected items\n colorPrimaryHover: 'var(--link-hover)', // Primary hover\n\n // ============ Dropdown.Button specific ============\n colorBgContainer: 'var(--bg-secondary)', // Button background\n colorSplit: 'var(--border-primary)', // Split line between button parts\n\n // ============ Padding & sizing ============\n paddingBlock: 8, // Vertical padding for items\n controlPaddingHorizontal: 12, // Horizontal padding for items\n },\n Menu: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorTextSecondary: 'var(--text-secondary)', // NEW: Secondary text in menu items\n colorBgContainer: 'var(--bg-sidebar)', // Menu background\n colorBorder: 'var(--border-primary)', // NEW: Border color\n colorSplit: 'var(--border-primary)', // NEW: Divider color\n\n // ============ Item colors (IMPORTANT for visibility) ============\n itemColor: 'var(--text-primary)', // NEW: Default item text color\n itemBg: 'var(--bg-secondary)', // NEW: Item background\n\n // ============ Hover states (IMPORTANT for feedback) ============\n itemHoverBg: 'var(--bg-hover)', // Item hover background\n itemHoverColor: 'var(--link)', // Item hover text color\n\n // ============ Selected states ============\n // Accent as a point (thin left bar, see .ant-menu-item-selected override in kb-sidebar.module.css)\n // not a filled pill — matches the rest of the kit's \"no tinted background\" rule\n itemSelectedBg: 'transparent',\n itemSelectedColor: 'var(--link)', // Selected item text color\n\n // ============ Active states ============\n itemActiveBg: 'transparent',\n\n // ============ Dark theme specific ============\n darkItemBg: 'var(--bg-secondary)', // NEW: Dark mode item background\n darkItemColor: 'var(--text-primary)', // NEW: Dark mode item text\n darkItemHoverBg: 'var(--bg-hover)', // NEW: Dark mode hover\n darkItemSelectedBg: 'transparent', // Dark mode selected — accent line, not a fill\n darkItemSelectedColor: 'var(--link)', // Dark mode selected text\n darkSubMenuItemBg: 'var(--bg-secondary)', // NEW: Dark mode submenu background\n\n // ============ SubMenu (dropdown menus) ============\n subMenuItemBg: 'var(--bg-secondary)', // Submenu background\n popupBg: 'var(--bg-secondary)', // NEW: Popup menu background\n\n // ============ Primary color ============\n colorPrimary: 'var(--link)', // Primary color for active elements\n\n // ============ Icons (IMPORTANT for visibility) ============\n colorIcon: 'var(--text-secondary)', // NEW: Icon color\n colorIconHover: 'var(--text-primary)', // NEW: Icon hover\n\n // ============ Group title ============\n groupTitleColor: 'var(--text-tertiary)',\n groupTitleFontSize: 11,\n\n // ============ Item border radius ============\n itemBorderRadius: 8,\n subMenuItemBorderRadius: 6,\n\n // ============ Padding ============\n itemPaddingInline: 12,\n },\n Tabs: {\n // Base colors\n colorText: 'var(--text-secondary)',\n colorTextHeading: 'var(--text-primary)',\n colorBorder: 'var(--border-primary)',\n colorBorderSecondary: 'var(--border-primary)',\n\n // Interactive states (IMPORTANT for tab navigation feedback)\n colorPrimary: 'var(--link)',\n itemHoverColor: 'var(--link)', // Tab hover color\n itemSelectedColor: 'var(--link)', // Selected tab color\n itemActiveColor: 'var(--link)', // Active tab color\n inkBarColor: 'var(--link)', // Active tab underline\n\n },\n Modal: {\n // Content colors\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n\n // Header & Footer\n headerBg: 'var(--bg-secondary)', // NEW: Modal header background\n footerBg: 'var(--bg-tertiary)', // NEW: Modal footer background\n contentBg: 'var(--bg-secondary)', // NEW: Modal content background\n\n // Close icon (IMPORTANT for visibility)\n colorIcon: 'var(--text-secondary)', // NEW: Close icon color\n colorIconHover: 'var(--text-primary)', // NEW: Close icon hover\n },\n Drawer: {\n // Content colors\n colorText: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n\n // Close icon (IMPORTANT for visibility)\n colorIcon: 'var(--text-secondary)', // NEW: Close icon color\n colorIconHover: 'var(--text-primary)', // NEW: Close icon hover\n },\n Popover: {\n colorText: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n },\n Tooltip: {\n colorText: 'var(--text-primary)',\n colorBgSpotlight: 'var(--bg-secondary)',\n colorTextLightSolid: 'var(--text-primary)',\n },\n List: {\n // Base colors\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBorder: 'var(--border-primary)',\n colorSplit: 'var(--border-primary)',\n\n metaMarginBottom: 8, // Meta info spacing\n avatarMarginRight: 16, // NEW: Avatar spacing\n },\n Switch: {\n colorPrimary: 'var(--link)',\n colorPrimaryHover: 'var(--link-hover)',\n },\n Radio: {\n colorPrimary: 'var(--link)',\n colorText: 'var(--text-primary)',\n buttonCheckedBg: 'var(--link)',\n buttonCheckedBgDisabled: 'var(--disabled)',\n buttonColor: 'var(--text-primary)',\n buttonSolidCheckedColor: 'var(--text-inverse)',\n buttonSolidCheckedBg: 'var(--link)',\n buttonSolidCheckedHoverBg: 'var(--link-hover)',\n buttonSolidCheckedActiveBg: 'var(--link-hover)',\n },\n Checkbox: {\n colorPrimary: 'var(--link)',\n colorText: 'var(--text-primary)',\n },\n DatePicker: {\n // Base colors\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n colorTextPlaceholder: 'var(--text-tertiary)',\n colorTextDisabled: 'var(--disabled)',\n\n // Interactive states (IMPORTANT for date selection feedback)\n colorLink: 'var(--link)', // Selected date color\n colorLinkHover: 'var(--link-hover)', // Date hover color\n cellHoverBg: 'var(--bg-hover)', // NEW: Date cell hover background\n cellActiveWithRangeBg: 'var(--accent-subtle)', // NEW: Range selection background\n cellBgDisabled: 'var(--bg-tertiary)', // NEW: Disabled date background\n\n // Icons (IMPORTANT for visibility)\n colorIcon: 'var(--text-secondary)', // NEW: Calendar icon color\n colorIconHover: 'var(--text-primary)', // NEW: Calendar icon hover\n },\n Form: {\n colorText: 'var(--text-primary)',\n colorTextLabel: 'var(--text-secondary)',\n colorError: 'var(--error)',\n colorWarning: 'var(--warning)',\n },\n Pagination: {\n // Base colors\n colorText: 'var(--text-primary)',\n colorTextDisabled: 'var(--disabled)',\n colorBgContainer: 'var(--bg-secondary)',\n\n // Interactive states (IMPORTANT for navigation feedback)\n colorPrimary: 'var(--link)', // Active page background\n colorPrimaryHover: 'var(--link-hover)', // Active page hover\n itemBg: 'var(--bg-secondary)', // NEW: Page item background\n itemActiveBg: 'var(--link)', // NEW: Active page background\n itemActiveBgDisabled: 'var(--bg-tertiary)', // NEW: Disabled active page\n itemInputBg: 'var(--bg-secondary)', // NEW: Quick jumper input background\n itemLinkBg: 'var(--bg-secondary)', // NEW: Page link background\n\n // Hover states (IMPORTANT for visual feedback)\n colorBgTextHover: 'var(--bg-hover)', // NEW: Page item hover background\n },\n Steps: {\n colorText: 'var(--text-primary)',\n colorTextDescription: 'var(--text-secondary)',\n colorPrimary: 'var(--link)',\n colorBorder: 'var(--border-primary)',\n },\n Breadcrumb: {\n colorText: 'var(--text-secondary)',\n colorTextDescription: 'var(--text-tertiary)',\n linkColor: 'var(--link)',\n linkHoverColor: 'var(--link-hover)',\n separatorColor: 'var(--text-tertiary)',\n },\n Progress: {\n colorText: 'var(--text-primary)',\n colorSuccess: 'var(--success)',\n colorError: 'var(--error)',\n remainingColor: 'var(--bg-tertiary)',\n },\n Skeleton: {\n colorFill: 'var(--bg-tertiary)',\n colorFillContent: 'var(--bg-hover)',\n },\n Spin: {\n colorPrimary: 'var(--link)',\n colorBgContainer: 'var(--bg-secondary)',\n },\n Divider: {\n colorSplit: 'var(--border-primary)',\n colorText: 'var(--text-secondary)',\n },\n Layout: {\n headerBg: 'var(--bg-secondary)',\n bodyBg: 'var(--bg-primary)',\n triggerBg: 'var(--bg-tertiary)',\n colorText: 'var(--text-primary)',\n },\n Collapse: {\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBorder: 'var(--border-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n headerBg: 'var(--bg-tertiary)',\n },\n Carousel: {\n colorBgContainer: 'var(--bg-secondary)',\n dotActiveWidth: 24,\n },\n Anchor: {\n colorPrimary: 'var(--link)',\n colorText: 'var(--text-secondary)',\n linkPaddingBlock: 4,\n },\n Timeline: {\n colorText: 'var(--text-primary)',\n colorTextDescription: 'var(--text-secondary)',\n tailColor: 'var(--border-primary)',\n dotBg: 'var(--bg-secondary)',\n },\n Transfer: {\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n controlItemBgActive: 'var(--bg-hover)',\n },\n Tree: {\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorPrimary: 'var(--link)',\n nodeHoverBg: 'var(--bg-hover)',\n nodeSelectedBg: 'var(--accent-subtle)',\n },\n TreeSelect: {\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n nodeHoverBg: 'var(--bg-hover)',\n nodeSelectedBg: 'var(--accent-subtle)',\n },\n Cascader: {\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n optionSelectedBg: 'var(--bg-hover)',\n },\n Segmented: {\n colorText: 'var(--text-primary)',\n colorTextLabel: 'var(--text-secondary)',\n colorBgLayout: 'var(--bg-tertiary)',\n itemSelectedBg: 'var(--bg-secondary)',\n itemSelectedColor: 'var(--link)',\n itemHoverBg: 'var(--bg-hover)',\n },\n Rate: {\n colorText: 'var(--warning)',\n },\n Slider: {\n colorPrimary: 'var(--link)',\n colorPrimaryBorder: 'var(--link)',\n trackBg: 'var(--bg-tertiary)',\n trackHoverBg: 'var(--bg-hover)',\n },\n Upload: {\n colorText: 'var(--text-primary)',\n colorTextDescription: 'var(--text-secondary)',\n colorBorder: 'var(--border-primary)',\n colorFillAlter: 'var(--bg-tertiary)',\n colorPrimary: 'var(--link)',\n },\n Calendar: {\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n itemActiveBg: 'var(--accent-subtle)',\n },\n Image: {\n colorTextLightSolid: 'var(--text-primary)',\n colorBgMask: 'rgba(0, 0, 0, 0.45)',\n },\n Statistic: {\n colorText: 'var(--text-primary)',\n colorTextDescription: 'var(--text-secondary)',\n },\n Result: {\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorTextDescription: 'var(--text-secondary)',\n },\n Empty: {\n colorText: 'var(--text-secondary)',\n colorTextDescription: 'var(--text-tertiary)',\n },\n Message: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)', // Message background\n contentBg: 'var(--bg-secondary)', // NEW: Content background\n contentPadding: '10px 16px', // NEW: Message padding\n\n // ============ Status colors ============\n colorSuccess: 'var(--success)',\n colorError: 'var(--error)',\n colorWarning: 'var(--warning)',\n colorInfo: 'var(--info)',\n },\n Notification: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)', // Notification background\n colorBorder: 'var(--border-primary)',\n\n // ============ Close icon (IMPORTANT for visibility in dark theme!) ============\n colorIcon: 'var(--text-secondary)', // NEW: Close button icon color\n colorIconHover: 'var(--text-primary)', // NEW: Close button hover color\n\n // ============ Status colors ============\n colorSuccess: 'var(--success)',\n colorError: 'var(--error)',\n colorWarning: 'var(--warning)',\n colorInfo: 'var(--info)',\n },\n };\n}\n\n/**\n * Gets algorithm for Ant Design theme (for dark/light mode)\n */\nexport function getThemeAlgorithm(theme: 'light' | 'dark' | 'auto' = 'light'): MappingAlgorithm {\n const actualTheme = theme === 'auto' \n ? (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n : theme;\n\n return actualTheme === 'dark' ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm;\n}\n\n"]}
1
+ {"version":3,"sources":["../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/page-context.tsx","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-page.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-event-bus.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-data.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-sse.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-elapsed-timer.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-infinite-data.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-websocket.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-permissions.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-navigation.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-notification.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/use-theme.ts","../../home/runner/work/kb-labs/kb-labs/studio/hooks/src/theme-adapter.ts"],"names":["useRef","useCallback","useEffect","useState","defaultParse","proto"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext, type ReactNode } from 'react';\n\n/**\n * Page context — provided to every plugin page by the host.\n */\nexport interface PageContext {\n /** Page ID from the manifest */\n pageId: string;\n /** Plugin that owns this page */\n pluginId: string;\n /** Additional config passed to this page instance */\n config: Record<string, unknown>;\n /** User permissions applicable to this page */\n permissions: string[];\n}\n\nconst PageCtx = createContext<PageContext | null>(null);\n\nexport interface PageContextProviderProps {\n children: ReactNode;\n value: PageContext;\n}\n\nexport function PageContextProvider({ children, value }: PageContextProviderProps) {\n return <PageCtx.Provider value={value}>{children}</PageCtx.Provider>;\n}\n\nexport function usePageContext(): PageContext {\n const ctx = useContext(PageCtx);\n if (!ctx) {\n throw new Error('usePage() must be used inside a PageContextProvider (are you inside a Studio page?)');\n }\n return ctx;\n}\n","import { usePageContext, type PageContext } from './page-context.js';\n\n/**\n * Access the current page context.\n *\n * @example\n * ```tsx\n * const { pageId, pluginId, permissions } = usePage();\n * ```\n */\nexport function usePage(): PageContext {\n return usePageContext();\n}\n","import { useEffect, useCallback, useRef } from 'react';\nimport { useEventBusContext, type EventHandler } from '@kb-labs/studio-event-bus';\nimport { usePageContext } from './page-context.js';\n\nexport interface UseEventBusReturn {\n /** Publish an event. pluginId/pageId auto-injected from context. */\n publish: <T = unknown>(event: string, payload: T) => void;\n /** Subscribe to an event. Auto-unsubscribes on unmount. Returns manual unsubscribe fn. */\n subscribe: <T = unknown>(event: string, handler: EventHandler<T>) => () => void;\n}\n\n/**\n * EventBus hook for cross-plugin communication.\n *\n * @example\n * ```tsx\n * const bus = useEventBus();\n * bus.publish('commit:completed', { scope });\n * bus.subscribe('quality:scanDone', (payload) => { ... });\n * ```\n */\nexport function useEventBus(): UseEventBusReturn {\n const bus = useEventBusContext();\n const { pluginId, pageId } = usePageContext();\n const unsubs = useRef<Array<() => void>>([]);\n\n // Auto-cleanup all subscriptions on unmount\n useEffect(() => {\n return () => {\n for (const unsub of unsubs.current) {\n unsub();\n }\n unsubs.current = [];\n };\n }, []);\n\n const publish = useCallback(\n <T = unknown>(event: string, payload: T) => {\n bus.publish(event, payload, pluginId, pageId);\n },\n [bus, pluginId, pageId],\n );\n\n const subscribe = useCallback(\n <T = unknown>(event: string, handler: EventHandler<T>) => {\n const unsub = bus.subscribe(event, handler, pluginId, pageId);\n unsubs.current.push(unsub);\n return unsub;\n },\n [bus, pluginId, pageId],\n );\n\n return { publish, subscribe };\n}\n","import { useQuery, useMutation, type UseQueryOptions, type MutateOptions } from '@tanstack/react-query';\n\n// ─── useData ────────────────────────────────────────────────────────\n\nexport interface UseDataOptions<T> {\n /** Polling interval in ms (0 = no polling) */\n pollingMs?: number;\n /** Enable/disable the query */\n enabled?: boolean;\n /** Stale time override in ms */\n staleTime?: number;\n /** Transform response before returning */\n select?: (data: unknown) => T;\n /** Additional query params appended to endpoint */\n params?: Record<string, string | number | boolean>;\n}\n\nexport interface UseDataReturn<T> {\n data: T | undefined;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n refetch: () => Promise<unknown>;\n isFetching: boolean;\n}\n\n/**\n * Data fetching hook wrapping TanStack Query.\n * Fetches from the platform REST API (same origin).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useData<Commit[]>('/v1/plugins/commit/history');\n * const { data: filtered } = useData('/v1/plugins/commit/files', { params: { scope } });\n * ```\n */\nexport function useData<T = unknown>(\n endpoint: string,\n options?: UseDataOptions<T>,\n): UseDataReturn<T> {\n const url = buildUrl(endpoint, options?.params);\n\n const query = useQuery<unknown, Error, T>({\n queryKey: ['studio-data', url],\n queryFn: () => fetchJson(url),\n enabled: options?.enabled,\n staleTime: options?.staleTime,\n refetchInterval: options?.pollingMs || undefined,\n select: options?.select as UseQueryOptions<unknown, Error, T>['select'],\n });\n\n return {\n data: query.data,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n isFetching: query.isFetching,\n };\n}\n\n// ─── useMutateData ──────────────────────────────────────────────────\n\nexport interface MutateDataOptions<TInput> {\n method?: 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** Transform input before sending as request body (useful with dynamic endpoints) */\n mapBody?: (input: TInput) => unknown;\n}\n\nexport interface UseMutateDataReturn<TInput, TOutput> {\n mutate: (input: TInput, options?: MutateOptions<TOutput, Error, TInput>) => void;\n mutateAsync: (input: TInput) => Promise<TOutput>;\n isLoading: boolean;\n isError: boolean;\n error: Error | null;\n data: TOutput | undefined;\n}\n\n/**\n * Mutation hook for POST/PUT/PATCH/DELETE.\n *\n * Endpoint can be a string or a function that receives the input and returns the URL.\n * Use a function when the URL depends on runtime values (e.g. a selected entity ID).\n *\n * @example\n * ```tsx\n * const { mutateAsync } = useMutateData<CommitInput, CommitResult>('/v1/plugins/commit/create');\n * await mutateAsync({ scope, message });\n *\n * // Dynamic endpoint:\n * const { mutate } = useMutateData<RunInput, RunResult>(\n * (input) => `/v1/workflows/${input.workflowId}/runs`,\n * );\n * ```\n */\nexport function useMutateData<TInput = unknown, TOutput = unknown>(\n endpoint: string | ((input: TInput) => string),\n methodOrOptions: 'POST' | 'PUT' | 'PATCH' | 'DELETE' | MutateDataOptions<TInput> = 'POST',\n): UseMutateDataReturn<TInput, TOutput> {\n const opts = typeof methodOrOptions === 'string'\n ? { method: methodOrOptions } as MutateDataOptions<TInput>\n : methodOrOptions;\n const method = opts.method ?? 'POST';\n const mapBody = opts.mapBody;\n\n const mutation = useMutation<TOutput, Error, TInput>({\n mutationFn: async (input: TInput) => {\n const url = typeof endpoint === 'function' ? endpoint(input) : endpoint;\n const payload = mapBody ? mapBody(input) : input;\n const hasBody = payload !== undefined && payload !== null;\n const res = await fetch(`${getApiOrigin()}/api${url}`, {\n method,\n headers: hasBody ? { 'Content-Type': 'application/json' } : {},\n body: hasBody ? JSON.stringify(payload) : undefined,\n });\n if (!res.ok) {\n throw new Error(`${method} ${url} failed: ${res.status} ${res.statusText}`);\n }\n const json = await res.json() as Record<string, unknown>;\n // Unwrap platform envelope { ok, data, meta }\n if (json && typeof json === 'object' && 'ok' in json && 'data' in json) {\n return json.data as TOutput;\n }\n return json as TOutput;\n },\n });\n\n return {\n mutate: mutation.mutate,\n mutateAsync: mutation.mutateAsync,\n isLoading: mutation.isPending,\n isError: mutation.isError,\n error: mutation.error,\n data: mutation.data,\n };\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────\n\n/**\n * Returns the API gateway origin from the runtime config injected by server.js.\n * Falls back to '' (same-origin) when running with a dev proxy.\n */\nfunction getApiOrigin(): string {\n if (typeof window !== 'undefined') {\n const cfg = (window as unknown as Record<string, unknown>)['__KB_STUDIO_CONFIG__'] as Record<string, string> | undefined;\n const base = cfg?.KB_API_BASE_URL;\n if (base) {\n try { return new URL(base).origin; } catch { /* fall through */ }\n }\n }\n return '';\n}\n\nfunction buildUrl(\n endpoint: string,\n params?: Record<string, string | number | boolean>,\n): string {\n if (!params || Object.keys(params).length === 0) { return endpoint; }\n const searchParams = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n searchParams.set(key, String(value));\n }\n }\n const sep = endpoint.includes('?') ? '&' : '?';\n return `${endpoint}${sep}${searchParams.toString()}`;\n}\n\nasync function fetchJson(endpoint: string): Promise<unknown> {\n const res = await fetch(`${getApiOrigin()}/api${endpoint}`);\n if (!res.ok) {\n throw new Error(`GET ${endpoint} failed: ${res.status} ${res.statusText}`);\n }\n const json = await res.json() as Record<string, unknown>;\n // Unwrap platform envelope { ok, data, meta }\n if (json && typeof json === 'object' && 'ok' in json && 'data' in json) {\n return json.data;\n }\n return json;\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\n\n// ─── Types ─────────────────────────────────────────────────────────\n\nexport type SSEConnectionStatus = 'connecting' | 'live' | 'reconnecting' | 'closed';\n\nexport interface UseSSEOptions<T> {\n /** SSE event name(s) to listen on (default: 'message') */\n events?: string | string[];\n /** Event that signals the stream is done (auto-closes connection) */\n doneEvent?: string;\n /** SSE event names that indicate the stream ended cleanly (no error raised on close) */\n terminalEvents?: string[];\n /** Enable/disable the hook (default: true) */\n enabled?: boolean;\n /** Auto-reconnect on error (default: false) */\n reconnect?: boolean;\n /** Max reconnect attempts (default: 5) */\n maxReconnects?: number;\n /** Base reconnect delay in ms, doubles each attempt (default: 2000) */\n reconnectIntervalMs?: number;\n /** Max events to keep in buffer (0 = unlimited, default: 0) */\n maxEvents?: number;\n /** Parse event data (default: JSON.parse) */\n parse?: (raw: string) => T;\n /** Query params appended to endpoint */\n params?: Record<string, string | number | boolean>;\n /** Called on each incoming event */\n onEvent?: (event: T) => void;\n /** Called on connection open */\n onOpen?: () => void;\n /** Called on error (before reconnect) */\n onError?: (error: Error) => void;\n /** Called when done event received or connection closed cleanly */\n onDone?: () => void;\n}\n\nexport interface UseSSEReturn<T> {\n /** Accumulated events */\n events: T[];\n /** Latest event received */\n latest: T | undefined;\n /** Whether EventSource is connected */\n isConnected: boolean;\n /** Granular connection status */\n connectionStatus: SSEConnectionStatus;\n /** True if stream closed via a terminal/done event (not a network error) */\n closedClean: boolean;\n /** Last error (null when closed cleanly) */\n error: Error | null;\n /** Manually close the connection */\n close: () => void;\n /** Clear the event buffer */\n clear: () => void;\n /** Current reconnect attempt count */\n reconnectCount: number;\n}\n\n// ─── Hook ──────────────────────────────────────────────────────────\n\n/**\n * Generic SSE hook for server-sent event streams.\n *\n * Pass `null` as endpoint to keep the hook mounted but inactive.\n *\n * @example\n * ```tsx\n * // Workflow logs\n * const { events, isConnected } = useSSE<LogEvent>(\n * runId ? `/workflows/runs/${runId}/logs` : null,\n * { events: 'workflow.log', doneEvent: 'workflow.done', params: { follow: '1' } },\n * );\n *\n * // Observability log stream with reconnect\n * const { events, latest } = useSSE<LogRecord>('/logs/stream', {\n * params: { level: 'error' },\n * maxEvents: 500,\n * reconnect: true,\n * });\n * ```\n */\nexport function useSSE<T = unknown>(\n endpoint: string | null,\n options: UseSSEOptions<T> = {},\n): UseSSEReturn<T> {\n const {\n events: eventNames = 'message',\n doneEvent,\n terminalEvents,\n enabled = true,\n reconnect = false,\n maxReconnects = 5,\n reconnectIntervalMs = 2000,\n maxEvents = 0,\n parse = defaultParse,\n params,\n onEvent,\n onOpen,\n onError,\n onDone,\n } = options;\n\n const [items, setItems] = useState<T[]>([]);\n const [latest, setLatest] = useState<T | undefined>(undefined);\n const [error, setError] = useState<Error | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [connectionStatus, setConnectionStatus] = useState<SSEConnectionStatus>('closed');\n const [closedClean, setClosedClean] = useState(false);\n const [reconnectCount, setReconnectCount] = useState(0);\n\n const esRef = useRef<EventSource | null>(null);\n const reconnectTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closedByUser = useRef(false);\n const closedByTerminal = useRef(false);\n\n // Stable refs for callbacks to avoid re-subscribing on every render\n const onEventRef = useRef(onEvent);\n const onOpenRef = useRef(onOpen);\n const onErrorRef = useRef(onError);\n const onDoneRef = useRef(onDone);\n const parseRef = useRef(parse);\n onEventRef.current = onEvent;\n onOpenRef.current = onOpen;\n onErrorRef.current = onError;\n onDoneRef.current = onDone;\n parseRef.current = parse;\n\n // Stable serialized deps for objects/arrays — avoids inline JSON.stringify in dep array\n const eventNamesKey = JSON.stringify(eventNames);\n const paramsKey = JSON.stringify(params);\n const terminalEventsKey = JSON.stringify(terminalEvents);\n\n const close = useCallback(() => {\n closedByUser.current = true;\n if (reconnectTimer.current) {\n clearTimeout(reconnectTimer.current);\n reconnectTimer.current = null;\n }\n if (esRef.current) {\n esRef.current.close();\n esRef.current = null;\n }\n setIsConnected(false);\n setConnectionStatus('closed');\n setClosedClean(true);\n }, []);\n\n const clear = useCallback(() => {\n setItems([]);\n setLatest(undefined);\n }, []);\n\n useEffect(() => {\n if (!endpoint || !enabled) {\n // Clean up if we were connected\n if (esRef.current) {\n esRef.current.close();\n esRef.current = null;\n }\n setIsConnected(false);\n return;\n }\n\n closedByUser.current = false;\n closedByTerminal.current = false;\n setItems([]);\n setLatest(undefined);\n setError(null);\n setClosedClean(false);\n setReconnectCount(0);\n setConnectionStatus('connecting');\n\n let attempt = 0;\n\n function connect() {\n const url = buildSSEUrl(endpoint!, params);\n const es = new EventSource(url);\n esRef.current = es;\n\n const names = Array.isArray(eventNames) ? eventNames : [eventNames];\n\n const handleMessage = (e: MessageEvent) => {\n try {\n const parsed = parseRef.current(e.data) as T;\n setLatest(parsed);\n setItems((prev) => {\n const next = [...prev, parsed];\n return maxEvents > 0 && next.length > maxEvents ? next.slice(-maxEvents) : next;\n });\n onEventRef.current?.(parsed);\n } catch (err) {\n const parseError = err instanceof Error ? err : new Error('Failed to parse SSE event data');\n setError(parseError);\n onErrorRef.current?.(parseError);\n }\n };\n\n for (const name of names) {\n es.addEventListener(name, handleMessage as EventListener);\n }\n\n // Terminal events close the stream cleanly — no error raised\n const allTerminal = [\n ...(terminalEvents ?? []),\n ...(doneEvent ? [doneEvent] : []),\n ];\n for (const name of allTerminal) {\n es.addEventListener(name, () => {\n closedByTerminal.current = true;\n es.close();\n esRef.current = null;\n setIsConnected(false);\n setConnectionStatus('closed');\n setClosedClean(true);\n onDoneRef.current?.();\n });\n }\n\n // Legacy doneEvent kept for backward compat (already covered above, but no-op duplicate)\n\n es.onopen = () => {\n attempt = 0;\n setReconnectCount(0);\n setIsConnected(true);\n setConnectionStatus('live');\n setError(null);\n onOpenRef.current?.();\n };\n\n es.onerror = () => {\n es.close();\n esRef.current = null;\n setIsConnected(false);\n\n // Clean close by user or terminal event — suppress error\n if (closedByUser.current || closedByTerminal.current) {\n setConnectionStatus('closed');\n return;\n }\n\n const connError = new Error('SSE connection lost');\n setError(connError);\n onErrorRef.current?.(connError);\n\n if (reconnect && attempt < maxReconnects) {\n attempt++;\n setReconnectCount(attempt);\n setConnectionStatus('reconnecting');\n const delay = reconnectIntervalMs * Math.pow(2, attempt - 1);\n reconnectTimer.current = setTimeout(connect, delay);\n } else {\n setConnectionStatus('closed');\n }\n };\n }\n\n connect();\n\n return () => {\n closedByUser.current = true;\n if (reconnectTimer.current) {\n clearTimeout(reconnectTimer.current);\n reconnectTimer.current = null;\n }\n if (esRef.current) {\n esRef.current.close();\n esRef.current = null;\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [endpoint, enabled, doneEvent, reconnect, maxReconnects, reconnectIntervalMs, maxEvents, eventNamesKey, paramsKey, terminalEventsKey]);\n\n return { events: items, latest, isConnected, connectionStatus, closedClean, error, close, clear, reconnectCount };\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────\n\nfunction defaultParse<T>(raw: string): T {\n return JSON.parse(raw) as T;\n}\n\nfunction buildSSEUrl(\n endpoint: string,\n params?: Record<string, string | number | boolean>,\n): string {\n const base = endpoint.startsWith('http') ? endpoint : `/api${endpoint}`;\n if (!params || Object.keys(params).length === 0) {\n return base;\n }\n const sp = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n sp.set(key, String(value));\n }\n }\n const sep = base.includes('?') ? '&' : '?';\n return `${base}${sep}${sp.toString()}`;\n}\n","import { useState, useEffect } from 'react';\n\n/**\n * Returns a live-updating elapsed time string starting from `startedAt`.\n * Updates every second while the component is mounted.\n * Returns null if startedAt is not provided (step not yet started).\n *\n * Format: <60s → \"42s\", <1h → \"2m 14s\", ≥1h → \"1h 03m\"\n */\nexport function useElapsedTimer(startedAt: string | undefined): string | null {\n const [elapsed, setElapsed] = useState<string | null>(() =>\n startedAt ? formatElapsed(startedAt) : null,\n );\n\n useEffect(() => {\n if (!startedAt) {\n setElapsed(null);\n return;\n }\n\n setElapsed(formatElapsed(startedAt));\n\n const id = setInterval(() => {\n setElapsed(formatElapsed(startedAt));\n }, 1000);\n\n return () => clearInterval(id);\n }, [startedAt]);\n\n return elapsed;\n}\n\nfunction formatElapsed(startedAt: string): string {\n const ms = Date.now() - new Date(startedAt).getTime();\n const totalSec = Math.max(0, Math.floor(ms / 1000));\n\n if (totalSec < 60) {\n return `${totalSec}s`;\n }\n const totalMin = Math.floor(totalSec / 60);\n if (totalMin < 60) {\n const secs = totalSec % 60;\n return `${totalMin}m ${secs.toString().padStart(2, '0')}s`;\n }\n const hours = Math.floor(totalMin / 60);\n const mins = totalMin % 60;\n return `${hours}h ${mins.toString().padStart(2, '0')}m`;\n}\n","import { useInfiniteQuery, type InfiniteData } from '@tanstack/react-query';\n\n// ─── Types ─────────────────────────────────────────────────────────\n\nexport interface UseInfiniteDataOptions<T, TCursor = string> {\n /** Extract the next-page cursor from the last fetched page. Return undefined to signal \"no more pages\". */\n getNextCursor: (lastPage: T) => TCursor | undefined;\n /** Additional query params (merged with cursor on each request) */\n params?: Record<string, string | number | boolean>;\n /** Enable/disable the query (default: true) */\n enabled?: boolean;\n /** Stale time override in ms */\n staleTime?: number;\n /** Query param name used to pass the cursor (default: 'cursor') */\n cursorParam?: string;\n /** Initial cursor value (default: undefined → first page) */\n initialCursor?: TCursor;\n}\n\nexport interface UseInfiniteDataReturn<T> {\n /** All fetched pages */\n pages: T[];\n /** Flattened data from all pages (requires pages to be arrays) */\n data: T extends Array<infer U> ? U[] : T[];\n /** Loading first page */\n isLoading: boolean;\n /** Fetching any page (initial or next) */\n isFetching: boolean;\n /** Currently fetching next page */\n isFetchingNextPage: boolean;\n /** Whether more pages are available */\n hasNextPage: boolean;\n /** Fetch the next page */\n fetchNextPage: () => Promise<unknown>;\n /** Error if any */\n error: Error | null;\n isError: boolean;\n /** Refetch all pages */\n refetch: () => Promise<unknown>;\n}\n\n// ─── Hook ──────────────────────────────────────────────────────────\n\n/**\n * Infinite/cursor-based pagination hook wrapping TanStack useInfiniteQuery.\n *\n * Works with any cursor-based or offset-based REST endpoint.\n *\n * @example\n * ```tsx\n * // Cursor-based pagination\n * const { data, fetchNextPage, hasNextPage } = useInfiniteData<RunsPage>(\n * '/workflows/runs',\n * {\n * getNextCursor: (page) => page.nextCursor,\n * params: { status: 'running' },\n * },\n * );\n *\n * // Offset-based pagination\n * const { data, fetchNextPage } = useInfiniteData<LogEntry[]>(\n * '/logs',\n * {\n * cursorParam: 'offset',\n * getNextCursor: (page) => page.length === 50 ? String(allLogs.length) : undefined,\n * },\n * );\n * ```\n */\nexport function useInfiniteData<T = unknown, TCursor = string>(\n endpoint: string,\n options: UseInfiniteDataOptions<T, TCursor>,\n): UseInfiniteDataReturn<T> {\n const {\n getNextCursor,\n params,\n enabled,\n staleTime,\n cursorParam = 'cursor',\n initialCursor,\n } = options;\n\n const query = useInfiniteQuery<T, Error, InfiniteData<T, TCursor>, unknown[], TCursor>({\n queryKey: ['studio-infinite', endpoint, params],\n queryFn: async ({ pageParam }) => {\n const url = buildInfiniteUrl(endpoint, params, cursorParam, pageParam);\n return fetchPage<T>(url);\n },\n initialPageParam: initialCursor as TCursor,\n getNextPageParam: getNextCursor,\n enabled,\n staleTime,\n });\n\n const pages = query.data?.pages ?? [];\n const flatData = pages.flatMap((page) => (Array.isArray(page) ? page : [page]));\n\n return {\n pages,\n data: flatData as UseInfiniteDataReturn<T>['data'],\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n isFetchingNextPage: query.isFetchingNextPage,\n hasNextPage: query.hasNextPage,\n fetchNextPage: query.fetchNextPage,\n error: query.error,\n isError: query.isError,\n refetch: query.refetch,\n };\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────\n\nfunction buildInfiniteUrl<TCursor>(\n endpoint: string,\n params: Record<string, string | number | boolean> | undefined,\n cursorParam: string,\n cursor: TCursor | undefined,\n): string {\n const sp = new URLSearchParams();\n\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n sp.set(key, String(value));\n }\n }\n }\n\n if (cursor !== undefined && cursor !== null) {\n sp.set(cursorParam, String(cursor));\n }\n\n const qs = sp.toString();\n const base = endpoint.startsWith('http') ? endpoint : `/api${endpoint}`;\n return qs ? `${base}?${qs}` : base;\n}\n\nasync function fetchPage<T>(url: string): Promise<T> {\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`GET ${url} failed: ${res.status} ${res.statusText}`);\n }\n const json = await res.json() as Record<string, unknown>;\n // Unwrap platform envelope { ok, data, meta }\n if (json && typeof json === 'object' && 'ok' in json && 'data' in json) {\n return json.data as T;\n }\n return json as T;\n}\n","import { useEffect, useState, useRef, useCallback } from 'react';\n\n// ─── Types ─────────────────────────────────────────────────────────\n\nexport type WebSocketStatus = 'connecting' | 'connected' | 'disconnected' | 'error';\n\nexport interface UseWebSocketOptions<TReceive> {\n /** Enable/disable auto-connect on mount (default: true) */\n enabled?: boolean;\n /** Auto-reconnect on close/error (default: false) */\n reconnect?: boolean;\n /** Max reconnect attempts (default: 5) */\n maxReconnects?: number;\n /** Base reconnect delay in ms, doubles each attempt (default: 2000) */\n reconnectIntervalMs?: number;\n /** WebSocket sub-protocols */\n protocols?: string | string[];\n /** Parse incoming messages (default: JSON.parse) */\n parse?: (raw: string) => TReceive;\n /** Serialize outgoing messages (default: JSON.stringify) */\n serialize?: (data: unknown) => string;\n /** Max messages to keep in history (default: 100) */\n maxMessages?: number;\n /** Called on each received message */\n onMessage?: (data: TReceive) => void;\n /** Called on connection open */\n onOpen?: (event: Event) => void;\n /** Called on connection close */\n onClose?: (event: CloseEvent) => void;\n /** Called on error */\n onError?: (event: Event) => void;\n}\n\nexport interface UseWebSocketReturn<TSend, TReceive> {\n /** Send a typed message (auto-serialized) */\n send: (data: TSend) => void;\n /** Send a raw string */\n sendRaw: (data: string | ArrayBufferLike | Blob) => void;\n /** Received messages (most recent last) */\n messages: TReceive[];\n /** Latest received message */\n latest: TReceive | undefined;\n /** Connection status */\n status: WebSocketStatus;\n /** Shorthand: status === 'connected' */\n isConnected: boolean;\n /** Last error event */\n error: Event | null;\n /** Manually open the connection */\n connect: () => void;\n /** Manually close the connection */\n disconnect: (code?: number, reason?: string) => void;\n /** Clear message history */\n clear: () => void;\n /** Current reconnect attempt count */\n reconnectCount: number;\n}\n\n// ─── Hook ──────────────────────────────────────────────────────────\n\n/**\n * Generic WebSocket hook for bidirectional communication.\n *\n * Pass `null` as url to keep the hook mounted but inactive.\n *\n * @example\n * ```tsx\n * // Agent chat\n * const { send, messages, isConnected } = useWebSocket<UserMsg, AgentMsg>(\n * sessionId ? `ws://localhost:4000/agent/${sessionId}` : null,\n * );\n * send({ type: 'user_message', text: input });\n *\n * // With reconnect and callbacks\n * const { messages, status } = useWebSocket<Command, StatusEvent>(\n * '/ws/deploy',\n * {\n * reconnect: true,\n * onMessage: (msg) => msg.done && showNotification('Deploy finished'),\n * },\n * );\n * ```\n */\nexport function useWebSocket<TSend = unknown, TReceive = unknown>(\n url: string | null,\n options: UseWebSocketOptions<TReceive> = {},\n): UseWebSocketReturn<TSend, TReceive> {\n const {\n enabled = true,\n reconnect = false,\n maxReconnects = 5,\n reconnectIntervalMs = 2000,\n protocols,\n parse = defaultParse,\n serialize = defaultSerialize,\n maxMessages = 100,\n onMessage,\n onOpen,\n onClose,\n onError,\n } = options;\n\n const [messages, setMessages] = useState<TReceive[]>([]);\n const [latest, setLatest] = useState<TReceive | undefined>(undefined);\n const [status, setStatus] = useState<WebSocketStatus>('disconnected');\n const [error, setError] = useState<Event | null>(null);\n const [reconnectCount, setReconnectCount] = useState(0);\n\n const wsRef = useRef<WebSocket | null>(null);\n const reconnectTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closedByUser = useRef(false);\n\n // Stable refs for callbacks\n const onMessageRef = useRef(onMessage);\n const onOpenRef = useRef(onOpen);\n const onCloseRef = useRef(onClose);\n const onErrorRef = useRef(onError);\n const parseRef = useRef(parse);\n const serializeRef = useRef(serialize);\n onMessageRef.current = onMessage;\n onOpenRef.current = onOpen;\n onCloseRef.current = onClose;\n onErrorRef.current = onError;\n parseRef.current = parse;\n serializeRef.current = serialize;\n\n const cleanup = useCallback(() => {\n if (reconnectTimer.current) {\n clearTimeout(reconnectTimer.current);\n reconnectTimer.current = null;\n }\n if (wsRef.current) {\n wsRef.current.close();\n wsRef.current = null;\n }\n }, []);\n\n const doConnect = useCallback(() => {\n if (!url) { return; }\n\n cleanup();\n closedByUser.current = false;\n setStatus('connecting');\n setError(null);\n\n let attempt = 0;\n\n function open() {\n const resolvedUrl = resolveWsUrl(url!);\n const ws = protocols ? new WebSocket(resolvedUrl, protocols) : new WebSocket(resolvedUrl);\n wsRef.current = ws;\n\n ws.onopen = (e) => {\n attempt = 0;\n setReconnectCount(0);\n setStatus('connected');\n setError(null);\n onOpenRef.current?.(e);\n };\n\n ws.onmessage = (e: MessageEvent) => {\n try {\n const data = parseRef.current(e.data as string) as TReceive;\n setLatest(data);\n setMessages((prev) => {\n const next = [...prev, data];\n return maxMessages > 0 && next.length > maxMessages ? next.slice(-maxMessages) : next;\n });\n onMessageRef.current?.(data);\n } catch {\n // Silently ignore parse errors for binary/non-JSON frames\n }\n };\n\n ws.onclose = (e) => {\n wsRef.current = null;\n setStatus('disconnected');\n onCloseRef.current?.(e);\n\n if (closedByUser.current) { return; }\n\n // Reconnect on abnormal close\n if (reconnect && attempt < maxReconnects && e.code !== 1000) {\n attempt++;\n setReconnectCount(attempt);\n const delay = reconnectIntervalMs * Math.pow(2, attempt - 1);\n reconnectTimer.current = setTimeout(open, delay);\n }\n };\n\n ws.onerror = (e) => {\n setStatus('error');\n setError(e);\n onErrorRef.current?.(e);\n };\n }\n\n open();\n }, [url, protocols, reconnect, maxReconnects, reconnectIntervalMs, maxMessages, cleanup]);\n\n const disconnect = useCallback((code?: number, reason?: string) => {\n closedByUser.current = true;\n if (reconnectTimer.current) {\n clearTimeout(reconnectTimer.current);\n reconnectTimer.current = null;\n }\n if (wsRef.current) {\n wsRef.current.close(code, reason);\n wsRef.current = null;\n }\n setStatus('disconnected');\n }, []);\n\n const send = useCallback((data: TSend) => {\n if (wsRef.current?.readyState === WebSocket.OPEN) {\n wsRef.current.send(serializeRef.current(data));\n }\n }, []);\n\n const sendRaw = useCallback((data: string | ArrayBufferLike | Blob) => {\n if (wsRef.current?.readyState === WebSocket.OPEN) {\n wsRef.current.send(data);\n }\n }, []);\n\n const clear = useCallback(() => {\n setMessages([]);\n setLatest(undefined);\n }, []);\n\n // Auto-connect on mount / url change\n useEffect(() => {\n if (!url || !enabled) {\n cleanup();\n setStatus('disconnected');\n return;\n }\n\n setMessages([]);\n setLatest(undefined);\n doConnect();\n\n return () => {\n closedByUser.current = true;\n cleanup();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, enabled]);\n\n return {\n send,\n sendRaw,\n messages,\n latest,\n status,\n isConnected: status === 'connected',\n error,\n connect: doConnect,\n disconnect,\n clear,\n reconnectCount,\n };\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────\n\nfunction defaultParse<T>(raw: string): T {\n return JSON.parse(raw) as T;\n}\n\nfunction defaultSerialize(data: unknown): string {\n return JSON.stringify(data);\n}\n\n/** Resolve relative paths to ws:// or wss:// using the configured API origin */\nfunction resolveWsUrl(url: string): string {\n if (url.startsWith('ws://') || url.startsWith('wss://')) {\n return url;\n }\n const path = url.startsWith('/') ? url : `/${url}`;\n // Use configured API gateway origin when available, otherwise fall back to current origin\n if (typeof window !== 'undefined') {\n const cfg = (window as unknown as Record<string, unknown>)['__KB_STUDIO_CONFIG__'] as Record<string, string> | undefined;\n const base = cfg?.KB_API_BASE_URL;\n if (base) {\n try {\n const origin = new URL(base).origin;\n const proto = origin.startsWith('https') ? 'wss:' : 'ws:';\n return `${proto}//${new URL(origin).host}${path}`;\n } catch { /* fall through */ }\n }\n }\n const proto = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n return `${proto}//${window.location.host}${path}`;\n}\n","import { useCallback } from 'react';\nimport { usePageContext } from './page-context.js';\n\nexport interface UsePermissionsReturn {\n /** Check if the current user has a specific permission */\n hasPermission: (permission: string) => boolean;\n /** All permissions available to this page */\n permissions: string[];\n}\n\n/**\n * Atomic permission checks inside a page.\n * Page-level permissions are enforced by the host before loading.\n * This hook is for fine-grained control within the page.\n *\n * @example\n * ```tsx\n * const { hasPermission } = usePermissions();\n * if (!hasPermission('commit:write')) return <ReadOnlyView />;\n * ```\n */\nexport function usePermissions(): UsePermissionsReturn {\n const { permissions } = usePageContext();\n\n const hasPermission = useCallback(\n (permission: string) => permissions.includes(permission),\n [permissions],\n );\n\n return { hasPermission, permissions };\n}\n","import { useCallback } from 'react';\nimport { useNavigate, useLocation } from 'react-router-dom';\n\nexport interface UseNavigationReturn {\n /** Navigate to a route */\n navigate: (path: string) => void;\n /** Current pathname */\n currentPath: string;\n /** Go back in history */\n goBack: () => void;\n /** Open external URL in new tab */\n openExternal: (url: string) => void;\n}\n\n/**\n * Navigation hook for plugin pages.\n *\n * @example\n * ```tsx\n * const { navigate, currentPath } = useNavigation();\n * navigate('/commit/history');\n * ```\n */\nexport function useNavigation(): UseNavigationReturn {\n const nav = useNavigate();\n const location = useLocation();\n\n const navigate = useCallback((path: string) => nav(path), [nav]);\n const goBack = useCallback(() => nav(-1), [nav]);\n const openExternal = useCallback((url: string) => window.open(url, '_blank', 'noopener'), []);\n\n return {\n navigate,\n currentPath: location.pathname,\n goBack,\n openExternal,\n };\n}\n","import { useCallback } from 'react';\nimport { notification } from 'antd';\n\nexport type NotificationType = 'success' | 'error' | 'warning' | 'info';\n\nexport interface UseNotificationReturn {\n notify: (options: {\n type: NotificationType;\n message: string;\n description?: string;\n duration?: number;\n }) => void;\n success: (message: string, description?: string) => void;\n error: (message: string, description?: string) => void;\n warning: (message: string, description?: string) => void;\n info: (message: string, description?: string) => void;\n}\n\n/**\n * Notification hook for plugin pages.\n *\n * @example\n * ```tsx\n * const notify = useNotification();\n * notify.success('Commit created');\n * notify.error('Build failed', 'Check logs for details');\n * ```\n */\nexport function useNotification(): UseNotificationReturn {\n const notify = useCallback(\n (opts: { type: NotificationType; message: string; description?: string; duration?: number }) => {\n notification[opts.type]({\n message: opts.message,\n description: opts.description,\n duration: opts.duration ?? 4.5,\n });\n },\n [],\n );\n\n const success = useCallback(\n (message: string, description?: string) => notify({ type: 'success', message, description }),\n [notify],\n );\n const error = useCallback(\n (message: string, description?: string) => notify({ type: 'error', message, description }),\n [notify],\n );\n const warning = useCallback(\n (message: string, description?: string) => notify({ type: 'warning', message, description }),\n [notify],\n );\n const info = useCallback(\n (message: string, description?: string) => notify({ type: 'info', message, description }),\n [notify],\n );\n\n return { notify, success, error, warning, info };\n}\n","import * as React from 'react';\nimport { theme } from 'antd';\nimport {\n colors,\n spacing,\n typography,\n radius,\n shadows,\n lightSemanticColors,\n darkSemanticColors,\n} from '@kb-labs/studio-ui-core';\n\n/**\n * Semantic tokens — theme-aware colors for backgrounds, text, borders, status.\n * These mirror the CSS variables injected by Studio host (e.g. `var(--bg-primary)`).\n */\nexport interface SemanticTokens {\n bgPrimary: string;\n bgSecondary: string;\n bgTertiary: string;\n textPrimary: string;\n textSecondary: string;\n textTertiary: string;\n textInverse: string;\n borderPrimary: string;\n borderSecondary: string;\n link: string;\n linkHover: string;\n accentSubtle: string;\n success: string;\n warning: string;\n error: string;\n info: string;\n disabled: string;\n shadow: string;\n}\n\nexport interface UseThemeReturn {\n /** Current theme mode */\n mode: 'light' | 'dark';\n /** Ant Design design token */\n antdToken: ReturnType<typeof theme.useToken>['token'];\n /** KB Labs semantic tokens (theme-aware) */\n semantic: SemanticTokens;\n /** Raw design tokens (colors, spacing, typography, radius, shadows) */\n tokens: {\n colors: typeof colors;\n spacing: typeof spacing;\n typography: typeof typography;\n radius: typeof radius;\n shadows: typeof shadows;\n };\n}\n\nconst LIGHT_SEMANTIC: SemanticTokens = {\n bgPrimary: lightSemanticColors['bg-primary'],\n bgSecondary: lightSemanticColors['bg-secondary'],\n bgTertiary: lightSemanticColors['bg-tertiary'],\n textPrimary: lightSemanticColors['text-primary'],\n textSecondary: lightSemanticColors['text-secondary'],\n textTertiary: lightSemanticColors['text-tertiary'],\n textInverse: lightSemanticColors['text-inverse'],\n borderPrimary: lightSemanticColors['border-primary'],\n borderSecondary: lightSemanticColors['border-secondary'],\n link: lightSemanticColors['link'],\n linkHover: lightSemanticColors['link-hover'],\n accentSubtle: lightSemanticColors['accent-subtle'],\n success: lightSemanticColors['success'],\n warning: lightSemanticColors['warning'],\n error: lightSemanticColors['error'],\n info: lightSemanticColors['info'],\n disabled: lightSemanticColors['disabled'],\n shadow: lightSemanticColors['shadow'],\n};\n\nconst DARK_SEMANTIC: SemanticTokens = {\n bgPrimary: darkSemanticColors['bg-primary'],\n bgSecondary: darkSemanticColors['bg-secondary'],\n bgTertiary: darkSemanticColors['bg-tertiary'],\n textPrimary: darkSemanticColors['text-primary'],\n textSecondary: darkSemanticColors['text-secondary'],\n textTertiary: darkSemanticColors['text-tertiary'],\n textInverse: darkSemanticColors['text-inverse'],\n borderPrimary: darkSemanticColors['border-primary'],\n borderSecondary: darkSemanticColors['border-secondary'],\n link: darkSemanticColors['link'],\n linkHover: darkSemanticColors['link-hover'],\n accentSubtle: darkSemanticColors['accent-subtle'],\n success: darkSemanticColors['success'],\n warning: darkSemanticColors['warning'],\n error: darkSemanticColors['error'],\n info: darkSemanticColors['info'],\n disabled: darkSemanticColors['disabled'],\n shadow: darkSemanticColors['shadow'],\n};\n\n/**\n * Theme hook for plugin pages.\n *\n * Three levels of access:\n * - `semantic` — high-level themed tokens (bgPrimary, textPrimary, success, error...)\n * - `antdToken` — Ant Design's full design token for antd component customization\n * - `tokens` — raw design tokens (colors, spacing, typography, radius, shadows)\n *\n * CSS variables (`var(--bg-primary)`, `var(--text-primary)`) are also available\n * in stylesheets — injected by the Studio host into `:root`.\n *\n * @example\n * ```tsx\n * const { semantic, tokens, mode } = useTheme();\n *\n * // Semantic tokens (recommended)\n * <div style={{ color: semantic.textPrimary, background: semantic.bgSecondary }}>\n *\n * // CSS variables in stylesheets\n * // .my-component { color: var(--text-primary); }\n *\n * // Raw tokens for specific shades\n * <div style={{ color: tokens.colors.primary[600] }}>\n * ```\n */\nfunction getResolvedTheme(): 'light' | 'dark' {\n if (typeof document === 'undefined') { return 'light'; }\n return document.documentElement.classList.contains('dark') ? 'dark' : 'light';\n}\n\nexport function useTheme(): UseThemeReturn {\n const { token: antdToken } = theme.useToken();\n\n const [mode, setMode] = React.useState<'light' | 'dark'>(getResolvedTheme);\n\n React.useEffect(() => {\n const observer = new MutationObserver(() => {\n setMode(getResolvedTheme());\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => observer.disconnect();\n }, []);\n\n return {\n mode,\n antdToken,\n semantic: mode === 'dark' ? DARK_SEMANTIC : LIGHT_SEMANTIC,\n tokens: { colors, spacing, typography, radius, shadows },\n };\n}\n","import type { ThemeConfig } from 'antd';\nimport { theme as antdTheme } from 'antd';\n\ntype MappingAlgorithm = typeof antdTheme.defaultAlgorithm;\n\n/**\n * Maps CSS variables from ui-core to Ant Design tokens\n * Uses CSS variables directly via var() for automatic theme switching\n * This adapter maintains framework-agnostic nature of ui-core\n * All Ant Design tokens are mapped to our CSS variables for consistency\n */\nexport function getAntDesignTokens(): ThemeConfig['token'] {\n // CSS variables automatically change based on .light/.dark classes\n // We use var() references so they update reactively\n // Map all Ant Design tokens to our CSS variables for complete theme consistency\n \n return {\n // ============ Primary Colors ============\n colorPrimary: 'var(--link, #0c66ff)',\n colorPrimaryHover: 'var(--link-hover, #0050cc)',\n colorPrimaryActive: 'var(--link-hover, #0050cc)',\n colorPrimaryBg: 'var(--accent-subtle, #dbeafe)', // Light primary background\n colorPrimaryBgHover: 'var(--accent-subtle, #dbeafe)',\n colorPrimaryBorder: 'var(--link, #0c66ff)',\n colorPrimaryBorderHover: 'var(--link-hover, #0050cc)',\n colorPrimaryText: 'var(--link, #0c66ff)',\n colorPrimaryTextHover: 'var(--link-hover, #0050cc)',\n colorPrimaryTextActive: 'var(--link-hover, #0050cc)',\n\n // ============ Success Colors ============\n colorSuccess: 'var(--success, #16A34A)',\n colorSuccessHover: 'var(--success, #16A34A)', // Use same color\n colorSuccessActive: 'var(--success, #16A34A)',\n colorSuccessBg: 'var(--bg-tertiary, #F3F4F6)', // Light background, could be success-specific\n colorSuccessBgHover: 'var(--bg-tertiary, #F3F4F6)',\n colorSuccessBorder: 'var(--success, #16A34A)',\n colorSuccessBorderHover: 'var(--success, #16A34A)',\n colorSuccessText: 'var(--success, #16A34A)',\n colorSuccessTextHover: 'var(--success, #16A34A)',\n colorSuccessTextActive: 'var(--success, #16A34A)',\n\n // ============ Warning Colors ============\n colorWarning: 'var(--warning, #F59E0B)',\n colorWarningHover: 'var(--warning, #F59E0B)',\n colorWarningActive: 'var(--warning, #F59E0B)',\n colorWarningBg: 'var(--bg-tertiary, #F3F4F6)',\n colorWarningBgHover: 'var(--bg-tertiary, #F3F4F6)',\n colorWarningBorder: 'var(--warning, #F59E0B)',\n colorWarningBorderHover: 'var(--warning, #F59E0B)',\n colorWarningText: 'var(--warning, #F59E0B)',\n colorWarningTextHover: 'var(--warning, #F59E0B)',\n colorWarningTextActive: 'var(--warning, #F59E0B)',\n colorWarningOutline: 'rgba(245, 158, 11, 0.2)', // NEW: Warning outline\n\n // ============ Error Colors ============\n colorError: 'var(--error, #DC2626)',\n colorErrorHover: 'var(--error, #DC2626)',\n colorErrorActive: 'var(--error, #DC2626)',\n colorErrorBg: 'var(--bg-tertiary, #F3F4F6)',\n colorErrorBgHover: 'var(--bg-tertiary, #F3F4F6)',\n colorErrorBorder: 'var(--error, #DC2626)',\n colorErrorBorderHover: 'var(--error, #DC2626)',\n colorErrorText: 'var(--error, #DC2626)',\n colorErrorTextHover: 'var(--error, #DC2626)',\n colorErrorTextActive: 'var(--error, #DC2626)',\n colorErrorOutline: 'rgba(220, 38, 38, 0.2)', // NEW: Error outline\n\n // ============ Info Colors ============\n colorInfo: 'var(--info, #0EA5E9)',\n colorInfoHover: 'var(--info, #0EA5E9)',\n colorInfoActive: 'var(--info, #0EA5E9)',\n colorInfoBg: 'var(--bg-tertiary, #F3F4F6)',\n colorInfoBgHover: 'var(--bg-tertiary, #F3F4F6)',\n colorInfoBorder: 'var(--info, #0EA5E9)',\n colorInfoBorderHover: 'var(--info, #0EA5E9)',\n colorInfoText: 'var(--info, #0EA5E9)',\n colorInfoTextHover: 'var(--info, #0EA5E9)',\n colorInfoTextActive: 'var(--info, #0EA5E9)',\n\n // ============ Background Colors ============\n colorBgContainer: 'var(--bg-secondary, #FFFFFF)',\n colorBgBase: 'var(--bg-primary, #F9FAFB)',\n colorBgElevated: 'var(--bg-secondary, #FFFFFF)',\n colorBgLayout: 'var(--bg-primary, #F9FAFB)',\n colorBgSpotlight: 'var(--bg-tertiary, #F3F4F6)',\n colorBgMask: 'rgba(0, 0, 0, 0.45)', // Overlay/modal backdrop - use standard dark overlay\n colorBgTextHover: 'var(--bg-hover, #F3F4F6)', // NEW: Text hover background\n colorBgTextActive: 'var(--bg-hover, #F3F4F6)', // NEW: Text active background\n colorBgContainerDisabled: 'var(--bg-tertiary, #F3F4F6)', // NEW: Disabled container bg\n\n // ============ Text Colors ============\n colorText: 'var(--text-primary, #111827)',\n colorTextBase: 'var(--text-primary, #111827)', // NEW: Base text color\n colorTextSecondary: 'var(--text-secondary, #6B7280)',\n colorTextTertiary: 'var(--text-tertiary, #6B7280)',\n colorTextQuaternary: 'var(--text-tertiary, #6B7280)', // Use tertiary as fallback\n colorTextDisabled: 'var(--disabled, #9CA3AF)',\n colorTextHeading: 'var(--text-primary, #111827)', // Headings use primary text\n colorTextLabel: 'var(--text-secondary, #6B7280)', // Labels use secondary\n colorTextDescription: 'var(--text-secondary, #6B7280)', // Descriptions use secondary\n colorTextPlaceholder: 'var(--text-tertiary, #6B7280)', // Placeholders use tertiary\n colorTextLightSolid: 'var(--text-inverse, #FFFFFF)', // NEW: Text on colored backgrounds\n\n // ============ Border Colors ============\n colorBorder: 'var(--border-primary, #E5E7EB)',\n colorBorderSecondary: 'var(--border-secondary, #D4D4D4)',\n colorBorderBg: 'var(--bg-secondary, #FFFFFF)', // NEW: Background border color\n colorSplit: 'var(--border-primary, #E5E7EB)', // Splitter/divider uses primary border\n\n // ============ Fill Colors (for input backgrounds, etc.) ============\n colorFill: 'var(--bg-tertiary, #F3F4F6)', // Fill uses tertiary background\n colorFillSecondary: 'var(--bg-tertiary, #F3F4F6)', // Used for table row hover\n colorFillTertiary: 'var(--bg-primary, #F9FAFB)', // Used for table header backgrounds\n colorFillQuaternary: 'var(--bg-primary, #F9FAFB)',\n colorFillContent: 'var(--bg-hover, #F3F4F6)', // NEW: Content area fill\n colorFillContentHover: 'var(--bg-hover, #F3F4F6)', // NEW: Content hover fill\n colorFillAlter: 'var(--bg-tertiary, #F3F4F6)', // NEW: Alternative fill\n\n // ============ Neutral Colors ============\n colorWhite: '#FFFFFF', // Always white\n\n // ============ Shadow ============\n // Soft, diffuse shadows (matches kblabs.ru marketing site) instead of antd's tighter default stack\n boxShadow: '0 2px 24px rgba(0,0,0,0.07)',\n boxShadowSecondary: '0 4px 32px rgba(0,0,0,0.08)',\n boxShadowTertiary: '0 8px 48px rgba(0,0,0,0.10)',\n\n // ============ Border Radius ============\n // Matches kblabs.ru radius scale (8/10/12/16/20/24/999) instead of antd's default 6/8/4\n borderRadius: 10,\n borderRadiusLG: 16,\n borderRadiusSM: 8,\n borderRadiusXS: 6,\n borderRadiusOuter: 8,\n\n // ============ Control Heights ============\n controlHeight: 36,\n controlHeightLG: 40,\n controlHeightSM: 28,\n controlHeightXS: 22,\n\n // ============ Font Family ============\n fontFamily: \"var(--font-body, 'Geist Sans', 'Segoe UI', sans-serif)\",\n\n // ============ Font Sizes ============\n fontSize: 14,\n fontSizeLG: 16,\n fontSizeSM: 12,\n fontSizeXL: 20,\n fontSizeHeading1: 38,\n fontSizeHeading2: 30,\n fontSizeHeading3: 24,\n fontSizeHeading4: 20,\n fontSizeHeading5: 16,\n fontSizeIcon: 12,\n\n // ============ Font Weights ============\n fontWeightStrong: 600,\n lineHeight: 1.5714285714285714,\n lineHeightLG: 1.5,\n lineHeightSM: 1.6666666666666667,\n\n // ============ Padding ============\n padding: 16,\n paddingLG: 24,\n paddingSM: 12,\n paddingXS: 8,\n paddingXXS: 4,\n\n // ============ Margin ============\n margin: 16,\n marginLG: 24,\n marginSM: 12,\n marginXS: 8,\n marginXXS: 4,\n\n // ============ Motion ============\n motionDurationFast: '0.1s',\n motionDurationMid: '0.2s',\n motionDurationSlow: '0.3s',\n motionEaseInOut: 'cubic-bezier(0.645, 0.045, 0.355, 1)',\n motionEaseOut: 'cubic-bezier(0.215, 0.61, 0.355, 1)',\n\n // ============ Link ============\n colorLink: 'var(--link, #0c66ff)',\n colorLinkHover: 'var(--link-hover, #0050cc)',\n colorLinkActive: 'var(--link-hover, #0050cc)',\n\n // ============ Icons & Highlights ============\n colorIcon: 'var(--text-secondary, #6B7280)', // NEW: Icon color\n colorIconHover: 'var(--text-primary, #111827)', // NEW: Icon hover\n colorHighlight: 'var(--link, #0c66ff)', // NEW: Highlight color\n\n // ============ Control States (Inputs, Buttons, etc.) ============\n controlOutline: 'rgba(12, 102, 255, 0.15)', // NEW: Input outline on focus\n controlOutlineWidth: 2, // NEW: Outline width\n controlInteractiveSize: 16, // NEW: Interactive hit area size\n controlItemBgHover: 'var(--bg-hover, #F3F4F6)', // NEW: Item hover bg\n controlItemBgActive: 'var(--accent-subtle, #dbeafe)', // NEW: Item active bg\n controlItemBgActiveHover: 'var(--accent-subtle, #dbeafe)', // NEW: Item active hover\n controlItemBgActiveDisabled: 'var(--bg-tertiary, #F3F4F6)', // NEW: Disabled active bg\n controlTmpOutline: 'rgba(12, 102, 255, 0.08)', // NEW: Temporary outline\n\n // ============ Screen Sizes (for responsive) ============\n screenXS: 480,\n screenSM: 576,\n screenMD: 768,\n screenLG: 992,\n screenXL: 1200,\n screenXXL: 1600,\n };\n}\n\n/**\n * Gets component-specific theme configurations\n * Uses Ant Design's components API for proper theming without CSS overrides\n */\nexport function getAntDesignComponents(): ThemeConfig['components'] {\n return {\n Table: {\n // Colors\n headerBg: 'var(--bg-tertiary)',\n headerColor: 'var(--text-primary)',\n borderColor: 'var(--border-primary)',\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n\n // Row states (IMPORTANT for UX)\n rowHoverBg: 'var(--bg-hover)',\n rowSelectedBg: 'var(--accent-subtle)', // NEW: Selected row background\n rowSelectedHoverBg: 'var(--accent-subtle)', // NEW: Selected row hover\n rowExpandedBg: 'var(--bg-secondary)', // NEW: Expanded row background\n bodySortBg: 'var(--bg-tertiary)', // NEW: Sorted column background\n\n // Header states\n headerSortActiveBg: 'var(--bg-tertiary)',\n headerSortHoverBg: 'var(--bg-tertiary)',\n headerFilterHoverBg: 'var(--bg-tertiary)',\n fixedHeaderSortActiveBg: 'var(--bg-tertiary)',\n\n // Icons (IMPORTANT for visibility)\n colorIcon: 'var(--text-secondary)',\n colorIconHover: 'var(--text-primary)',\n expandIconBg: 'var(--bg-secondary)',\n\n // Footer\n footerBg: 'var(--bg-tertiary)', // NEW: Table footer background\n footerColor: 'var(--text-primary)', // NEW: Footer text color\n\n // Sizing\n selectionColumnWidth: 60,\n stickyScrollBarBg: 'var(--bg-tertiary)',\n stickyScrollBarBorderRadius: 4,\n },\n Tag: {\n defaultBg: 'var(--bg-tertiary)',\n defaultColor: 'var(--text-primary)',\n colorBorder: 'var(--border-primary)',\n colorSuccess: 'var(--success)',\n colorError: 'var(--error)',\n colorWarning: 'var(--warning)',\n colorInfo: 'var(--info)',\n },\n Badge: {\n colorError: 'var(--error)',\n colorSuccess: 'var(--success)',\n colorWarning: 'var(--warning)',\n colorInfo: 'var(--info)',\n colorText: 'var(--text-primary)',\n },\n Alert: {\n // ============ Status colors ============\n colorSuccess: 'var(--success)',\n colorError: 'var(--error)',\n colorWarning: 'var(--warning)',\n colorInfo: 'var(--info)',\n\n // ============ Text & background ============\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n\n // ============ Icons (IMPORTANT for close button visibility) ============\n colorIcon: 'var(--text-secondary)', // NEW: Icon color (close button)\n colorIconHover: 'var(--text-primary)', // NEW: Icon hover (close button hover)\n\n // ============ Status-specific backgrounds ============\n colorSuccessBg: 'var(--bg-tertiary)', // NEW: Success alert background\n colorErrorBg: 'var(--bg-tertiary)', // NEW: Error alert background\n colorWarningBg: 'var(--bg-tertiary)', // NEW: Warning alert background\n colorInfoBg: 'var(--bg-tertiary)', // NEW: Info alert background\n\n // ============ Status-specific borders ============\n colorSuccessBorder: 'var(--success)', // NEW: Success alert border\n colorErrorBorder: 'var(--error)', // NEW: Error alert border\n colorWarningBorder: 'var(--warning)', // NEW: Warning alert border\n colorInfoBorder: 'var(--info)', // NEW: Info alert border\n },\n Card: {\n // Colors\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n colorBorderSecondary: 'var(--border-primary)',\n\n // Header & Actions (IMPORTANT for visual hierarchy)\n headerBg: 'var(--bg-secondary)', // NEW: Card header background\n actionsBg: 'var(--bg-tertiary)', // NEW: Card actions background\n extraColor: 'var(--text-secondary)', // NEW: Extra area text color\n },\n Descriptions: {\n colorText: 'var(--text-primary)',\n colorTextLabel: 'var(--text-secondary)',\n colorBorder: 'var(--border-primary)',\n },\n Button: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n\n // ============ Primary button ============\n colorPrimary: 'var(--link)',\n colorPrimaryHover: 'var(--link-hover)',\n colorPrimaryActive: 'var(--link-hover)',\n primaryColor: 'var(--text-inverse)',\n primaryShadow: '0 2px 0 rgba(12, 102, 255, 0.15)',\n\n // ============ Default button (filled style) ============\n defaultBg: 'var(--bg-secondary)',\n defaultColor: 'var(--text-primary)',\n defaultBorderColor: 'var(--border-primary)',\n defaultShadow: '0 2px 0 rgba(0, 0, 0, 0.015)',\n\n // Default button - hover states (IMPORTANT for dark theme)\n defaultHoverBg: 'var(--bg-hover)',\n defaultHoverColor: 'var(--text-primary)',\n defaultHoverBorderColor: 'var(--border-secondary)',\n\n // Default button - active states\n defaultActiveBg: 'var(--bg-hover)',\n defaultActiveColor: 'var(--text-primary)',\n defaultActiveBorderColor: 'var(--border-secondary)',\n\n // ============ Ghost button (transparent with border) ============\n ghostBg: 'transparent',\n defaultGhostColor: 'var(--text-primary)', // Text color\n defaultGhostBorderColor: 'var(--border-primary)', // Border color\n\n // Ghost button - active states\n\n // ============ Dashed button (dashed border) ============\n borderColorDisabled: 'var(--border-primary)', // Dashed border uses this\n colorBgContainerDisabled: 'var(--bg-tertiary)', // Disabled background\n\n // ============ Text button (no background, no border) ============\n // CRITICAL: These control icon-only buttons like notification close button!\n textTextColor: 'var(--text-secondary)', // Base text color for text buttons (icons!)\n textTextHoverColor: 'var(--text-primary)', // Text button hover (icon hover!)\n textTextActiveColor: 'var(--text-primary)', // Text button active (icon active!)\n textHoverBg: 'var(--accent-subtle)', // Text button hover background\n\n // ============ Link button (looks like a link) ============\n linkHoverBg: 'transparent',\n colorLink: 'var(--link)',\n colorLinkHover: 'var(--link-hover)',\n colorLinkActive: 'var(--link-hover)',\n\n // ============ Solid button (filled buttons) ============\n solidTextColor: 'var(--text-primary)', // Text color for solid buttons\n\n // ============ Danger button ============\n dangerColor: 'var(--error)', // Danger button text & border color\n dangerShadow: '0 2px 0 rgba(220, 38, 38, 0.1)',\n\n // Danger ghost button\n colorErrorBg: 'transparent', // Ghost danger background\n colorErrorBgHover: 'var(--bg-hover)', // Ghost danger hover\n colorErrorBorder: 'var(--error)', // Ghost danger border\n colorErrorBorderHover: 'var(--error)', // Ghost danger border hover\n colorErrorHover: 'var(--error)', // Ghost danger text hover\n colorErrorActive: 'var(--error)', // Ghost danger text active\n },\n Input: {\n // Base colors\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n colorTextPlaceholder: 'var(--text-tertiary)',\n\n // Interactive states (IMPORTANT for focus feedback)\n hoverBorderColor: 'var(--border-secondary)',\n activeBorderColor: 'var(--link)',\n activeShadow: '0 0 0 3px rgba(12, 102, 255, 0.12)', // NEW: Focus shadow\n errorActiveShadow: '0 0 0 2px rgba(220, 38, 38, 0.1)', // NEW: Error focus shadow\n warningActiveShadow: '0 0 0 2px rgba(245, 158, 11, 0.1)', // NEW: Warning focus shadow\n\n // Clear icon (IMPORTANT for visibility)\n colorIcon: 'var(--text-secondary)', // NEW: Clear icon color\n colorIconHover: 'var(--text-primary)', // NEW: Clear icon hover\n },\n Select: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)', // Input background\n colorBorder: 'var(--border-primary)', // Input border\n colorBgElevated: 'var(--bg-secondary)', // Dropdown panel background\n colorTextPlaceholder: 'var(--text-tertiary)', // Placeholder text\n\n // ============ Primary & status colors ============\n colorPrimary: 'var(--link)', // Selected item marker color\n colorPrimaryHover: 'var(--link-hover)', // Selected item hover\n\n // ============ Options/items (IMPORTANT for selection feedback) ============\n optionSelectedBg: 'var(--accent-subtle)', // Selected option background\n optionSelectedColor: 'var(--link)', // Selected option text color\n optionActiveBg: 'var(--bg-hover)', // Option hover background\n optionSelectedFontWeight: 600, // Bold for selected items\n\n // ============ Multiple select (tags mode) ============\n multipleItemBg: 'var(--bg-tertiary)', // Tag background\n multipleItemBorderColor: 'var(--border-primary)', // Tag border\n multipleItemColorDisabled: 'var(--disabled)', // Disabled tag color\n\n // ============ Icons (IMPORTANT for visibility) ============\n colorIcon: 'var(--text-secondary)', // Dropdown arrow, clear icon\n colorIconHover: 'var(--text-primary)', // Icon hover\n\n // ============ Selector (input area) ============\n selectorBg: 'var(--bg-secondary)', // Selector background\n },\n Dropdown: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)', // Dropdown panel background\n colorBorder: 'var(--border-primary)',\n colorTextDisabled: 'var(--disabled)',\n\n // ============ Item states (IMPORTANT for visual feedback) ============\n controlItemBgHover: 'var(--bg-hover)', // Item hover background\n controlItemBgActive: 'var(--accent-subtle)', // Selected item background\n controlItemBgActiveHover: 'var(--accent-subtle)', // Selected item hover\n\n // ============ Colors for items ============\n colorPrimary: 'var(--link)', // Primary color for selected items\n colorPrimaryHover: 'var(--link-hover)', // Primary hover\n\n // ============ Dropdown.Button specific ============\n colorBgContainer: 'var(--bg-secondary)', // Button background\n colorSplit: 'var(--border-primary)', // Split line between button parts\n\n // ============ Padding & sizing ============\n paddingBlock: 8, // Vertical padding for items\n controlPaddingHorizontal: 12, // Horizontal padding for items\n },\n Menu: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorTextSecondary: 'var(--text-secondary)', // NEW: Secondary text in menu items\n colorBgContainer: 'var(--bg-sidebar)', // Menu background\n colorBorder: 'var(--border-primary)', // NEW: Border color\n colorSplit: 'var(--border-primary)', // NEW: Divider color\n\n // ============ Item colors (IMPORTANT for visibility) ============\n itemColor: 'var(--text-primary)', // NEW: Default item text color\n itemBg: 'var(--bg-secondary)', // NEW: Item background\n\n // ============ Hover states (IMPORTANT for feedback) ============\n itemHoverBg: 'var(--bg-hover)', // Item hover background\n itemHoverColor: 'var(--link)', // Item hover text color\n\n // ============ Selected states ============\n // Accent as a point (thin left bar, see .ant-menu-item-selected override in kb-sidebar.module.css)\n // not a filled pill — matches the rest of the kit's \"no tinted background\" rule\n itemSelectedBg: 'transparent',\n itemSelectedColor: 'var(--link)', // Selected item text color\n\n // ============ Active states ============\n itemActiveBg: 'transparent',\n\n // ============ Dark theme specific ============\n darkItemBg: 'var(--bg-secondary)', // NEW: Dark mode item background\n darkItemColor: 'var(--text-primary)', // NEW: Dark mode item text\n darkItemHoverBg: 'var(--bg-hover)', // NEW: Dark mode hover\n darkItemSelectedBg: 'transparent', // Dark mode selected — accent line, not a fill\n darkItemSelectedColor: 'var(--link)', // Dark mode selected text\n darkSubMenuItemBg: 'var(--bg-secondary)', // NEW: Dark mode submenu background\n\n // ============ SubMenu (dropdown menus) ============\n subMenuItemBg: 'var(--bg-secondary)', // Submenu background\n popupBg: 'var(--bg-secondary)', // NEW: Popup menu background\n\n // ============ Primary color ============\n colorPrimary: 'var(--link)', // Primary color for active elements\n\n // ============ Icons (IMPORTANT for visibility) ============\n colorIcon: 'var(--text-secondary)', // NEW: Icon color\n colorIconHover: 'var(--text-primary)', // NEW: Icon hover\n\n // ============ Group title ============\n groupTitleColor: 'var(--text-tertiary)',\n groupTitleFontSize: 11,\n\n // ============ Item border radius ============\n itemBorderRadius: 8,\n subMenuItemBorderRadius: 6,\n\n // ============ Padding ============\n itemPaddingInline: 12,\n },\n Tabs: {\n // Base colors\n colorText: 'var(--text-secondary)',\n colorTextHeading: 'var(--text-primary)',\n colorBorder: 'var(--border-primary)',\n colorBorderSecondary: 'var(--border-primary)',\n\n // Interactive states (IMPORTANT for tab navigation feedback)\n colorPrimary: 'var(--link)',\n itemHoverColor: 'var(--link)', // Tab hover color\n itemSelectedColor: 'var(--link)', // Selected tab color\n itemActiveColor: 'var(--link)', // Active tab color\n inkBarColor: 'var(--link)', // Active tab underline\n\n },\n Modal: {\n // Content colors\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n\n // Header & Footer\n headerBg: 'var(--bg-secondary)', // NEW: Modal header background\n footerBg: 'var(--bg-tertiary)', // NEW: Modal footer background\n contentBg: 'var(--bg-secondary)', // NEW: Modal content background\n\n // Close icon (IMPORTANT for visibility)\n colorIcon: 'var(--text-secondary)', // NEW: Close icon color\n colorIconHover: 'var(--text-primary)', // NEW: Close icon hover\n },\n Drawer: {\n // Content colors\n colorText: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n\n // Close icon (IMPORTANT for visibility)\n colorIcon: 'var(--text-secondary)', // NEW: Close icon color\n colorIconHover: 'var(--text-primary)', // NEW: Close icon hover\n },\n Popover: {\n colorText: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n },\n Tooltip: {\n colorText: 'var(--text-primary)',\n colorBgSpotlight: 'var(--bg-secondary)',\n colorTextLightSolid: 'var(--text-primary)',\n },\n List: {\n // Base colors\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBorder: 'var(--border-primary)',\n colorSplit: 'var(--border-primary)',\n\n metaMarginBottom: 8, // Meta info spacing\n avatarMarginRight: 16, // NEW: Avatar spacing\n },\n Switch: {\n colorPrimary: 'var(--link)',\n colorPrimaryHover: 'var(--link-hover)',\n },\n Radio: {\n colorPrimary: 'var(--link)',\n colorText: 'var(--text-primary)',\n buttonCheckedBg: 'var(--link)',\n buttonCheckedBgDisabled: 'var(--disabled)',\n buttonColor: 'var(--text-primary)',\n buttonSolidCheckedColor: 'var(--text-inverse)',\n buttonSolidCheckedBg: 'var(--link)',\n buttonSolidCheckedHoverBg: 'var(--link-hover)',\n buttonSolidCheckedActiveBg: 'var(--link-hover)',\n },\n Checkbox: {\n colorPrimary: 'var(--link)',\n colorText: 'var(--text-primary)',\n },\n DatePicker: {\n // Base colors\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n colorTextPlaceholder: 'var(--text-tertiary)',\n colorTextDisabled: 'var(--disabled)',\n\n // Interactive states (IMPORTANT for date selection feedback)\n colorLink: 'var(--link)', // Selected date color\n colorLinkHover: 'var(--link-hover)', // Date hover color\n cellHoverBg: 'var(--bg-hover)', // NEW: Date cell hover background\n cellActiveWithRangeBg: 'var(--accent-subtle)', // NEW: Range selection background\n cellBgDisabled: 'var(--bg-tertiary)', // NEW: Disabled date background\n\n // Icons (IMPORTANT for visibility)\n colorIcon: 'var(--text-secondary)', // NEW: Calendar icon color\n colorIconHover: 'var(--text-primary)', // NEW: Calendar icon hover\n },\n Form: {\n colorText: 'var(--text-primary)',\n colorTextLabel: 'var(--text-secondary)',\n colorError: 'var(--error)',\n colorWarning: 'var(--warning)',\n },\n Pagination: {\n // Base colors\n colorText: 'var(--text-primary)',\n colorTextDisabled: 'var(--disabled)',\n colorBgContainer: 'var(--bg-secondary)',\n\n // Interactive states (IMPORTANT for navigation feedback)\n colorPrimary: 'var(--link)', // Active page background\n colorPrimaryHover: 'var(--link-hover)', // Active page hover\n itemBg: 'var(--bg-secondary)', // NEW: Page item background\n itemActiveBg: 'var(--link)', // NEW: Active page background\n itemActiveBgDisabled: 'var(--bg-tertiary)', // NEW: Disabled active page\n itemInputBg: 'var(--bg-secondary)', // NEW: Quick jumper input background\n itemLinkBg: 'var(--bg-secondary)', // NEW: Page link background\n\n // Hover states (IMPORTANT for visual feedback)\n colorBgTextHover: 'var(--bg-hover)', // NEW: Page item hover background\n },\n Steps: {\n colorText: 'var(--text-primary)',\n colorTextDescription: 'var(--text-secondary)',\n colorPrimary: 'var(--link)',\n colorBorder: 'var(--border-primary)',\n },\n Breadcrumb: {\n colorText: 'var(--text-secondary)',\n colorTextDescription: 'var(--text-tertiary)',\n linkColor: 'var(--link)',\n linkHoverColor: 'var(--link-hover)',\n separatorColor: 'var(--text-tertiary)',\n },\n Progress: {\n colorText: 'var(--text-primary)',\n colorSuccess: 'var(--success)',\n colorError: 'var(--error)',\n remainingColor: 'var(--bg-tertiary)',\n },\n Skeleton: {\n colorFill: 'var(--bg-tertiary)',\n colorFillContent: 'var(--bg-hover)',\n },\n Spin: {\n colorPrimary: 'var(--link)',\n colorBgContainer: 'var(--bg-secondary)',\n },\n Divider: {\n colorSplit: 'var(--border-primary)',\n colorText: 'var(--text-secondary)',\n },\n Layout: {\n headerBg: 'var(--bg-secondary)',\n bodyBg: 'var(--bg-primary)',\n triggerBg: 'var(--bg-tertiary)',\n colorText: 'var(--text-primary)',\n },\n Collapse: {\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBorder: 'var(--border-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n headerBg: 'var(--bg-tertiary)',\n },\n Carousel: {\n colorBgContainer: 'var(--bg-secondary)',\n dotActiveWidth: 24,\n },\n Anchor: {\n colorPrimary: 'var(--link)',\n colorText: 'var(--text-secondary)',\n linkPaddingBlock: 4,\n },\n Timeline: {\n colorText: 'var(--text-primary)',\n colorTextDescription: 'var(--text-secondary)',\n tailColor: 'var(--border-primary)',\n dotBg: 'var(--bg-secondary)',\n },\n Transfer: {\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n controlItemBgActive: 'var(--bg-hover)',\n },\n Tree: {\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorPrimary: 'var(--link)',\n nodeHoverBg: 'var(--bg-hover)',\n nodeSelectedBg: 'var(--accent-subtle)',\n },\n TreeSelect: {\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n nodeHoverBg: 'var(--bg-hover)',\n nodeSelectedBg: 'var(--accent-subtle)',\n },\n Cascader: {\n colorText: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n colorBgElevated: 'var(--bg-secondary)',\n optionSelectedBg: 'var(--bg-hover)',\n },\n Segmented: {\n colorText: 'var(--text-primary)',\n colorTextLabel: 'var(--text-secondary)',\n colorBgLayout: 'var(--bg-tertiary)',\n itemSelectedBg: 'var(--bg-secondary)',\n itemSelectedColor: 'var(--link)',\n itemHoverBg: 'var(--bg-hover)',\n },\n Rate: {\n colorText: 'var(--warning)',\n },\n Slider: {\n colorPrimary: 'var(--link)',\n colorPrimaryBorder: 'var(--link)',\n trackBg: 'var(--bg-tertiary)',\n trackHoverBg: 'var(--bg-hover)',\n },\n Upload: {\n colorText: 'var(--text-primary)',\n colorTextDescription: 'var(--text-secondary)',\n colorBorder: 'var(--border-primary)',\n colorFillAlter: 'var(--bg-tertiary)',\n colorPrimary: 'var(--link)',\n },\n Calendar: {\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBgContainer: 'var(--bg-secondary)',\n colorBorder: 'var(--border-primary)',\n itemActiveBg: 'var(--accent-subtle)',\n },\n Image: {\n colorTextLightSolid: 'var(--text-primary)',\n colorBgMask: 'rgba(0, 0, 0, 0.45)',\n },\n Statistic: {\n colorText: 'var(--text-primary)',\n colorTextDescription: 'var(--text-secondary)',\n },\n Result: {\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorTextDescription: 'var(--text-secondary)',\n },\n Empty: {\n colorText: 'var(--text-secondary)',\n colorTextDescription: 'var(--text-tertiary)',\n },\n Message: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)', // Message background\n contentBg: 'var(--bg-secondary)', // NEW: Content background\n contentPadding: '10px 16px', // NEW: Message padding\n\n // ============ Status colors ============\n colorSuccess: 'var(--success)',\n colorError: 'var(--error)',\n colorWarning: 'var(--warning)',\n colorInfo: 'var(--info)',\n },\n Notification: {\n // ============ Base colors ============\n colorText: 'var(--text-primary)',\n colorTextHeading: 'var(--text-primary)',\n colorBgElevated: 'var(--bg-secondary)', // Notification background\n colorBorder: 'var(--border-primary)',\n\n // ============ Close icon (IMPORTANT for visibility in dark theme!) ============\n colorIcon: 'var(--text-secondary)', // NEW: Close button icon color\n colorIconHover: 'var(--text-primary)', // NEW: Close button hover color\n\n // ============ Status colors ============\n colorSuccess: 'var(--success)',\n colorError: 'var(--error)',\n colorWarning: 'var(--warning)',\n colorInfo: 'var(--info)',\n },\n };\n}\n\n/**\n * Gets algorithm for Ant Design theme (for dark/light mode)\n */\nexport function getThemeAlgorithm(theme: 'light' | 'dark' | 'auto' = 'light'): MappingAlgorithm {\n const actualTheme = theme === 'auto' \n ? (typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')\n : theme;\n\n return actualTheme === 'dark' ? antdTheme.darkAlgorithm : antdTheme.defaultAlgorithm;\n}\n\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kb-labs/studio-hooks",
3
3
  "description": "Studio SDK hooks — useData, useMutateData, useSSE, useInfiniteData, useWebSocket, useEventBus, usePermissions, useNavigation, useNotification, useTheme",
4
- "version": "2.119.0-canary.e120bc0ee",
4
+ "version": "2.119.0",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -15,8 +15,8 @@
15
15
  "dist"
16
16
  ],
17
17
  "dependencies": {
18
- "@kb-labs/studio-event-bus": "2.119.0-canary.e120bc0ee",
19
- "@kb-labs/studio-ui-core": "2.119.0-canary.e120bc0ee"
18
+ "@kb-labs/studio-event-bus": "2.119.0",
19
+ "@kb-labs/studio-ui-core": "2.119.0"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@tanstack/react-query": "^5.62.23",
@@ -29,10 +29,10 @@
29
29
  "tsup": "^8.5.0",
30
30
  "typescript": "^5.6.3",
31
31
  "vitest": "^3.2.6",
32
- "@kb-labs/devkit": "2.119.0-canary.e120bc0ee"
32
+ "@kb-labs/devkit": "2.119.0"
33
33
  },
34
34
  "engines": {
35
- "node": ">=22.0.0",
35
+ "node": ">=24.0.0",
36
36
  "pnpm": ">=9.0.0"
37
37
  },
38
38
  "peerDependencies": {