@agentiffai/design 1.3.12 → 1.3.13

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/theme/tokens.ts","../../src/components/copilotkit/Button/Button.styles.ts","../../src/components/copilotkit/Button/Button.tsx","../../src/components/copilotkit/Actions/Actions.styles.ts","../../src/components/copilotkit/Actions/Actions.tsx","../../src/components/copilotkit/Response/Response.styles.ts","../../src/components/copilotkit/Response/Response.tsx","../../src/components/copilotkit/AgentState/AgentState.styles.ts","../../src/components/copilotkit/AgentState/AgentState.tsx","../../src/components/copilotkit/adapters/ActionExecutionAdapter.tsx","../../src/components/AssistantThinking/AssistantThinking.styles.ts","../../src/components/AssistantThinking/AssistantThinking.tsx","../../src/components/copilotkit/StreamingText.tsx","../../src/components/copilotkit/Messages/AssistantMessage.styles.ts","../../src/components/copilotkit/Messages/FileAttachment.styles.ts","../../src/components/copilotkit/Messages/FileAttachment.tsx","../../src/components/copilotkit/Messages/AssistantMessage.tsx","../../src/components/copilotkit/adapters/AssistantMessageAdapter.tsx","../../src/components/ChatInput/ChatInput.styles.ts","../../src/components/ChatInput/ChatInput.tsx","../../src/components/copilotkit/adapters/InputAdapter.tsx","../../src/components/UserMessage/UserMessage.styles.ts","../../src/components/UserMessage/UserMessage.tsx","../../src/components/copilotkit/adapters/UserMessageAdapter.tsx","../../src/components/copilotkit/StreamStatusIndicator.tsx","../../src/components/copilotkit/Header/Header.styles.ts","../../src/components/copilotkit/Header/Header.tsx","../../src/components/copilotkit/Messages/Messages.styles.ts","../../src/components/copilotkit/Messages/Messages.tsx","../../src/components/copilotkit/Window/Window.styles.ts","../../src/components/copilotkit/Window/Window.tsx","../../src/components/copilotkit/CopilotSidebarIntegration.tsx","../../src/components/copilotkit/CustomCopilotSidebar/CustomCopilotSidebar.tsx","../../src/components/copilotkit/Footer/Footer.styles.ts","../../src/components/copilotkit/Footer/Footer.tsx","../../src/components/copilotkit/Input/Input.styles.ts","../../src/components/copilotkit/Input/Input.tsx","../../src/components/copilotkit/Messages/MessagesList.styles.ts","../../src/components/copilotkit/Messages/MessagesList.tsx","../../src/components/copilotkit/Messages/UserMessage.styles.ts","../../src/components/copilotkit/Messages/UserMessage.tsx","../../src/components/copilotkit/StreamErrorMessage.tsx","../../src/components/copilotkit/Suggestions/Suggestions.styles.ts","../../src/components/copilotkit/Suggestions/Suggestions.tsx"],"names":["css","styled","useRef","useButton","jsx","jsxs","keyframes","dotPulse","Container","LoadingDots","Dot","Message","useEffect","useMemo","StreamingText","memo","Avatar","pulse","ActionsContainer","Fragment","useCopilotChat","useState","useCallback","ActionButton","createGlobalStyle","useChatContext","WindowAdapter","CopilotSidebar","GlobalSidebarStyles","StyledChatButton","CustomCopilotSidebar","InputWrapper","useTextField","StyledUserMessage","MessageContent","MessageTime","UserMessage","Content","Actions","Button"],"mappings":";;;;;;;;;;;;;;;;;AAMO,IAAM,MAAA,GAAS;AAAA,EACpB,MAAA,EAAQ;AAAA;AAAA,IAEN,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,SAAA,EAAW,SAAA;AAAA;AAAA,IACX,MAAA,EAAQ,SAAA;AAAA,IACE;AAAA;AAAA,IAGV,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,SAAA;AAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA;AAAA,MACN,KAAA,EAAO;AAAA;AAAA,KACT;AAAA;AAAA,IAGA,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAW,SAAA;AAAA,MACX,QAAA,EAAU,SAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACZ;AAAA,IAGS;AAAA,IACT,KAAA,EAAO,SAAA;AAAA,IAED;AAAA;AAAA,IAGN,MAAA,EAAQ;AAAA,MAGN,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,SAAA;AAAA,MACE;AAAA,MACX,MAAA,EAAQ,SAMV,CAAA;AAAA;AAAA,IAGA,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,SAAA;AAAA;AAAA,MACX,SAAA,EAAW,SAAA;AAAA;AAAA,MACX,YAAA,EAAc,SAAA;AAAA,MACd,YAAA,EAAc;AAAA,KAChB;AAAA;AAAA,IAGA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,2BAAA;AAAA,MACT,YAAA,EAAc,0BAAA;AAAA,MACd,aAAA,EAAe,2BAAA;AAAA,MAEf,KAAA,EAAO,2BAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA;AAAA,IAGA,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,0BAAA;AAAA,MACT,MAAA,EAAQ,2BAAA;AAAA,MACR,KAAA,EAAO,0BAAA;AAAA,MACP,KAAA,EAAO,SAET,CAAA;AAAA;AAAA,IAGA,SAAA,EAAW;AAAA,MACT,KAAA,EAAO,aAAA;AAAA,MACP,KAAA,EAAO,0BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA;AAAA,IAGA,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,SAAA;AAAA;AAAA,MACN,EAAA,EAAI,SAAA;AAAA;AAAA,MACJ,MAAA,EAAQ;AAAA;AAAA,KACV;AAAA,IAIA,QAAA,EAAU,wBAuBZ,CAAA;AAAA,EAEA,UAAA,EAAY;AAAA,IACV,UAAA,EAAY;AAAA,MACV,OAAA,EACE,uFAAA;AAAA,MAGF,SAAA,EAAW;AAAA,KACb;AAAA,IACA,QAAA,EAAU;AAAA,MACR,EAAA,EAAI,UAAA;AAAA;AAAA,MACJ,EAAA,EAAI,MAAA;AAAA;AAAA,MACJ,IAAA,EAAM,UAAA;AAAA;AAAA,MACN,EAAA,EAAI,UAAA;AAAA,MACA;AAAA,MACJ,KAAA,EAAO,QAGT,CAAA;AAAA,IACA,UAAA,EAAY;AAAA,MAEV,OAAA,EAAS,GAAA;AAAA,MACT,MAAA,EAAQ,GAAA;AAAA,MACR,QAAA,EAAU,GAAA;AAAA,MACV,IAAA,EAAM;AAAA,KACR;AAAA,IACA,UAAA,EAAY;AAAA,MACV,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,GAEV;AAAA,GACF;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,SAAA;AAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA;AAAA,IACJ,EAAA,EAAI,MAGN,CAAA;AAAA,EAEA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,GAAA;AAAA,IACN,EAAA,EAAI,SAAA;AAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA;AAAA,IACJ,KAAA,EAAO,QAAA;AAAA;AAAA,IACP,IAAA,EAAM;AAAA;AAAA,GACR;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,EAAA,EAAI,iCAAA;AAAA,IACJ,EAAA,EAAI,uEAAA;AAAA,IACJ,EAAA,EAAI,yEAAA;AAAA,IAGJ,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,kCAAA;AAAA,MACT,SAAA,EAAW,iCAAA;AAAA,MACX,MAAA,EAAQ;AAAA;AACV,GACF;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,mBAAA;AAAA,IACN,MAAA,EAAQ,mBAEV,CAAA;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,QAAA,EAAU;AAAA,MAER,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ,OAEV,CAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MAGN,MAAA,EAAQ,8BAEV;AAAA,GACF;AAAA,EAEA,MAAA,EAAQ;AAAA,IAIN,KAAA,EAAO,IAAA;AAAA,IAEP,KAAA,EAAO,IAIT,CAAA;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,MAAA,EAAQ,GAAA;AAAA,IACR,MAAA,EAAQ,IAEV;AACF,CAAA;;;ACtNA,IAAM,aAAA,GAAgB;AAAA,EACpB,OAAA,EAASA,WAAA;AAAA,sBAAA,EACa,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,WAAA,EAChC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,yBAAA,EAcZ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAInD,SAAA,EAAWA,WAAA;AAAA;AAAA,WAAA,EAEA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,sBAAA,EACf,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;;AAAA;AAAA,wBAAA,EAG1B,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,oBAAA,EACjC,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA;;AAAA;AAAA,wBAAA,EAIjB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA;AAAA;;AAAA;AAAA,yBAAA,EAIlC,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAInD,IAAA,EAAMA,WAAA;AAAA;AAAA,WAAA,EAEK,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA;AAAA,aAAA,EAExB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA;AAAA,wBAAA,EAIN,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,yBAAA,EASjC,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;AAAA;AAAA,EAAA;AAIrD,CAAA;AAEA,IAAM,UAAA,GAAa;AAAA,EACjB,KAAA,EAAOA,WAAA;AAAA,aAAA,EACM,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAI5C,MAAA,EAAQA,WAAA;AAAA,aAAA,EACK,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,EAI9C,KAAA,EAAOA,WAAA;AAAA,aAAA,EACM,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA;AAAA;AAAA,EAAA;AAI9C,CAAA;AAEO,IAAM,eAAeC,wBAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,EAK1B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,eAAA,EACT,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,iBAAA,EACjC,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,kBAAA,EAErB,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA;AAAA;;AAAA;AAAA,EAAA,EAKzC,CAAC,EAAE,QAAA,EAAS,KAAM,aAAA,CAAc,QAAQ,CAAC;;AAAA;AAAA,EAAA,EAGzC,CAAC,EAAE,KAAA,EAAO,QAAA,OAAe,QAAA,KAAa,MAAA,IAAU,UAAA,CAAW,KAAK,CAAC;;AAAA;AAAA,EAAA,EAGjE,CAAC,EAAE,QAAA,EAAU,KAAA,EAAM,KACnB,aAAa,MAAA,IACbD,WAAA;AAAA,aAAA,EACW,UAAU,OAAA,GAAU,MAAA,GAAS,KAAA,KAAU,OAAA,GAAU,SAAS,MAAM,CAAA;AAAA,cAAA,EAC/D,UAAU,OAAA,GAAU,MAAA,GAAS,KAAA,KAAU,OAAA,GAAU,SAAS,MAAM,CAAA;AAAA,qBAAA,EACzD,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,IAAA,CACxC;;AAAA;AAAA,EAAA,EAGD,CAAC,EAAE,UAAA,EAAW,KACd,UAAA,IACAA,WAAA;AAAA;AAAA,IAAA,CAEC;;AAAA;AAAA,EAAA,EAGD,CAAC,EAAE,UAAA,EAAW,KACd,UAAA,IACAA,WAAA;AAAA;AAAA;AAAA,IAAA,CAGC;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;ACvHE,SAAS,MAAA,CAAO;AAAA,EACrB,OAAA,GAAU,SAAA;AAAA,EACV,IAAA,GAAO,QAAA;AAAA,EACP,QAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,KAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAgB;AACd,EAAA,MAAM,GAAA,GAAME,aAA0B,IAAI,CAAA;AAC1C,EAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAU,GAAIC,gBAAA;AAAA,IACjC;AAAA,MACE,GAAG,SAAA;AAAA,MACH,YAAY,QAAA,IAAY;AAAA,KAC1B;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEC,cAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACE,GAAG,WAAA;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,EAAU,OAAA;AAAA,MACV,KAAA,EAAO,IAAA;AAAA,MACP,UAAA,EAAY,SAAA;AAAA,MACZ,UAAA,EAAY,SAAA;AAAA,MACZ,UAAU,QAAA,IAAY,SAAA;AAAA,MAErB,QAAA,EAAA,SAAA,kCACE,MAAA,EAAA,EAAK,WAAA,EAAU,UAAS,WAAA,EAAU,MAAA,EAAO,wBAE1C,CAAA,GAEA;AAAA;AAAA,GAEJ;AAEJ;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;AClDd,IAAM,mBAAmBH,wBAAAA,CAAO,GAAA;AAAA;AAAA,OAAA,EAE9B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA,EAAA,EAGtB,CAAC,EAAE,OAAA,EAAQ,KACX,YAAY,YAAA,GACRD,WAAAA;AAAA;AAAA;AAAA,QAAA,CAAA,GAIAA,WAAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,QAAA,CAOC;AAAA,CAAA;ACbF,SAAS,QAAQ,EAAE,OAAA,EAAS,MAAA,GAAS,YAAA,EAAc,WAAU,EAAiB;AACnF,EAAA,uBACEI,eAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,QAAQ,SAAA,EAChC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,qBACZC,eAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MAEC,OAAA,EAAS,OAAO,OAAA,IAAW,WAAA;AAAA,MAC3B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,YAAY,MAAA,CAAO,QAAA;AAAA,MACnB,cAAY,MAAA,CAAO,KAAA;AAAA,MAElB,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,wBAAQD,cAAAA,CAAC,UAAK,aAAA,EAAY,MAAA,EAAQ,iBAAO,IAAA,EAAK,CAAA;AAAA,QACrD,MAAA,CAAO,OAAA,KAAY,MAAA,IAAU,MAAA,CAAO;AAAA;AAAA,KAAA;AAAA,IAPhC,MAAA,CAAO;AAAA,GASf,CAAA,EACH,CAAA;AAEJ;AAEA,OAAA,CAAQ,WAAA,GAAc,SAAA;AC5BtB,IAAM,QAAA,GAAWE,iBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAYjB,IAAM,MAAA,GAASA,iBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAUf,IAAM,KAAA,GAAQA,iBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AASP,IAAM,oBAAoBL,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG/B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EAC7B,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,iBAAA,EACjC,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,eAAA,EAExB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA;AAAA;AAAA,CAAA;AAK9C,IAAM,cAAcA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAGzB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,aAAA,EACX,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAGzB,IAAM,MAAMA,wBAAAA,CAAO,IAAA;AAAA,SAAA,EACf,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,UAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,iBAAA,EACV,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,oBAAA,EACrB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,aAAA,EAClC,QAAQ,CAAA;AAAA,mBAAA,EACF,CAAC,KAAA,KAAU,KAAA,CAAM,KAAK,CAAA;AAAA,CAAA;AAGpC,IAAM,kBAAkBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG7B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,aAAA,EACX,MAAA,CAAO,QAAQ,EAAE,CAAA;;AAAA,EAAA,EAE5B,GAAG,CAAA;AAAA,WAAA,EACM,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,YAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,sBAAA,EACP,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,eAAA,EAClC,QAAQ,CAAA;AAAA;AAAA,CAAA;AAIlB,IAAM,UAAUA,wBAAAA,CAAO,IAAA;AAAA,aAAA,EACf,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,SAAA,EACjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,eAAA,EACpB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA;AAAA,CAAA;AAI7C,IAAM,gBAAgBA,wBAAAA,CAAO,GAAA;AAAA,aAAA,EACrB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,SAAA,EACzC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,aAAA,EACtB,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,SAAA,CAAU,SAAS,MAAM,CAAA;AAAA;AAAA,eAAA,EAExC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAOpC,KAAK,CAAA;AAAA,WAAA,EACT,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,iBAAA,EACrB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA;AAAA,CAAA;ACzEhD,IAAM,WAAW,CAAC;AAAA,EACvB,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,WAAA,GAAc,KAAA;AAAA,EACd,gBAAA,GAAmB,EAAA;AAAA,EACnB,OAAA,GAAU,aAAA;AAAA,EACV;AACF,CAAA,KAAqB;AAEnB,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEI,eAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAsB,eAAY,kBAAA,EACnD,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,WAAA,EAAA,EAAY,aAAA,EAAY,MAAA,EACvB,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,wBACfA,cAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,wBAClBA,cAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK;AAAA,OAAA,EACnB,CAAA;AAAA,sBACAA,cAAAA,CAAC,OAAA,EAAA,EAAS,QAAA,EAAA,OAAA,EAAQ;AAAA,KAAA,EACpB,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBACEC,eAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAsB,eAAY,iBAAA,EACnD,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,eAAA,EAAA,EAAgB,aAAA,EAAY,MAAA,EAC3B,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,wBACfA,cAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,wBAClBA,cAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAO,GAAA,EAAK;AAAA,OAAA,EACnB,CAAA;AAAA,sBACAA,cAAAA,CAAC,OAAA,EAAA,EAAS,QAAA,EAAA,OAAA,EAAQ;AAAA,KAAA,EACpB,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,eAAe,gBAAA,EAAkB;AACnC,IAAA,uBACEA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAsB,aAAA,EAAY,sBACnD,QAAA,kBAAAA,cAAAA,CAAC,aAAA,EAAA,EAAe,QAAA,EAAA,gBAAA,EAAiB,CAAA,EACnC,CAAA;AAAA,EAEJ;AAGA,EAAA,OAAO,IAAA;AACT;ACvEA,IAAMG,SAAAA,GAAWD,iBAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAYjB,IAAM,KAAA,GAAQA,iBAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAYP,IAAM,sBAAsBL,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,OAAA,EAIjC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EAC7B,CAAC,UAAW,KAAA,CAAM,OAAA,GAAU,4BAA4B,MAAA,CAAO,MAAA,CAAO,QAAQ,QAAS,CAAA;AAAA,iBAAA,EAC1F,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,UAAA,EAC7B,CAAC,UAAW,KAAA,CAAM,OAAA,GAAU,aAAa,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAA,GAAK,MAAO,CAAA;AAAA;AAAA,eAAA,EAEnE,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA;AAAA;AAAA,CAAA;AAK9C,IAAM,eAAeA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG1B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,CAAA;AAKnB,IAAM,gBAAgBA,wBAAAA,CAAO,GAAA;AAAA,SAAA,EACzB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,UAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EACP,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,iBAAA,EAC5B,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,aAAA,EAC5BM,SAAQ,CAAA;AAAA,CAAA;AAGhB,IAAM,iBAAiBN,wBAAAA,CAAO,GAAA;AAAA,SAAA,EAC1B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,UAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EACP,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,iBAAA,EACtB,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,aAAA,EAC5B,KAAK,CAAA;AAAA,CAAA;AAGb,IAAM,aAAaA,wBAAAA,CAAO,IAAA;AAAA,aAAA,EAClB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,SAAA,EAC1C,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,eAAA,EACpB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA;AAAA,CAAA;AAIzBA,wBAAAA,CAAO,CAAA;AAAA,aAAA,EACnB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,SAAA,EACjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,eAAA,EACrB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAM7C,IAAM,cAAcA,wBAAAA,CAAO,GAAA;AAAA;AAAA,UAAA,EAEtB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EACP,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,iBAAA,EACjC,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,cAAA,EAEzB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAG1B,IAAM,kBAAkBA,wBAAAA,CAAO,GAAA;AAAA;AAAA,SAAA,EAE3B,CAAC,KAAA,KAAU,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,sCAAA,EACxB,OAAO,MAAA,CAAO,MAAM,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,iBAAA,EACtE,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,oBAAA,EACnB,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,CAAA;ACxExC,IAAM,aAAa,CAAC,EAAE,OAAO,OAAA,EAAS,QAAA,EAAU,WAAU,KAAuB;AAEtF,EAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,IAAA,uBACEG,eAAC,mBAAA,EAAA,EAAoB,SAAA,EAAsB,eAAY,kBAAA,EACrD,QAAA,kBAAAC,gBAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,eAAC,aAAA,EAAA,EAAc,CAAA;AAAA,sBACfA,cAAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,OAAA,IAAW,eAAA,EAAgB,CAAA;AAAA,MACvC,QAAA,KAAa,0BACZA,cAAAA,CAAC,eACC,QAAA,kBAAAA,cAAAA,CAAC,eAAA,EAAA,EAAgB,QAAA,EAAoB,CAAA,EACvC;AAAA,KAAA,EAEJ,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,uBACEA,cAAAA,CAAC,mBAAA,EAAA,EAAoB,SAAA,EAAsB,aAAA,EAAY,qBAAoB,OAAA,EAAO,IAAA,EAChF,QAAA,kBAAAC,eAAAA,CAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,eAAC,cAAA,EAAA,EAAe,CAAA;AAAA,sBAChBA,cAAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,OAAA,IAAW,gBAAA,EAAiB;AAAA,KAAA,EAC3C,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,uBAAOA,eAAC,QAAA,EAAA,EAAS,SAAA,EAAS,MAAC,OAAA,EAAS,OAAA,IAAW,wBAAwB,SAAA,EAAsB,CAAA;AAAA,EAC/F;AAGA,EAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,IAAA,uBACEA,eAAC,QAAA,EAAA,EAAS,QAAA,EAAQ,MAAC,OAAA,EAAS,OAAA,IAAW,0BAA0B,SAAA,EAAsB,CAAA;AAAA,EAE3F;AAEA,EAAA,OAAO,IAAA;AACT;ACrCA,IAAM,YAAYH,wBAAAA,CAAO,GAAA;AAAA,UAAA,EACb,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,aAAA,EACd,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAGhC,IAAM,WAAWA,wBAAAA,CAAO,GAAA;AAAA,aAAA,EACT,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,SAAA,EACjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,iBAAA,EACnB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,eAAA,EACnB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA;AAAA,CAAA;AAUvD,SAAS,yBAAyB,OAAA,EAA0D;AAC1F,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,UAAU,OAAO,KAAA;AAEpD,EAAA,MAAM,GAAA,GAAM,OAAA;AAGZ,EAAA,IAAI,OAAO,GAAA,CAAI,wBAAA,KAA6B,UAAA,EAAY;AACtD,IAAA,OAAQ,IAAI,wBAAA,EAA2C;AAAA,EACzD;AAGA,EAAA,OACE,GAAA,CAAI,IAAA,KAAS,wBAAA,IACZ,OAAO,GAAA,CAAI,SAAS,QAAA,IAAY,WAAA,IAAe,GAAA,IAAO,EAAE,SAAA,IAAa,GAAA,CAAA;AAE1E;AAMA,SAAS,eAAe,IAAA,EAAsB;AAC5C,EAAA,OAAO,KACJ,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CAC1D,KAAK,GAAG,CAAA;AACb;AAKA,SAAS,cAAA,CAAe,MAAc,IAAA,EAAuC;AAE3E,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,cAAc,CAAA,EAAG;AACjC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,yBAAyB,KAAK,CAAA,CAAA,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,gCAAA;AAAA,EACT;AAGA,EAAA,OAAO,CAAA,QAAA,EAAW,cAAA,CAAe,IAAI,CAAC,CAAA,GAAA,CAAA;AACxC;AAcO,IAAM,sBAAA,GAAuD,CAAC,EAAE,OAAA,EAAS,YAAW,KAAM;AAE/F,EAAA,IAAI,CAAC,wBAAA,CAAyB,OAAO,CAAA,EAAG;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAW,OAAA,CAAQ,IAAA;AAEzB,EAAA,IAAI,WAAoC,EAAC;AACzC,EAAA,IAAI,OAAO,OAAA,CAAQ,SAAA,KAAc,QAAA,EAAU;AACzC,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,GAAW,EAAC;AAAA,IACd;AAAA,EACF,WAAW,OAAA,CAAQ,SAAA,IAAa,OAAO,OAAA,CAAQ,cAAc,QAAA,EAAU;AACrE,IAAA,QAAA,GAAW,OAAA,CAAQ,SAAA;AAAA,EACrB;AAGA,EAAA,MAAM,KAAA,GAAQ,aAAa,UAAA,GAAa,YAAA;AACxC,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,QAAA,EAAU,QAAQ,CAAA;AAEvD,EAAA,uBACEI,eAAAA,CAAC,SAAA,EAAA,EAAU,aAAA,EAAY,0BAAA,EACrB,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,QAAA,EAAA,EAAU,QAAA,EAAA,cAAA,CAAe,QAAQ,CAAA,EAAE,CAAA;AAAA,oBACpCA,cAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAc,SAAS,aAAA,EAAe;AAAA,GAAA,EACpD,CAAA;AAEJ;AAEA,sBAAA,CAAuB,WAAA,GAAc,wBAAA;ACxIrC,IAAMG,SAAAA,GAAWD,iBAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWjB,IAAM,KAAA,GAAQA,iBAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWd,IAAM,IAAA,GAAOA,iBAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAab,IAAM,YAAA,GAAe,CAAC,IAAA,GAA2B,IAAA,KAAS;AACxD,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,IAAA;AACH,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,QAClD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAA;AAAA,QACrC,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,IAAA;AACH,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,QAClD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,IAAA;AAAA,QACrC,OAAA,EAAS;AAAA,OACX;AAAA,IACF,KAAK,IAAA;AAAA,IACL;AACE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,QAClD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,QAAA,EAAU,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAA;AAAA,QACrC,OAAA,EAAS;AAAA,OACX;AAAA;AAEN,CAAA;AAEO,IAAME,aAAYP,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAGvB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,IAAI,EAAE,OAAO,CAAA;AAAA,oBAAA,EAClC,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAAA,iBAAA,EAC7B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,cAAA,EACzB,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA,eAAA,EAClB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA;AAAA;AAAA,CAAA;AAK9C,IAAM,SAASA,wBAAAA,CAAO,GAAA;AAAA,SAAA,EAClB,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,IAAI,EAAE,MAAM,CAAA;AAAA,UAAA,EACzC,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,IAAI,EAAE,MAAM,CAAA;AAAA,iBAAA,EACnC,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,sCAAA,EACH,OAAO,MAAA,CAAO,SAAS,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAK5E,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAAA,CAAA;AAGpC,IAAM,iBAAiBA,wBAAAA,CAAO,GAAA;AAAA,SAAA,EAC1B,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,IAAI,EAAE,IAAI,CAAA;AAAA,UAAA,EACvC,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,IAAI,EAAE,IAAI,CAAA;AAAA,SAAA,EACzC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,CAAA;AAG9B,IAAM,UAAUA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAGrB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAOnB,IAAMQ,eAAcR,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAGzB,CAAC,KAAA,KAAW,KAAA,CAAM,OAAA,KAAY,MAAA,GAAS,QAAQ,CAAA,EAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAG,CAAA;AAAA,aAAA,EAChE,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAOzB,IAAMS,OAAMT,wBAAAA,CAAO,IAAA;AAAA,SAAA,EACf,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,IAAI,EAAE,OAAO,CAAA;AAAA,UAAA,EAC1C,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,IAAI,EAAE,OAAO,CAAA;AAAA,iBAAA,EACpC,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,oBAAA,EACrB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,aAAA,EAClC,CAAC,KAAA,KAAU;AACtB,EAAA,QAAQ,MAAM,OAAA;AAAS,IACrB,KAAK,OAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT,KAAK,MAAA;AAAA,IACL;AACE,MAAA,OAAOM,SAAAA;AAAA;AAEb,CAAC;AAAA;AAAA,CAAA;AAII,IAAMI,WAAUV,wBAAAA,CAAO,IAAA;AAAA,aAAA,EACf,CAAC,KAAA,KAAU,YAAA,CAAa,KAAA,CAAM,IAAI,EAAE,QAAQ,CAAA;AAAA,SAAA,EAChD,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,eAAA,EACtB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA;AAAA,CAAA;AC1H7C,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA,GAAU,gCAAA;AAAA,EACV,SAAA;AAAA,EACA,SAAA,GAAY,uBAAA;AAAA,EACZ,OAAA,GAAU,MAAA;AAAA,EACV,IAAA,GAAO;AACT,CAAA,EAA2B;AACzB,EAAA,MAAM,YAAA,GAAeC,aAAuB,IAAI,CAAA;AAEhD,EAAA,MAAM,yBAAyB,MAAM;AACnC,IAAA,QAAQ,OAAA;AAAS,MACf,KAAK,MAAA;AACH,QAAA,uBACEG,eAAAA,CAACI,YAAAA,EAAA,EAAY,aAAA,EAAY,QAAO,IAAA,EAC9B,QAAA,EAAA;AAAA,0BAAAL,cAAAA,CAACM,MAAA,EAAI,KAAA,EAAO,EAAE,cAAA,EAAgB,KAAA,IAAS,IAAA,EAAY,CAAA;AAAA,0BACnDN,eAACM,IAAAA,EAAA,EAAI,OAAO,EAAE,cAAA,EAAgB,OAAA,EAAQ,EAAG,IAAA,EAAY,CAAA;AAAA,0BACrDN,eAACM,IAAAA,EAAA,EAAI,OAAO,EAAE,cAAA,EAAgB,OAAA,EAAQ,EAAG,IAAA,EAAY;AAAA,SAAA,EACvD,CAAA;AAAA,MAEJ,KAAK,OAAA;AACH,QAAA,uBACEN,eAACK,YAAAA,EAAA,EAAY,eAAY,MAAA,EAAO,IAAA,EAAY,SAAQ,OAAA,EAClD,QAAA,kBAAAL,eAACM,IAAAA,EAAA,EAAI,OAAO,EAAE,cAAA,EAAgB,OAAM,EAAG,IAAA,EAAY,OAAA,EAAQ,OAAA,EAAQ,CAAA,EACrE,CAAA;AAAA,MAEJ,KAAK,MAAA;AACH,QAAA,uBACEL,gBAACI,YAAAA,EAAA,EAAY,eAAY,MAAA,EAAO,IAAA,EAAY,SAAQ,MAAA,EAClD,QAAA,EAAA;AAAA,0BAAAL,cAAAA,CAACM,IAAAA,EAAA,EAAI,KAAA,EAAO,EAAE,gBAAgB,KAAA,EAAM,EAAG,IAAA,EAAY,OAAA,EAAQ,MAAA,EAAO,CAAA;AAAA,0BAClEN,cAAAA,CAACM,IAAAA,EAAA,EAAI,KAAA,EAAO,EAAE,cAAA,EAAgB,OAAA,EAAQ,EAAG,IAAA,EAAY,OAAA,EAAQ,MAAA,EAAO,CAAA;AAAA,0BACpEN,cAAAA,CAACM,IAAAA,EAAA,EAAI,KAAA,EAAO,EAAE,cAAA,EAAgB,OAAA,EAAQ,EAAG,IAAA,EAAY,OAAA,EAAQ,MAAA,EAAO,CAAA;AAAA,0BACpEN,cAAAA,CAACM,IAAAA,EAAA,EAAI,KAAA,EAAO,EAAE,cAAA,EAAgB,OAAA,EAAQ,EAAG,IAAA,EAAY,OAAA,EAAQ,MAAA,EAAO,CAAA;AAAA,0BACpEN,cAAAA,CAACM,IAAAA,EAAA,EAAI,KAAA,EAAO,EAAE,cAAA,EAAgB,OAAA,EAAQ,EAAG,IAAA,EAAY,OAAA,EAAQ,MAAA,EAAO;AAAA,SAAA,EACtE,CAAA;AAAA,MAEJ,KAAK,MAAA;AACH,QAAA,OAAO,IAAA;AAAA;AAAA,MACT;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF,CAAA;AAEA,EAAA,uBACEL,eAAAA;AAAA,IAACG,UAAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,SAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAY,SAAA;AAAA,MACZ,IAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,cAAAA,CAAC,UAAO,aAAA,EAAY,MAAA,EAAO,MACzB,QAAA,kBAAAA,cAAAA,CAAC,kBAAe,OAAA,EAAQ,WAAA,EAAY,MAAK,cAAA,EAAe,KAAA,EAAM,8BAC5D,QAAA,kBAAAA,cAAAA,CAAC,UAAK,CAAA,EAAE,oIAAA,EAAqI,GAC/I,CAAA,EACF,CAAA;AAAA,wBACAC,gBAAC,OAAA,EAAA,EACE,QAAA,EAAA;AAAA,UAAA,sBAAA,EAAuB;AAAA,0BACxBD,cAAAA,CAACO,QAAAA,EAAA,EAAQ,MAAa,QAAA,EAAA,OAAA,EAAQ;AAAA,SAAA,EAChC;AAAA;AAAA;AAAA,GACF;AAEJ;AAEA,iBAAA,CAAkB,WAAA,GAAc,mBAAA;ACnEhC,SAAS,cAAc,IAAA,EAAiC;AACtD,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AAEnB,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,IAAI,GAAA,GAAM,CAAA;AAGV,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAErC,EAAA,UAAA,CAAW,OAAA,CAAQ,CAAC,SAAA,EAAW,MAAA,KAAW;AACxC,IAAA,IAAI,SAAS,CAAA,EAAG;AAEd,MAAA,QAAA,CAAS,IAAA,iBAAKP,cAAAA,CAAC,IAAA,EAAA,EAAA,EAAQ,KAAO,CAAE,CAAA;AAChC,MAAA,QAAA,CAAS,IAAA,iBAAKA,cAAAA,CAAC,IAAA,EAAA,EAAA,EAAQ,KAAO,CAAE,CAAA;AAAA,IAClC;AAGA,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAClC,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,SAAA,KAAc;AACjC,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,QAAA,CAAS,IAAA,iBAAKA,cAAAA,CAAC,IAAA,EAAA,EAAA,EAAQ,KAAO,CAAE,CAAA;AAAA,MAClC;AAGA,MAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,IAAA,EAAM,GAAG,CAAA;AAC5C,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAChC,MAAA,GAAA,GAAM,MAAA,CAAO,OAAA;AAAA,IACf,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,mBAAA,CACP,MACA,QAAA,EACkD;AAClD,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,IAAI,GAAA,GAAM,QAAA;AAIV,EAAA,MAAM,WAAA,GACJ,oEAAA;AAEF,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,KAAA;AAGJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAEhD,IAAA,IAAI,KAAA,CAAM,QAAQ,SAAA,EAAW;AAC3B,MAAA,QAAA,CAAS,KAAK,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,EAAG;AAEZ,MAAA,QAAA,CAAS,IAAA,iBAAKA,cAAAA,CAAC,QAAA,EAAA,EAAoB,gBAAM,CAAC,CAAA,EAAA,EAAf,KAAiB,CAAS,CAAA;AAAA,IACvD,CAAA,MAAA,IAAW,KAAA,CAAM,CAAC,CAAA,EAAG;AAEnB,MAAA,QAAA,CAAS,IAAA,iBAAKA,cAAAA,CAAC,IAAA,EAAA,EAAgB,gBAAM,CAAC,CAAA,EAAA,EAAf,KAAiB,CAAK,CAAA;AAAA,IAC/C,CAAA,MAAA,IAAW,KAAA,CAAM,CAAC,CAAA,EAAG;AAEnB,MAAA,QAAA,CAAS,IAAA,iBAAKA,cAAAA,CAAC,MAAA,EAAA,EAAkB,gBAAM,CAAC,CAAA,EAAA,EAAf,KAAiB,CAAO,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,KAAA,CAAM,CAAC,CAAA,EAAG;AAEnB,MAAA,QAAA,CAAS,IAAA;AAAA,wBACPA,cAAAA,CAAC,GAAA,EAAA,EAAc,IAAA,EAAM,MAAM,CAAC,CAAA,EAAG,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,qBAAA,EAChD,QAAA,EAAA,KAAA,CAAM,CAAC,KADF,GAAA,EAER;AAAA,OACF;AAAA,IACF;AAEA,IAAA,SAAA,GAAY,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAAA,EACrC;AAGA,EAAA,IAAI,SAAA,GAAY,KAAK,MAAA,EAAQ;AAC3B,IAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA,EACrC;AAGA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EACpB;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,GAAA,EAAI;AAClC;AAmBA,IAAMI,aAAYP,wBAAAA,CAAO,GAAA;AAAA,eAAA,EACR,CAAC,KAAA,KACd,KAAA,CAAM,QAAA,KAAa,MAAA,GACf,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,SAAA,GAC7B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA;AAAA;AAAA,eAAA,EAG3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,iBAAA,EAOjC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAAA,WAAA,EACvC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,iBAAA,EAQpB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA;AAAA,gBAAA,EACvC,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA;AAAA,mBAAA,EAE1B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA;;AAAA;AAAA,WAAA,EAK9B,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AASlC,IAAM,SAASA,wBAAAA,CAAO,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAgCtB,IAAM,oBAAkD,CAAC;AAAA,EACvD,OAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,aAAa,YAAA,GAAe,EAAA;AAAA;AAAA,EAC5B,MAAA,GAAS,IAAA;AAAA,EACT,OAAA,GAAU,SAAA;AAAA,EACV,gBAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,eAAA,GAAkBC,aAAO,WAAW,CAAA;AAC1C,EAAA,MAAM,mBAAA,GAAsBA,aAAO,KAAK,CAAA;AAGxC,EAAAU,eAAA,CAAU,MAAM;AAEd,IAAA,IAAI,gBAAgB,OAAA,IAAW,CAAC,WAAA,IAAe,CAAC,oBAAoB,OAAA,EAAS;AAC3E,MAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,MAAA,gBAAA,IAAmB;AAAA,IACrB;AAGA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,mBAAA,CAAoB,OAAA,GAAU,KAAA;AAAA,IAChC;AAEA,IAAA,eAAA,CAAgB,OAAA,GAAU,WAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAElC,EAAA,MAAM,aAAa,WAAA,IAAe,MAAA;AAGlC,EAAA,MAAM,eAAA,GAAkBC,cAAQ,MAAM;AACpC,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,OAAO,cAAc,OAAO,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,EAAG,CAAC,OAAA,EAAS,OAAO,CAAC,CAAA;AAGrB,EAAA,uBACER,eAAAA,CAACG,UAAAA,EAAA,EAAU,QAAA,EAAU,SAAS,SAAA,EAC3B,QAAA,EAAA;AAAA,IAAA,eAAA;AAAA,IACA,UAAA,oBAAcJ,cAAAA,CAAC,MAAA,EAAA,EAAO;AAAA,GAAA,EACzB,CAAA;AAEJ,CAAA;AAGO,IAAMU,cAAAA,GAAgBC,WAAK,iBAAiB;AAEnDD,cAAAA,CAAc,WAAA,GAAc,eAAA;ACtPrB,IAAM,mBAAmBb,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG9B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAOvB,IAAM,kBAAkBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG7B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,CAAA;AAInB,IAAMe,UAASf,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,iBAAA,EAGV,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA;AAAA;AAAA,CAAA;AAKpC,IAAM,iBAAiBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,iBAAA,EAGlB,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAA,EAKrB,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWtC,IAAM,cAAcA,wBAAAA,CAAO,IAAA;AAAA,aAAA,EACnB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,SAAA,EACzC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,CAAA;AAGhC,IAAM,mBAAmBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,CAAA;AAKhC,IAAM,iBAAiBA,wBAAAA,CAAO,GAAA;AAAA;AAAA,oBAAA,EAEf,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,WAAA,EACvC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,iBAAA,EACX,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,SAAA,EAC9B,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,aAAA,EACtB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,eAAA,EACnC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAO9C,IAAMQ,eAAcR,wBAAAA,CAAO,GAAA;AAAA;AAAA,OAAA,EAEzB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,oBAAA,EAER,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,iBAAA,EACjC,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,CAAA;AAKzC,IAAMgB,MAAAA,GAAQX,iBAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AASP,IAAM,aAAaL,wBAAAA,CAAO,GAAA;AAAA,SAAA,EACtB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,UAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,iBAAA,EACV,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,oBAAA,EACrB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA;AAAA,aAAA,EAElCgB,MAAK,CAAA;AAAA,mBAAA,EACC,CAAC,KAAA,KAAU,KAAA,CAAM,KAAK,CAAA;AAAA,CAAA;AC9FpC,IAAM,0BAA0BhB,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAGrC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EACR,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,oBAAA,EAC9B,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,iBAAA,EAC/B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,UAAA,EAE7B,CAAC,KAAA,KAAW,KAAA,CAAM,cAAA,GAAiB,YAAY,SAAU,CAAA;AAAA,2BAAA,EACxC,MAAA,CAAO,YAAY,IAAI,CAAA;;AAAA;AAAA,EAAA,EAGhD,CAAC,KAAA,KACD,KAAA,CAAM,cAAA,IACN;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,oBAAA,EAQkB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,wBAAA,EACtB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAAA;;AAAA;AAAA,yBAAA,EAIjC,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA;AAAA,oBAAA,EAEzB,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA;;AAAA;AAAA,oBAAA,EAIpB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;AAAA,EAAA,CAE7C;AAAA,CAAA;AAGI,IAAM,oBAAoBA,wBAAAA,CAAO,GAAA;AAAA;AAAA,SAAA,EAE7B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,UAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAId,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA;AAAA,CAAA;AAIzC,IAAM,WAAWA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAQxB,IAAM,YAAYA,wBAAAA,CAAO,GAAA;AAAA,aAAA,EACjB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,SAAA,EACzC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,eAAA,EACpB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAM5C,IAAM,eAAeA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG1B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,aAAA,EACX,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,SAAA,EACjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,eAAA,EACrB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA;AAAA;AAAA,CAAA;AAI5C,IAAM,eAAeA,wBAAAA,CAAO,IAAA;AAAA,SAAA,EACxB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;ACtC/B,IAAM,iBAAgD,CAAC;AAAA,EAC5D,KAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA,GAAO,WAAA;AAAA,EACP,OAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAMC,aAA0B,IAAI,CAAA;AAC1C,EAAA,MAAM,aAAA,GAAgB,CAAC,EAAE,OAAA,IAAW,OAAA,CAAA;AAGpC,EAAA,MAAM,WAAA,GAAc,CAAC,CAAA,KAAkB;AACrC,IAAA,IAAI,SAAS,OAAA,EAAQ;AACrB,IAAA,IAAI,OAAA,UAAiB,CAAC,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,EAAE,aAAY,GAAIC,gBAAAA;AAAA,IACtB;AAAA,MACE,GAAG,SAAA;AAAA,MACH,OAAA,EAAS,gBAAgB,WAAA,GAAc,MAAA;AAAA,MACvC,YAAY,CAAC;AAAA,KACf;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEE,eAAAA;AAAA,IAAC,uBAAA;AAAA,IAAA;AAAA,MACE,GAAI,aAAA,GAAgB,WAAA,GAAc,EAAC;AAAA,MACpC,GAAA,EAAK,gBAAgB,GAAA,GAAM,MAAA;AAAA,MAC3B,SAAA;AAAA,MACA,cAAA,EAAgB,aAAA;AAAA,MAChB,EAAA,EAAI,gBAAgB,QAAA,GAAW,KAAA;AAAA,MAE/B,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,qBAAmB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,wBACzBC,gBAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,aAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BAClBC,gBAAC,YAAA,EAAA,EACE,QAAA,EAAA;AAAA,YAAA,QAAA,oBAAYD,cAAAA,CAAC,YAAA,EAAA,EAAc,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,YACpC,QAAQ,QAAA,oBAAYA,eAAC,YAAA,EAAA,EAAa,aAAA,EAAY,QAAO,QAAA,EAAA,UAAA,EAAG,CAAA;AAAA,YACxD,IAAA,oBAAQA,cAAAA,CAAC,YAAA,EAAA,EAAc,QAAA,EAAA,IAAA,EAAK;AAAA,WAAA,EAC/B;AAAA,SAAA,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;AChFA,IAAM,uBAAuBH,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG3B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,cAAA,EACV,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAGjC,IAAM,eAAeA,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA,OAAA,EAGnB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,aAAA,EACpC,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,SAAA,EACzC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,cAAA,EACvB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,oBAAA,EACvB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,iBAAA,EAC/B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,kBAAA,EAErB,MAAA,CAAO,YAAY,IAAI,CAAA;;AAAA;AAAA,gBAAA,EAGzB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAAA,kBAAA,EAChC,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,WAAA,EACjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAQvC,IAAMiB,oBAAmBjB,wBAAAA,CAAO,GAAA;AAAA;AAAA,OAAA,EAEvB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,cAAA,EAEV,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAGjC,IAAM,cAAcA,wBAAAA,CAAO,IAAA;AAAA,aAAA,EACZ,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,SAAA,EACjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA,cAAA,EACtB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,CAAA;AAIjC,IAAM,qBAAqBA,wBAAAA,CAAO,IAAA;AAAA;AAAA,SAAA,EAEvB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,UAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,eAAA,EACZ,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EACZ,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,iBAAA,EACvB,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA4D3C,IAAM,uBAAkD,CAAC;AAAA,EACvD,OAAA,GAAU,EAAA;AAAA,EACV,SAAA;AAAA,EACA,gBAAgB,eAAA,GAAkB,IAAA;AAAA,EAClC,SAAA,GAAY,KAAA;AAAA,EACZ,WAAA,GAAc,KAAA;AAAA,EACd,SAAA;AAAA,EACA,cAAc,EAAC;AAAA,EACf,cAAA,GAAiB,KAAA;AAAA,EACjB,SAAA;AAAA,EACA,UAAU;AACZ,CAAA,KAAM;AACJ,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,uBACEI,eAAAA,CAACI,YAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,cAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,wBACtBA,cAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,wBACxBA,cAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,GAAA,EAAK;AAAA,OAAA,EAC1B,CAAA;AAAA,IAEJ;AAGA,IAAA,uBACEC,gBAAAc,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,MAAA,OAAA,oBACCd,gBAAC,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAACU,cAAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,WAAA;AAAA,YACA,WAAA,EAAa,EAAA;AAAA,YACb,MAAA,EAAQ,KAAA;AAAA,YACR,OAAA,EAAS,iBAAiB,UAAA,GAAa;AAAA;AAAA,SACzC;AAAA,QACC,WAAA,oBAAeV,cAAAA,CAAC,kBAAA,EAAA,EAAmB;AAAA,OAAA,EACtC,CAAA;AAAA,MAED,WAAA,CAAY,SAAS,CAAA,oBACpBA,eAAC,oBAAA,EAAA,EACE,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,EAAY,KAAA,qBAC5BA,cAAAA,CAAC,cAAA,EAAA,EAAqD,GAAG,UAAA,EAAA,EAApC,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAoB,CACtE,CAAA,EACH,CAAA;AAAA,MAED,SAAA,oBAAaA,cAAAA,CAAC,WAAA,EAAA,EAAa,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,MACrC,QAAQ,MAAA,GAAS,CAAA,oBAChBA,cAAAA,CAACc,mBAAA,EACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,qBACpBb,gBAAC,YAAA,EAAA,EAAyB,OAAA,EAAS,OAAO,OAAA,EACvC,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,IAAA;AAAA,QACP,MAAA,CAAO;AAAA,OAAA,EAAA,EAFS,KAGnB,CACD,CAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACEA,eAAAA,CAAC,gBAAA,EAAA,EAAiB,SAAA,EAChB,QAAA,EAAA;AAAA,oBAAAA,gBAAC,eAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,SAAA,mBACCD,eAACY,OAAAA,EAAA,EAAO,KAAK,SAAA,EAAW,GAAA,EAAI,oBAAmB,CAAA,mBAE/CZ,eAAC,cAAA,EAAA,EACC,QAAA,kBAAAA,eAACY,OAAAA,EAAA,EAAO,KAAI,mCAAA,EAAoC,GAAA,EAAI,gBAAe,CAAA,EACrE,CAAA;AAAA,sBAEFZ,cAAAA,CAAC,WAAA,EAAA,EAAY,QAAA,EAAA,WAAA,EAAS;AAAA,KAAA,EACxB,CAAA;AAAA,oBACAA,cAAAA,CAAC,gBAAA,EAAA,EAAkB,QAAA,EAAA,aAAA,EAAc,EAAE;AAAA,GAAA,EACrC,CAAA;AAEJ,CAAA;AAGO,IAAM,gBAAA,GAAmBW,WAAK,oBAAoB;AAEzD,gBAAA,CAAiB,WAAA,GAAc,kBAAA;ACjL/B,IAAM,sBAAA,GAAyB,iCAAA;AAM/B,SAAS,qBAAqB,OAAA,EAAyB;AACrD,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,sBAAA,EAAwB,EAAE,EAAE,IAAA,EAAK;AAC1D;AAoCA,IAAM,cAAA,GAAiB;AAAA,EACrB,aAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,2BAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA;AAMA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,4BAAA;AAAA,EACA,sCAAA;AAAA,EACA;AACF,CAAA;AAKA,SAAS,mBAAmB,OAAA,EAAgC;AAC1D,EAAA,MAAM,YAAA,GAAe,QAAQ,WAAA,EAAY;AAGzC,EAAA,IACE,aAAa,QAAA,CAAS,SAAS,KAC/B,YAAA,CAAa,QAAA,CAAS,UAAU,CAAA,IAChC,YAAA,CAAa,SAAS,YAAY,CAAA,IAClC,aAAa,QAAA,CAAS,SAAS,KAC/B,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA,EACjC;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,IACE,aAAa,QAAA,CAAS,cAAc,KACpC,YAAA,CAAa,QAAA,CAAS,gBAAgB,CAAA,IACtC,YAAA,CAAa,SAAS,OAAO,CAAA,IAC7B,aAAa,QAAA,CAAS,iBAAiB,KACvC,YAAA,CAAa,QAAA,CAAS,aAAa,CAAA,EACnC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IACE,aAAa,QAAA,CAAS,OAAO,KAC7B,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA,IACjC,YAAA,CAAa,SAAS,eAAe,CAAA,IACpC,aAAa,QAAA,CAAS,OAAO,KAAK,YAAA,CAAa,QAAA,CAAS,SAAS,CAAA,EAClE;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,IACE,YAAA,CAAa,QAAA,CAAS,UAAU,CAAA,IAChC,aAAa,QAAA,CAAS,WAAW,CAAA,IACjC,YAAA,CAAa,SAAS,iBAAiB,CAAA,IACvC,YAAA,CAAa,QAAA,CAAS,YAAY,CAAA,EAClC;AACA,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,qBAAqB,OAAA,EAAqC;AACjE,EAAA,KAAA,MAAW,WAAW,uBAAA,EAAyB;AAC7C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,IAAA,IAAI,KAAA,GAAQ,CAAC,CAAA,EAAG;AACd,MAAA,OAAO,MAAM,CAAC,CAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,qBAAqB,OAAA,EAAwC;AAE3E,EAAA,MAAM,QAAA,GAAW,eAAe,IAAA,CAAK,CAAC,YAAY,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAC,CAAA;AAEvE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,EAAE,UAAU,KAAA,EAAM;AAAA,EAC3B;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,IAAA;AAAA,IACV,QAAA,EAAU,mBAAmB,OAAO,CAAA;AAAA,IACpC,aAAA,EAAe,qBAAqB,OAAO,CAAA;AAAA,IAC3C,YAAA,EAAc;AAAA,GAChB;AACF;AAmBA,SAAS,iBACP,QAAA,EACA,mBAAA,EACA,WAAA,GAAc,CAAA,EACd,YAAY,IAAA,EACJ;AAER,EAAA,MAAM,cAAA,GAAiB,QAAA,CACpB,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,OAAA,KAAY,mBAAmB,CAAA,CAClE,KAAA,CAAM,CAAC,WAAW,CAAA;AAGrB,EAAA,MAAM,iBAAA,GAAoB,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,KAAQ;AACpD,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,IAAA,KAAS,MAAA,GAAS,MAAA,GAAS,WAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,IAAW,EAAA;AAE/B,IAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAA,GAAS,GAAA,GAAM,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA,GAAQ,OAAA;AAChF,IAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,gBAAgB,CAAA,CAAA;AAAA,EACvC,CAAC,CAAA;AAGD,EAAA,MAAM,YAAA,GACJ,oBAAoB,MAAA,GAAS,GAAA,GACzB,oBAAoB,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA,GACpC,mBAAA;AACN,EAAA,iBAAA,CAAkB,IAAA,CAAK,CAAA,qBAAA,EAAwB,YAAY,CAAA,CAAE,CAAA;AAG7D,EAAA,IAAI,MAAA,GAAS,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAA;AAC1C,EAAA,IAAI,MAAA,CAAO,SAAS,SAAA,EAAW;AAC7B,IAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,GAAI,kBAAA;AAAA,EACxC;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,IAAM,wBAAwBd,wBAAAA,CAAO,GAAA;AAAA,cAAA,EACrB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,iBAAA,EACd,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAOpC,IAAM,8BAAgE,CAAC;AAAA,EACrE,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASF,CAAA,KAAM;AAEJ,EAAA,IAAI,SAAA,IAAc,YAAA,IAAgB,CAAC,OAAA,EAAS,OAAA,EAAU;AACpD,IAAA,uBAAOG,cAAAA,CAAC,iBAAA,EAAA,EAAkB,OAAA,EAAQ,aAAA,EAAc,CAAA;AAAA,EAClD;AAGA,EAAA,MAAM,UAAA,GAAa,SAAS,OAAA,IAAW,EAAA;AACvC,EAAA,MAAM,OAAA,GAAU,qBAAqB,UAAU,CAAA;AAI/C,EAAA,IAAI,kBAAA,GAAgC,IAAA;AACpC,EAAA,MAAM,SAAA,GAAY,OAAA;AAClB,EAAA,IAAI,SAAA,IAAa,OAAO,SAAA,CAAU,YAAA,KAAiB,UAAA,EAAY;AAC7D,IAAA,IAAI;AACF,MAAA,kBAAA,GAAqB,UAAU,YAAA,EAAa;AAAA,IAC9C,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,2DAA2D,CAAC,CAAA;AAAA,IAC3E;AAAA,EACF;AAIA,EAAA,MAAM,cAAuB,EAAC;AAE9B,EAAA,uBACEC,eAAAA,CAAAc,mBAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,IAAA,kBAAA,oBAAsBf,cAAAA,CAAC,qBAAA,EAAA,EAAuB,QAAA,EAAA,kBAAA,EAAmB,CAAA;AAAA,IAEjE,2BACCA,cAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,cAAA,EAAe,IAAA;AAAA,QACf,SAAA,EAAW,KAAA;AAAA,QACX,WAAA,EAAa,YAAA;AAAA,QACb,WAAA;AAAA,QACA,cAAA,EAAgB;AAAA;AAAA;AAClB,GAAA,EAEJ,CAAA;AAEJ,CAAA;AAGO,IAAM,uBAAA,GAA0BW,WAAK,2BAA2B;AAEvE,uBAAA,CAAwB,WAAA,GAAc,yBAAA;AAkB/B,SAAS,6BAAA,CACd,mBACA,kBAAA,EACkC;AAClC,EAAA,MAAM,gCAAkE,CAAC;AAAA,IACvE,OAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,KAAM;AAEJ,IAAA,MAAM,YAAA,GAAe,SAAA,IAAc,YAAA,IAAgB,CAAC,OAAA,EAAS,OAAA;AAI7D,IAAA,MAAM,sBAAsB,gBAAA,IAAoB,kBAAA;AAGhD,IAAA,MAAM,UAAA,GAAa,SAAS,OAAA,IAAW,EAAA;AACvC,IAAA,MAAM,OAAA,GAAU,qBAAqB,UAAU,CAAA;AAG/C,IAAA,IAAI,kBAAA,GAAgC,IAAA;AACpC,IAAA,MAAM,SAAA,GAAY,OAAA;AAClB,IAAA,IAAI,SAAA,IAAa,OAAO,SAAA,CAAU,YAAA,KAAiB,UAAA,EAAY;AAC7D,MAAA,IAAI;AACF,QAAA,kBAAA,GAAqB,UAAU,YAAA,EAAa;AAAA,MAC9C,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,IAAA,CAAK,2DAA2D,CAAC,CAAA;AAAA,MAC3E;AAAA,IACF;AAEA,IAAA,MAAM,cAAuB,EAAC;AAG9B,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,uBACEV,eAAAA,CAAAc,mBAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,QAAA,iBAAA,mBACCf,cAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAsB,YAAA,EAA4B,oBAErEA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,OAAA,EAAQ,aAAA,EAAc,CAAA;AAAA,QAG1C,mBAAA,oBAAuBA,cAAAA,CAAC,kBAAA,EAAA,EAAmB;AAAA,OAAA,EAC9C,CAAA;AAAA,IAEJ;AAGA,IAAA,uBACEC,eAAAA,CAAAc,mBAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,MAAA,mBAAA,oBAAuBf,eAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,MAC3C,kBAAA,oBAAsBA,cAAAA,CAAC,qBAAA,EAAA,EAAuB,QAAA,EAAA,kBAAA,EAAmB,CAAA;AAAA,MACjE,2BACCA,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,OAAA;AAAA,UACA,cAAA,EAAe,IAAA;AAAA,UACf,SAAA,EAAW,KAAA;AAAA,UACX,WAAA,EAAa,YAAA;AAAA,UACb,WAAA;AAAA,UACA,cAAA,EAAgB;AAAA;AAAA;AAClB,KAAA,EAEJ,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,6BAAA,CAA8B,WAAA,GAAc,+BAAA;AAC5C,EAAA,OAAOW,WAAK,6BAA6B,CAAA;AAC3C;AAWO,SAAS,+CAAA,CACd,aAAA,EACA,iBAAA,EACA,kBAAA,EACkC;AAClC,EAAA,MAAM,wCAA0E,CAAC;AAAA,IAC/E,OAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,KAAM;AAEJ,IAAA,MAAM,EAAE,eAAA,EAAgB,GAAIK,wBAAA,EAAe;AAG3C,IAAA,MAAM,YAAA,GAAe,SAAA,IAAc,YAAA,IAAgB,CAAC,OAAA,EAAS,OAAA;AAI7D,IAAA,MAAM,sBAAsB,gBAAA,IAAoB,kBAAA;AAGhD,IAAA,MAAM,UAAA,GAAa,SAAS,OAAA,IAAW,EAAA;AACvC,IAAA,MAAM,OAAA,GAAU,qBAAqB,UAAU,CAAA;AAG/C,IAAA,MAAM,YAAA,GAAeP,cAAQ,MAAM,oBAAA,CAAqB,OAAO,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAG3E,IAAA,MAAM,WAAA,GAAcA,cAAQ,MAAM;AAChC,MAAA,IAAI,CAAC,YAAA,CAAa,QAAA,EAAU,OAAO,EAAA;AAEnC,MAAA,OAAO,gBAAA,CAAiB,iBAAqC,OAAO,CAAA;AAAA,IACtE,GAAG,CAAC,eAAA,EAAiB,OAAA,EAAS,YAAA,CAAa,QAAQ,CAAC,CAAA;AAGpD,IAAA,MAAM,OAAA,GAA8BA,cAAQ,MAAM;AAEhD,MAAA,IAAI,CAAC,YAAA,CAAa,QAAA,IAAY,CAAC,iBAAiB,YAAA,EAAc;AAC5D,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,OAAO;AAAA,QACL;AAAA,UACE,KAAA,EAAO,cAAA;AAAA,UACP,SAAS,MAAM;AACb,YAAA,aAAA,CAAc;AAAA,cACZ,eAAe,YAAA,CAAa,QAAA;AAAA,cAC5B,eAAe,YAAA,CAAa,aAAA;AAAA;AAAA,cAE5B;AAAA,aACD,CAAA;AAAA,UACH,CAAA;AAAA,UACA,sBACER,eAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,IAAA;AAAA,cACN,MAAA,EAAO,IAAA;AAAA,cACP,OAAA,EAAQ,WAAA;AAAA,cACR,IAAA,EAAK,MAAA;AAAA,cACL,MAAA,EAAO,cAAA;AAAA,cACP,WAAA,EAAY,GAAA;AAAA,cACZ,aAAA,EAAc,OAAA;AAAA,cACd,cAAA,EAAe,OAAA;AAAA,cAEf,QAAA,EAAA;AAAA,gCAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,gCAC/BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,gCACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,IAAA,EAAK;AAAA;AAAA;AAAA;AAC3C;AAEJ,OACF;AAAA,IACF,CAAA,EAAG,CAAC,YAAA,EAAc,WAAA,EAAa,YAAY,CAAC,CAAA;AAG5C,IAAA,IAAI,kBAAA,GAAgC,IAAA;AACpC,IAAA,MAAM,SAAA,GAAY,OAAA;AAClB,IAAA,IAAI,SAAA,IAAa,OAAO,SAAA,CAAU,YAAA,KAAiB,UAAA,EAAY;AAC7D,MAAA,IAAI;AACF,QAAA,kBAAA,GAAqB,UAAU,YAAA,EAAa;AAAA,MAC9C,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,IAAA,CAAK,2DAA2D,CAAC,CAAA;AAAA,MAC3E;AAAA,IACF;AAEA,IAAA,MAAM,cAAuB,EAAC;AAG9B,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,uBACEC,eAAAA,CAAAc,mBAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,QAAA,iBAAA,mBACCf,cAAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAsB,YAAA,EAA4B,oBAErEA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,OAAA,EAAQ,aAAA,EAAc,CAAA;AAAA,QAG1C,mBAAA,oBAAuBA,cAAAA,CAAC,kBAAA,EAAA,EAAmB;AAAA,OAAA,EAC9C,CAAA;AAAA,IAEJ;AAGA,IAAA,uBACEC,eAAAA,CAAAc,mBAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,MAAA,mBAAA,oBAAuBf,eAAC,kBAAA,EAAA,EAAmB,CAAA;AAAA,MAC3C,kBAAA,oBAAsBA,cAAAA,CAAC,qBAAA,EAAA,EAAuB,QAAA,EAAA,kBAAA,EAAmB,CAAA;AAAA,MACjE,2BACCA,cAAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,OAAA;AAAA,UACA,cAAA,EAAe,IAAA;AAAA,UACf,SAAA,EAAW,KAAA;AAAA,UACX,WAAA,EAAa,YAAA;AAAA,UACb,WAAA;AAAA,UACA,cAAA,EAAgB,IAAA;AAAA,UAChB;AAAA;AAAA;AACF,KAAA,EAEJ,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,qCAAA,CAAsC,WAAA,GAAc,uCAAA;AACpD,EAAA,OAAOW,WAAK,qCAAqC,CAAA;AACnD;AC/gBO,IAAM,qBAAqBd,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAI5B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EACR,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA;AAAA;AAAA,iBAAA,EAGzB,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,cAAA,EAC3B,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA;;AAAA,qBAAA,EAGZ,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,aAAA,EACjC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,CAAA;AAOzB,IAAM,qBAAqBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,OAAA,EAIhC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,iBAAA,EACP,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,CAAA;AAQ7B,IAAM,mBAAmBA,wBAAAA,CAAO,MAAA;AAAA,WAAA,EAC1B,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,eAAA,EAClC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA;AAAA,eAAA,EAEpC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA;AAAA,oBAAA,EAE/B,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,iBAAA,EAC/B,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA;AAAA,kBAAA,EAEvB,MAAA,CAAO,YAAY,IAAI,CAAA;AAAA;;AAAA;AAAA,oBAAA,EAIrB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAAA,SAAA,EACrC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;;AAAA;AAAA;AAAA,sBAAA,EAIf,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,kBAAA,EAClC,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;;AAAA;AAAA;AAAA,sBAAA,EAKtB,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AAAA;;AAAA;AAAA;AAAA,uBAAA,EAK7B,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AActC,IAAM,eAAeA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG1B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,oBAAA,EAE7B,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,iBAAA,EAC9B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,kBAAA,EACrB,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,kBAAA,EAMzB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;AAAA;AAAA,CAAA;AAQvC,IAAM,aAAaA,wBAAAA,CAAO,QAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAIhB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,aAAA,EACtC,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,SAAA,EACjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,WAAA,EAW1B,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA;;AAAA;AAAA,WAAA,EAI3B,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA;AAAA;AAAA,CAAA;AAYjC,IAAM,eAAeA,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAQhB,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,oBAAA,EACrB,CAAC,KAAA,KAAW,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,OAAO,OAAA,CAAQ,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,MAAO,CAAA;AAAA,SAAA,EAC9F,CAAC,KAAA,KAAW,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAQ,CAAA;AAAA,UAAA,EACrF,CAAC,KAAA,KAAW,KAAA,CAAM,QAAA,GAAW,gBAAgB,SAAU,CAAA;AAAA,kBAAA,EAC/C,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA;;AAAA;AAAA,sBAAA,EAIrB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,uBAAA,EAS3B,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;ACjGtC,IAAM,YAAsC,CAAC;AAAA,EAClD,cAAc,EAAC;AAAA,EACf,kBAAA;AAAA,EACA,KAAA,GAAQ,EAAA;AAAA,EACR,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,sCAAA;AAAA,EACd,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA,EACb,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA;AAAA,EACA,cAAc,SAAA,GAAY;AAAA;AAAA;AAG5B,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIoB,eAAS,KAAK,CAAA;AACxD,EAAA,MAAM,QAAA,GAAWnB,aAA4B,IAAI,CAAA;AAGjD,EAAA,MAAM,YAAA,GAAe,KAAA,KAAU,MAAA,GAAY,KAAA,GAAQ,aAAA;AACnD,EAAA,MAAM,WAAW,QAAA,IAAY,gBAAA;AAG7B,EAAA,MAAM,UAAA,GAAaoB,kBAAY,MAAM;AACnC,IAAA,MAAM,WAAW,QAAA,CAAS,OAAA;AAC1B,IAAA,IAAI,QAAA,EAAU;AAEZ,MAAA,QAAA,CAAS,MAAM,MAAA,GAAS,MAAA;AAExB,MAAA,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,YAAY,CAAA,EAAA,CAAA;AAAA,IAClD;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAV,gBAAU,MAAM;AACd,IAAA,UAAA,EAAW;AAAA,EACb,CAAA,EAAG,CAAC,YAAA,EAAc,UAAU,CAAC,CAAA;AAM7B,EAAA,MAAM,kBAAA,GAAqB,CAAC,CAAA,KAA8C;AACxE,IAAA,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EACzB,CAAA;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA0C;AAE/D,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,YAAA,EAAa;AAAA,IACf;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,aAAa,IAAA,EAAK,IAAK,YAAY,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AACjE,MAAA,QAAA,CAAS,YAAA,CAAa,MAAM,CAAA;AAC5B,MAAA,QAAA,CAAS,EAAE,CAAA;AAEX,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,QAAA,CAAS,OAAA,CAAQ,MAAM,MAAA,GAAS,MAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,qBAAA,GAAwB,CAAC,cAAA,KAA2B;AACxD,IAAA,IAAI,kBAAA,IAAsB,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AACpD,MAAA,kBAAA,CAAmB,cAAc,CAAA;AAAA,IACnC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,aAAa,IAAA,EAAK,CAAE,SAAS,CAAA,IAAK,CAAC,cAAc,CAAC,UAAA;AAEpE,EAAA,uBACEP,eAAAA,CAAC,kBAAA,EAAA,EAAmB,SAAA,EAEjB,QAAA,EAAA;AAAA,IAAA,WAAA,CAAY,MAAA,GAAS,CAAA,oBACpBD,cAAAA,CAAC,sBAAmB,IAAA,EAAK,MAAA,EAAO,YAAA,EAAW,mBAAA,EACxC,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,UAAA,EAAY,0BAC5BA,cAAAA;AAAA,MAAC,yBAAA;AAAA,MAAA;AAAA,QAEC,UAAA;AAAA,QACA,QAAA,EAAU,qBAAA;AAAA,QACV,YAAY,UAAA,IAAc;AAAA,OAAA;AAAA,MAHrB,CAAA,EAAG,UAAA,CAAW,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,KAKnC,CAAA,EACH,CAAA;AAAA,oBAIFC,gBAAC,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,cAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAY,SAAA;AAAA,UACZ,WAAA;AAAA,UACA,SAAA,EAAW,aAAA;AAAA,UACX,QAAA,EAAU,kBAAA;AAAA,UACV,SAAA;AAAA,UACA,QAAA,EAAU,UAAA;AAAA,UACV,QAAA,EAAU,UAAA;AAAA,UACV,KAAA,EAAO,YAAA;AAAA,UACP,IAAA,EAAM;AAAA;AAAA,OACR;AAAA,sBACAA,cAAAA;AAAA,QAAC,qBAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,YAAA;AAAA,UACT,YAAY,CAAC,SAAA;AAAA,UACb,SAAA,EAAU;AAAA;AAAA;AACZ,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AAWA,IAAM,4BAAsE,CAAC;AAAA,EAC3E,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa;AACf,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAMF,aAA0B,IAAI,CAAA;AAC1C,EAAA,MAAM,EAAE,aAAY,GAAIC,gBAAAA;AAAA,IACtB;AAAA,MACE,OAAA,EAAS,MAAM,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAAA,MACvC,UAAA;AAAA,MACA,YAAA,EAAc,CAAA,mBAAA,EAAsB,UAAA,CAAW,IAAI,CAAA;AAAA,KACrD;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEC,eAAC,gBAAA,EAAA,EAAkB,GAAG,aAAa,GAAA,EAAU,IAAA,EAAK,UAAA,EAC/C,QAAA,EAAA,UAAA,CAAW,IAAA,EACd,CAAA;AAEJ,CAAA;AAWA,IAAM,wBAA8D,CAAC;AAAA,EACnE,OAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAMF,aAA0B,IAAI,CAAA;AAC1C,EAAA,MAAM,EAAE,aAAY,GAAIC,gBAAAA;AAAA,IACtB;AAAA,MACE,OAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEC,cAAAA,CAAC,YAAA,EAAA,EAAc,GAAG,WAAA,EAAa,KAAU,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,SAAA,EACpE,QAAA,kBAAAC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,IAAA;AAAA,MACN,MAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAM,4BAAA;AAAA,MACN,IAAA,EAAK,KAAA;AAAA,MACL,aAAA,EAAY,MAAA;AAAA,MAEZ,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,WAAM,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,wBACvBA,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,CAAA,EAAE,iCAAA;AAAA,YACF,MAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAY,GAAA;AAAA,YACZ,aAAA,EAAc,OAAA;AAAA,YACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA,GACF,EACF,CAAA;AAEJ,CAAA;AAEA,SAAA,CAAU,WAAA,GAAc,WAAA;ACpPjB,IAAM,eAA4C,CAAC;AAAA,EACxD,UAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAW,UAAA,GAAa;AAC1B,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIiB,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEtD,EAAA,MAAM,YAAA,GAAe,OAAO,OAAA,KAAoB;AAC9C,IAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAK,EAAG;AACnB,MAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAClE,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,IAAA,IAAI;AAEF,MAAA,MAAM,OAAO,OAAO,CAAA;AACpB,MAAA,QAAA,CAAS,EAAE,CAAA;AAAA,IACb,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAAA,IAC9D,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,sBAAA,GAAyB,OAAO,UAAA,KAAuB;AAG3D,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,EAAK,EAAG;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,cAAc,YAAA,EAAc;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,IAAA,IAAI;AACF,MAAA,MAAM,OAAO,UAAU,CAAA;AAAA,IAEzB,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,KAAK,CAAA;AAAA,IACjE,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,kBAAA,GAAqB,YAAA;AAE3B,EAAA,uBACEjB,cAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,QAAA,EAAU,QAAA;AAAA,MACV,QAAA,EAAU,YAAA;AAAA,MACV,WAAA,EAAY,sCAAA;AAAA,MACZ,UAAA,EAAY,kBAAA;AAAA,MACZ,SAAA,EAAW,KAAA;AAAA,MACX,YAAA,EAAW,oBAAA;AAAA,MACX,WAAA,EAAa,CAAC,EAAE,IAAA,EAAM,qBAAqB,CAAA;AAAA,MAC3C,kBAAA,EAAoB;AAAA;AAAA,GACtB;AAEJ;AAEA,YAAA,CAAa,WAAA,GAAc,cAAA;AC9EpB,IAAM,oBAAoBH,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAK3B,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,eAAA,EAClC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,aAAA,EACtC,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,gBAAA,EAYlC,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAAA,WAAA,EAC/B,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,mBAAA,EAClB,MAAA,CAAO,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA;;AAAA;AAAA,cAAA,EAI/B,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;;AAAA;AAAA,kBAAA,EAGzB,MAAA,CAAO,YAAY,MAAM,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAOhC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,gBAAA,EAGZ,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAAA;AAAA,uBAAA,EAEnB,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,gBAAA,EAE7B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EACb,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAQ7B,MAAA,CAAO,QAAQ,EAAE,CAAA;;AAAA;AAAA,kBAAA,EAGf,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,gBAAA,EAOnB,MAAA,CAAO,QAAQ,EAAE,CAAA;;AAAA;AAAA,kBAAA,EAGf,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;;AAAA,EAAA,EAIjC,CAAC,EAAE,UAAA,EAAW,KACd,UAAA,IACAD,WAAAA;AAAA;AAAA,kBAAA,EAEgB,MAAA,CAAO,QAAQ,EAAE,CAAA;;AAAA;AAAA,oBAAA,EAGf,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,IAAA,CAElC;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,uBAAA,EAQoB,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA;AAAA,gBAAA,EAE9B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAQjB,MAAA,CAAO,QAAQ,IAAI,CAAA;;AAAA;AAAA;AAAA,kBAAA,EAIjB,MAAA,CAAO,QAAQ,IAAI,CAAA;AAAA;AAAA;AAAA,CAAA;ACpEvC,SAAS,eAAA,CAAgB;AAAA,EACvB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqB;AACnB,EAAA,MAAM,GAAA,GAAME,aAA0B,IAAI,CAAA;AAG1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACEE,cAAAA,CAAC,iBAAA,EAAA,EAAkB,EAAA,EAAG,KAAA,EAAM,WAAsB,UAAA,EAAY,SAAA,EAAW,IAAA,EAAK,cAAA,EAC3E,QAAA,EACH,CAAA;AAAA,EAEJ;AAGA,EAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAW,gBAAA,EAAiB,GAAID,gBAAAA;AAAA,IACnD;AAAA,MACE,GAAG,SAAA;AAAA,MACH;AAAA,KACF;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEC,cAAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACE,GAAG,WAAA;AAAA,MACJ,GAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAY,SAAA,IAAa,gBAAA;AAAA,MACzB,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAGO,IAAM,WAAA,GAAcW,WAAK,eAAe,CAAA;AAE/C,WAAA,CAAY,WAAA,GAAc,aAAA;ACpE1B,IAAM,qBAAqBd,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAIrB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,CAAA;AAS9B,IAAM,yBAAsD,CAAC;AAAA,EAC3D,OAAA;AAAA,EACA;AACF,CAAA,KAAM;AAEJ,EAAA,IAAI,SAAS,KAAA,EAAO;AAClB,IAAA,uBAAOG,eAAC,aAAA,EAAA,EAAc,KAAA,EAAO,QAAQ,KAAA,EAAO,OAAA,EAAS,QAAQ,OAAA,EAAS,CAAA;AAAA,EACxE;AAGA,EAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,EAAA;AAIpC,EAAA,uBACEA,cAAAA,CAAC,kBAAA,EAAA,EACC,0BAAAA,cAAAA,CAAC,WAAA,EAAA,EAAa,mBAAQ,CAAA,EACxB,CAAA;AAEJ,CAAA;AAGO,IAAM,kBAAA,GAAqBW,WAAK,sBAAsB;AAE7D,kBAAA,CAAmB,WAAA,GAAc,oBAAA;ACzCjC,IAAME,MAAAA,GAAQX,iBAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWd,IAAME,aAAYP,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAGhB,CAAC,KAAA,KAAU;AAChB,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,KAAK,IAAA;AAAA,IACL;AACE,MAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA;AAE5B,CAAC,CAAA;AAAA,eAAA,EACc,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,CAAA;AAGrD,IAAM,YAAYA,wBAAAA,CAAO,GAAA;AAAA,SAAA,EAKd,CAAC,KAAA,KAAU;AAClB,EAAA,IAAI,KAAA,CAAM,YAAY,OAAA,EAAS;AAC7B,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,IAAA;AACH,QAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA,MACxB,KAAK,IAAA;AACH,QAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA,MACxB,KAAK,IAAA;AAAA,MACL;AACE,QAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA;AAC1B,EACF;AACA,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,YAAA,CAAa,EAAA;AAAA,IAC7B,KAAK,IAAA;AAAA,IACL;AACE,MAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA;AAE5B,CAAC,CAAA;AAAA,UAAA,EACS,CAAC,KAAA,KAAU;AACnB,EAAA,IAAI,KAAA,CAAM,YAAY,OAAA,EAAS;AAC7B,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,IAAA;AACH,QAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA,MACxB,KAAK,IAAA;AACH,QAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA,MACxB,KAAK,IAAA;AAAA,MACL;AACE,QAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA;AAC1B,EACF;AACA,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,YAAA,CAAa,EAAA;AAAA,IAC7B,KAAK,IAAA;AAAA,IACL;AACE,MAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA;AAE5B,CAAC,CAAA;AAAA,iBAAA,EACgB,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,oBAAA,EACrB,CAAC,KAAA,KAAU;AAC7B,EAAA,QAAQ,MAAM,MAAA;AAAQ,IACpB,KAAK,WAAA;AACH,MAAA,OAAO,MAAA,CAAO,OAAO,UAAA,CAAW,SAAA;AAAA,IAClC,KAAK,WAAA;AACH,MAAA,OAAO,MAAA,CAAO,OAAO,UAAA,CAAW,SAAA;AAAA,IAClC,KAAK,cAAA;AACH,MAAA,OAAO,MAAA,CAAO,OAAO,UAAA,CAAW,YAAA;AAAA,IAClC,KAAK,cAAA;AACH,MAAA,OAAO,MAAA,CAAO,OAAO,UAAA,CAAW,YAAA;AAAA;AAEtC,CAAC,CAAA;AAAA,aAAA,EACY,CAAC,KAAA,KAAW,KAAA,CAAM,MAAA,KAAW,WAAA,GAAcgB,SAAQ,MAAO,CAAA;AAAA;AAAA,CAAA;AAIzE,IAAM,QAAQhB,wBAAAA,CAAO,IAAA;AAAA,aAAA,EACN,CAAC,KAAA,KAAU;AACtB,EAAA,IAAI,KAAA,CAAM,YAAY,OAAA,EAAS;AAC7B,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,IAAA;AACH,QAAA,OAAO,MAAA,CAAO,WAAW,QAAA,CAAS,EAAA;AAAA,MACpC,KAAK,IAAA;AACH,QAAA,OAAO,MAAA,CAAO,WAAW,QAAA,CAAS,IAAA;AAAA,MACpC,KAAK,IAAA;AAAA,MACL;AACE,QAAA,OAAO,MAAA,CAAO,WAAW,QAAA,CAAS,EAAA;AAAA;AACtC,EACF;AACA,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,IAAA;AACH,MAAA,OAAO,MAAA,CAAO,WAAW,QAAA,CAAS,EAAA;AAAA,IACpC,KAAK,IAAA;AACH,MAAA,OAAO,MAAA,CAAO,WAAW,QAAA,CAAS,IAAA;AAAA,IACpC,KAAK,IAAA;AAAA,IACL;AACE,MAAA,OAAO,MAAA,CAAO,WAAW,QAAA,CAAS,EAAA;AAAA;AAExC,CAAC,CAAA;AAAA,eAAA,EACc,CAAC,KAAA,KAAW,KAAA,CAAM,OAAA,KAAY,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAQ,CAAA;AAAA,SAAA,EACzH,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,eAAA,EACtB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA;AAAA,CAAA;AAGnD,IAAM,iBAAiBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAGrB,CAAC,KAAA,KAAU;AAChB,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA,IACxB,KAAK,IAAA;AAAA,IACL;AACE,MAAA,OAAO,OAAO,OAAA,CAAQ,EAAA;AAAA;AAE5B,CAAC,CAAA;AAAA,WAAA,EACU,CAAC,KAAA,KAAU;AACpB,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,IAAA;AACH,MAAA,OAAO,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,KAAK,IAAA;AACH,MAAA,OAAO,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,IAClD,KAAK,IAAA;AAAA,IACL;AACE,MAAA,OAAO,GAAG,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA;AAEtD,CAAC,CAAA;AAAA,oBAAA,EACmB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,oBAAA,EAC7B,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,iBAAA,EAC/B,CAAC,KAAA,KAAU;AAC1B,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,YAAA,CAAa,EAAA;AAAA,IAC7B,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,YAAA,CAAa,EAAA;AAAA,IAC7B,KAAK,IAAA;AAAA,IACL;AACE,MAAA,OAAO,OAAO,YAAA,CAAa,EAAA;AAAA;AAEjC,CAAC,CAAA;AAAA,CAAA;AAgBH,IAAM,cAAA,GAAiB,CAAC,MAAA,KAAyD;AAC/E,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,WAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT,KAAK,cAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,cAAA;AACH,MAAA,OAAO,iBAAA;AAAA;AAEb,CAAA;AAaO,IAAM,wBAA8D,CAAC;AAAA,EAC1E,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,IAAA,GAAO,IAAA;AAAA,EACP,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,OAAA,mBACJI,eAAAA,CAAAc,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAf,eAAC,SAAA,EAAA,EAAU,MAAA,EAAgB,IAAA,EAAY,OAAA,EAAkB,eAAY,MAAA,EAAO,CAAA;AAAA,IAC3E,SAAA,oBACCA,cAAAA,CAAC,KAAA,EAAA,EAAM,MAAY,OAAA,EAChB,QAAA,EAAA,cAAA,CAAe,MAAM,CAAA,EACxB;AAAA,GAAA,EAEJ,CAAA;AAGF,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,uBACEA,cAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,eAAe,MAAM,CAAA;AAAA,QAEhC,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,uBACEA,cAAAA,CAACI,UAAAA,EAAA,EAAU,IAAA,EAAY,SAAA,EAAsB,IAAA,EAAK,QAAA,EAAS,YAAA,EAAY,cAAA,CAAe,MAAM,CAAA,EACzF,QAAA,EAAA,OAAA,EACH,CAAA;AAEJ;AAEA,qBAAA,CAAsB,WAAA,GAAc,uBAAA;ACtP7B,IAAM,kBAAkBP,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAIzB,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EAC7B,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA;AAAA;AAAA,2BAAA,EAGf,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA;AAAA;;AAAA,qBAAA,EAIlC,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,aAAA,EACjC,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,CAAA;AAI9C,IAAM,gBAAgBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG3B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,CAAA;AAKnB,IAAM,cAAcA,wBAAAA,CAAO,EAAA;AAAA;AAAA,aAAA,EAEnB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,IAAI,CAAA;AAAA,eAAA,EAC7B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,QAAQ,CAAA;AAAA,SAAA,EAC3C,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,eAAA,EACpB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAM7C,IAAM,iBAAiBA,wBAAAA,CAAO,CAAA;AAAA;AAAA,aAAA,EAEtB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,SAAA,EACjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,eAAA,EACtB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAM5C,IAAM,gBAAgBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG3B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,eAAA,EACT,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAG3B,IAAMsB,gBAAetB,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAIxB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,UAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAIV,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,SAAA,EAC9B,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA;AAAA,kBAAA,EAEjB,MAAA,CAAO,YAAY,IAAI,CAAA;;AAAA;AAAA,sBAAA,EAGnB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA,sBAAA,EAK7B,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA;AAAA;;AAAA;AAAA,uBAAA,EAIlC,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,WAAA,EAUtC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,YAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,CAAA;AC9BxB,IAAM,SAAgC,CAAC;AAAA,EAC5C,KAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,WAAA,GAAcC,aAA0B,IAAI,CAAA;AAClD,EAAA,MAAM,QAAA,GAAWA,aAA0B,IAAI,CAAA;AAE/C,EAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAc,GAAIC,gBAAAA;AAAA,IACrC;AAAA,MACE,OAAA,EAAS,UAAA;AAAA,MACT,YAAA,EAAc,UAAA;AAAA,MACd,YAAY,CAAC;AAAA,KACf;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,EAAE,WAAA,EAAa,UAAA,EAAW,GAAIA,gBAAAA;AAAA,IAClC;AAAA,MACE,OAAA,EAAS,OAAA;AAAA,MACT,YAAA,EAAc,OAAA;AAAA,MACd,YAAY,CAAC;AAAA,KACf;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEE,eAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EACf,QAAA,EAAA;AAAA,oBAAAA,gBAAC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,MAAA,CAAO,OAAA,CAAQ,EAAA,EAAG,EAC1E,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,eAAa,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,QACnB,gCACCA,cAAAA;AAAA,UAAC,qBAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,YAAA;AAAA,YACR,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,SAAA,EAAW,YAAA,KAAiB,WAAA,IAAe,YAAA,KAAiB;AAAA;AAAA;AAC9D,OAAA,EAEJ,CAAA;AAAA,MACC,QAAA,oBAAYA,cAAAA,CAAC,cAAA,EAAA,EAAgB,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EACzC,CAAA;AAAA,oBAEAC,gBAAC,aAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,UAAA,oBACCD,cAAAA,CAACmB,aAAAA,EAAA,EAAa,GAAA,EAAK,aAAc,GAAG,aAAA,EAAe,aAAA,EAAY,UAAA,EAC7D,QAAA,kBAAAlB,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,IAAA;AAAA,UACN,MAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAM,4BAAA;AAAA,UACN,aAAA,EAAY,MAAA;AAAA,UAEZ,QAAA,EAAA;AAAA,4BAAAD,cAAAA,CAAC,WAAM,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4BACfA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI;AAAA;AAAA;AAAA,OAC3E,EACF,CAAA;AAAA,MAGD,OAAA,oBACCA,cAAAA,CAACmB,aAAAA,EAAA,EAAa,GAAA,EAAK,QAAA,EAAW,GAAG,UAAA,EAAY,aAAA,EAAY,OAAA,EACvD,QAAA,kBAAAlB,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,IAAA;AAAA,UACN,MAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAQ,WAAA;AAAA,UACR,IAAA,EAAK,MAAA;AAAA,UACL,KAAA,EAAM,4BAAA;AAAA,UACN,aAAA,EAAY,MAAA;AAAA,UAEZ,QAAA,EAAA;AAAA,4BAAAD,cAAAA,CAAC,WAAM,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,4BACZA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI,CAAA;AAAA,4BAC1EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAI;AAAA;AAAA;AAAA,OAC5E,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;AC5Id,IAAM,oBAAoBH,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAQlC,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAAA,IAAA,EAC7B,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,MAAM,CAAA;AAAA,IAAA,EAC/B,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,OAAO;AAAA;AAAA;AAAA,WAAA,EAGzB,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,OAAA,EAC1C,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;ACUnB,IAAM,WAAoC,CAAC;AAAA,EAChD,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,uBACEG,eAAC,iBAAA,EAAA,EAAkB,SAAA,EAAsB,MAAK,QAAA,EAAS,YAAA,EAAY,WAChE,QAAA,EACH,CAAA;AAEJ;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;ACjChB,IAAM,kBAAkBH,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAA,EAOhB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AAAA,iBAAA,EACpC,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,cAAA,EACzB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,kBAAA,EAEb,MAAA,CAAO,UAAU,QAAA,CAAS,KAAK,IAAI,MAAA,CAAO,SAAA,CAAU,OAAO,MAAM,CAAA;AAAA;;AAAA;AAAA,SAAA,EAI1E,CAAC,EAAE,MAAA,EAAO,KAAM,MAAM,CAAA;AAAA,UAAA,EACrB,CAAC,EAAE,OAAA,EAAQ,KAAM,OAAO,CAAA;;AAAA;AAAA,EAAA,EAGhC,CAAC,EAAE,aAAA,EAAc,KACjB,aAAA,IACAD,WAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAAA,EAQa,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IAAA,CAC/B;;AAAA;AAAA,EAAA,EAGD,CAAC,EAAE,YAAA,EAAa,KAChB,YAAA,IACAA,WAAAA;AAAA;AAAA;AAAA,kBAAA,EAGgB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAYhC;;AAAA;AAAA,qBAAA,EAGkB,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA,IAAA,EAC1C,CAAC,EAAE,aAAA,EAAe,YAAA,OAClB,CAAC,aAAA,IACD,CAAC,YAAA,IACDA,WAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAMC;AAAA;;AAAA;AAAA;AAAA,uBAAA,EAKkB,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA;AAAA;;AAAA;AAAA,WAAA,EAKjC,CAAC,EAAE,aAAA,EAAc,KAAO,aAAA,GAAgB,OAAO,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,KAAM,CAAA;AAAA,CAAA;ACAxF,IAAM,SAAgC,CAAC;AAAA,EAC5C,WAAA,GAAc,KAAA;AAAA,EACd,YAAA,GAAe,KAAA;AAAA,EACf,KAAA,GAAQ,OAAA;AAAA,EACR,MAAA,GAAS,OAAA;AAAA,EACT,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,uBACEI,cAAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,aAAA,EAAe,YAAA;AAAA,MACf,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,SAAA;AAAA,MACZ,YAAA,EAAW,OAAA;AAAA,MAEV;AAAA;AAAA,GACH;AAEJ;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;ACpErB,IAAM,mBAAA,GAAsBoB,yBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA8G5B,IAAM,mBAAmBvB,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAAA,EAQQ,OAAO,MAAA,CAAO,OAAO,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAiFlF,IAAM,uBAA4D,CAAC;AAAA,EACxE,QAAA;AAAA,EACA,YAAA,GAAe,iCAAA;AAAA,EACf,MAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,mBAAA,GAAsB,IAAA;AAAA,EACtB,gBAAA,GAAmB,IAAA;AAAA,EACnB,QAAA,GAAW,GAAA;AAAA,EACX,SAAA;AAAA,EACA;AACF,CAAA,KAAM;AAGJ,EAAA,MAAM,aAAA,GAAgB,CAAC,MAAA,KAA+B;AACpD,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAIwB,sBAAA,EAAe;AAEnC,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA,SAAA,GAAY,KAAK,CAAA;AAAA,IACnB,CAAA;AAEA,IAAA,uBACErB,eAAC,MAAA,EAAA,EAAO,KAAA,EAAM,gBAAe,QAAA,EAAS,2BAAA,EAA4B,SAAS,WAAA,EAAa,CAAA;AAAA,EAE5F,CAAA;AAIA,EAAA,MAAMsB,cAAAA,GAAgB,CAAC,KAAA,KAA8B;AACnD,IAAA,uBAAOtB,cAAAA,CAAC,MAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,QAAA,EAAS,CAAA;AAAA,EACjC,CAAA;AAIA,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAgC;AACvD,IAAA,uBACEA,eAAC,QAAA,EAAA,EACE,QAAA,EAAA,KAAA,CAAM,SAAS,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,qBAC5BA,cAAAA;AAAA,MAAC,KAAA,CAAM,aAAA;AAAA,MAAN;AAAA,QAEC,OAAA;AAAA,QACA,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,KAAA;AAAA,QACA,gBAAA,EAAkB,KAAA,KAAU,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS;AAAA,OAAA;AAAA,MAJ/C,OAAA,CAAQ,EAAA,IAAM,CAAA,QAAA,EAAW,KAAK,CAAA;AAAA,KAMtC,CAAA,EACH,CAAA;AAAA,EAEJ,CAAA;AAIA,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAA+B;AACnD,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAIqB,sBAAA,EAAe;AAEzC,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAM,eAAe,CAAC,IAAA;AACtB,MAAA,OAAA,CAAQ,YAAY,CAAA;AACpB,MAAA,SAAA,GAAY,YAAY,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,uBACErB,cAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,WAAA;AAAA,QACT,YAAA,EAAY,OAAO,YAAA,GAAe,WAAA;AAAA,QAClC,IAAA,EAAK,QAAA;AAAA,QAEL,QAAA,kBAAAC,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,IAAA;AAAA,YACN,MAAA,EAAO,IAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAK,cAAA;AAAA,YACL,KAAA,EAAM,4BAAA;AAAA,YACN,IAAA,EAAK,KAAA;AAAA,YACL,YAAA,EAAW,WAAA;AAAA,YAEX,QAAA,EAAA;AAAA,8BAAAD,cAAAA,CAAC,WAAM,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACXA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yFAAA,EAA0F;AAAA;AAAA;AAAA;AACpG;AAAA,KACF;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACEC,eAAAA,CAAAc,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAf,eAAC,mBAAA,EAAA,EAAoB,CAAA;AAAA,oBACrBA,cAAAA;AAAA,MAACuB,sBAAA;AAAA,MAAA;AAAA,QAEC,gBAAA,EAAkB,uBAAA;AAAA,QAClB,WAAA,EAAa,kBAAA;AAAA,QACb,KAAA,EAAO,YAAA;AAAA,QACP,MAAA,EAAQ,aAAA;AAAA,QACR,MAAA,EAAQD,cAAAA;AAAA,QACR,QAAA,EAAU,eAAA;AAAA,QACV,MAAA,EAAQ,YAAA;AAAA,QAER,YAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,cAAA;AAAA,UACP,OAAA,EAAS,+BAAA;AAAA,UACT,GAAG;AAAA,SACL;AAAA,QACA,KAAA;AAAA,QAEA,WAAA;AAAA,QACA,mBAAA;AAAA,QACA,gBAAA;AAAA,QACA,QAAA;AAAA,QACA,SAAA;AAAA,QAEA,SAAA;AAAA,QAEC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEA,oBAAA,CAAqB,WAAA,GAAc,sBAAA;AChVnC,IAAME,oBAAAA,GAAsBJ,yBAAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAoBb,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAclB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,gBAAA,EAEf,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,wBAAA,EAET,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,eAAA,EAE1B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,wBAAA,EACR,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,yBAAA,EAEhB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,4BAAA,EACd,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,6BAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,mBAAA,EAE3B,MAAA,CAAO,aAAa,EAAE,CAAA;;AAAA;AAAA,gBAAA,EAGzB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,gBAAA,EAC3B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,sBAAA,EAGX,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;;AAAA;AAAA;AAAA,aAAA,EAI1C,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,qBAAA,EAoBX,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAI9B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,kBAAA,EAEf,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,0BAAA,EAET,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,2BAAA,EAIhB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,+BAAA,EAEb,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAyClB,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,iCAAA,EACnB,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,eAAA,EAyBxC,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA;AAAA,eAAA,EAItC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,cAAA,EAClB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,eAAA,EAMhB,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAmE5C,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,aAAA,EACb,MAAA,CAAO,QAAQ,EAAE,CAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA6ChC,IAAMK,oBAAmB5B,wBAAAA,CAAO,MAAA;AAAA;AAAA,eAAA,EAEf,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,cAAA,EAClB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,iBAAA,EAGd,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA;AAAA,sCAAA,EAEH,OAAO,MAAA,CAAO,OAAO,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,cAAA,EACzE,CAAC,EAAE,SAAA,EAAU,KAAO,YAAY,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,OAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAIzE,CAAC,EAAE,SAAA,EAAU,KAAO,SAAA,GAAY,gBAAgB,SAAU,CAAA;AAAA,WAAA,EACzD,CAAC,EAAE,SAAA,EAAU,KAAO,SAAA,GAAY,MAAM,CAAE,CAAA;AAAA,UAAA,EACzC,CAAC,EAAE,SAAA,EAAU,KAAO,SAAA,GAAY,mBAAmB,MAAO,CAAA;AAAA,WAAA,EACzD,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,kBAAA,EACZ,MAAA,CAAO,YAAY,IAAI,CAAA;;AAAA;AAAA;AAAA,gBAAA,EAIzB,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,UAAA,EAUhC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA;AAAA,CAAA;AAmEtC,IAAM,aAAA,GAAgB,CAAC,KAAA,KAA8B;AACnD,EAAA,uBAAOG,cAAAA,CAAC,MAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,QAAA,EAAS,CAAA;AACjC,CAAA;AACA,aAAA,CAAc,WAAA,GAAc,eAAA;AAM5B,SAAS,oBAAoB,SAAA,EAAqC;AAChE,EAAA,MAAM,sBAAA,GAAyB,CAAC,MAAA,KAA+B;AAC7D,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAIqB,sBAAAA,EAAe;AAEnC,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,OAAA,CAAQ,KAAK,CAAA;AACb,MAAA,SAAA,GAAY,KAAK,CAAA;AAAA,IACnB,CAAA;AAEA,IAAA,uBAAOrB,cAAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAM,cAAA,EAAe,SAAS,WAAA,EAAa,CAAA;AAAA,EAC5D,CAAA;AACA,EAAA,sBAAA,CAAuB,WAAA,GAAc,wBAAA;AACrC,EAAA,OAAO,sBAAA;AACT;AAMA,SAAS,mBAAA,CACP,QAAA,EACA,cAAA,EACA,SAAA,EACA;AACA,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAA+B;AACnD,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAIqB,sBAAAA,EAAe;AAEzC,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,IAAI,QAAA,EAAU;AACd,MAAA,MAAM,eAAe,CAAC,IAAA;AACtB,MAAA,OAAA,CAAQ,YAAY,CAAA;AACpB,MAAA,SAAA,GAAY,YAAY,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,uBACErB,cAAAA;AAAA,MAACyB,iBAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,WAAA;AAAA,QACT,YAAA,EAAY,QAAA,GAAW,cAAA,GAAiB,IAAA,GAAO,YAAA,GAAe,WAAA;AAAA,QAC9D,eAAA,EAAe,QAAA;AAAA,QACf,KAAA,EAAO,WAAW,cAAA,GAAiB,MAAA;AAAA,QACnC,IAAA,EAAK,QAAA;AAAA,QACL,SAAA,EAAW,QAAA;AAAA,QAEX,QAAA,kBAAAxB,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,IAAA;AAAA,YACN,MAAA,EAAO,IAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAK,cAAA;AAAA,YACL,KAAA,EAAM,4BAAA;AAAA,YACN,IAAA,EAAK,KAAA;AAAA,YACL,aAAA,EAAY,MAAA;AAAA,YAEZ,QAAA,EAAA;AAAA,8BAAAD,cAAAA,CAAC,WAAM,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,8BACXA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yFAAA,EAA0F;AAAA;AAAA;AAAA;AACpG;AAAA,KACF;AAAA,EAEJ,CAAA;AACA,EAAA,YAAA,CAAa,WAAA,GAAc,cAAA;AAC3B,EAAA,OAAO,YAAA;AACT;AAkBO,SAAS0B,qBAAAA,CAAqB;AAAA,EACnC,QAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,SAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,cAAA,GAAiB,sCAAA;AAAA,EACjB,OAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAG5B,EAAA,MAAM,sBAAA,GAAyBjB,aAAAA;AAAA,IAC7B,MAAM,oBAAoB,SAAS,CAAA;AAAA,IACnC,CAAC,SAAS;AAAA,GACZ;AAGA,EAAA,MAAM,YAAA,GAAeA,aAAAA;AAAA,IACnB,MAAM,mBAAA,CAAoB,QAAA,EAAU,cAAA,EAAgB,SAAS,CAAA;AAAA,IAC7D,CAAC,QAAA,EAAU,cAAA,EAAgB,SAAS;AAAA,GACtC;AAIA,EAAA,MAAM,2BAAA,GAA8BA,aAAAA;AAAA,IAClC,MACE,aAAA,GACI,+CAAA,CAAgD,aAAA,EAAe,iBAAA,EAAmB,kBAAkB,CAAA,GACpG,iBAAA,IAAqB,kBAAA,GACnB,6BAAA,CAA8B,iBAAA,EAAmB,kBAAkB,CAAA,GACnE,uBAAA;AAAA,IACR,CAAC,iBAAA,EAAmB,kBAAA,EAAoB,aAAa;AAAA,GACvD;AAEA,EAAA,uBACER,eAAAA,CAAAc,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAf,cAAAA,CAACwB,sBAAA,EAAoB,CAAA;AAAA,oBACrBxB,cAAAA;AAAA,MAACuB,sBAAAA;AAAA,MAAA;AAAA,QAGC,gBAAA,EAAkB,2BAAA;AAAA,QAClB,WAAA,EAAa,kBAAA;AAAA,QACb,KAAA,EAAO,YAAA;AAAA,QACP,MAAA,EAAQ,sBAAA;AAAA,QACR,MAAA,EAAQ,aAAA;AAAA,QACR,MAAA,EAAQ,YAAA;AAAA,QAIR,4BAAA,EAA8B,sBAAA;AAAA,QAE9B,YAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,cAAA;AAAA,UACP,OAAA,EAAS;AAAA,SACX;AAAA,QAEA,WAAA;AAAA,QACA,mBAAA,EAAqB,IAAA;AAAA,QACrB,gBAAA,EAAkB,IAAA;AAAA,QAClB,SAAA;AAAA,QAEA,OAAA;AAAA,QACA,WAAA;AAAA,QAEA,SAAA;AAAA,QAEC;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ;AAEAG,qBAAAA,CAAqB,WAAA,GAAc,sBAAA;ACrjB5B,IAAM,kBAAkB7B,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAIzB,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,oBAAA,EAC7B,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAAA,wBAAA,EACtB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA;AAAA,CAAA;AAI/C,IAAM,gBAAgBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,OAAA,EAI3B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,aAAA,EAGX,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,SAAA,EACjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA;AAAA,eAAA,EAEtB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,eAAA,EACpC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA;AAAA,CAAA;AAG5C,IAAM,iBAAiBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG5B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,CAAA;AAInB,IAAM,eAAeA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAG1B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EAIX,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA;AAAA,CAAA;AAIrC,IAAM,aAAaA,wBAAAA,CAAO,CAAA;AAAA,SAAA,EACtB,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA;AAAA,sBAAA,EAER,MAAA,CAAO,YAAY,IAAI,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,uBAAA,EAStB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;AAAA,mBAAA,EAE9B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,CAAA;ACRpC,IAAM,SAAgC,CAAC;AAAA,EAC5C,QAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KAAM;AAEJ,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,CAAA,KAA2C;AACtE,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,eAAA,EAAgB;AAAA,IAClB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEG,cAAAA,CAAC,eAAA,EAAA,EAAgB,SAAA,EACf,QAAA,kBAAAC,gBAAC,aAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,QAAA,oBACCD,cAAAA,CAAC,cAAA,EAAA,EACE,QAAA,EAAA,WAAA,mBACCA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,WAAA;AAAA,QACN,OAAA,EAAS,mBAAA;AAAA,QACT,MAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAI,qBAAA;AAAA,QAEH,QAAA,EAAA;AAAA;AAAA,QAGH,QAAA,EAEJ,CAAA;AAAA,IAGD,MAAA,oBAAUA,cAAAA,CAAC,YAAA,EAAA,EAAc,QAAA,EAAA,MAAA,EAAO;AAAA,GAAA,EACnC,CAAA,EACF,CAAA;AAEJ;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;AC7Fd,IAAM,iBAAiBH,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAO9B,IAAM8B,gBAAe9B,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,MAAA,EAG3B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,UAAA,EACb,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,mBAAA,EACR,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA;AAAA;AAAA,mBAAA,EAGtB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,gBAAA,EAC/B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,iBAAA,EACrB,MAAA,CAAO,YAAY,MAAM,CAAA;;AAAA;AAAA,gBAAA,EAG1B,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;;AAAA;AAAA,gBAAA,EAI1B,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA;AAAA,CAAA;AAUtC,IAAM,WAAWA,wBAAAA,CAAO,QAAA;AAAA;AAAA,aAAA,EAEhB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,aAAA,EACjB,CAAC,KAAA,KAAU,CAAA,EAAA,CAAI,MAAM,QAAA,IAAY,CAAA,IAAK,EAAE,CAAA,EAAA,CAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAK3C,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,YAAA,EACtC,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,cAAA,EAC3B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,QAAA,EACvB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA;AAAA;;AAAA;AAAA,SAAA,EAKzB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA;;AAAA;AAAA,SAAA,EAI3B,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,SAAA,EAU3B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA;AAAA,cAAA,EAIZ,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA;AAAA;;AAAA;AAAA,cAAA,EAI7B,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA;AAAA,iBAAA,EAC1B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;;AAAA;AAAA,cAAA,EAIzB,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AAAA;AAAA,CAAA;AAQ3C,IAAM,aAAaA,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAA,EAQf,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,mBAAA,EACnB,CAAC,KAAA,KAAW,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,OAAO,OAAA,CAAQ,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,OAAQ,CAAA;AAAA,QAAA,EAC9F,CAAC,KAAA,KAAW,KAAA,CAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAQ,CAAA;AAAA,SAAA,EACrF,CAAC,KAAA,KAAW,KAAA,CAAM,QAAA,GAAW,gBAAgB,SAAU,CAAA;AAAA,iBAAA,EAC/C,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA;;AAAA;AAAA,oBAAA,EAItB,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,qBAAA,EASnB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AC3E1C,IAAM,QAA8B,CAAC;AAAA,EAC1C,KAAA,GAAQ,EAAA;AAAA,EACR,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,mBAAA;AAAA,EACd,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA,EACb,OAAA,GAAU,CAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA;AAAA,EACA,cAAc,SAAA,GAAY,eAAA;AAAA,EAC1B,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,WAAA,GAAcC,aAA4B,IAAI,CAAA;AAGpD,EAAA,MAAM,EAAE,YAAW,GAAI8B,sBAAA;AAAA,IACrB;AAAA,MACE,GAAG,SAAA;AAAA,MACH,YAAA,EAAc,SAAA;AAAA,MACd,KAAA;AAAA,MACA,QAAA,EAAU,CAAC,QAAA,KAAqB;AAC9B,QAAA,QAAA,GAAW,QAAQ,CAAA;AAAA,MACrB,CAAA;AAAA,MACA,UAAA;AAAA,MACA,UAAA;AAAA,MACA,gBAAA,EAAkB;AAAA,KACpB;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAA0C;AAE/D,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAC,EAAE,QAAA,EAAU;AACpC,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,IAAI,MAAM,IAAA,EAAK,IAAK,YAAY,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAC1D,QAAA,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AAErB,QAAA,QAAA,GAAW,EAAE,CAAA;AAAA,MACf;AAAA,IACF;AAAA,EAEF,CAAA;AAGA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,MAAM,IAAA,EAAK,IAAK,YAAY,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAC1D,MAAA,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AACrB,MAAA,QAAA,GAAW,EAAE,CAAA;AAEb,MAAA,WAAA,CAAY,SAAS,KAAA,EAAM;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK,CAAE,SAAS,CAAA,IAAK,CAAC,cAAc,CAAC,UAAA;AAE3D,EAAA,uBACE5B,cAAAA,CAAC,cAAA,EAAA,EAAe,WACd,QAAA,kBAAAC,eAAAA,CAAC0B,eAAA,EACC,QAAA,EAAA;AAAA,oBAAA3B,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACE,GAAG,UAAA;AAAA,QACJ,GAAA,EAAK,WAAA;AAAA,QACL,WAAA;AAAA,QACA,SAAA,EAAW,aAAA;AAAA,QACX,QAAA,EAAU,OAAA;AAAA,QACV,SAAA;AAAA,QACA,QAAA,EAAU,UAAA;AAAA,QACV,QAAA,EAAU;AAAA;AAAA,KACZ;AAAA,oBACAA,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,UAAA;AAAA,QACT,UAAU,CAAC,OAAA;AAAA,QACX,YAAA,EAAW,cAAA;AAAA,QACX,KAAA,EAAM,sBAAA;AAAA,QAEN,QAAA,kBAAAC,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,IAAA;AAAA,YACN,MAAA,EAAO,IAAA;AAAA,YACP,OAAA,EAAQ,WAAA;AAAA,YACR,IAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAM,4BAAA;AAAA,YACN,IAAA,EAAK,KAAA;AAAA,YACL,aAAA,EAAY,MAAA;AAAA,YAEZ,QAAA,EAAA;AAAA,8BAAAD,cAAAA,CAAC,WAAM,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,8BAChBA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,CAAA,EAAE,+CAAA;AAAA,kBACF,MAAA,EAAO,cAAA;AAAA,kBACP,WAAA,EAAY,GAAA;AAAA,kBACZ,aAAA,EAAc,OAAA;AAAA,kBACd,cAAA,EAAe;AAAA;AAAA;AACjB;AAAA;AAAA;AACF;AAAA;AACF,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;ACtIO,IAAM,wBAAwBH,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAI5B,CAAC,KAAA,KAAU,KAAA,CAAM,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,cAAA,EAI3B,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAAA,oBAAA,EACpB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,iBAAA,EAC/B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,gBAAA,EASvB,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA;AAAA,mBAAA,EAC1B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;;AAAA;AAAA,gBAAA,EAIzB,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA;AAAA,mBAAA,EAC1B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,2BAAA,EACd,MAAA,CAAO,YAAY,IAAI,CAAA;AAAA;;AAAA;AAAA,gBAAA,EAIlC,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA;AAAA;;AAAA;AAAA;AAAA,mBAAA,EAK/B,MAAA,CAAO,OAAO,SAAA,CAAU,KAAK,IAAI,MAAA,CAAO,MAAA,CAAO,UAAU,KAAK,CAAA;;AAAA;AAAA;AAAA;AAM5E,IAAM,sBAAsBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAGjC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAOnB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,aAAA,EACb,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,mBAAA,EAChC,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA;AAAA,8BAAA,EAGX,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,4BAAA,EAMjC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,gBAAA,EAW7B,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAAA,WAAA,EAC/B,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,gCAAA,EACL,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA,gBAAA,EAKtC,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAAA,WAAA,EAC7B,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,+BAAA,EACN,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA,gBAAA,EAKrC,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AAAA,WAAA,EACjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,eAAA,EACxB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACvDvC,IAAM,eAAe,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,SAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAyB;AACvB,EAAA,MAAM,YAAA,GAAeC,aAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,UAAA,GAAaA,aAAuB,IAAI,CAAA;AAC9C,EAAA,MAAM,kBAAA,GAAqBA,aAAO,KAAK,CAAA;AACvC,EAAA,MAAM,gBAAA,GAAmBA,aAA6C,IAAI,CAAA;AAI1E,EAAAU,gBAAU,MAAM;AACd,IAAA,IAAI,UAAA,IAAc,CAAC,kBAAA,CAAmB,OAAA,IAAW,aAAa,OAAA,EAAS;AACrE,MAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,MAAA,SAAA,CAAU,YAAY,SAAA,CAAU,YAAA;AAAA,IAClC;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,CAAS,MAAA,EAAQ,UAAU,CAAC,CAAA;AAGhC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AAE3B,IAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,IAAA,MAAM,aAAa,SAAA,CAAU,YAAA,GAAe,SAAA,CAAU,SAAA,GAAY,UAAU,YAAA,GAAe,EAAA;AAG3F,IAAA,kBAAA,CAAmB,UAAU,CAAC,UAAA;AAG9B,IAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,MAAA,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAAA,IACvC;AAGA,IAAA,gBAAA,CAAiB,OAAA,GAAU,WAAW,MAAM;AAC1C,MAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAAA,IAC/B,GAAG,GAAI,CAAA;AAGP,IAAA,IAAI,SAAA,CAAU,SAAA,KAAc,CAAA,IAAK,WAAA,EAAa;AAC5C,MAAA,WAAA,EAAY;AAAA,IACd;AAAA,EACF,CAAA;AAGA,EAAAA,gBAAU,MAAM;AACd,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,QAAA,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAAA,MACvC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,oBAAA,GAAuB,CAAC,OAAA,qBAC5BR,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAW,CAAA,iBAAA,EAAoB,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,MAC3C,mBAAiB,OAAA,CAAQ,EAAA;AAAA,MACzB,aAAW,OAAA,CAAQ,IAAA;AAAA,MAElB,QAAA,EAAA,OAAA,CAAQ;AAAA,KAAA;AAAA,IALJ,OAAA,CAAQ;AAAA,GAMf;AAGF,EAAA,uBACEA,cAAAA;AAAA,IAAC,qBAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,YAAA;AAAA,MACL,QAAA,EAAU,YAAA;AAAA,MACV,SAAA;AAAA,MACA,UAAA,EAAY,SAAA;AAAA,MAEZ,QAAA,kBAAAA,eAAC,mBAAA,EAAA,EAAoB,GAAA,EAAK,YACvB,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,aAAA,IAAiB,oBAAoB,CAAA,EACrD;AAAA;AAAA,GACF;AAEJ;ACjHO,IAAM6B,qBAAoBhC,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAI5B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,CAAA;AAQtB,IAAM,gBAAgBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAIvB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,iBAAA,EACX,MAAA,CAAO,aAAa,EAAE,CAAA;;AAAA;AAAA,cAAA,EAGzB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAAA,SAAA,EAC/B,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;;AAAA;AAAA,kBAAA,EAGjB,MAAA,CAAO,YAAY,IAAI,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,eAAA,EAS1B,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,iBAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,QAAQ,CAAA;AAAA,mBAAA,EACnC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA;AAAA,CAAA;AAQ/B,IAAMiC,kBAAiBjC,wBAAAA,CAAO,CAAA;AAAA;AAAA,aAAA,EAEtB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAU7C,IAAMkC,eAAclC,wBAAAA,CAAO,IAAA;AAAA,aAAA,EACnB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA;AAAA,cAAA,EAE5B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,CAAA;ACtDjC,IAAMsB,gBAAetB,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA,OAAA,EAGnB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,cAAA,EACnC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,aAAA,EAClB,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,SAAA,EACzC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,cAAA,EACvB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,oBAAA,EACvB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,iBAAA,EAC/B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,kBAAA,EAErB,MAAA,CAAO,YAAY,IAAI,CAAA;;AAAA;AAAA,gBAAA,EAGzB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAAA,kBAAA,EAChC,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAQ9C,IAAMiB,oBAAmBjB,wBAAAA,CAAO,GAAA;AAAA;AAAA,OAAA,EAEvB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,CAAA;AAI1B,IAAMe,UAASf,wBAAAA,CAAO,GAAA;AAAA,SAAA,EACX,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,UAAA,EAChB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,iBAAA,EACV,MAAA,CAAO,aAAa,IAAI,CAAA;AAAA,eAAA,EAC1B,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;AAAA,oBAAA,EAEZ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,CAAA;AAwC3C,IAAMmC,eAAc,CAAC;AAAA,EAC1B,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd,UAAU,EAAC;AAAA,EACX,cAAA,GAAiB;AACnB,CAAA,KAAwB;AACtB,EAAA,uBACE/B,eAAAA,CAAC4B,kBAAAA,EAAA,EAAkB,SAAA,EACjB,QAAA,EAAA;AAAA,oBAAA5B,gBAAC,aAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,QAAA,oBAAYD,cAAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,sBAC/BA,cAAAA,CAAC8B,eAAAA,EAAA,EACC,QAAA,kBAAA9B,cAAAA;AAAA,QAACU,cAAAA;AAAA,QAAA;AAAA,UACC,OAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,EAAS,iBAAiB,UAAA,GAAa,SAAA;AAAA,UACvC,MAAA,EAAQ;AAAA;AAAA,OACV,EACF,CAAA;AAAA,MACC,SAAA,oBAAaV,cAAAA,CAAC+B,YAAAA,EAAA,EAAa,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,MACrC,QAAQ,MAAA,GAAS,CAAA,oBAChB/B,cAAAA,CAACc,iBAAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,0BACpBb,eAAAA,CAACkB,eAAA,EAAyB,OAAA,EAAS,OAAO,OAAA,EACvC,QAAA,EAAA;AAAA,QAAA,MAAA,CAAO,IAAA;AAAA,QACP,MAAA,CAAO;AAAA,OAAA,EAAA,EAFS,KAGnB,CACD,CAAA,EACH;AAAA,KAAA,EAEJ,CAAA;AAAA,IACC,SAAA,oBAAanB,cAAAA,CAACY,OAAAA,EAAA,EAAO,GAAA,EAAK,SAAA,EAAW,GAAA,EAAK,QAAA,IAAY,MAAA,EAAQ;AAAA,GAAA,EACjE,CAAA;AAEJ;ACjHA,IAAM,iBAAiBf,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAGrB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,CAAC,KAAA,KAAW,KAAA,CAAM,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,CAAQ,EAAA,GAAK,CAAA,EAAG,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA,CAAG,CAAA;AAAA,oBAAA,EAChG,CAAC,KAAA,KACnB,KAAA,CAAM,OAAA,KAAY,WAAW,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAA,CAAA,GAAO,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,oBAAA,EAClE,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,iBAAA,EACtB,CAAC,KAAA,KAAW,KAAA,CAAM,OAAA,KAAY,QAAA,GAAW,OAAO,YAAA,CAAa,EAAA,GAAK,MAAA,CAAO,YAAA,CAAa,EAAG,CAAA;AAAA,SAAA,EACjG,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,eAAA,EACpB,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,UAAA,EACzC,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,SAAA,EAClB,CAAC,KAAA,KAAW,KAAA,CAAM,OAAA,KAAY,QAAA,GAAW,SAAS,MAAO,CAAA;AAAA,aAAA,EACrD,CAAC,KAAA,KAAW,KAAA,CAAM,OAAA,KAAY,QAAA,GAAW,SAAS,OAAQ,CAAA;AAAA,CAAA;AAGzE,IAAM,gBAAgBA,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAIlB,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,CAAA;AAG9B,IAAM,SAAA,GAAY,sBAChBG,cAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAM,4BAAA;AAAA,IACN,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAO,IAAA;AAAA,IAEP,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kGAAA,EAAmG;AAAA;AAC7G,CAAA;AAGF,IAAMiC,WAAUpC,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA;AAAA,OAAA,EAId,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAG1B,IAAM,eAAeA,wBAAAA,CAAO,GAAA;AAAA,aAAA,EACb,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,SAAA,EACzC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,CAAA;AAGrC,IAAM,eAAeA,wBAAAA,CAAO,GAAA;AAAA,aAAA,EACb,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA;AAAA,SAAA,EAEjC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA,cAAA,EACvB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAGjC,IAAMqC,WAAUrC,wBAAAA,CAAO,GAAA;AAAA;AAAA,OAAA,EAEd,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,cAAA,EACV,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,CAAA;AAGjC,IAAMsC,UAAStC,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA,OAAA,EAGb,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,WAAA,EACb,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,aAAA,EACpC,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,SAAA,EACzC,CAAC,KAAA,KAAW,KAAA,CAAM,OAAA,KAAY,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAU,CAAA;AAAA,cAAA,EAC/F,CAAC,KAAA,KAAW,KAAA,CAAM,OAAA,KAAY,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAQ,CAAA;AAAA;AAAA,IAAA,EAExG,CAAC,KAAA,KAAW,KAAA,CAAM,OAAA,KAAY,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAQ,CAAA;AAAA,iBAAA,EAChF,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,kBAAA,EAErB,MAAA,CAAO,YAAY,IAAI,CAAA;;AAAA;AAAA,gBAAA,EAGzB,CAAC,KAAA,KACb,KAAA,CAAM,OAAA,KAAY,SAAA,GACd,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GACrB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAAA,kBAAA,EACxB,CAAC,KAAA,KACf,KAAA,CAAM,OAAA,KAAY,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAa5F,IAAM,cAAcA,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAUhB,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAAA;AAAA,iBAAA,EAEpB,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA,kBAAA,EACrB,MAAA,CAAO,YAAY,IAAI,CAAA;;AAAA;AAAA,gBAAA,EAGzB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAAA,WAAA,EACvC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAQvC,IAAM,SAAA,GAAY,sBAChBG,cAAAA;AAAA,EAAC,KAAA;AAAA,EAAA;AAAA,IACC,KAAA,EAAM,4BAAA;AAAA,IACN,OAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAO,IAAA;AAAA,IAEP,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uGAAA,EAAwG;AAAA;AAClH,CAAA;AA8BK,IAAM,qBAAwD,CAAC;AAAA,EACpE,KAAA;AAAA,EACA,OAAA,GAAU,QAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,YAAA,GAAe,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,CAAM,OAAA;AAE/D,EAAA,uBACEC,gBAAC,cAAA,EAAA,EAAe,OAAA,EAAkB,WAAsB,IAAA,EAAK,OAAA,EAAQ,aAAU,WAAA,EAC7E,QAAA,EAAA;AAAA,oBAAAD,eAAC,aAAA,EAAA,EAAc,aAAA,EAAY,QACzB,QAAA,kBAAAA,cAAAA,CAAC,aAAU,CAAA,EACb,CAAA;AAAA,oBACAC,eAAAA,CAACgC,QAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAjC,cAAAA,CAAC,gBAAc,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,MAC3B,OAAA,oBAAWA,cAAAA,CAAC,YAAA,EAAA,EAAc,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,MAAA,CACjC,SAAA,IAAa,SAAA,qBACbC,eAAAA,CAACiC,UAAA,EACE,QAAA,EAAA;AAAA,QAAA,SAAA,IAAa,OAAA,oBACZlC,cAAAA,CAACmC,OAAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,OAAA,EAAS,OAAA,EAAS,QAAA,EAAA,OAAA,EAE5C,CAAA;AAAA,QAED,SAAA,oBACCnC,cAAAA,CAACmC,OAAAA,EAAA,EAAO,OAAA,EAAQ,WAAA,EAAY,OAAA,EAAS,SAAA,EAAW,QAAA,EAAA,SAAA,EAEhD;AAAA,OAAA,EAEJ;AAAA,KAAA,EAEJ,CAAA;AAAA,IACC,SAAA,oBACCnC,cAAAA,CAAC,WAAA,EAAA,EAAY,OAAA,EAAS,SAAA,EAAW,YAAA,EAAW,eAAA,EAC1C,QAAA,kBAAAA,cAAAA,CAAC,SAAA,EAAA,EAAU,CAAA,EACb;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,kBAAA,CAAmB,WAAA,GAAc,oBAAA;ACnN1B,IAAM,uBAAuBH,wBAAAA,CAAO,GAAA;AAAA;AAAA;AAAA,OAAA,EAGlC,MAAA,CAAO,QAAQ,EAAE,CAAA;;AAAA;AAAA,WAAA,EAGb,MAAA,CAAO,QAAQ,EAAE,CAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AAgCvB,IAAM,mBAAmBA,wBAAAA,CAAO,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAK1B,OAAO,OAAA,CAAQ,EAAE,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA,eAAA,EAClC,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,OAAO,CAAA;AAAA,aAAA,EACtC,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS,EAAE,CAAA;AAAA,eAAA,EAC3B,MAAA,CAAO,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA;AAAA,SAAA,EACzC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAAA,oBAAA,EACf,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,oBAAA,EAC9B,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,iBAAA,EAC/B,MAAA,CAAO,aAAa,EAAE,CAAA;AAAA;AAAA,kBAAA,EAErB,MAAA,CAAO,YAAY,MAAM,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,sBAAA,EAOrB,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA;AAAA,kBAAA,EACtC,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA;AAAA,gBAAA,EAEvB,MAAA,CAAO,QAAQ,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,EAAA,EAS/B,CAAC,EAAE,UAAA,EAAW,KACd,UAAA,IACAD,WAAAA;AAAA;AAAA,IAAA,CAEC;;AAAA;AAAA;AAAA,uBAAA,EAIoB,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;ACxE5C,SAAS,WAAA,CAAY,EAAE,WAAA,EAAa,QAAA,EAAU,WAAU,EAAqB;AAClF,EAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,uBACEI,cAAAA,CAAC,oBAAA,EAAA,EAAqB,WAAsB,IAAA,EAAK,MAAA,EAAO,cAAW,mBAAA,EAChE,QAAA,EAAA,WAAA,CAAY,IAAI,CAAC,UAAA,qBAChBA,cAAAA,CAAC,cAAA,EAAA,EAAgC,YAAwB,QAAA,EAAA,EAApC,UAAwD,CAC9E,CAAA,EACH,CAAA;AAEJ;AAOA,SAAS,cAAA,CAAe,EAAE,UAAA,EAAY,QAAA,EAAS,EAAwB;AACrE,EAAA,MAAM,GAAA,GAAMF,aAA0B,IAAI,CAAA;AAC1C,EAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAU,GAAIC,gBAAAA;AAAA,IACjC;AAAA,MACE,OAAA,EAAS,MAAM,QAAA,CAAS,UAAU,CAAA;AAAA,MAClC,YAAA,EAAc,sBAAsB,UAAU,CAAA;AAAA,KAChD;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACEC,cAAAA,CAAC,gBAAA,EAAA,EAAkB,GAAG,WAAA,EAAa,KAAU,UAAA,EAAY,SAAA,EAAW,IAAA,EAAK,UAAA,EACtE,QAAA,EAAA,UAAA,EACH,CAAA;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"index.cjs","sourcesContent":["/**\n * Design Tokens\n * Centralized design system tokens for colors, typography, spacing, etc.\n * These tokens are the single source of truth for styling across all components.\n */\n\nexport const tokens = {\n colors: {\n // Brand colors\n primary: '#2CB0AB', // Teal (main brand color)\n secondary: '#264E68', // Deep Blue\n accent: '#459FB9', // Sky Blue\n seaGreen: '#4EB999', // Sea Green (additional brand color)\n\n // Backgrounds - dark theme optimized\n background: {\n darkest: '#0a1b2a', // Darkest Blue (brand color)\n darker: '#151a26', // Discord gray (preserved)\n dark: '#1b2230', // Discord surface gray (preserved)\n light: '#252d3d', // Discord border gray (preserved)\n },\n\n // Text hierarchy\n text: {\n primary: '#FFFFFF',\n secondary: '#B4B8C5',\n tertiary: '#6B7280',\n disabled: '#4B5563',\n },\n\n // Semantic colors\n success: '#2CB0AB', // Teal (brand aligned)\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#459FB9', // Sky Blue (brand aligned)\n\n // Status colors (for workflow/SSE events)\n status: {\n pending: '#6B7280',\n editing: '#3B82F6',\n idle: '#6B7280',\n running: '#459FB9', // Sky Blue (brand aligned)\n completed: '#2CB0AB', // Teal (brand aligned)\n failed: '#EF4444',\n timeout: '#F59E0B',\n // Badge status (online/offline pattern)\n online: '#2CB0AB',\n offline: '#EF4444',\n busy: '#459FB9',\n },\n\n // Connection status\n connection: {\n connected: '#2CB0AB', // Teal (brand aligned)\n streaming: '#459FB9', // Sky Blue (brand aligned)\n disconnected: '#EF4444',\n reconnecting: '#F59E0B',\n },\n\n // Surface variants (for overlays, cards, panels)\n surface: {\n base: '#1b2230',\n elevated: '#252d3d',\n overlay: 'rgba(255, 255, 255, 0.05)',\n overlayHover: 'rgba(255, 255, 255, 0.1)',\n overlayActive: 'rgba(255, 255, 255, 0.15)',\n subtle: 'rgba(255, 255, 255, 0.02)',\n glass: 'rgba(255, 255, 255, 0.26)',\n glassBorder: 'rgba(255, 255, 255, 0.3)',\n },\n\n // UI Element colors\n border: {\n default: 'rgba(255, 255, 255, 0.1)',\n subtle: 'rgba(255, 255, 255, 0.05)',\n hover: 'rgba(255, 255, 255, 0.2)',\n focus: '#2CB0AB', // Teal (brand aligned)\n error: '#EF4444',\n },\n\n // Scrollbar colors\n scrollbar: {\n track: 'transparent',\n thumb: 'rgba(255, 255, 255, 0.2)',\n thumbHover: 'rgba(255, 255, 255, 0.3)',\n },\n\n // Message bubbles\n message: {\n user: '#264E68', // Deep Blue (brand color)\n ai: '#1b2230', // Dark background\n system: '#151a26', // Darker background\n },\n\n // Overlays and backdrops\n overlay: 'rgba(0, 0, 0, 0.5)',\n backdrop: 'rgba(27, 34, 48, 0.95)',\n\n // Icon colors\n icon: {\n default: '#B4B8C5',\n muted: '#6B7280',\n active: '#2CB0AB',\n },\n\n // Platform brand colors (for social media icons)\n platform: {\n facebook: '#1877F2',\n instagram: '#E4405F',\n linkedin: '#0A66C2',\n x: '#000000',\n twitter: '#1DA1F2',\n youtube: '#FF0000',\n reddit: '#FF4500',\n slack: '#4A154B',\n telegram: '#0088CC',\n whatsapp: '#25D366',\n gmail: '#EA4335',\n },\n },\n\n typography: {\n fontFamily: {\n primary:\n \"'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', sans-serif\",\n heading:\n \"'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', sans-serif\",\n monospace: \"'Roboto Mono', 'Monaco', 'Menlo', 'Ubuntu Mono', monospace\",\n },\n fontSize: {\n xs: '0.875rem', // 14px (was 12px, increased for better readability)\n sm: '1rem', // 16px (was 14px, increased for better readability)\n base: '1.125rem', // 18px (was 16px, increased for better readability)\n lg: '1.125rem', // 18px (heading size, unchanged)\n xl: '1.25rem', // 20px (heading size, unchanged)\n '2xl': '1.5rem', // 24px (heading size, unchanged)\n '3xl': '1.875rem', // 30px (heading size, unchanged)\n '4xl': '2.25rem', // 36px (heading size, unchanged)\n },\n fontWeight: {\n light: 300,\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeight: {\n tight: 1.25,\n normal: 1.5,\n relaxed: 1.75,\n },\n },\n\n spacing: {\n xs: '0.25rem', // 4px\n sm: '0.5rem', // 8px\n md: '1rem', // 16px\n lg: '1.5rem', // 24px\n xl: '2rem', // 32px\n '2xl': '3rem', // 48px\n '3xl': '4rem', // 64px\n },\n\n borderRadius: {\n none: '0',\n sm: '0.25rem', // 4px\n md: '0.5rem', // 8px\n lg: '0.75rem', // 12px\n xl: '1rem', // 16px\n '2xl': '1.5rem', // 24px\n full: '9999px', // Fully rounded\n },\n\n shadows: {\n none: 'none',\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',\n card: '0 4px 20px rgba(0, 0, 0, 0.3)',\n glow: {\n primary: '0 0 20px rgba(44, 176, 171, 0.3)',\n secondary: '0 0 20px rgba(38, 78, 104, 0.3)',\n accent: '0 0 20px rgba(69, 159, 185, 0.3)',\n },\n },\n\n transitions: {\n fast: '150ms ease-in-out',\n normal: '250ms ease-in-out',\n slow: '350ms ease-in-out',\n },\n\n animation: {\n duration: {\n micro: '150ms',\n short: '200ms',\n medium: '300ms',\n long: '500ms',\n },\n easing: {\n enter: 'cubic-bezier(0.4, 0, 0.2, 1)',\n exit: 'cubic-bezier(0.4, 0, 1, 1)',\n smooth: 'cubic-bezier(0.4, 0, 0.2, 1)',\n linear: 'linear',\n },\n },\n\n zIndex: {\n base: 0,\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n overlay: 1100,\n modal: 1200,\n popover: 1300,\n tooltip: 1400,\n toast: 1500,\n },\n\n breakpoints: {\n mobile: 640,\n tablet: 1024,\n desktop: 1280,\n },\n} as const;\n\nexport type Tokens = typeof tokens;\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport type { ButtonSize, ButtonVariant } from './Button.types';\n\ninterface StyledButtonProps {\n $variant: ButtonVariant;\n $size: ButtonSize;\n $isPressed: boolean;\n $isLoading: boolean;\n}\n\nconst variantStyles = {\n primary: css`\n background-color: ${tokens.colors.primary};\n color: ${tokens.colors.text.primary};\n border: none;\n\n &:hover:not(:disabled) {\n opacity: 0.9;\n transform: translateY(-1px);\n }\n\n &:active:not(:disabled) {\n opacity: 0.8;\n transform: translateY(0);\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n `,\n secondary: css`\n background-color: transparent;\n color: ${tokens.colors.text.primary};\n border: 1px solid ${tokens.colors.border.default};\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlay};\n border-color: ${tokens.colors.primary};\n }\n\n &:active:not(:disabled) {\n background-color: ${tokens.colors.surface.overlayActive};\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n `,\n icon: css`\n background-color: transparent;\n color: ${tokens.colors.text.primary};\n border: none;\n padding: ${tokens.spacing.sm};\n min-width: auto;\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlayHover};\n opacity: 0.8;\n }\n\n &:active:not(:disabled) {\n opacity: 0.6;\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n `,\n};\n\nconst sizeStyles = {\n small: css`\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.sm};\n min-width: 60px;\n height: 28px;\n `,\n medium: css`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n font-size: ${tokens.typography.fontSize.base};\n min-width: 80px;\n height: 36px;\n `,\n large: css`\n padding: ${tokens.spacing.md} ${tokens.spacing.lg};\n font-size: ${tokens.typography.fontSize.lg};\n min-width: 100px;\n height: 44px;\n `,\n};\n\nexport const StyledButton = styled.button<StyledButtonProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: ${tokens.spacing.xs};\n font-family: ${tokens.typography.fontFamily.primary};\n font-weight: ${tokens.typography.fontWeight.medium};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.normal};\n white-space: nowrap;\n user-select: none;\n\n /* Variant styles */\n ${({ $variant }) => variantStyles[$variant]}\n\n /* Size styles */\n ${({ $size, $variant }) => $variant !== 'icon' && sizeStyles[$size]}\n\n /* Icon variant size overrides */\n ${({ $variant, $size }) =>\n $variant === 'icon' &&\n css`\n width: ${$size === 'small' ? '28px' : $size === 'large' ? '44px' : '36px'};\n height: ${$size === 'small' ? '28px' : $size === 'large' ? '44px' : '36px'};\n border-radius: ${tokens.borderRadius.sm};\n `}\n\n /* Pressed state */\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: scale(0.98);\n `}\n\n /* Loading state */\n ${({ $isLoading }) =>\n $isLoading &&\n css`\n cursor: wait;\n opacity: 0.7;\n `}\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n }\n\n /* Remove default focus outline, using focus-visible instead */\n &:focus {\n outline: none;\n }\n`;\n","import type { AriaButtonProps } from '@react-aria/button';\nimport { useButton } from '@react-aria/button';\nimport { useRef } from 'react';\nimport { StyledButton } from './Button.styles';\nimport type { ButtonSize, ButtonVariant } from './Button.types';\n\n// Re-export types for public API\nexport type { ButtonSize, ButtonVariant } from './Button.types';\n\nexport interface ButtonProps extends AriaButtonProps {\n variant?: ButtonVariant;\n size?: ButtonSize;\n children: React.ReactNode;\n className?: string;\n disabled?: boolean;\n isLoading?: boolean;\n}\n\nexport function Button({\n variant = 'primary',\n size = 'medium',\n children,\n className,\n disabled = false,\n isLoading = false,\n ...ariaProps\n}: ButtonProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps, isPressed } = useButton(\n {\n ...ariaProps,\n isDisabled: disabled || isLoading,\n },\n ref\n );\n\n return (\n <StyledButton\n {...buttonProps}\n ref={ref}\n className={className}\n $variant={variant}\n $size={size}\n $isPressed={isPressed}\n $isLoading={isLoading}\n disabled={disabled || isLoading}\n >\n {isLoading ? (\n <span aria-live=\"polite\" aria-busy=\"true\">\n Loading...\n </span>\n ) : (\n children\n )}\n </StyledButton>\n );\n}\n\nButton.displayName = 'Button';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport type { ActionsLayout } from './Actions.types';\n\ninterface ActionsContainerProps {\n $layout: ActionsLayout;\n}\n\nexport const ActionsContainer = styled.div<ActionsContainerProps>`\n display: flex;\n gap: ${tokens.spacing.sm};\n align-items: center;\n\n ${({ $layout }) =>\n $layout === 'horizontal'\n ? css`\n flex-direction: row;\n flex-wrap: wrap;\n `\n : css`\n flex-direction: column;\n align-items: stretch;\n\n button {\n width: 100%;\n }\n `}\n`;\n","import { Button } from '../Button';\nimport { ActionsContainer } from './Actions.styles';\nimport type { Action, ActionsLayout } from './Actions.types';\n\n// Re-export types for public API\nexport type { Action, ActionsLayout, ActionVariant } from './Actions.types';\n\nexport interface ActionsProps {\n actions: Action[];\n layout?: ActionsLayout;\n className?: string;\n}\n\nexport function Actions({ actions, layout = 'horizontal', className }: ActionsProps) {\n return (\n <ActionsContainer $layout={layout} className={className}>\n {actions.map((action) => (\n <Button\n key={action.id}\n variant={action.variant || 'secondary'}\n onPress={action.onClick}\n isDisabled={action.disabled}\n aria-label={action.label}\n >\n {action.icon && <span aria-hidden=\"true\">{action.icon}</span>}\n {action.variant !== 'icon' && action.label}\n </Button>\n ))}\n </ActionsContainer>\n );\n}\n\nActions.displayName = 'Actions';\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n// Pulse animation matching AssistantThinking\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Fade in animation for streaming text\nconst fadeIn = keyframes`\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n`;\n\n// Cursor blink animation for streaming\nconst blink = keyframes`\n 0%, 49% {\n opacity: 1;\n }\n 50%, 100% {\n opacity: 0;\n }\n`;\n\nexport const ResponseContainer = styled.div`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: ${tokens.colors.surface.elevated};\n border-radius: ${tokens.borderRadius.xl};\n box-shadow: none;\n font-family: ${tokens.typography.fontFamily.primary};\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const LoadingDots = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: 0 ${tokens.spacing.xs};\n`;\n\nexport const Dot = styled.span<{ delay: number }>`\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${tokens.colors.text.tertiary};\n animation: ${dotPulse} 1.4s ease-in-out infinite;\n animation-delay: ${(props) => props.delay}s;\n`;\n\nexport const TypingIndicator = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: 0 ${tokens.spacing.xs};\n\n ${Dot} {\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.text.tertiary};\n animation: ${dotPulse} 1.4s ease-in-out infinite;\n }\n`;\n\nexport const Message = styled.span`\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.primary};\n font-weight: ${tokens.typography.fontWeight.regular};\n line-height: ${tokens.typography.lineHeight.normal};\n white-space: nowrap;\n`;\n\nexport const StreamingText = styled.div`\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n color: ${tokens.colors.text.primary};\n animation: ${fadeIn} ${tokens.animation.duration.medium} ease-in;\n position: relative;\n font-weight: ${tokens.typography.fontWeight.regular};\n white-space: nowrap;\n\n /* Blinking cursor effect */\n &::after {\n content: '|';\n margin-left: 0.125rem;\n animation: ${blink} 1s infinite;\n color: ${tokens.colors.text.tertiary};\n font-weight: ${tokens.typography.fontWeight.regular};\n }\n`;\n","import {\n Dot,\n LoadingDots,\n Message,\n ResponseContainer,\n StreamingText,\n TypingIndicator,\n} from './Response.styles';\n\nexport interface ResponseProps {\n /** Loading state - shows animated dots */\n isLoading?: boolean;\n /** Typing state - shows typing indicator */\n isTyping?: boolean;\n /** Streaming state - shows text being typed */\n isStreaming?: boolean;\n /** Content to display when streaming */\n streamingContent?: string;\n /** Message to display with loading/typing state */\n message?: string;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Response component for displaying loading and streaming states\n * Shows animated loading dots, typing indicators, and streaming text\n */\nexport const Response = ({\n isLoading = false,\n isTyping = false,\n isStreaming = false,\n streamingContent = '',\n message = 'Thinking...',\n className,\n}: ResponseProps) => {\n // Show loading dots\n if (isLoading) {\n return (\n <ResponseContainer className={className} data-testid=\"response-loading\">\n <LoadingDots aria-hidden=\"true\">\n <Dot delay={0} />\n <Dot delay={0.15} />\n <Dot delay={0.3} />\n </LoadingDots>\n <Message>{message}</Message>\n </ResponseContainer>\n );\n }\n\n // Show typing indicator\n if (isTyping) {\n return (\n <ResponseContainer className={className} data-testid=\"response-typing\">\n <TypingIndicator aria-hidden=\"true\">\n <Dot delay={0} />\n <Dot delay={0.15} />\n <Dot delay={0.3} />\n </TypingIndicator>\n <Message>{message}</Message>\n </ResponseContainer>\n );\n }\n\n // Show streaming text\n if (isStreaming && streamingContent) {\n return (\n <ResponseContainer className={className} data-testid=\"response-streaming\">\n <StreamingText>{streamingContent}</StreamingText>\n </ResponseContainer>\n );\n }\n\n // Empty state\n return null;\n};\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n// Pulse animation matching AssistantThinking\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Shake animation for error indicator\nconst shake = keyframes`\n 0%, 100% {\n transform: translateX(0);\n }\n 25% {\n transform: translateX(-5px);\n }\n 75% {\n transform: translateX(5px);\n }\n`;\n\nexport const AgentStateContainer = styled.div<{ isError?: boolean }>`\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: ${(props) => (props.isError ? 'rgba(239, 68, 68, 0.15)' : tokens.colors.surface.elevated)};\n border-radius: ${tokens.borderRadius.xl};\n border: ${(props) => (props.isError ? `1px solid ${tokens.colors.error}` : 'none')};\n box-shadow: none;\n font-family: ${tokens.typography.fontFamily.primary};\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const StateContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n align-items: center;\n width: 100%;\n`;\n\nexport const IdleIndicator = styled.div`\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.status.idle};\n border-radius: ${tokens.borderRadius.full};\n animation: ${dotPulse} 2s infinite ease-in-out;\n`;\n\nexport const ErrorIndicator = styled.div`\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.error};\n border-radius: ${tokens.borderRadius.full};\n animation: ${shake} 0.5s ease-in-out;\n`;\n\nexport const StateLabel = styled.span`\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.regular};\n color: ${tokens.colors.text.primary};\n line-height: ${tokens.typography.lineHeight.normal};\n white-space: nowrap;\n`;\n\nexport const MessageText = styled.p`\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.tertiary};\n line-height: ${tokens.typography.lineHeight.normal};\n margin: 0;\n text-align: center;\n white-space: nowrap;\n`;\n\nexport const ProgressBar = styled.div`\n width: 100%;\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.surface.elevated};\n border-radius: ${tokens.borderRadius.sm};\n overflow: hidden;\n margin-top: ${tokens.spacing.xs};\n`;\n\nexport const ProgressBarFill = styled.div<{ progress: number }>`\n height: 100%;\n width: ${(props) => Math.min(Math.max(props.progress, 0), 100)}%;\n background: linear-gradient(135deg, ${tokens.colors.accent} 0%, ${tokens.colors.primary} 100%);\n border-radius: ${tokens.borderRadius.sm};\n transition: width ${tokens.transitions.normal};\n`;\n","import { Response } from '../Response';\nimport {\n AgentStateContainer,\n ErrorIndicator,\n IdleIndicator,\n ProgressBar,\n ProgressBarFill,\n StateContent,\n StateLabel,\n} from './AgentState.styles';\n\nexport interface AgentStateProps {\n /** Current agent state */\n state: 'idle' | 'thinking' | 'responding' | 'error';\n /** Optional message to display */\n message?: string;\n /** Optional progress percentage (0-100) */\n progress?: number;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * AgentState component for displaying agent status\n * Styled to match AssistantThinking and Response components with dark theme\n */\nexport const AgentState = ({ state, message, progress, className }: AgentStateProps) => {\n // Idle state - show pulsing indicator\n if (state === 'idle') {\n return (\n <AgentStateContainer className={className} data-testid=\"agent-state-idle\">\n <StateContent>\n <IdleIndicator />\n <StateLabel>{message || 'Agent is idle'}</StateLabel>\n {progress !== undefined && (\n <ProgressBar>\n <ProgressBarFill progress={progress} />\n </ProgressBar>\n )}\n </StateContent>\n </AgentStateContainer>\n );\n }\n\n // Error state - show error indicator\n if (state === 'error') {\n return (\n <AgentStateContainer className={className} data-testid=\"agent-state-error\" isError>\n <StateContent>\n <ErrorIndicator />\n <StateLabel>{message || 'Error occurred'}</StateLabel>\n </StateContent>\n </AgentStateContainer>\n );\n }\n\n // Thinking state - use Response component with loading dots\n if (state === 'thinking') {\n return <Response isLoading message={message || 'Agent is thinking...'} className={className} />;\n }\n\n // Responding state - use Response component with typing indicator\n if (state === 'responding') {\n return (\n <Response isTyping message={message || 'Agent is responding...'} className={className} />\n );\n }\n\n return null;\n};\n","/**\n * ActionExecutionAdapter Component\n *\n * Adapter for CopilotKit's action execution messages.\n * Displays tool calls using the AgentState component.\n */\n\nimport type { RenderMessageProps } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { AgentState } from '../AgentState';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * ActionExecutionMessage shape from CopilotKit\n * We define this interface because the runtime-client-gql types aren't\n * directly exported in a way TypeScript can use with the react-ui types.\n */\ninterface ActionExecutionMessageShape {\n type: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\n// =============================================================================\n// Styled Components\n// =============================================================================\n\nconst Container = styled.div`\n margin: ${tokens.spacing.sm} 0;\n padding: 0 ${tokens.spacing.sm};\n`;\n\nconst ToolName = styled.div`\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.tertiary};\n margin-bottom: ${tokens.spacing.xs};\n font-family: ${tokens.typography.fontFamily.monospace};\n`;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Check if a message is an ActionExecutionMessage\n */\nfunction isActionExecutionMessage(message: unknown): message is ActionExecutionMessageShape {\n if (!message || typeof message !== 'object') return false;\n\n const msg = message as Record<string, unknown>;\n\n // Check for CopilotKit's message type indicator\n if (typeof msg.isActionExecutionMessage === 'function') {\n return (msg.isActionExecutionMessage as () => boolean)();\n }\n\n // Fallback: check for action execution message properties\n return (\n msg.type === 'ActionExecutionMessage' ||\n (typeof msg.name === 'string' && 'arguments' in msg && !('content' in msg))\n );\n}\n\n/**\n * Format tool name for display\n * e.g., \"create-social-media-posts\" -> \"Create Social Media Posts\"\n */\nfunction formatToolName(name: string): string {\n return name\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Extract a human-readable message from tool arguments\n */\nfunction getToolMessage(name: string, args: Record<string, unknown>): string {\n // Handle common tool patterns\n if (name.includes('social-media')) {\n const topic = args.topic as string | undefined;\n if (topic) {\n return `Creating posts about \"${topic}\"`;\n }\n return 'Creating social media posts...';\n }\n\n // Default message\n return `Running ${formatToolName(name)}...`;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * ActionExecutionAdapter - Renders tool/action execution messages in chat\n *\n * Uses the AgentState component to show:\n * - Tool name\n * - Current status (thinking/responding)\n * - Progress message based on tool arguments\n */\nexport const ActionExecutionAdapter: React.FC<RenderMessageProps> = ({ message, inProgress }) => {\n // Only handle ActionExecutionMessage types\n if (!isActionExecutionMessage(message)) {\n return null;\n }\n\n const toolName = message.name;\n // Handle arguments as either object or JSON string (from GraphQL)\n let toolArgs: Record<string, unknown> = {};\n if (typeof message.arguments === 'string') {\n try {\n toolArgs = JSON.parse(message.arguments);\n } catch {\n toolArgs = {};\n }\n } else if (message.arguments && typeof message.arguments === 'object') {\n toolArgs = message.arguments;\n }\n\n // Determine state based on whether still in progress\n const state = inProgress ? 'thinking' : 'responding';\n const statusMessage = getToolMessage(toolName, toolArgs);\n\n return (\n <Container data-testid=\"action-execution-message\">\n <ToolName>{formatToolName(toolName)}</ToolName>\n <AgentState state={state} message={statusMessage} />\n </Container>\n );\n};\n\nActionExecutionAdapter.displayName = 'ActionExecutionAdapter';\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\nconst pulse = keyframes`\n 0%, 100% {\n opacity: 0.5;\n transform: scale(1);\n }\n 50% {\n opacity: 1;\n transform: scale(1.2);\n }\n`;\n\nconst wave = keyframes`\n 0%, 40%, 100% {\n transform: translateY(0);\n }\n 20% {\n transform: translateY(-8px);\n }\n`;\n\ninterface SizeProps {\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst getSizeValue = (size: 'sm' | 'md' | 'lg' = 'md') => {\n switch (size) {\n case 'sm':\n return {\n padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,\n avatar: '32px',\n icon: '16px',\n fontSize: tokens.typography.fontSize.xs,\n dotSize: '4px',\n };\n case 'lg':\n return {\n padding: `${tokens.spacing.md} ${tokens.spacing.xl}`,\n avatar: '48px',\n icon: '24px',\n fontSize: tokens.typography.fontSize.base,\n dotSize: '8px',\n };\n case 'md':\n default:\n return {\n padding: `${tokens.spacing.md} ${tokens.spacing.md}`,\n avatar: '40px',\n icon: '20px',\n fontSize: tokens.typography.fontSize.sm,\n dotSize: '6px',\n };\n }\n};\n\nexport const Container = styled.div<SizeProps>`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.md};\n padding: ${(props) => getSizeValue(props.size).padding};\n background-color: ${tokens.colors.surface.base};\n border-radius: ${tokens.borderRadius.xl};\n box-shadow: ${tokens.shadows.none};\n font-family: ${tokens.typography.fontFamily.primary};\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const Avatar = styled.div<SizeProps>`\n width: ${(props) => getSizeValue(props.size).avatar};\n height: ${(props) => getSizeValue(props.size).avatar};\n border-radius: ${tokens.borderRadius.full};\n background: linear-gradient(135deg, ${tokens.colors.secondary} 0%, ${tokens.colors.primary} 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-shadow: ${tokens.shadows.glow.primary};\n`;\n\nexport const HeadphonesIcon = styled.svg<SizeProps>`\n width: ${(props) => getSizeValue(props.size).icon};\n height: ${(props) => getSizeValue(props.size).icon};\n color: ${tokens.colors.text.primary};\n`;\n\nexport const Content = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n`;\n\ninterface LoadingDotsProps extends SizeProps {\n variant?: 'dots' | 'pulse' | 'wave';\n}\n\nexport const LoadingDots = styled.div<LoadingDotsProps>`\n display: flex;\n align-items: center;\n gap: ${(props) => (props.variant === 'wave' ? '2px' : `${tokens.spacing.xs}`)};\n padding: 0 ${tokens.spacing.xs};\n`;\n\ninterface DotProps extends SizeProps {\n variant?: 'dots' | 'pulse' | 'wave';\n}\n\nexport const Dot = styled.span<DotProps>`\n width: ${(props) => getSizeValue(props.size).dotSize};\n height: ${(props) => getSizeValue(props.size).dotSize};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${tokens.colors.text.tertiary};\n animation: ${(props) => {\n switch (props.variant) {\n case 'pulse':\n return pulse;\n case 'wave':\n return wave;\n case 'dots':\n default:\n return dotPulse;\n }\n }}\n 1.4s ease-in-out infinite;\n`;\n\nexport const Message = styled.span<SizeProps>`\n font-size: ${(props) => getSizeValue(props.size).fontSize};\n color: ${tokens.colors.text.secondary};\n font-weight: ${tokens.typography.fontWeight.regular};\n line-height: ${tokens.typography.lineHeight.normal};\n white-space: nowrap;\n`;\n","import { useRef } from 'react';\nimport {\n Avatar,\n Container,\n Content,\n Dot,\n HeadphonesIcon,\n LoadingDots,\n Message,\n} from './AssistantThinking.styles';\n\nexport interface AssistantThinkingProps {\n message?: string;\n className?: string;\n ariaLabel?: string;\n /** Visual variant for the loading indicator */\n variant?: 'dots' | 'pulse' | 'wave' | 'text';\n /** Size of the component */\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport function AssistantThinking({\n message = 'Analyzing data, please wait...',\n className,\n ariaLabel = 'Assistant is thinking',\n variant = 'dots',\n size = 'md',\n}: AssistantThinkingProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const renderLoadingIndicator = () => {\n switch (variant) {\n case 'dots':\n return (\n <LoadingDots aria-hidden=\"true\" size={size}>\n <Dot style={{ animationDelay: '0ms' }} size={size} />\n <Dot style={{ animationDelay: '150ms' }} size={size} />\n <Dot style={{ animationDelay: '300ms' }} size={size} />\n </LoadingDots>\n );\n case 'pulse':\n return (\n <LoadingDots aria-hidden=\"true\" size={size} variant=\"pulse\">\n <Dot style={{ animationDelay: '0ms' }} size={size} variant=\"pulse\" />\n </LoadingDots>\n );\n case 'wave':\n return (\n <LoadingDots aria-hidden=\"true\" size={size} variant=\"wave\">\n <Dot style={{ animationDelay: '0ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '100ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '200ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '300ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '400ms' }} size={size} variant=\"wave\" />\n </LoadingDots>\n );\n case 'text':\n return null; // Just show the message with no indicator\n default:\n return null;\n }\n };\n\n return (\n <Container\n ref={containerRef}\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={ariaLabel}\n size={size}\n >\n <Avatar aria-hidden=\"true\" size={size}>\n <HeadphonesIcon viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 13a4 4 0 0 1 0 8c-2.142 0-4-1.79-4-4h-2a4 4 0 1 1-.535-2h3.07A4 4 0 0 1 17 13M2 12v-2h2V7a4 4 0 0 1 4-4h8a4 4 0 0 1 4 4v3h2v2z\" />\n </HeadphonesIcon>\n </Avatar>\n <Content>\n {renderLoadingIndicator()}\n <Message size={size}>{message}</Message>\n </Content>\n </Container>\n );\n}\n\nAssistantThinking.displayName = 'AssistantThinking';\n","/**\n * StreamingText Component\n *\n * Provides typewriter animation for streaming AI responses.\n * Supports basic markdown rendering (bold, italic, code, links).\n *\n * @see specs/015-restyle-ai-chat/spec.md:FR-031, FR-042\n * @see UI_COMPONENTS_SSE.md:548-595\n */\n\nimport { memo, useEffect, useMemo, useRef } from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\n/**\n * Parse basic markdown and return React elements.\n * Supports: **bold**, *italic*, `code`, [links](url), and line breaks.\n */\nfunction parseMarkdown(text: string): React.ReactNode[] {\n if (!text) return [];\n\n const elements: React.ReactNode[] = [];\n let key = 0;\n\n // Split by double newlines for paragraphs, single newlines for line breaks\n const paragraphs = text.split(/\\n\\n+/);\n\n paragraphs.forEach((paragraph, pIndex) => {\n if (pIndex > 0) {\n // Add paragraph break\n elements.push(<br key={key++} />);\n elements.push(<br key={key++} />);\n }\n\n // Process lines within paragraph\n const lines = paragraph.split('\\n');\n lines.forEach((line, lineIndex) => {\n if (lineIndex > 0) {\n elements.push(<br key={key++} />);\n }\n\n // Parse inline markdown\n const parsed = parseInlineMarkdown(line, key);\n elements.push(...parsed.elements);\n key = parsed.nextKey;\n });\n });\n\n return elements;\n}\n\n/**\n * Parse inline markdown elements within a line of text.\n */\nfunction parseInlineMarkdown(\n text: string,\n startKey: number\n): { elements: React.ReactNode[]; nextKey: number } {\n const elements: React.ReactNode[] = [];\n let key = startKey;\n\n // Combined regex for all inline patterns\n // Order matters: bold (**) before italic (*), and code backticks need escaping\n const inlineRegex =\n /(\\*\\*(.+?)\\*\\*)|(\\*(.+?)\\*)|(`([^`]+)`)|(\\[([^\\]]+)\\]\\(([^)]+)\\))/g;\n\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n // biome-ignore lint/suspicious/noAssignInExpressions: regex exec loop pattern\n while ((match = inlineRegex.exec(text)) !== null) {\n // Add text before match\n if (match.index > lastIndex) {\n elements.push(text.slice(lastIndex, match.index));\n }\n\n if (match[1]) {\n // **bold**\n elements.push(<strong key={key++}>{match[2]}</strong>);\n } else if (match[3]) {\n // *italic*\n elements.push(<em key={key++}>{match[4]}</em>);\n } else if (match[5]) {\n // `code`\n elements.push(<code key={key++}>{match[6]}</code>);\n } else if (match[7]) {\n // [link](url)\n elements.push(\n <a key={key++} href={match[9]} target=\"_blank\" rel=\"noopener noreferrer\">\n {match[8]}\n </a>\n );\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text after last match\n if (lastIndex < text.length) {\n elements.push(text.slice(lastIndex));\n }\n\n // If no matches, just return the original text\n if (elements.length === 0) {\n elements.push(text);\n }\n\n return { elements, nextKey: key };\n}\n\nexport interface StreamingTextProps {\n /** The text content to display */\n content: string;\n /** Whether text is currently streaming */\n isStreaming?: boolean;\n /** Typing speed in milliseconds per character */\n typingSpeed?: number;\n /** Whether to show blinking cursor */\n cursor?: boolean;\n /** Visual variant */\n variant?: 'default' | 'code' | 'markdown';\n /** Callback when streaming completes */\n onStreamComplete?: () => void;\n /** Additional CSS class name */\n className?: string;\n}\n\nconst Container = styled.div<{ $variant: 'default' | 'code' | 'markdown' }>`\n font-family: ${(props) =>\n props.$variant === 'code'\n ? tokens.typography.fontFamily.monospace\n : tokens.typography.fontFamily.primary};\n white-space: pre-wrap;\n word-break: break-word;\n line-height: ${tokens.typography.lineHeight.normal};\n /* Performance optimizations for streaming text */\n text-rendering: optimizeSpeed;\n contain: content;\n\n /* Markdown element styles */\n strong {\n font-weight: ${tokens.typography.fontWeight.bold};\n color: ${tokens.colors.text.primary};\n }\n\n em {\n font-style: italic;\n }\n\n code {\n font-family: ${tokens.typography.fontFamily.monospace};\n background: ${tokens.colors.surface.overlay};\n padding: 0.15em 0.4em;\n border-radius: ${tokens.borderRadius.sm};\n font-size: 0.9em;\n }\n\n a {\n color: ${tokens.colors.primary};\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`;\n\nconst Cursor = styled.span`\n display: inline-block;\n width: 2px;\n height: 1em;\n background-color: currentColor;\n margin-left: 2px;\n vertical-align: text-bottom;\n animation: blink 1s infinite;\n\n @keyframes blink {\n 0%,\n 49% {\n opacity: 1;\n }\n 50%,\n 100% {\n opacity: 0;\n }\n }\n`;\n\n/**\n * StreamingText component for displaying streaming AI responses\n *\n * Features:\n * - Renders content directly without extra state (optimal performance)\n * - Optional blinking cursor during streaming\n * - Code and markdown variants\n * - Completion callback when streaming ends\n *\n * Memoized to prevent unnecessary re-renders during parent updates.\n */\nconst StreamingTextBase: React.FC<StreamingTextProps> = ({\n content,\n isStreaming = false,\n typingSpeed: _typingSpeed = 50, // Reserved for future use\n cursor = true,\n variant = 'default',\n onStreamComplete,\n className,\n}) => {\n const wasStreamingRef = useRef(isStreaming);\n const completionCalledRef = useRef(false);\n\n // Handle streaming completion callback without causing re-renders\n useEffect(() => {\n // Track when streaming transitions from true to false (completion)\n if (wasStreamingRef.current && !isStreaming && !completionCalledRef.current) {\n completionCalledRef.current = true;\n onStreamComplete?.();\n }\n\n // Reset completion flag when streaming starts again\n if (isStreaming) {\n completionCalledRef.current = false;\n }\n\n wasStreamingRef.current = isStreaming;\n }, [isStreaming, onStreamComplete]);\n\n const showCursor = isStreaming && cursor;\n\n // Parse markdown content when variant is 'markdown'\n const renderedContent = useMemo(() => {\n if (variant === 'markdown') {\n return parseMarkdown(content);\n }\n return content;\n }, [content, variant]);\n\n // Render content directly - no intermediate state for optimal performance\n return (\n <Container $variant={variant} className={className}>\n {renderedContent}\n {showCursor && <Cursor />}\n </Container>\n );\n};\n\n// Memoize to prevent re-renders when parent updates but props are the same\nexport const StreamingText = memo(StreamingTextBase);\n\nStreamingText.displayName = 'StreamingText';\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const MessageContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} 0;\n max-width: 100%;\n /* GPU acceleration hint for smooth rendering during streaming */\n will-change: contents;\n contain: content;\n`;\n\nexport const AvatarContainer = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n flex-shrink: 0;\n`;\n\nexport const Avatar = styled.img`\n width: 20px;\n height: 20px;\n border-radius: ${tokens.borderRadius.full};\n object-fit: cover;\n background-color: transparent;\n`;\n\nexport const AvatarInitials = styled.div`\n width: 20px;\n height: 20px;\n border-radius: ${tokens.borderRadius.full};\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: ${tokens.colors.secondary};\n padding: 2px;\n box-sizing: border-box;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n`;\n\nexport const AvatarLabel = styled.span`\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.secondary};\n`;\n\nexport const ContentContainer = styled.div`\n width: 100%;\n min-width: 0;\n`;\n\nexport const MessageContent = styled.div`\n /* Use solid color instead of backdrop-filter for performance during streaming */\n background-color: ${tokens.colors.surface.elevated};\n padding: ${tokens.spacing.sm};\n border-radius: ${tokens.borderRadius.lg};\n color: ${tokens.colors.text.primary};\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n font-family: ${tokens.typography.fontFamily.primary};\n word-wrap: break-word;\n white-space: pre-wrap;\n /* Optimize text rendering */\n text-rendering: optimizeSpeed;\n`;\n\nexport const LoadingDots = styled.div`\n display: flex;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.sm};\n /* Use solid color instead of backdrop-filter for performance */\n background-color: ${tokens.colors.surface.elevated};\n border-radius: ${tokens.borderRadius.lg};\n width: fit-content;\n`;\n\n/* Simplified pulse animation - opacity only, no transform */\nconst pulse = keyframes`\n 0%, 100% {\n opacity: 0.4;\n }\n 50% {\n opacity: 1;\n }\n`;\n\nexport const LoadingDot = styled.div<{ delay: number }>`\n width: ${tokens.spacing.sm};\n height: ${tokens.spacing.sm};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${tokens.colors.text.tertiary};\n /* Use simple opacity animation instead of transform bounce */\n animation: ${pulse} 1.4s ease-in-out infinite;\n animation-delay: ${(props) => props.delay}s;\n`;\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\ninterface FileAttachmentContainerProps {\n $isInteractive?: boolean;\n}\n\nexport const FileAttachmentContainer = styled.div<FileAttachmentContainerProps>`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm};\n background-color: ${tokens.colors.surface.elevated};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n max-width: 320px;\n cursor: ${(props) => (props.$isInteractive ? 'pointer' : 'default')};\n transition: border-color ${tokens.transitions.fast};\n\n /* Remove default button styles when used as button */\n ${(props) =>\n props.$isInteractive &&\n `\n font: inherit;\n color: inherit;\n text-align: left;\n appearance: none;\n -webkit-appearance: none;\n\n &:hover {\n border-color: ${tokens.colors.border.hover};\n background-color: ${tokens.colors.surface.overlayHover};\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n border-color: ${tokens.colors.accent};\n }\n\n &:active {\n border-color: ${tokens.colors.border.hover};\n }\n `}\n`;\n\nexport const FileIconContainer = styled.div`\n flex-shrink: 0;\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: ${tokens.typography.fontSize['2xl']};\n line-height: 1;\n`;\n\nexport const FileInfo = styled.div`\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n`;\n\nexport const FileTitle = styled.div`\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.primary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const FileMetadata = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.tertiary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n overflow: hidden;\n`;\n\nexport const FileSubtitle = styled.span`\n color: ${tokens.colors.text.tertiary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:last-child {\n flex-shrink: 0;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type { AriaButtonProps } from '@react-types/button';\nimport type { PressEvent } from '@react-types/shared';\nimport type React from 'react';\nimport { useRef } from 'react';\nimport {\n FileAttachmentContainer,\n FileIconContainer,\n FileInfo,\n FileMetadata,\n FileSubtitle,\n FileTitle,\n} from './FileAttachment.styles';\n\nexport interface FileAttachmentProps extends Omit<AriaButtonProps, 'children'> {\n /** File name/title */\n title: string;\n /** File subtitle/category (e.g., \"Downloads\", \"Documents\") */\n subtitle?: string;\n /** File size in human-readable format (e.g., \"500 KB\", \"2.5 MB\") */\n size?: string;\n /** File icon emoji or Unicode character */\n icon?: string;\n /** Click handler for file interaction */\n onClick?: () => void;\n /** Custom className for styling */\n className?: string;\n}\n\n/**\n * FileAttachment component displays file information in assistant messages\n *\n * Features:\n * - File icon display (emoji or Unicode)\n * - File metadata (title, subtitle, size)\n * - Accessible keyboard navigation via React ARIA\n * - Clean, minimal card-based design\n * - WCAG 2.1 AA compliant\n *\n * @example\n * ```tsx\n * <FileAttachment\n * title=\"Example File\"\n * subtitle=\"Downloads\"\n * size=\"500 KB\"\n * icon=\"📄\"\n * onPress={() => console.log('File clicked')}\n * />\n * ```\n */\nexport const FileAttachment: React.FC<FileAttachmentProps> = ({\n title,\n subtitle,\n size,\n icon = '📄',\n onClick,\n onPress,\n className,\n ...ariaProps\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const isInteractive = !!(onClick || onPress);\n\n // Combine onClick and onPress handlers\n const handlePress = (e: PressEvent) => {\n if (onClick) onClick();\n if (onPress) onPress(e);\n };\n\n const { buttonProps } = useButton(\n {\n ...ariaProps,\n onPress: isInteractive ? handlePress : undefined,\n isDisabled: !isInteractive,\n },\n ref\n );\n\n return (\n <FileAttachmentContainer\n {...(isInteractive ? buttonProps : {})}\n ref={isInteractive ? ref : undefined}\n className={className}\n $isInteractive={isInteractive}\n as={isInteractive ? 'button' : 'div'}\n >\n <FileIconContainer>{icon}</FileIconContainer>\n <FileInfo>\n <FileTitle>{title}</FileTitle>\n <FileMetadata>\n {subtitle && <FileSubtitle>{subtitle}</FileSubtitle>}\n {size && subtitle && <FileSubtitle aria-hidden=\"true\"> • </FileSubtitle>}\n {size && <FileSubtitle>{size}</FileSubtitle>}\n </FileMetadata>\n </FileInfo>\n </FileAttachmentContainer>\n );\n};\n\nexport default FileAttachment;\n","import { memo, type FC } from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { StreamingText } from '../StreamingText';\nimport {\n Avatar,\n AvatarContainer,\n AvatarInitials,\n AvatarLabel,\n ContentContainer,\n LoadingDot,\n LoadingDots,\n MessageContainer,\n MessageContent,\n} from './AssistantMessage.styles';\nimport { FileAttachment, type FileAttachmentProps } from './FileAttachment';\n\nconst AttachmentsContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n margin-top: ${tokens.spacing.sm};\n`;\n\nconst ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.secondary};\n background: ${tokens.colors.surface.overlay};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${tokens.colors.surface.overlayHover};\n border-color: ${tokens.colors.border.hover};\n color: ${tokens.colors.text.primary};\n }\n\n &:active {\n transform: scale(0.98);\n }\n`;\n\nconst ActionsContainer = styled.div`\n display: flex;\n gap: ${tokens.spacing.xs};\n flex-wrap: wrap;\n margin-top: ${tokens.spacing.sm};\n`;\n\nconst MessageTime = styled.time`\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.tertiary};\n margin-top: ${tokens.spacing.xs};\n display: block;\n`;\n\nconst StreamingIndicator = styled.span`\n display: inline-block;\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n margin-left: ${tokens.spacing.xs};\n background-color: ${tokens.colors.accent};\n border-radius: ${tokens.borderRadius.full};\n animation: pulse 1.5s ease-in-out infinite;\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1.2);\n }\n }\n`;\n\nexport interface ActionButtonType {\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n}\n\nexport interface AssistantMessageProps {\n /** Message content to display */\n content?: string;\n /** Avatar image URL */\n avatarUrl?: string;\n /** Avatar initials when no image is provided */\n avatarInitials?: string;\n /** Whether to show loading state */\n isLoading?: boolean;\n /** Whether message is currently streaming */\n isStreaming?: boolean;\n /** Custom className for styling */\n className?: string;\n /** Support for markdown rendering (future enhancement) */\n enableMarkdown?: boolean;\n /** File attachments to display below the message */\n attachments?: FileAttachmentProps[];\n /** Optional timestamp */\n timestamp?: string;\n /** Action buttons to display */\n actions?: ActionButtonType[];\n}\n\n/**\n * AssistantMessage component displays AI assistant messages with avatar\n *\n * Features:\n * - Avatar with image or initials fallback\n * - Loading state with animated dots\n * - Streaming state indicator\n * - Markdown support (optional)\n * - Dark gray bubble (#2D2D3D) from Figma design\n * - Left-aligned layout\n * - Action buttons support\n * - Timestamp display\n *\n * Memoized to prevent unnecessary re-renders during parent updates.\n */\nconst AssistantMessageBase: FC<AssistantMessageProps> = ({\n content = '',\n avatarUrl,\n avatarInitials: _avatarInitials = 'AI',\n isLoading = false,\n isStreaming = false,\n className,\n attachments = [],\n enableMarkdown = false,\n timestamp,\n actions = [],\n}) => {\n const renderContent = () => {\n if (isLoading) {\n return (\n <LoadingDots>\n <LoadingDot delay={0} />\n <LoadingDot delay={0.2} />\n <LoadingDot delay={0.4} />\n </LoadingDots>\n );\n }\n\n // Use StreamingText for typewriter effect\n return (\n <>\n {content && (\n <MessageContent>\n <StreamingText\n content={content}\n isStreaming={isStreaming}\n typingSpeed={30}\n cursor={false}\n variant={enableMarkdown ? 'markdown' : 'default'}\n />\n {isStreaming && <StreamingIndicator />}\n </MessageContent>\n )}\n {attachments.length > 0 && (\n <AttachmentsContainer>\n {attachments.map((attachment, index) => (\n <FileAttachment key={`${attachment.title}-${index}`} {...attachment} />\n ))}\n </AttachmentsContainer>\n )}\n {timestamp && <MessageTime>{timestamp}</MessageTime>}\n {actions.length > 0 && (\n <ActionsContainer>\n {actions.map((action, index) => (\n <ActionButton key={index} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ActionButton>\n ))}\n </ActionsContainer>\n )}\n </>\n );\n };\n\n return (\n <MessageContainer className={className}>\n <AvatarContainer>\n {avatarUrl ? (\n <Avatar src={avatarUrl} alt=\"Assistant avatar\" />\n ) : (\n <AvatarInitials>\n <Avatar src=\"/assets/avatar-transparent-bg.png\" alt=\"AI Assistant\" />\n </AvatarInitials>\n )}\n <AvatarLabel>Assistant</AvatarLabel>\n </AvatarContainer>\n <ContentContainer>{renderContent()}</ContentContainer>\n </MessageContainer>\n );\n};\n\n// Memoize to prevent re-renders when parent updates but props are the same\nexport const AssistantMessage = memo(AssistantMessageBase);\n\nAssistantMessage.displayName = 'AssistantMessage';\n\nexport default AssistantMessage;\n","/**\n * Adapter component that bridges custom AssistantMessage with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's AssistantMessageProps to our custom component props\n * 2. Handles loading states by showing AssistantThinking component\n * 3. Extracts message content and renders with our styled component\n * 4. Renders generativeUI (tool call renders) when present\n * 5. Detects errors and provides \"Report Issue\" action button\n */\n\nimport { useCopilotChat } from '@copilotkit/react-core';\nimport type { AssistantMessageProps as CopilotAssistantMessageProps } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport { type FC, memo, type ReactNode, useMemo } from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { AssistantThinking } from '../../AssistantThinking/AssistantThinking';\nimport { AssistantMessage, type ActionButtonType } from '../Messages/AssistantMessage';\n\n/**\n * Extended message type that includes generativeUI for tool call renders\n */\ninterface MessageWithGenerativeUI {\n content?: string;\n generativeUI?: () => ReactNode;\n}\n\n/**\n * Regex to match tool call markers embedded in message content\n * Format: <!--TOOL_CALL:tool_name:json_args-->\n */\nconst TOOL_CALL_MARKER_REGEX = /<!--TOOL_CALL:([^:]+):(.+?)-->/g;\n\n/**\n * Strip tool call markers from message content\n * These are internal markers used for state sync, not meant for display\n */\nfunction stripToolCallMarkers(content: string): string {\n return content.replace(TOOL_CALL_MARKER_REGEX, '').trim();\n}\n\n/**\n * Error category types matching the mobile client's error system\n */\nexport type ErrorCategory = 'Network' | 'Auth' | 'OAuth' | 'Workflow' | 'Unknown';\n\n/**\n * Error context extracted from a message\n */\nexport interface ExtractedErrorContext {\n /** Whether the message contains an error */\n hasError: boolean;\n /** Inferred error category */\n category?: ErrorCategory;\n /** Correlation ID if present in the message */\n correlationId?: string;\n /** The error message text */\n errorMessage?: string;\n}\n\n/**\n * Callback for reporting issues from chat\n */\nexport interface ReportIssueCallback {\n (context: {\n errorCategory?: ErrorCategory;\n correlationId?: string;\n chatSnippet?: string;\n }): void;\n}\n\n/**\n * Error detection patterns\n * These patterns identify error messages in assistant responses\n */\nconst ERROR_PATTERNS = [\n /\\bfailed\\b/i,\n /\\berror\\b/i,\n /\\bunable to\\b/i,\n /\\bcouldn't\\b/i,\n /\\bcan't\\b/i,\n /\\bcannot\\b/i,\n /\\bsomething went wrong\\b/i,\n /\\btry again\\b/i,\n /\\bunexpected\\b/i,\n /\\btimed out\\b/i,\n /\\bconnection\\b.*\\b(lost|failed|refused)\\b/i,\n];\n\n/**\n * Patterns to extract correlation IDs from error messages\n * Format: \"Reference: abc123\" or \"Correlation ID: abc123\" or \"[abc123]\"\n */\nconst CORRELATION_ID_PATTERNS = [\n /reference:\\s*([a-f0-9-]+)/i,\n /correlation[_\\s]?id:\\s*([a-f0-9-]+)/i,\n /\\[([a-f0-9]{8,})\\]/i,\n];\n\n/**\n * Infer error category from message content\n */\nfunction inferErrorCategory(content: string): ErrorCategory {\n const lowerContent = content.toLowerCase();\n\n // Network errors\n if (\n lowerContent.includes('network') ||\n lowerContent.includes('internet') ||\n lowerContent.includes('connection') ||\n lowerContent.includes('offline') ||\n lowerContent.includes('timed out')\n ) {\n return 'Network';\n }\n\n // Auth errors\n if (\n lowerContent.includes('unauthorized') ||\n lowerContent.includes('authentication') ||\n lowerContent.includes('login') ||\n lowerContent.includes('session expired') ||\n lowerContent.includes('credentials')\n ) {\n return 'Auth';\n }\n\n // OAuth errors\n if (\n lowerContent.includes('oauth') ||\n lowerContent.includes('reconnect') ||\n lowerContent.includes('authorization') ||\n (lowerContent.includes('token') && lowerContent.includes('expired'))\n ) {\n return 'OAuth';\n }\n\n // Workflow errors\n if (\n lowerContent.includes('workflow') ||\n lowerContent.includes('execution') ||\n lowerContent.includes('failed to start') ||\n lowerContent.includes('automation')\n ) {\n return 'Workflow';\n }\n\n return 'Unknown';\n}\n\n/**\n * Extract correlation ID from message content\n */\nfunction extractCorrelationId(content: string): string | undefined {\n for (const pattern of CORRELATION_ID_PATTERNS) {\n const match = content.match(pattern);\n if (match?.[1]) {\n return match[1];\n }\n }\n return undefined;\n}\n\n/**\n * Detect if a message contains an error and extract context\n */\nexport function detectErrorInMessage(content: string): ExtractedErrorContext {\n // Check if any error patterns match\n const hasError = ERROR_PATTERNS.some((pattern) => pattern.test(content));\n\n if (!hasError) {\n return { hasError: false };\n }\n\n return {\n hasError: true,\n category: inferErrorCategory(content),\n correlationId: extractCorrelationId(content),\n errorMessage: content,\n };\n}\n\n/**\n * CopilotKit message type (simplified for our use)\n */\ninterface CopilotMessage {\n role?: string;\n content?: string;\n}\n\n/**\n * Build a chat snippet from recent messages for error context.\n * Includes recent user messages and the error message itself.\n *\n * @param messages - Array of chat messages from useCopilotChat\n * @param errorMessageContent - The current error message content\n * @param maxMessages - Maximum number of recent messages to include (default: 5)\n * @param maxLength - Maximum total character length (default: 1500)\n */\nfunction buildChatSnippet(\n messages: CopilotMessage[],\n errorMessageContent: string,\n maxMessages = 5,\n maxLength = 1500\n): string {\n // Get last N messages (excluding the current error message if it's already in the list)\n const recentMessages = messages\n .filter((msg) => msg.content && msg.content !== errorMessageContent)\n .slice(-maxMessages);\n\n // Format messages with role labels\n const formattedMessages = recentMessages.map((msg) => {\n const role = msg.role === 'user' ? 'User' : 'Assistant';\n const content = msg.content || '';\n // Truncate individual messages if too long\n const truncatedContent = content.length > 300 ? content.slice(0, 300) + '...' : content;\n return `[${role}]: ${truncatedContent}`;\n });\n\n // Add the error message\n const errorSnippet =\n errorMessageContent.length > 500\n ? errorMessageContent.slice(0, 500) + '...'\n : errorMessageContent;\n formattedMessages.push(`[Assistant - Error]: ${errorSnippet}`);\n\n // Join and truncate if total is too long\n let result = formattedMessages.join('\\n\\n');\n if (result.length > maxLength) {\n result = result.slice(0, maxLength) + '\\n...[truncated]';\n }\n\n return result;\n}\n\n/**\n * Container for generative UI (tool call renders)\n */\nconst GenerativeUIContainer = styled.div`\n margin-top: ${tokens.spacing.sm};\n margin-bottom: ${tokens.spacing.sm};\n`;\n\n/**\n * Adapter that converts CopilotKit's AssistantMessageProps to our custom component\n * Memoized to prevent re-renders when props haven't changed.\n */\nconst AssistantMessageAdapterBase: FC<CopilotAssistantMessageProps> = ({\n message,\n isLoading,\n isGenerating,\n // These are available but not used in our current implementation:\n // isCurrentMessage,\n // onRegenerate,\n // onCopy,\n // onThumbsUp,\n // onThumbsDown,\n // markdownTagRenderers,\n // ImageRenderer,\n}) => {\n // Show thinking state ONLY when truly loading (no content yet)\n if (isLoading || (isGenerating && !message?.content)) {\n return <AssistantThinking message=\"Thinking...\" />;\n }\n\n // Extract content from the message and strip internal markers\n const rawContent = message?.content || '';\n const content = stripToolCallMarkers(rawContent);\n\n // Invoke generativeUI to get tool call render output\n // This is how CopilotKit renders custom tool call UIs from useRenderToolCall\n let generativeUIOutput: ReactNode = null;\n const msgWithUI = message as MessageWithGenerativeUI | undefined;\n if (msgWithUI && typeof msgWithUI.generativeUI === 'function') {\n try {\n generativeUIOutput = msgWithUI.generativeUI();\n } catch (e) {\n console.warn('[AssistantMessageAdapter] Error rendering generativeUI:', e);\n }\n }\n\n // Parse attachments if present in the message\n // TODO: Implement attachments parsing from CopilotKit message data\n const attachments: never[] = [];\n\n return (\n <>\n {/* Render generative UI (tool call renders) above the message if present */}\n {generativeUIOutput && <GenerativeUIContainer>{generativeUIOutput}</GenerativeUIContainer>}\n {/* Only render AssistantMessage if there's content */}\n {content && (\n <AssistantMessage\n content={content}\n avatarInitials=\"AI\"\n isLoading={false} // Don't show loading dots when we have content\n isStreaming={isGenerating} // Show streaming indicator while generating\n attachments={attachments}\n enableMarkdown={true}\n />\n )}\n </>\n );\n};\n\n// Memoize to prevent re-renders when parent updates but props are the same\nexport const AssistantMessageAdapter = memo(AssistantMessageAdapterBase);\n\nAssistantMessageAdapter.displayName = 'AssistantMessageAdapter';\n\n/**\n * Props for custom thinking indicator component\n */\nexport interface ThinkingIndicatorProps {\n isLoading?: boolean;\n isGenerating?: boolean;\n}\n\n/**\n * Creates a custom AssistantMessageAdapter with a custom thinking indicator\n * and an optional tool calls component that renders before the message.\n *\n * @param ThinkingIndicator - Custom component to render during loading/generating state (optional)\n * @param ToolCallsComponent - Component to render before message content, shown during loading/generating (optional)\n * @returns A memoized AssistantMessageAdapter component\n */\nexport function createAssistantMessageAdapter(\n ThinkingIndicator?: React.ComponentType<ThinkingIndicatorProps>,\n ToolCallsComponent?: React.ComponentType\n): FC<CopilotAssistantMessageProps> {\n const CustomAssistantMessageAdapter: FC<CopilotAssistantMessageProps> = ({\n message,\n isLoading,\n isGenerating,\n isCurrentMessage,\n }) => {\n // Show thinking indicator when truly loading (no content yet)\n const showThinking = isLoading || (isGenerating && !message?.content);\n\n // Only render ToolCallsComponent for the CURRENT message to prevent\n // multiple instances causing render loops (each instance has hooks)\n const shouldShowToolCalls = isCurrentMessage && ToolCallsComponent;\n\n // Extract content from the message and strip internal markers\n const rawContent = message?.content || '';\n const content = stripToolCallMarkers(rawContent);\n\n // Invoke generativeUI to get tool call render output\n let generativeUIOutput: ReactNode = null;\n const msgWithUI = message as MessageWithGenerativeUI | undefined;\n if (msgWithUI && typeof msgWithUI.generativeUI === 'function') {\n try {\n generativeUIOutput = msgWithUI.generativeUI();\n } catch (e) {\n console.warn('[AssistantMessageAdapter] Error rendering generativeUI:', e);\n }\n }\n\n const attachments: never[] = [];\n\n // If only showing thinking state (no content yet)\n if (showThinking) {\n return (\n <>\n {/* Show thinking indicator */}\n {ThinkingIndicator ? (\n <ThinkingIndicator isLoading={isLoading} isGenerating={isGenerating} />\n ) : (\n <AssistantThinking message=\"Thinking...\" />\n )}\n {/* Show tool calls underneath thinking - only for current message */}\n {shouldShowToolCalls && <ToolCallsComponent />}\n </>\n );\n }\n\n // Once we have content, show message with tool calls above (only for current message)\n return (\n <>\n {/* Tool calls only for current message to avoid multiple hook instances */}\n {shouldShowToolCalls && <ToolCallsComponent />}\n {generativeUIOutput && <GenerativeUIContainer>{generativeUIOutput}</GenerativeUIContainer>}\n {content && (\n <AssistantMessage\n content={content}\n avatarInitials=\"AI\"\n isLoading={false}\n isStreaming={isGenerating}\n attachments={attachments}\n enableMarkdown={true}\n />\n )}\n </>\n );\n };\n\n CustomAssistantMessageAdapter.displayName = 'CustomAssistantMessageAdapter';\n return memo(CustomAssistantMessageAdapter);\n}\n\n/**\n * Creates a custom AssistantMessageAdapter with error detection and reporting.\n * When an error is detected in the message, a \"Report Issue\" button is shown.\n *\n * @param onReportIssue - Callback fired when user clicks \"Report Issue\" button\n * @param ThinkingIndicator - Custom component to render during loading/generating state (optional)\n * @param ToolCallsComponent - Component to render before message content, shown during loading/generating (optional)\n * @returns A memoized AssistantMessageAdapter component with error reporting\n */\nexport function createAssistantMessageAdapterWithErrorReporting(\n onReportIssue?: ReportIssueCallback,\n ThinkingIndicator?: React.ComponentType<ThinkingIndicatorProps>,\n ToolCallsComponent?: React.ComponentType\n): FC<CopilotAssistantMessageProps> {\n const ErrorReportingAssistantMessageAdapter: FC<CopilotAssistantMessageProps> = ({\n message,\n isLoading,\n isGenerating,\n isCurrentMessage,\n }) => {\n // Access conversation history for error context\n const { visibleMessages } = useCopilotChat();\n\n // Show thinking indicator when truly loading (no content yet)\n const showThinking = isLoading || (isGenerating && !message?.content);\n\n // Only render ToolCallsComponent for the CURRENT message to prevent\n // multiple instances causing render loops (each instance has hooks)\n const shouldShowToolCalls = isCurrentMessage && ToolCallsComponent;\n\n // Extract content from the message and strip internal markers\n const rawContent = message?.content || '';\n const content = stripToolCallMarkers(rawContent);\n\n // Detect errors in the message content\n const errorContext = useMemo(() => detectErrorInMessage(content), [content]);\n\n // Build chat snippet including conversation history\n const chatSnippet = useMemo(() => {\n if (!errorContext.hasError) return '';\n // Cast visibleMessages to our simplified type for building snippet\n return buildChatSnippet(visibleMessages as CopilotMessage[], content);\n }, [visibleMessages, content, errorContext.hasError]);\n\n // Build action buttons - add \"Report Issue\" if error detected and callback provided\n const actions: ActionButtonType[] = useMemo(() => {\n // Only show report button for completed messages with errors (not while streaming)\n if (!errorContext.hasError || !onReportIssue || isGenerating) {\n return [];\n }\n\n return [\n {\n label: 'Report Issue',\n onClick: () => {\n onReportIssue({\n errorCategory: errorContext.category,\n correlationId: errorContext.correlationId,\n // Include conversation history leading to the error\n chatSnippet,\n });\n },\n icon: (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n ),\n },\n ];\n }, [errorContext, chatSnippet, isGenerating]);\n\n // Invoke generativeUI to get tool call render output\n let generativeUIOutput: ReactNode = null;\n const msgWithUI = message as MessageWithGenerativeUI | undefined;\n if (msgWithUI && typeof msgWithUI.generativeUI === 'function') {\n try {\n generativeUIOutput = msgWithUI.generativeUI();\n } catch (e) {\n console.warn('[AssistantMessageAdapter] Error rendering generativeUI:', e);\n }\n }\n\n const attachments: never[] = [];\n\n // If only showing thinking state (no content yet)\n if (showThinking) {\n return (\n <>\n {/* Show thinking indicator */}\n {ThinkingIndicator ? (\n <ThinkingIndicator isLoading={isLoading} isGenerating={isGenerating} />\n ) : (\n <AssistantThinking message=\"Thinking...\" />\n )}\n {/* Show tool calls underneath thinking - only for current message */}\n {shouldShowToolCalls && <ToolCallsComponent />}\n </>\n );\n }\n\n // Once we have content, show message with tool calls above (only for current message)\n return (\n <>\n {/* Tool calls only for current message to avoid multiple hook instances */}\n {shouldShowToolCalls && <ToolCallsComponent />}\n {generativeUIOutput && <GenerativeUIContainer>{generativeUIOutput}</GenerativeUIContainer>}\n {content && (\n <AssistantMessage\n content={content}\n avatarInitials=\"AI\"\n isLoading={false}\n isStreaming={isGenerating}\n attachments={attachments}\n enableMarkdown={true}\n actions={actions}\n />\n )}\n </>\n );\n };\n\n ErrorReportingAssistantMessageAdapter.displayName = 'ErrorReportingAssistantMessageAdapter';\n return memo(ErrorReportingAssistantMessageAdapter);\n}\n","import styled from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\n/**\n * Main container for the chat input component with dark theme\n * Matches header style with backdrop blur\n */\nexport const ChatInputContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: ${tokens.spacing.sm};\n background-color: ${tokens.colors.backdrop};\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-radius: ${tokens.borderRadius.none};\n box-shadow: ${tokens.shadows.none};\n box-sizing: border-box;\n\n @media (min-width: ${tokens.breakpoints.mobile}px) {\n padding: ${tokens.spacing.md};\n }\n`;\n\n/**\n * Container for suggestion buttons - horizontal layout with wrapping\n */\nexport const SuggestionsWrapper = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: ${tokens.spacing.sm};\n margin-bottom: ${tokens.spacing.md};\n width: 100%;\n box-sizing: border-box;\n`;\n\n/**\n * Minimal pill-shaped suggestion button - Dark theme\n */\nexport const SuggestionButton = styled.button`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: 13px;\n font-weight: ${tokens.typography.fontWeight.regular};\n text-align: center;\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.full};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n white-space: nowrap;\n\n /* Dark theme colors */\n background-color: ${tokens.colors.surface.base};\n color: ${tokens.colors.text.secondary};\n\n /* Hover state */\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.elevated};\n border-color: ${tokens.colors.border.hover};\n }\n\n /* Active state */\n &:active:not(:disabled) {\n background-color: ${tokens.colors.background.light};\n }\n\n /* Focus state */\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n`;\n\n/**\n * Input wrapper with dark theme\n */\nexport const InputWrapper = styled.div`\n display: flex;\n align-items: flex-end; /* Align button to bottom when textarea expands */\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: rgba(25, 25, 25, 0.4);\n border: 1px solid ${tokens.colors.border.subtle};\n border-radius: ${tokens.borderRadius.lg};\n transition: all ${tokens.transitions.normal};\n width: 100%;\n box-sizing: border-box;\n\n &:focus-within {\n /* Subtle focus indication without bold colored border */\n border-color: ${tokens.colors.border.hover};\n background-color: rgba(50, 50, 52, 0.6);\n }\n`;\n\n/**\n * Text input field - Dark theme (textarea for multiline support)\n */\nexport const InputField = styled.textarea`\n flex: 1;\n border: none;\n outline: none;\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.secondary};\n background: transparent;\n resize: none; /* Disable manual resize, we auto-resize */\n min-height: 24px; /* Single line height */\n max-height: 150px; /* Max ~6 lines before scrolling */\n overflow-y: auto;\n line-height: 1.5;\n padding: 0;\n margin: 0;\n\n &::placeholder {\n color: ${tokens.colors.text.tertiary};\n }\n\n &:disabled {\n color: ${tokens.colors.text.tertiary};\n cursor: not-allowed;\n }\n`;\n\n/**\n * Circular submit button with arrow icon\n */\ninterface SubmitButtonProps {\n disabled?: boolean;\n}\n\nexport const SubmitButton = styled.button<SubmitButtonProps>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: ${tokens.borderRadius.full};\n background-color: ${(props) => (props.disabled ? tokens.colors.surface.elevated : tokens.colors.accent)};\n color: ${(props) => (props.disabled ? tokens.colors.text.tertiary : tokens.colors.text.primary)};\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n transition: all ${tokens.transitions.normal};\n flex-shrink: 0;\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.status.running};\n transform: scale(1.05);\n }\n\n &:active:not(:disabled) {\n transform: scale(0.98);\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n }\n\n svg {\n width: 18px;\n height: 18px;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type { AriaTextFieldProps } from '@react-aria/textfield';\nimport React, { type KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport {\n ChatInputContainer,\n InputField,\n InputWrapper,\n SubmitButton,\n SuggestionButton,\n SuggestionsWrapper,\n} from './ChatInput.styles';\n\nexport interface Suggestion {\n /** The text content of the suggestion */\n text: string;\n}\n\nexport interface ChatInputProps extends Omit<AriaTextFieldProps, 'onChange'> {\n /** Array of suggestion items to display above the input */\n suggestions?: Suggestion[];\n /** Callback when a suggestion is selected */\n onSuggestionSelect?: (suggestion: string) => void;\n /** Current message value */\n value?: string;\n /** Callback when message value changes */\n onChange?: (value: string) => void;\n /** Callback when message is submitted */\n onSubmit?: (message: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n isDisabled?: boolean;\n /** Whether the input is read-only */\n isReadOnly?: boolean;\n /** Whether to auto-focus the input */\n autoFocus?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** ARIA label for the input */\n 'aria-label'?: string;\n}\n\n/**\n * ChatInput component with minimal pill-shaped suggestion buttons\n *\n * Features:\n * - Horizontal pill-shaped suggestion buttons with minimal design\n * - Auto-expanding multiline input (up to ~6 lines, then scrolls)\n * - Enter to submit, Shift+Enter for new line\n * - React ARIA for accessibility\n * - Keyboard navigation support\n * - Clean, modern design matching vendor image\n *\n * @example\n * ```tsx\n * <ChatInput\n * suggestions={[\n * { text: \"Create in-depth analysis\" },\n * { text: \"Identify actionable tasks\" }\n * ]}\n * placeholder=\"Ask, write or search for anything...\"\n * onSubmit={(message) => console.log(message)}\n * onSuggestionSelect={(suggestion) => console.log(suggestion)}\n * />\n * ```\n */\nexport const ChatInput: React.FC<ChatInputProps> = ({\n suggestions = [],\n onSuggestionSelect,\n value = '',\n onChange,\n onSubmit,\n placeholder = 'Ask, write or search for anything...',\n isDisabled = false,\n isReadOnly = false,\n autoFocus = false,\n className,\n 'aria-label': ariaLabel = 'Chat message input',\n // Note: Additional AriaTextFieldProps are accepted but not spread to textarea\n // since useTextField is not compatible with textarea elements\n}) => {\n const [internalValue, setInternalValue] = useState(value);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n // Use controlled value if provided, otherwise use internal state\n const currentValue = value !== undefined ? value : internalValue;\n const setValue = onChange || setInternalValue;\n\n // Auto-resize textarea based on content\n const autoResize = useCallback(() => {\n const textarea = inputRef.current;\n if (textarea) {\n // Reset height to auto to get the correct scrollHeight\n textarea.style.height = 'auto';\n // Set height to scrollHeight (capped by max-height in CSS)\n textarea.style.height = `${textarea.scrollHeight}px`;\n }\n }, []);\n\n // Resize on value change\n useEffect(() => {\n autoResize();\n }, [currentValue, autoResize]);\n\n // Note: useTextField is not compatible with textarea, so we handle accessibility manually\n // The aria-label and other accessibility props are passed directly to the InputField\n\n // Direct onChange handler as backup\n const handleDirectChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setValue(e.target.value);\n };\n\n // Handle keyboard events\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift for new line)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n // Handle submit\n const handleSubmit = () => {\n if (currentValue.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(currentValue.trim());\n setValue('');\n // Reset textarea height after clearing\n if (inputRef.current) {\n inputRef.current.style.height = 'auto';\n }\n }\n };\n\n // Handle suggestion selection\n const handleSuggestionClick = (suggestionText: string) => {\n if (onSuggestionSelect && !isDisabled && !isReadOnly) {\n onSuggestionSelect(suggestionText);\n }\n };\n\n const canSubmit = currentValue.trim().length > 0 && !isDisabled && !isReadOnly;\n\n return (\n <ChatInputContainer className={className}>\n {/* Suggestions */}\n {suggestions.length > 0 && (\n <SuggestionsWrapper role=\"list\" aria-label=\"Suggested prompts\">\n {suggestions.map((suggestion, index) => (\n <SuggestionButtonComponent\n key={`${suggestion.text}-${index}`}\n suggestion={suggestion}\n onSelect={handleSuggestionClick}\n isDisabled={isDisabled || isReadOnly}\n />\n ))}\n </SuggestionsWrapper>\n )}\n\n {/* Input field */}\n <InputWrapper>\n <InputField\n ref={inputRef}\n aria-label={ariaLabel}\n placeholder={placeholder}\n onKeyDown={handleKeyDown}\n onChange={handleDirectChange}\n autoFocus={autoFocus}\n disabled={isDisabled}\n readOnly={isReadOnly}\n value={currentValue}\n rows={1}\n />\n <SubmitButtonComponent\n onPress={handleSubmit}\n isDisabled={!canSubmit}\n ariaLabel=\"Send message\"\n />\n </InputWrapper>\n </ChatInputContainer>\n );\n};\n\n/**\n * Individual suggestion button component\n */\ninterface SuggestionButtonComponentProps {\n suggestion: Suggestion;\n onSelect: (text: string) => void;\n isDisabled?: boolean;\n}\n\nconst SuggestionButtonComponent: React.FC<SuggestionButtonComponentProps> = ({\n suggestion,\n onSelect,\n isDisabled = false,\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n onPress: () => onSelect(suggestion.text),\n isDisabled,\n 'aria-label': `Select suggestion: ${suggestion.text}`,\n },\n ref\n );\n\n return (\n <SuggestionButton {...buttonProps} ref={ref} role=\"listitem\">\n {suggestion.text}\n </SuggestionButton>\n );\n};\n\n/**\n * Submit button component with arrow icon\n */\ninterface SubmitButtonComponentProps {\n onPress: () => void;\n isDisabled?: boolean;\n ariaLabel?: string;\n}\n\nconst SubmitButtonComponent: React.FC<SubmitButtonComponentProps> = ({\n onPress,\n isDisabled = false,\n ariaLabel = 'Send message',\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n onPress,\n isDisabled,\n 'aria-label': ariaLabel,\n },\n ref\n );\n\n return (\n <SubmitButton {...buttonProps} ref={ref} disabled={isDisabled} title={ariaLabel}>\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Arrow Right Icon</title>\n <path\n d=\"M4 10H16M16 10L10 4M16 10L10 16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </SubmitButton>\n );\n};\n\nChatInput.displayName = 'ChatInput';\n","/**\n * Adapter component that bridges custom Input with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's InputProps to our custom component props\n * 2. Handles the onSend callback to work with CopilotKit's message system\n * 3. Manages input state and submission\n */\n\nimport type { InputProps as CopilotInputProps } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport { useState } from 'react';\nimport { ChatInput } from '../../ChatInput/ChatInput';\n\n/**\n * Adapter that converts CopilotKit's InputProps to our custom component\n */\nexport const InputAdapter: React.FC<CopilotInputProps> = ({\n inProgress,\n onSend,\n isVisible: _isVisible = true,\n}) => {\n const [value, setValue] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleSubmit = async (message: string) => {\n if (!message.trim()) {\n console.log('[InputAdapter] handleSubmit: empty message, ignoring');\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n // Call CopilotKit's onSend which returns a Promise<Message>\n await onSend(message);\n setValue(''); // Clear input after sending\n } catch (error) {\n console.error('[InputAdapter] Error sending message:', error);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleSuggestionSelect = async (suggestion: string) => {\n // Directly call onSend with the suggestion text without setting value first\n // This avoids potential race conditions and ensures the message is sent\n if (!suggestion.trim()) {\n return;\n }\n\n if (inProgress || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n await onSend(suggestion);\n // Don't set value since we're submitting directly\n } catch (error) {\n console.error('[InputAdapter] Error sending suggestion:', error);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // TODO: Add support for stop button and file upload if needed\n const shouldDisableInput = isSubmitting;\n\n return (\n <ChatInput\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n placeholder=\"Ask, write or search for anything...\"\n isDisabled={shouldDisableInput}\n autoFocus={false}\n aria-label=\"Chat message input\"\n suggestions={[{ text: 'Explore workflows' }]}\n onSuggestionSelect={handleSuggestionSelect}\n />\n );\n};\n\nInputAdapter.displayName = 'InputAdapter';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\ninterface StyledUserMessageProps {\n $isPressed: boolean;\n}\n\nexport const StyledUserMessage = styled.button<StyledUserMessageProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.md} ${tokens.spacing.xl};\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.regular};\n line-height: ${tokens.typography.lineHeight.normal};\n border: none;\n cursor: default;\n user-select: none;\n white-space: pre-wrap;\n word-wrap: break-word;\n word-break: break-word;\n position: relative;\n text-align: left;\n\n /* Force override CopilotKit's default user message styles */\n && {\n background: ${tokens.colors.message.user} !important;\n color: ${tokens.colors.text.primary} !important;\n border-radius: ${tokens.borderRadius['2xl']} !important; /* Rounded corners that work for multi-line */\n }\n\n /* Subtle shadow and glow effect */\n box-shadow: ${tokens.shadows.glow.secondary};\n\n /* Smooth transitions */\n transition: all ${tokens.transitions.normal};\n\n /* Speech bubble tail - matches bubble background */\n &::after {\n content: '';\n position: absolute;\n bottom: -6px;\n right: ${tokens.spacing.md};\n width: 14px;\n height: 14px;\n background: ${tokens.colors.message.user} !important;\n transform: rotate(45deg);\n border-radius: 0 0 ${tokens.borderRadius.sm} 0;\n clip-path: polygon(0 0, 100% 100%, 0 100%);\n box-shadow: ${tokens.shadows.sm};\n transition: all ${tokens.transitions.normal};\n z-index: -1;\n }\n\n /* Hover state - only for button elements */\n &[role=\"button\"]:hover:not(:disabled) {\n transform: translateY(-1px);\n cursor: pointer;\n box-shadow: ${tokens.shadows.lg};\n\n &::after {\n box-shadow: ${tokens.shadows.md};\n }\n }\n\n /* Active/Pressed state - only for button elements */\n &[role=\"button\"]:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: ${tokens.shadows.sm};\n\n &::after {\n box-shadow: ${tokens.shadows.sm};\n }\n }\n\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: translateY(0) scale(0.98);\n box-shadow: ${tokens.shadows.sm};\n\n &::after {\n box-shadow: ${tokens.shadows.sm};\n }\n `}\n\n /* Focus state for accessibility */\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.secondary};\n outline-offset: 3px;\n box-shadow: ${tokens.shadows.lg};\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n box-shadow: ${tokens.shadows.none};\n\n &::after {\n opacity: 0.5;\n box-shadow: ${tokens.shadows.none};\n }\n }\n`;\n","import type { AriaButtonProps } from '@react-aria/button';\nimport { useButton } from '@react-aria/button';\nimport { memo, useRef, type ReactNode } from 'react';\nimport { StyledUserMessage } from './UserMessage.styles';\n\nexport interface UserMessageProps extends AriaButtonProps {\n /**\n * The message text to display\n */\n children: ReactNode;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * Whether the message is in a pressed state\n */\n isPressed?: boolean;\n /**\n * Optional click handler\n */\n onPress?: () => void;\n}\n\n/**\n * UserMessage component - Displays a user message in a gradient pill\n *\n * This component renders a user message with a purple-to-blue gradient background,\n * pill-shaped design with fully rounded ends, and white text. It uses React ARIA\n * for accessibility and supports keyboard navigation.\n *\n * Memoized to prevent unnecessary re-renders during parent updates.\n *\n * @example\n * ```tsx\n * <UserMessage onPress={() => console.log('clicked')}>\n * Can you export this as a CSV?\n * </UserMessage>\n * ```\n */\nfunction UserMessageBase({\n children,\n className,\n isPressed = false,\n onPress,\n ...ariaProps\n}: UserMessageProps) {\n const ref = useRef<HTMLButtonElement>(null);\n\n // If no onPress handler, render as non-interactive div\n if (!onPress) {\n return (\n <StyledUserMessage as=\"div\" className={className} $isPressed={isPressed} role=\"presentation\">\n {children}\n </StyledUserMessage>\n );\n }\n\n // Otherwise render as interactive button with React ARIA\n const { buttonProps, isPressed: ariaPressedState } = useButton(\n {\n ...ariaProps,\n onPress,\n },\n ref\n );\n\n return (\n <StyledUserMessage\n {...buttonProps}\n ref={ref}\n className={className}\n $isPressed={isPressed || ariaPressedState}\n role=\"button\"\n tabIndex={0}\n >\n {children}\n </StyledUserMessage>\n );\n}\n\n// Memoize to prevent re-renders when parent updates but props are the same\nexport const UserMessage = memo(UserMessageBase);\n\nUserMessage.displayName = 'UserMessage';\n","/**\n * Adapter component that bridges custom UserMessage with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's UserMessageProps to our custom component props\n * 2. Extracts message content from CopilotKit's message object\n * 3. Handles image messages appropriately\n */\n\nimport type { UserMessageProps as CopilotUserMessageProps } from '@copilotkit/react-ui';\nimport { memo, type FC } from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { UserMessage } from '../../UserMessage/UserMessage';\n\n// Wrapper to align user messages to the right\nconst UserMessageWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n width: 100%;\n padding: ${tokens.spacing.sm} 0;\n /* Performance optimization - isolate layout/paint */\n contain: content;\n`;\n\n/**\n * Adapter that converts CopilotKit's UserMessageProps to our custom component\n * Memoized to prevent re-renders when props haven't changed.\n */\nconst UserMessageAdapterBase: FC<CopilotUserMessageProps> = ({\n message,\n ImageRenderer,\n}) => {\n // Handle image messages\n if (message?.image) {\n return <ImageRenderer image={message.image} content={message.content} />;\n }\n\n // Extract text content\n const content = message?.content || '';\n\n // Our UserMessage is a button-like component with React ARIA\n // In the chat context, it's not interactive, so we don't provide onPress\n return (\n <UserMessageWrapper>\n <UserMessage>{content}</UserMessage>\n </UserMessageWrapper>\n );\n};\n\n// Memoize to prevent re-renders when parent updates but props are the same\nexport const UserMessageAdapter = memo(UserMessageAdapterBase);\n\nUserMessageAdapter.displayName = 'UserMessageAdapter';\n","/**\n * StreamStatusIndicator Component\n *\n * Displays connection status for streaming chat (SSE).\n *\n * @see specs/015-restyle-ai-chat/spec.md\n */\n\nimport type React from 'react';\nimport styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\nconst pulse = keyframes`\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.6;\n transform: scale(1.1);\n }\n`;\n\nconst Container = styled.div<{ size: 'sm' | 'md' | 'lg' }>`\n display: inline-flex;\n align-items: center;\n gap: ${(props) => {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.xs;\n }\n }};\n font-family: ${tokens.typography.fontFamily.primary};\n`;\n\nconst StatusDot = styled.div<{\n status: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n size: 'sm' | 'md' | 'lg';\n variant: 'dot' | 'badge';\n}>`\n width: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.borderRadius.lg;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }};\n height: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.borderRadius.lg;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${(props) => {\n switch (props.status) {\n case 'connected':\n return tokens.colors.connection.connected;\n case 'streaming':\n return tokens.colors.connection.streaming;\n case 'disconnected':\n return tokens.colors.connection.disconnected;\n case 'reconnecting':\n return tokens.colors.connection.reconnecting;\n }\n }};\n animation: ${(props) => (props.status === 'streaming' ? pulse : 'none')} 2s ease-in-out infinite;\n flex-shrink: 0;\n`;\n\nconst Label = styled.span<{ size: 'sm' | 'md' | 'lg'; variant: 'dot' | 'badge' }>`\n font-size: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return tokens.typography.fontSize.xs;\n case 'lg':\n return tokens.typography.fontSize.base;\n case 'md':\n default:\n return tokens.typography.fontSize.sm;\n }\n }\n switch (props.size) {\n case 'sm':\n return tokens.typography.fontSize.xs;\n case 'lg':\n return tokens.typography.fontSize.base;\n case 'md':\n default:\n return tokens.typography.fontSize.sm;\n }\n }};\n font-weight: ${(props) => (props.variant === 'badge' ? tokens.typography.fontWeight.medium : tokens.typography.fontWeight.regular)};\n color: ${tokens.colors.text.secondary};\n line-height: ${tokens.typography.lineHeight.tight};\n`;\n\nconst BadgeContainer = styled.div<{ size: 'sm' | 'md' | 'lg' }>`\n display: inline-flex;\n align-items: center;\n gap: ${(props) => {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.xs;\n }\n }};\n padding: ${(props) => {\n switch (props.size) {\n case 'sm':\n return `${tokens.spacing.xs} ${tokens.spacing.sm}`;\n case 'lg':\n return `${tokens.spacing.sm} ${tokens.spacing.md}`;\n case 'md':\n default:\n return `${tokens.spacing.xs} ${tokens.spacing.sm}`;\n }\n }};\n background-color: ${tokens.colors.surface.overlay};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${(props) => {\n switch (props.size) {\n case 'sm':\n return tokens.borderRadius.sm;\n case 'lg':\n return tokens.borderRadius.md;\n case 'md':\n default:\n return tokens.borderRadius.md;\n }\n }};\n`;\n\nexport interface StreamStatusIndicatorProps {\n /** Connection status */\n status: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n /** Visual variant */\n variant?: 'dot' | 'badge';\n /** Size of the indicator */\n size?: 'sm' | 'md' | 'lg';\n /** Whether to show text label */\n showLabel?: boolean;\n /** Custom className */\n className?: string;\n}\n\nconst getStatusLabel = (status: StreamStatusIndicatorProps['status']): string => {\n switch (status) {\n case 'connected':\n return 'Connected';\n case 'streaming':\n return 'Streaming';\n case 'disconnected':\n return 'Disconnected';\n case 'reconnecting':\n return 'Reconnecting...';\n }\n};\n\n/**\n * StreamStatusIndicator component for showing connection status\n *\n * Features:\n * - Visual status indicators (connected/streaming/disconnected/reconnecting)\n * - Color-coded status (green/blue/red/yellow)\n * - Pulsing animation for streaming state\n * - Dot and badge variants\n * - Size options (sm/md/lg)\n * - Optional text labels\n */\nexport const StreamStatusIndicator: React.FC<StreamStatusIndicatorProps> = ({\n status,\n variant = 'dot',\n size = 'md',\n showLabel = false,\n className,\n}) => {\n const content = (\n <>\n <StatusDot status={status} size={size} variant={variant} aria-hidden=\"true\" />\n {showLabel && (\n <Label size={size} variant={variant}>\n {getStatusLabel(status)}\n </Label>\n )}\n </>\n );\n\n if (variant === 'badge') {\n return (\n <BadgeContainer\n size={size}\n className={className}\n role=\"status\"\n aria-label={getStatusLabel(status)}\n >\n {content}\n </BadgeContainer>\n );\n }\n\n return (\n <Container size={size} className={className} role=\"status\" aria-label={getStatusLabel(status)}>\n {content}\n </Container>\n );\n};\n\nStreamStatusIndicator.displayName = 'StreamStatusIndicator';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const HeaderContainer = styled.header`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n background-color: ${tokens.colors.backdrop};\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-bottom: 1px solid ${tokens.colors.border.default};\n min-height: 44px;\n box-sizing: border-box;\n\n @media (min-width: ${tokens.breakpoints.mobile}px) {\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n }\n`;\n\nexport const HeaderContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.xs};\n flex: 1;\n min-width: 0;\n`;\n\nexport const HeaderTitle = styled.h1`\n margin: 0;\n font-size: ${tokens.typography.fontSize.base};\n font-weight: ${tokens.typography.fontWeight.semibold};\n color: ${tokens.colors.text.primary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.normal};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const HeaderSubtitle = styled.p`\n margin: 0;\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.secondary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const HeaderActions = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n margin-left: ${tokens.spacing.md};\n`;\n\nexport const ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n padding: 0;\n background-color: transparent;\n border: none;\n border-radius: ${tokens.borderRadius.md};\n color: ${tokens.colors.text.primary};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlay};\n }\n\n &:active:not(:disabled) {\n transform: scale(0.95);\n background-color: ${tokens.colors.surface.overlayActive};\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.3;\n }\n\n svg {\n width: ${tokens.spacing.md};\n height: ${tokens.spacing.md};\n display: block;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type React from 'react';\nimport { useRef } from 'react';\nimport { tokens } from '../../../theme/tokens';\nimport { StreamStatusIndicator } from '../StreamStatusIndicator';\nimport {\n ActionButton,\n HeaderActions,\n HeaderContainer,\n HeaderContent,\n HeaderSubtitle,\n HeaderTitle,\n} from './Header.styles';\n\nexport interface HeaderProps {\n /**\n * The main title text displayed in the header\n */\n title: string;\n\n /**\n * Optional subtitle text displayed below the title\n */\n subtitle?: string;\n\n /**\n * Optional stream status indicator (connected/streaming/disconnected/reconnecting)\n * When provided, displays a StreamStatusIndicator next to the title\n */\n streamStatus?: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n\n /**\n * Callback function triggered when the close button is clicked\n */\n onClose?: () => void;\n\n /**\n * Callback function triggered when the minimize button is clicked\n */\n onMinimize?: () => void;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n}\n\n/**\n * Header Component\n *\n * A chat header component that displays a title, optional subtitle, and action buttons.\n * Built with React ARIA for accessibility and Styled Components for theming.\n *\n * @example\n * ```tsx\n * <Header\n * title=\"AI Assistant\"\n * subtitle=\"How can I help you today?\"\n * onClose={() => console.log('Close clicked')}\n * onMinimize={() => console.log('Minimize clicked')}\n * />\n * ```\n */\nexport const Header: React.FC<HeaderProps> = ({\n title,\n subtitle,\n streamStatus,\n onClose,\n onMinimize,\n className,\n}) => {\n const minimizeRef = useRef<HTMLButtonElement>(null);\n const closeRef = useRef<HTMLButtonElement>(null);\n\n const { buttonProps: minimizeProps } = useButton(\n {\n onPress: onMinimize,\n 'aria-label': 'Minimize',\n isDisabled: !onMinimize,\n },\n minimizeRef\n );\n\n const { buttonProps: closeProps } = useButton(\n {\n onPress: onClose,\n 'aria-label': 'Close',\n isDisabled: !onClose,\n },\n closeRef\n );\n\n return (\n <HeaderContainer className={className}>\n <HeaderContent>\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm }}>\n <HeaderTitle>{title}</HeaderTitle>\n {streamStatus && (\n <StreamStatusIndicator\n status={streamStatus}\n variant=\"badge\"\n size=\"sm\"\n showLabel={streamStatus === 'streaming' || streamStatus === 'reconnecting'}\n />\n )}\n </div>\n {subtitle && <HeaderSubtitle>{subtitle}</HeaderSubtitle>}\n </HeaderContent>\n\n <HeaderActions>\n {onMinimize && (\n <ActionButton ref={minimizeRef} {...minimizeProps} data-action=\"minimize\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <title>Minimize</title>\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </ActionButton>\n )}\n\n {onClose && (\n <ActionButton ref={closeRef} {...closeProps} data-action=\"close\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <title>Close</title>\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </ActionButton>\n )}\n </HeaderActions>\n </HeaderContainer>\n );\n};\n\nHeader.displayName = 'Header';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n/**\n * Styled container for the messages area\n * Provides flexible layout and responsive spacing\n */\nexport const MessagesContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n /* Gradient background - brand aligned */\n background: linear-gradient(\n to right bottom,\n ${tokens.colors.background.dark},\n ${tokens.colors.background.darker},\n ${tokens.colors.background.darkest}\n );\n /* Minimal horizontal padding to maximize message width */\n padding: ${tokens.spacing.sm} ${tokens.spacing.xs};\n gap: ${tokens.spacing.sm};\n box-sizing: border-box;\n\n /* Ensure proper scrolling behavior for child components */\n position: relative;\n min-height: 0;\n`;\n","import type React from 'react';\nimport { MessagesContainer } from './Messages.styles';\n\nexport interface MessagesProps {\n /**\n * Children elements to be rendered inside the messages container\n */\n children?: React.ReactNode;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * ARIA label for accessibility\n */\n ariaLabel?: string;\n}\n\n/**\n * Messages component - Container for message list\n *\n * This component serves as a wrapper for the messages area,\n * providing consistent spacing and layout for chat messages.\n *\n * @example\n * ```tsx\n * <Messages ariaLabel=\"Chat messages\">\n * <MessagesList messages={messages} />\n * </Messages>\n * ```\n */\nexport const Messages: React.FC<MessagesProps> = ({\n children,\n className,\n ariaLabel = 'Messages',\n}) => {\n return (\n <MessagesContainer className={className} role=\"region\" aria-label={ariaLabel}>\n {children}\n </MessagesContainer>\n );\n};\n\nMessages.displayName = 'Messages';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\ninterface WindowContainerProps {\n $isMinimized: boolean;\n $isFullscreen: boolean;\n $width: string;\n $height: string;\n}\n\nexport const WindowContainer = styled.div<WindowContainerProps>`\n display: flex;\n flex-direction: column;\n /* Glassmorphism effect */\n background: transparent;\n backdrop-filter: blur(3.8px);\n -webkit-backdrop-filter: blur(3.8px);\n border: 1px solid ${tokens.colors.surface.glassBorder};\n border-radius: ${tokens.borderRadius.xl};\n box-shadow: ${tokens.shadows.lg};\n overflow: hidden;\n transition: all ${tokens.animation.duration.short} ${tokens.animation.easing.smooth};\n position: relative;\n\n /* Default dimensions */\n width: ${({ $width }) => $width};\n height: ${({ $height }) => $height};\n\n /* Fullscreen state */\n ${({ $isFullscreen }) =>\n $isFullscreen &&\n css`\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n box-shadow: none;\n position: fixed;\n top: 0;\n left: 0;\n z-index: ${tokens.zIndex.modal};\n `}\n\n /* Minimized state */\n ${({ $isMinimized }) =>\n $isMinimized &&\n css`\n height: 60px;\n width: 300px;\n box-shadow: ${tokens.shadows.sm};\n cursor: pointer;\n\n /* Hide all content except header when minimized */\n > *:not(:first-child) {\n display: none;\n }\n\n /* Keep header visible but adjust styling */\n > *:first-child {\n border-bottom: none;\n }\n `}\n\n /* Responsive behavior for smaller screens */\n @media (max-width: ${tokens.breakpoints.tablet}px) {\n ${({ $isFullscreen, $isMinimized }) =>\n !$isFullscreen &&\n !$isMinimized &&\n css`\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n max-width: 100%;\n max-height: 100%;\n `}\n }\n\n /* Focus states for accessibility */\n &:focus-visible {\n outline: 2px solid ${tokens.colors.primary};\n outline-offset: 2px;\n }\n\n /* Ensure proper stacking context */\n z-index: ${({ $isFullscreen }) => ($isFullscreen ? tokens.zIndex.modal : tokens.zIndex.fixed)};\n`;\n","import type React from 'react';\nimport { WindowContainer } from './Window.styles';\n\nexport interface WindowProps {\n /**\n * Whether the window is minimized to a small bar\n */\n isMinimized?: boolean;\n\n /**\n * Whether the window is fullscreen (100vw x 100vh)\n */\n isFullscreen?: boolean;\n\n /**\n * Custom width for the window (e.g., \"400px\", \"50vw\")\n * @default \"400px\"\n */\n width?: string;\n\n /**\n * Custom height for the window (e.g., \"600px\", \"80vh\")\n * @default \"600px\"\n */\n height?: string;\n\n /**\n * Children elements to be rendered inside the window\n */\n children: React.ReactNode;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n\n /**\n * ARIA label for the window\n */\n ariaLabel?: string;\n}\n\n/**\n * Window Component\n *\n * Main container/window wrapper for the CopilotKit chat interface.\n * This component holds the Header, Messages, Input, and Footer components.\n *\n * Features:\n * - Default: 400px width x 600px height with rounded corners and shadow\n * - Minimized: Collapsed to a small bar\n * - Fullscreen: Takes full viewport (100vw x 100vh)\n * - Smooth transitions between states\n * - Customizable dimensions via width/height props\n *\n * @example\n * ```tsx\n * // Default window\n * <Window>\n * <Header title=\"AI Assistant\" />\n * <Messages>...</Messages>\n * <MessageInput />\n * <Footer />\n * </Window>\n *\n * // Minimized window\n * <Window isMinimized>\n * <Header title=\"AI Assistant\" />\n * </Window>\n *\n * // Fullscreen window\n * <Window isFullscreen>\n * <Header title=\"AI Assistant\" />\n * <Messages>...</Messages>\n * <MessageInput />\n * </Window>\n *\n * // Custom dimensions\n * <Window width=\"500px\" height=\"700px\">\n * ...\n * </Window>\n * ```\n */\nexport const Window: React.FC<WindowProps> = ({\n isMinimized = false,\n isFullscreen = false,\n width = '400px',\n height = '600px',\n children,\n className,\n ariaLabel = 'Chat window',\n}) => {\n return (\n <WindowContainer\n className={className}\n $isMinimized={isMinimized}\n $isFullscreen={isFullscreen}\n $width={width}\n $height={height}\n role=\"dialog\"\n aria-label={ariaLabel}\n aria-modal=\"false\"\n >\n {children}\n </WindowContainer>\n );\n};\n\nWindow.displayName = 'Window';\n","/**\n * Complete CopilotSidebar Integration Example\n *\n * This file demonstrates how to integrate custom-designed components\n * (AssistantMessage, UserMessage, AssistantThinking, Input) with CopilotKit's\n * CopilotSidebar component using adapter components.\n *\n * Usage:\n * ```tsx\n * import { CopilotKit } from \"@copilotkit/react-core\";\n * import { CustomCopilotSidebar } from \"./CopilotSidebarIntegration\";\n *\n * function App() {\n * return (\n * <CopilotKit runtimeUrl=\"/api/copilotkit\">\n * <CustomCopilotSidebar>\n * <YourApp />\n * </CustomCopilotSidebar>\n * </CopilotKit>\n * );\n * }\n * ```\n */\n\nimport type {\n ButtonProps as CopilotButtonProps,\n HeaderProps as CopilotHeaderProps,\n MessagesProps as CopilotMessagesProps,\n WindowProps as CopilotWindowProps,\n} from '@copilotkit/react-ui';\nimport { CopilotSidebar, useChatContext } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\nimport { AssistantMessageAdapter, InputAdapter, UserMessageAdapter } from './adapters';\nimport { Header } from './Header/Header';\nimport { Messages } from './Messages/Messages';\nimport { Window } from './Window/Window';\n\n// Global styles to ensure sidebar starts hidden and button visibility\nconst GlobalSidebarStyles = createGlobalStyle`\n /* Override CopilotKit's default positioning - start off-screen */\n .copilotKitSidebar {\n position: fixed !important;\n right: -100vw !important;\n bottom: 0 !important;\n transition: right 0.3s ease !important;\n }\n\n /* Move sidebar container into view when expanded */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar {\n right: 0 !important;\n }\n\n /* Mobile-first: Full viewport sidebar */\n .copilotKitSidebar .copilotKitWindow {\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: auto !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n margin: 0 !important;\n border-radius: 0 !important;\n z-index: 1001 !important;\n\n transform: translateX(100%) !important;\n visibility: hidden !important;\n pointer-events: none !important;\n opacity: 0 !important;\n display: none !important;\n\n transition: transform 0.3s ease, visibility 0.3s ease, opacity 0.3s ease !important;\n }\n\n /* When window has .open class (CopilotKit's native class), show it */\n .copilotKitSidebar .copilotKitWindow.open {\n display: flex !important;\n transform: translateX(0) !important;\n visibility: visible !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n }\n\n /* Desktop: Sidebar panel on the right (640px = CopilotKit's breakpoint) */\n @media (min-width: 640px) {\n .copilotKitSidebar .copilotKitWindow {\n inset: auto !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: auto !important;\n width: 28rem !important;\n height: 100vh !important;\n max-width: 28rem !important;\n max-height: 100vh !important;\n }\n }\n\n /* Hide button when sidebar is open */\n .copilotKitSidebarContentWrapper.sidebarExpanded {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: none !important;\n }\n }\n\n /* Show button when sidebar is closed */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: flex !important;\n }\n }\n\n /* Override CopilotKit's default message styles with our custom components */\n .copilotKitSidebar {\n /* Reset all default CopilotKit message styling */\n [class*=\"copilotKitMessage\"],\n [class*=\"Message-module\"] {\n all: unset !important;\n display: contents !important;\n }\n\n /* Ensure our custom UserMessage gradient pill shows through */\n button[role=\"presentation\"] {\n all: revert !important;\n display: inline-flex !important;\n }\n\n /* Reset input styles to allow our custom ChatInput */\n [class*=\"Input-module\"],\n [class*=\"copilotKitInput\"] {\n all: unset !important;\n display: contents !important;\n }\n\n /* Reset header styles */\n [class*=\"Header-module\"],\n [class*=\"copilotKitHeader\"] {\n all: unset !important;\n display: contents !important;\n }\n }\n`;\n\n// Styled button positioned in the bottom-right corner\nconst StyledChatButton = styled.button`\n position: fixed;\n bottom: 8px;\n right: 8px;\n width: 36px;\n height: 36px;\n border-radius: 18px;\n border: none;\n background: linear-gradient(135deg, ${tokens.colors.primary} 0%, ${tokens.colors.accent} 100%);\n box-shadow: 0 4px 12px rgba(44, 176, 171, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1000;\n transition: all 0.2s ease;\n\n &:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 16px rgba(44, 176, 171, 0.5);\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n svg {\n width: 20px;\n height: 20px;\n fill: white;\n }\n`;\n\nexport interface CustomCopilotSidebarProps {\n /**\n * Children to render alongside the sidebar\n */\n children?: React.ReactNode;\n /**\n * Instructions for the AI assistant\n */\n instructions?: string;\n /**\n * Custom labels for the UI\n */\n labels?: Record<string, string>;\n /**\n * Custom icons for the UI\n */\n icons?: Record<string, React.ReactNode>;\n /**\n * Whether the sidebar should be open by default\n */\n defaultOpen?: boolean;\n /**\n * Whether clicking outside should close the sidebar\n */\n clickOutsideToClose?: boolean;\n /**\n * Whether hitting escape should close the sidebar\n */\n hitEscapeToClose?: boolean;\n /**\n * Keyboard shortcut to open the sidebar\n */\n shortcut?: string;\n /**\n * Callback when the sidebar open state changes\n */\n onSetOpen?: (open: boolean) => void;\n /**\n * Additional CSS class name\n */\n className?: string;\n}\n\n/**\n * CopilotSidebar with custom-designed components\n *\n * This component wraps CopilotKit's CopilotSidebar and injects our\n * custom components via adapter components.\n *\n * Features:\n * - Custom AssistantMessage with avatar and loading states\n * - AssistantThinking component shown during loading\n * - Custom UserMessage with gradient pill design\n * - Custom Input with React ARIA accessibility\n * - Styled chat button with gradient\n */\nexport const CustomCopilotSidebar: React.FC<CustomCopilotSidebarProps> = ({\n children,\n instructions = 'You are a helpful AI assistant.',\n labels,\n icons,\n defaultOpen = false,\n clickOutsideToClose = true,\n hitEscapeToClose = true,\n shortcut = '/',\n onSetOpen,\n className,\n}) => {\n // Header adapter with close handler\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const HeaderAdapter = (_props: CopilotHeaderProps) => {\n const { setOpen } = useChatContext();\n\n const handleClose = () => {\n setOpen(false);\n onSetOpen?.(false);\n };\n\n return (\n <Header title=\"AI Assistant\" subtitle=\"How can I help you today?\" onClose={handleClose} />\n );\n };\n\n // Window adapter - wraps our custom Window component\n // biome-ignore lint/correctness/noNestedComponentDefinitions: Simple adapter component\n const WindowAdapter = (props: CopilotWindowProps) => {\n return <Window>{props.children}</Window>;\n };\n\n // Messages adapter - wraps our custom Messages component\n // biome-ignore lint/correctness/noNestedComponentDefinitions: Simple adapter component\n const MessagesAdapter = (props: CopilotMessagesProps) => {\n return (\n <Messages>\n {props.messages.map((message, index) => (\n <props.RenderMessage\n key={message.id || `message-${index}`}\n message={message}\n inProgress={props.inProgress}\n index={index}\n isCurrentMessage={index === props.messages.length - 1}\n />\n ))}\n </Messages>\n );\n };\n\n // Custom Button component that uses CopilotKit's ChatContext\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const CustomButton = (_props: CopilotButtonProps) => {\n const { open, setOpen } = useChatContext();\n\n const handleClick = () => {\n const newOpenState = !open;\n setOpen(newOpenState);\n onSetOpen?.(newOpenState);\n };\n\n return (\n <StyledChatButton\n onClick={handleClick}\n aria-label={open ? 'Close chat' : 'Open chat'}\n type=\"button\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"Chat icon\"\n >\n <title>Chat</title>\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\" />\n </svg>\n </StyledChatButton>\n );\n };\n\n return (\n <>\n <GlobalSidebarStyles />\n <CopilotSidebar\n // Pass through custom components via adapters\n AssistantMessage={AssistantMessageAdapter}\n UserMessage={UserMessageAdapter}\n Input={InputAdapter}\n Header={HeaderAdapter}\n Window={WindowAdapter}\n Messages={MessagesAdapter}\n Button={CustomButton}\n // Configuration\n instructions={instructions}\n labels={{\n title: 'AI Assistant',\n initial: 'Hi! How can I help you today?',\n ...labels,\n }}\n icons={icons}\n // Behavior\n defaultOpen={defaultOpen}\n clickOutsideToClose={clickOutsideToClose}\n hitEscapeToClose={hitEscapeToClose}\n shortcut={shortcut}\n onSetOpen={onSetOpen}\n // Styling\n className={className}\n >\n {children}\n </CopilotSidebar>\n </>\n );\n};\n\nCustomCopilotSidebar.displayName = 'CustomCopilotSidebar';\n","import type {\n ButtonProps as CopilotButtonProps,\n HeaderProps as CopilotHeaderProps,\n WindowProps as CopilotWindowProps,\n} from '@copilotkit/react-ui';\nimport { CopilotSidebar, useChatContext } from '@copilotkit/react-ui';\nimport { type ReactNode, useMemo } from 'react';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport {\n ActionExecutionAdapter,\n AssistantMessageAdapter,\n InputAdapter,\n UserMessageAdapter,\n createAssistantMessageAdapter,\n createAssistantMessageAdapterWithErrorReporting,\n type ReportIssueCallback,\n} from '../adapters';\nimport { Header } from '../Header/Header';\nimport { Window } from '../Window/Window';\n\n// Global styles to ensure sidebar starts hidden and button visibility\nconst GlobalSidebarStyles = createGlobalStyle`\n /* Override CopilotKit's content wrapper to respect safe areas in landscape */\n @media (orientation: landscape) {\n .copilotKitSidebarContentWrapper {\n right: var(--safe-area-right, 0px) !important;\n left: var(--safe-area-left, 0px) !important;\n }\n }\n\n /* Override CopilotKit's default positioning - keep sidebar container in place */\n /* z-index must be higher than NavHorizontal (sticky: 1020) for button to show above nav */\n .copilotKitSidebar {\n position: fixed !important;\n top: calc(var(--safe-area-top, 0px) + 8px) !important;\n right: calc(var(--safe-area-right, 0px) + 8px) !important;\n bottom: calc(var(--safe-area-bottom, 0px) + 8px) !important;\n left: calc(var(--safe-area-left, 0px) + 8px) !important;\n width: auto !important;\n height: auto !important;\n pointer-events: none !important;\n z-index: ${tokens.zIndex.fixed} !important;\n }\n\n /* Keep sidebar container always visible (the window inside will animate) */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar {\n pointer-events: auto !important;\n }\n\n /* Mobile-first: Glassmorphism sidebar with rounded corners */\n /* Target the actual dialog element that gets rendered */\n .copilotKitSidebar [role=\"dialog\"] {\n /* Override CopilotKit defaults for mobile */\n position: fixed !important;\n /* TOP: Account for status bar safe area (Android notch/status bar) */\n top: calc(${tokens.spacing.sm} + var(--safe-area-top, 0px)) !important;\n /* RIGHT: Account for landscape notch on right side */\n right: calc(${tokens.spacing.sm} + var(--safe-area-right, 0px)) !important;\n /* BOTTOM: Account for horizontal navbar (52px) + safe area for Android nav buttons */\n bottom: calc(52px + ${tokens.spacing.sm} + var(--safe-area-bottom, 0px)) !important;\n /* LEFT: Account for landscape notch on left side */\n left: calc(${tokens.spacing.sm} + var(--safe-area-left, 0px)) !important;\n width: calc(100vw - ${tokens.spacing.lg} - var(--safe-area-left, 0px) - var(--safe-area-right, 0px)) !important;\n /* Adjust height to account for top, bottom safe areas, and navbar */\n height: calc(100vh - ${tokens.spacing.lg} - var(--safe-area-top, 0px) - 52px - var(--safe-area-bottom, 0px)) !important;\n max-width: calc(100vw - ${tokens.spacing.lg} - var(--safe-area-left, 0px) - var(--safe-area-right, 0px)) !important;\n max-height: calc(100vh - ${tokens.spacing.lg} - var(--safe-area-top, 0px) - 52px - var(--safe-area-bottom, 0px)) !important;\n margin: 0 !important;\n border-radius: ${tokens.borderRadius.xl} !important;\n\n /* Glassmorphism effect */\n background: ${tokens.colors.surface.glass} !important;\n box-shadow: ${tokens.shadows.lg} !important;\n backdrop-filter: blur(11.1px) !important;\n -webkit-backdrop-filter: blur(11.1px) !important;\n border: 1px solid ${tokens.colors.surface.glassBorder} !important;\n\n /* Smooth slide transition */\n transition: transform 0.3s ease, visibility 0.3s ease, opacity 0.3s ease !important;\n z-index: ${tokens.zIndex.modal} !important;\n }\n\n /* Hidden by default */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) .copilotKitSidebar [role=\"dialog\"] {\n transform: translateX(100%) !important;\n visibility: hidden !important;\n pointer-events: none !important;\n opacity: 0 !important;\n }\n\n /* Visible when expanded */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar [role=\"dialog\"] {\n transform: translateX(0) !important;\n visibility: visible !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n }\n\n /* Desktop: Sidebar panel on the right with glassmorphism (640px = CopilotKit's breakpoint) */\n @media (min-width: ${tokens.breakpoints.mobile}px) {\n .copilotKitSidebar [role=\"dialog\"] {\n inset: auto !important;\n /* TOP: Account for status bar safe area */\n top: calc(${tokens.spacing.sm} + var(--safe-area-top, 0px)) !important;\n /* RIGHT: Account for landscape notch on right side */\n right: calc(${tokens.spacing.sm} + var(--safe-area-right, 0px)) !important;\n /* BOTTOM: Account for horizontal navbar (52px) + safe area */\n bottom: calc(52px + ${tokens.spacing.sm} + var(--safe-area-bottom, 0px)) !important;\n left: auto !important;\n width: 28rem !important;\n /* Adjust height to account for top, bottom safe areas, and navbar */\n height: calc(100vh - ${tokens.spacing.lg} - var(--safe-area-top, 0px) - 52px - var(--safe-area-bottom, 0px)) !important;\n max-width: 28rem !important;\n max-height: calc(100vh - ${tokens.spacing.lg} - var(--safe-area-top, 0px) - 52px - var(--safe-area-bottom, 0px)) !important;\n }\n }\n\n /* Mobile landscape: sidebar on right side, allow background interaction */\n @media (orientation: landscape) and (max-height: 500px) {\n /* Account for vertical nav (60px) in landscape */\n .copilotKitSidebarContentWrapper {\n left: 60px !important;\n width: calc(100% - 60px) !important;\n }\n\n /* Shrink the sidebar container to only cover the right portion where dialog lives */\n /* Also stretch to full height (remove default 8px padding) */\n .copilotKitSidebar {\n top: 0 !important;\n bottom: 0 !important;\n left: 58vw !important;\n width: min(50vw, 22rem) !important;\n height: 100vh !important;\n }\n\n /* Offset the expanded sidebar wrapper to leave space for main content */\n .copilotKitSidebarContentWrapper.sidebarExpanded {\n margin-right: 30vw !important;\n }\n\n .copilotKitSidebar [role=\"dialog\"] {\n width: min(50vw, 20rem) !important;\n max-width: min(50vw, 20rem) !important;\n left: auto !important;\n right: 1.5rem !important;\n /* Use top/bottom ONLY - let browser calculate height (more reliable than explicit height) */\n top: var(--safe-area-top, 0px) !important;\n bottom: calc(52px + var(--safe-area-bottom, 0px)) !important;\n /* Remove explicit height - let top/bottom define it */\n height: auto !important;\n max-height: none !important;\n /* Remove margins */\n margin: 0 !important;\n border-radius: 0 !important;\n border-top-left-radius: ${tokens.borderRadius.xl} !important;\n border-bottom-left-radius: ${tokens.borderRadius.xl} !important;\n }\n\n /* Compact header in landscape - hide title text but keep close button */\n .copilotKitSidebar [role=\"dialog\"] header,\n .copilotKitSidebar [role=\"dialog\"] [data-testid=\"chat-header\"],\n .copilotKitSidebar [role=\"dialog\"] > div:first-child {\n padding: 0.25rem 0.5rem !important;\n min-height: auto !important;\n height: 1.5rem;\n padding-right: 1.5rem !important;\n }\n\n /* Hide the title text but keep close button visible */\n .copilotKitSidebar [role=\"dialog\"] header h1,\n .copilotKitSidebar [role=\"dialog\"] header h2,\n .copilotKitSidebar [role=\"dialog\"] header span:not(:last-child),\n .copilotKitSidebar [role=\"dialog\"] > div:first-child > span,\n .copilotKitSidebar [role=\"dialog\"] > div:first-child > h1,\n .copilotKitSidebar [role=\"dialog\"] > div:first-child > h2 {\n display: none !important;\n }\n\n /* Reduce vertical padding inside chat to preserve space in landscape */\n .copilotKitMessages {\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm} !important;\n }\n\n .copilotKitMessage {\n padding: ${tokens.spacing.xs} 0 !important;\n margin: ${tokens.spacing.xs} 0 !important;\n }\n\n /* Compact input area in landscape */\n .copilotKitInput,\n .copilotKitSidebar [role=\"dialog\"] > div:last-child {\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm} !important;\n }\n\n /* Reduce gap between messages */\n .copilotKitMessages > div {\n gap: 0.25rem !important;\n padding-bottom: 0;\n margin-bottom: -3rem;\n }\n\n /* Compact suggested prompts in landscape */\n div[role=\"list\"][aria-label*=\"Suggested\"] {\n margin: 0 !important;\n padding: 1px !important;\n min-height: auto !important;\n max-height: 32px !important;\n }\n\n /* Compact parent of suggestions (input area) */\n .copilotKitSidebar [role=\"dialog\"] > div:last-child {\n padding: 1px !important;\n }\n }\n\n /* Hide button when sidebar is open */\n .copilotKitSidebarContentWrapper.sidebarExpanded {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: none !important;\n }\n }\n\n /* Show button when sidebar is closed */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: flex !important;\n }\n }\n\n /* Position chat button with safe area on landscape (right side for Android controls) */\n @media (orientation: landscape) {\n .copilotKitSidebarContentWrapper {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n bottom: calc(var(--safe-area-bottom, 0px) + 8px) !important;\n right: calc(var(--safe-area-right, 0px) + 8px) !important;\n z-index: 2000 !important;\n }\n }\n }\n\n /* Fix messages container background */\n .copilotKitMessages {\n background-color: transparent !important;\n }\n\n /* Performance optimization for messages - no animations to reduce jitter during streaming */\n .copilotKitMessage {\n /* contain: content isolates layout/paint to this element */\n contain: content;\n }\n\n /* Override CopilotKit suggestions to be single-row with horizontal scroll */\n div[role=\"list\"][aria-label*=\"Suggested\"] {\n display: flex !important;\n flex-wrap: nowrap !important; /* Force single row */\n gap: ${tokens.spacing.sm} !important;\n padding: ${tokens.spacing.xs} 0 !important;\n\n /* Horizontal scrolling */\n overflow-x: auto !important;\n overflow-y: hidden !important;\n\n /* Smooth scrolling */\n -webkit-overflow-scrolling: touch;\n scroll-behavior: smooth;\n\n /* Fixed height for one suggestion */\n max-height: 40px !important;\n min-height: 40px !important;\n align-items: center !important;\n\n /* Hide scrollbar */\n scrollbar-width: none !important;\n -ms-overflow-style: none !important;\n\n &::-webkit-scrollbar {\n display: none !important;\n }\n }\n\n /* Ensure suggestion buttons don't wrap or shrink */\n div[role=\"list\"][aria-label*=\"Suggested\"] button {\n flex-shrink: 0 !important;\n white-space: nowrap !important;\n }\n\n /* Remove teal/cyan outline from all inputs */\n .copilotKitSidebar input,\n .copilotKitSidebar input:focus,\n .copilotKitSidebar input:focus-visible,\n .copilotKitSidebar textarea,\n .copilotKitSidebar textarea:focus,\n .copilotKitSidebar textarea:focus-visible {\n outline: none !important;\n outline-color: transparent !important;\n box-shadow: none !important;\n }\n`;\n\n// Styled button positioned in the bottom-right corner\n// Uses safe area insets to avoid Android system buttons in landscape\nconst StyledChatButton = styled.button<{ $disabled?: boolean }>`\n position: fixed;\n bottom: calc(${tokens.spacing.sm} + var(--safe-area-bottom, 0px));\n right: calc(${tokens.spacing.sm} + var(--safe-area-right, 0px));\n width: 36px;\n height: 36px;\n border-radius: ${tokens.borderRadius.full};\n border: none;\n background: linear-gradient(135deg, ${tokens.colors.primary} 0%, ${tokens.colors.accent} 100%);\n box-shadow: ${({ $disabled }) => ($disabled ? 'none' : tokens.shadows.glow.primary)};\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed' : 'pointer')};\n opacity: ${({ $disabled }) => ($disabled ? 0.5 : 1)};\n filter: ${({ $disabled }) => ($disabled ? 'grayscale(0.6)' : 'none')};\n z-index: ${tokens.zIndex.fixed};\n transition: all ${tokens.transitions.fast};\n\n &:hover:not([aria-disabled='true']) {\n transform: scale(1.05);\n box-shadow: ${tokens.shadows.glow.accent};\n }\n\n &:active:not([aria-disabled='true']) {\n transform: scale(0.95);\n }\n\n svg {\n width: 20px;\n height: 20px;\n fill: ${tokens.colors.text.primary};\n }\n`;\n\n/**\n * Error event from CopilotKit\n */\nexport interface CopilotErrorEvent {\n status?: number;\n message?: string;\n error?: Error;\n}\n\nexport interface CustomCopilotSidebarProps {\n children: ReactNode;\n defaultOpen?: boolean;\n onSetOpen?: (open: boolean) => void;\n instructions?: string;\n className?: string;\n /**\n * When true, disables the chat button and prevents opening the sidebar.\n */\n disabled?: boolean;\n /**\n * Message to display as tooltip when disabled.\n */\n disabledReason?: string;\n /**\n * Callback fired when an error occurs during chat (e.g., 429 rate limit).\n * Use this to show user-friendly error messages.\n */\n onError?: (errorEvent: CopilotErrorEvent) => void;\n /**\n * Custom renderer for error messages in the chat.\n * If not provided, a default error message will be shown.\n */\n renderError?: (error: { status?: number; message?: string }) => ReactNode;\n /**\n * Optional custom component to render instead of the default \"Thinking...\" indicator.\n * Use this to show tool call progress for server-side tool calls.\n * The component receives isLoading and isGenerating props.\n */\n ThinkingIndicator?: React.ComponentType<{ isLoading?: boolean; isGenerating?: boolean }>;\n /**\n * Optional component to render tool calls underneath thinking and before the message.\n * This is shown during the thinking phase and while the response is still generating.\n * Use this for server-side tool calls that should be visible throughout the response.\n */\n ToolCallsComponent?: React.ComponentType;\n /**\n * Callback fired when user clicks \"Report Issue\" button on error messages.\n * The callback receives error context including category, correlation ID, and chat snippet.\n * Use this to open a support ticket modal with pre-filled error context.\n */\n onReportIssue?: ReportIssueCallback;\n}\n\n// =============================================================================\n// Stable adapter components - defined outside to prevent remounting on parent re-renders\n// These components receive callbacks via props instead of closures to maintain stable references\n// This is critical for preventing chat input state from being lost during re-renders\n// =============================================================================\n\n/**\n * Stable Window adapter - wraps our custom Window component\n * Defined outside CustomCopilotSidebar to prevent recreation on every render\n */\nconst WindowAdapter = (props: CopilotWindowProps) => {\n return <Window>{props.children}</Window>;\n};\nWindowAdapter.displayName = 'WindowAdapter';\n\n/**\n * Creates a memoized Header adapter component\n * The component reference stays stable as long as onSetOpen doesn't change\n */\nfunction createHeaderAdapter(onSetOpen?: (open: boolean) => void) {\n const HeaderAdapterWithClose = (_props: CopilotHeaderProps) => {\n const { setOpen } = useChatContext();\n\n const handleClose = () => {\n setOpen(false);\n onSetOpen?.(false);\n };\n\n return <Header title=\"AI Assistant\" onClose={handleClose} />;\n };\n HeaderAdapterWithClose.displayName = 'HeaderAdapterWithClose';\n return HeaderAdapterWithClose;\n}\n\n/**\n * Creates a memoized Button adapter component\n * The component reference stays stable as long as the dependencies don't change\n */\nfunction createButtonAdapter(\n disabled: boolean,\n disabledReason: string,\n onSetOpen?: (open: boolean) => void\n) {\n const CustomButton = (_props: CopilotButtonProps) => {\n const { open, setOpen } = useChatContext();\n\n const handleClick = () => {\n if (disabled) return;\n const newOpenState = !open;\n setOpen(newOpenState);\n onSetOpen?.(newOpenState);\n };\n\n return (\n <StyledChatButton\n onClick={handleClick}\n aria-label={disabled ? disabledReason : open ? 'Close chat' : 'Open chat'}\n aria-disabled={disabled}\n title={disabled ? disabledReason : undefined}\n type=\"button\"\n $disabled={disabled}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Chat</title>\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\" />\n </svg>\n </StyledChatButton>\n );\n };\n CustomButton.displayName = 'CustomButton';\n return CustomButton;\n}\n\n/**\n * CustomCopilotSidebar - A CopilotSidebar wrapper using our custom components\n *\n * This component wraps CopilotKit's CopilotSidebar and provides our custom\n * design system components for a consistent look and feel.\n *\n * IMPORTANT: Uses memoized component factories to prevent unnecessary remounts\n * of the Input component, which would clear the user's typed message.\n *\n * @example\n * ```tsx\n * <CustomCopilotSidebar defaultOpen={false} onSetOpen={(open) => console.log(open)}>\n * <YourApp />\n * </CustomCopilotSidebar>\n * ```\n */\nexport function CustomCopilotSidebar({\n children,\n defaultOpen = false,\n onSetOpen,\n instructions,\n className,\n disabled = false,\n disabledReason = 'Start a free trial to enable AI chat',\n onError,\n renderError,\n ThinkingIndicator,\n ToolCallsComponent,\n onReportIssue,\n}: CustomCopilotSidebarProps) {\n // Memoize the Header adapter - only recreate when onSetOpen changes\n // This prevents the Input component from remounting on every parent re-render\n const HeaderAdapterWithClose = useMemo(\n () => createHeaderAdapter(onSetOpen),\n [onSetOpen]\n );\n\n // Memoize the Button adapter - only recreate when its dependencies change\n const CustomButton = useMemo(\n () => createButtonAdapter(disabled, disabledReason, onSetOpen),\n [disabled, disabledReason, onSetOpen]\n );\n\n // Memoize the AssistantMessage adapter - use custom components if provided\n // Use error reporting adapter if onReportIssue is provided\n const AssistantMessageAdapterMemo = useMemo(\n () =>\n onReportIssue\n ? createAssistantMessageAdapterWithErrorReporting(onReportIssue, ThinkingIndicator, ToolCallsComponent)\n : ThinkingIndicator || ToolCallsComponent\n ? createAssistantMessageAdapter(ThinkingIndicator, ToolCallsComponent)\n : AssistantMessageAdapter,\n [ThinkingIndicator, ToolCallsComponent, onReportIssue]\n );\n\n return (\n <>\n <GlobalSidebarStyles />\n <CopilotSidebar\n // Pass through custom components via adapters\n // CRITICAL: These must be stable references to prevent Input remounting\n AssistantMessage={AssistantMessageAdapterMemo}\n UserMessage={UserMessageAdapter}\n Input={InputAdapter}\n Header={HeaderAdapterWithClose}\n Window={WindowAdapter}\n Button={CustomButton}\n // Custom renderer for action/tool execution messages\n // Note: RenderActionExecutionMessage is deprecated but RenderMessage requires handling ALL message types\n // which ActionExecutionAdapter doesn't do. Keep using the legacy prop until proper migration.\n RenderActionExecutionMessage={ActionExecutionAdapter}\n // Configuration\n instructions={instructions}\n labels={{\n title: 'AI Assistant',\n initial: 'Hi! How can I help you today?',\n }}\n // Behavior\n defaultOpen={defaultOpen}\n clickOutsideToClose={true}\n hitEscapeToClose={true}\n onSetOpen={onSetOpen}\n // Error handling\n onError={onError}\n renderError={renderError}\n // Styling\n className={className}\n >\n {children}\n </CopilotSidebar>\n </>\n );\n}\n\nCustomCopilotSidebar.displayName = 'CustomCopilotSidebar';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const FooterContainer = styled.footer`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: ${tokens.colors.surface.base};\n border-top: 1px solid ${tokens.colors.border.default};\n min-height: 44px;\n`;\n\nexport const FooterContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ${tokens.spacing.md};\n width: 100%;\n max-width: 100%;\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.secondary};\n opacity: 0.6;\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n`;\n\nexport const FooterBranding = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n flex-shrink: 0;\n`;\n\nexport const FooterStatus = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: ${tokens.typography.fontSize.xs};\n opacity: 0.8;\n`;\n\nexport const FooterLink = styled.a`\n color: ${tokens.colors.primary};\n text-decoration: none;\n transition: opacity ${tokens.transitions.fast};\n cursor: pointer;\n\n &:hover {\n opacity: 0.8;\n text-decoration: underline;\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n border-radius: ${tokens.borderRadius.sm};\n }\n`;\n","import type React from 'react';\nimport {\n FooterBranding,\n FooterContainer,\n FooterContent,\n FooterLink,\n FooterStatus,\n} from './Footer.styles';\n\nexport interface FooterProps {\n /**\n * Branding text to display (e.g., \"Powered by CopilotKit\")\n */\n branding?: string;\n\n /**\n * Optional status text (e.g., \"Connected\", \"Typing...\", \"3 tokens remaining\")\n */\n status?: string;\n\n /**\n * Optional link URL for the branding text\n */\n brandingUrl?: string;\n\n /**\n * Callback when branding link is clicked\n */\n onBrandingClick?: () => void;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n}\n\n/**\n * Footer Component\n *\n * A chat footer component that displays branding, status information, and optional links.\n * Typically used at the bottom of a chat interface to show provider information or connection status.\n *\n * @example\n * ```tsx\n * <Footer\n * branding=\"Powered by CopilotKit\"\n * status=\"Connected\"\n * brandingUrl=\"https://copilotkit.ai\"\n * />\n * ```\n */\nexport const Footer: React.FC<FooterProps> = ({\n branding,\n status,\n brandingUrl,\n onBrandingClick,\n className,\n}) => {\n // If no content, don't render\n if (!branding && !status) {\n return null;\n }\n\n const handleBrandingClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (onBrandingClick) {\n e.preventDefault();\n onBrandingClick();\n }\n };\n\n return (\n <FooterContainer className={className}>\n <FooterContent>\n {branding && (\n <FooterBranding>\n {brandingUrl ? (\n <FooterLink\n href={brandingUrl}\n onClick={handleBrandingClick}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {branding}\n </FooterLink>\n ) : (\n branding\n )}\n </FooterBranding>\n )}\n\n {status && <FooterStatus>{status}</FooterStatus>}\n </FooterContent>\n </FooterContainer>\n );\n};\n\nFooter.displayName = 'Footer';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const InputContainer = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: 100%;\n\tposition: relative;\n`;\n\nexport const InputWrapper = styled.div`\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: ${tokens.spacing.sm};\n\tpadding: ${tokens.spacing.md};\n\tbackground-color: ${tokens.colors.backdrop};\n\tbackdrop-filter: blur(10px);\n\t-webkit-backdrop-filter: blur(10px);\n\tborder: 1px solid ${tokens.colors.border.default};\n\tborder-radius: ${tokens.borderRadius.lg};\n\ttransition: all ${tokens.transitions.normal};\n\n\t&:focus-within {\n\t\tborder-color: ${tokens.colors.border.hover};\n\t}\n\n\t&:hover:not(:focus-within) {\n\t\tborder-color: ${tokens.colors.border.subtle};\n\t}\n`;\n\ninterface TextAreaProps {\n $maxRows?: number;\n disabled?: boolean;\n readOnly?: boolean;\n}\n\nexport const TextArea = styled.textarea<TextAreaProps>`\n\tflex: 1;\n\tmin-height: ${tokens.spacing.lg};\n\tmax-height: ${(props) => `${(props.$maxRows || 5) * 24}px`};\n\tpadding: 0;\n\tborder: none;\n\toutline: none;\n\tresize: none;\n\tfont-family: ${tokens.typography.fontFamily.primary};\n\tfont-size: ${tokens.typography.fontSize.sm};\n\tline-height: ${tokens.spacing.lg};\n\tcolor: ${tokens.colors.text.primary};\n\tbackground: transparent;\n\toverflow-y: auto;\n\n\t&::placeholder {\n\t\tcolor: ${tokens.colors.text.tertiary};\n\t}\n\n\t&:disabled {\n\t\tcolor: ${tokens.colors.text.disabled};\n\t\tcursor: not-allowed;\n\t}\n\n\t&:read-only {\n\t\tcursor: default;\n\t}\n\n\t/* Custom scrollbar */\n\t&::-webkit-scrollbar {\n\t\twidth: ${tokens.spacing.xs};\n\t}\n\n\t&::-webkit-scrollbar-track {\n\t\tbackground: ${tokens.colors.scrollbar.track};\n\t}\n\n\t&::-webkit-scrollbar-thumb {\n\t\tbackground: ${tokens.colors.scrollbar.thumb};\n\t\tborder-radius: ${tokens.borderRadius.sm};\n\t}\n\n\t&::-webkit-scrollbar-thumb:hover {\n\t\tbackground: ${tokens.colors.scrollbar.thumbHover};\n\t}\n`;\n\ninterface SendButtonProps {\n disabled?: boolean;\n}\n\nexport const SendButton = styled.button<SendButtonProps>`\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 36px;\n\theight: 36px;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: ${tokens.borderRadius.md};\n\tbackground-color: ${(props) => (props.disabled ? tokens.colors.surface.overlay : tokens.colors.primary)};\n\tcolor: ${(props) => (props.disabled ? tokens.colors.text.tertiary : tokens.colors.text.primary)};\n\tcursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n\ttransition: all ${tokens.transitions.normal};\n\tflex-shrink: 0;\n\n\t&:hover:not(:disabled) {\n\t\tbackground-color: ${tokens.colors.accent};\n\t\ttransform: translateY(-1px);\n\t}\n\n\t&:active:not(:disabled) {\n\t\ttransform: translateY(0);\n\t}\n\n\t&:focus-visible {\n\t\toutline: 2px solid ${tokens.colors.border.focus};\n\t\toutline-offset: 2px;\n\t}\n\n\tsvg {\n\t\twidth: 20px;\n\t\theight: 20px;\n\t}\n`;\n","import type { AriaTextFieldProps } from '@react-aria/textfield';\nimport { useTextField } from '@react-aria/textfield';\nimport React, { type KeyboardEvent, useRef } from 'react';\nimport { InputContainer, InputWrapper, SendButton, TextArea } from './Input.styles';\n\nexport interface InputProps\n extends Omit<AriaTextFieldProps, 'onChange' | 'onFocus' | 'onBlur' | 'onKeyDown' | 'onKeyUp'> {\n /** Current message value */\n value?: string;\n /** Callback when message value changes */\n onChange?: (value: string) => void;\n /** Callback when message is submitted */\n onSubmit?: (message: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n isDisabled?: boolean;\n /** Whether the input is read-only */\n isReadOnly?: boolean;\n /** Maximum number of rows before scrolling */\n maxRows?: number;\n /** Whether to auto-focus the input */\n autoFocus?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** ARIA label for the input */\n 'aria-label'?: string;\n}\n\n/**\n * Input component for chat interfaces\n * Features:\n * - Multi-line text support\n * - Submit on Enter, Shift+Enter for new line\n * - React ARIA for accessibility\n * - Auto-growing textarea\n * - Integrated send button\n */\nexport const Input: React.FC<InputProps> = ({\n value = '',\n onChange,\n onSubmit,\n placeholder = 'Type a message...',\n isDisabled = false,\n isReadOnly = false,\n maxRows = 5,\n autoFocus = false,\n className,\n 'aria-label': ariaLabel = 'Message input',\n ...ariaProps\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // React ARIA hook for accessibility\n const { inputProps } = useTextField(\n {\n ...ariaProps,\n 'aria-label': ariaLabel,\n value,\n onChange: (newValue: string) => {\n onChange?.(newValue);\n },\n isDisabled,\n isReadOnly,\n inputElementType: 'textarea',\n },\n textareaRef\n );\n\n // Handle keyboard events\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (value.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(value.trim());\n // Clear the input after submission\n onChange?.('');\n }\n }\n // Shift+Enter adds a new line (default behavior)\n };\n\n // Handle send button click\n const handleSend = () => {\n if (value.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(value.trim());\n onChange?.('');\n // Refocus the textarea after sending\n textareaRef.current?.focus();\n }\n };\n\n const canSend = value.trim().length > 0 && !isDisabled && !isReadOnly;\n\n return (\n <InputContainer className={className}>\n <InputWrapper>\n <TextArea\n {...inputProps}\n ref={textareaRef}\n placeholder={placeholder}\n onKeyDown={handleKeyDown}\n $maxRows={maxRows}\n autoFocus={autoFocus}\n disabled={isDisabled}\n readOnly={isReadOnly}\n />\n <SendButton\n type=\"button\"\n onClick={handleSend}\n disabled={!canSend}\n aria-label=\"Send message\"\n title=\"Send message (Enter)\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Send Icon</title>\n <path\n d=\"M2.5 10L17.5 3.75L11.25 18.75L10 12.5L2.5 10Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </SendButton>\n </InputWrapper>\n </InputContainer>\n );\n};\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const MessagesListContainer = styled.div<{ $maxHeight: string }>`\n display: flex;\n flex-direction: column;\n width: 100%;\n max-height: ${(props) => props.$maxHeight};\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n background: ${tokens.colors.surface.base};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n scroll-behavior: smooth;\n\n /* Custom scrollbar styling */\n &::-webkit-scrollbar {\n width: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: ${tokens.colors.scrollbar.track};\n border-radius: ${tokens.borderRadius.sm};\n }\n\n &::-webkit-scrollbar-thumb {\n background: ${tokens.colors.scrollbar.thumb};\n border-radius: ${tokens.borderRadius.sm};\n transition: background ${tokens.transitions.fast};\n }\n\n &::-webkit-scrollbar-thumb:hover {\n background: ${tokens.colors.scrollbar.thumbHover};\n }\n\n /* Firefox scrollbar styling */\n scrollbar-width: thin;\n scrollbar-color: ${tokens.colors.scrollbar.thumb} ${tokens.colors.scrollbar.track};\n\n /* Ensure proper rendering on mobile */\n -webkit-overflow-scrolling: touch;\n`;\n\nexport const MessagesListContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.md};\n min-height: min-content;\n\n /* Message styling */\n .message {\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n border-radius: ${tokens.borderRadius.md};\n max-width: 85%;\n word-wrap: break-word;\n animation: messageSlideIn ${tokens.animation.duration.short} ease-out;\n }\n\n @keyframes messageSlideIn {\n from {\n opacity: 0;\n transform: translateY(${tokens.spacing.sm});\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Role-specific message styling */\n .message--user {\n align-self: flex-end;\n background: ${tokens.colors.message.user};\n color: ${tokens.colors.text.primary};\n border-bottom-right-radius: ${tokens.borderRadius.sm};\n }\n\n .message--assistant {\n align-self: flex-start;\n background: ${tokens.colors.message.ai};\n color: ${tokens.colors.text.primary};\n border-bottom-left-radius: ${tokens.borderRadius.sm};\n }\n\n .message--system {\n align-self: center;\n background: ${tokens.colors.message.system};\n color: ${tokens.colors.text.secondary};\n font-size: ${tokens.typography.fontSize.sm};\n font-style: italic;\n max-width: 100%;\n text-align: center;\n }\n`;\n","import { type ReactNode, useEffect, useRef } from 'react';\nimport { MessagesListContainer, MessagesListContent } from './MessagesList.styles';\n\nexport interface Message {\n id: string;\n content: ReactNode;\n role: 'user' | 'assistant' | 'system';\n timestamp?: Date;\n}\n\nexport interface MessagesListProps {\n /** Array of messages to display */\n messages: Message[];\n /** Whether to automatically scroll to the bottom when new messages arrive */\n autoScroll?: boolean;\n /** Custom class name for the container */\n className?: string;\n /** Custom render function for individual messages */\n renderMessage?: (message: Message) => ReactNode;\n /** Callback when scroll reaches the top (for loading more messages) */\n onScrollTop?: () => void;\n /** Maximum height of the messages list */\n maxHeight?: string;\n}\n\n/**\n * MessagesList Component\n *\n * A scrollable message list component with auto-scroll functionality.\n * Designed for chat interfaces where messages need to be displayed\n * in a scrollable container with automatic scrolling to the latest message.\n *\n * Features:\n * - Auto-scroll to bottom on new messages\n * - Overflow handling with custom scrollbar\n * - Flexible message rendering\n * - Scroll event handling for pagination\n */\nexport const MessagesList = ({\n messages,\n autoScroll = true,\n className,\n renderMessage,\n onScrollTop,\n maxHeight = '600px',\n}: MessagesListProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const isUserScrollingRef = useRef(false);\n const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Auto-scroll to bottom when new messages arrive\n // biome-ignore lint/correctness/useExhaustiveDependencies: We need messages.length to trigger scroll on new messages\n useEffect(() => {\n if (autoScroll && !isUserScrollingRef.current && containerRef.current) {\n const container = containerRef.current;\n container.scrollTop = container.scrollHeight;\n }\n }, [messages.length, autoScroll]);\n\n // Handle scroll events\n const handleScroll = () => {\n if (!containerRef.current) return;\n\n const container = containerRef.current;\n const isAtBottom = container.scrollHeight - container.scrollTop - container.clientHeight < 10;\n\n // User is scrolling manually\n isUserScrollingRef.current = !isAtBottom;\n\n // Clear existing timeout\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n // Reset user scrolling flag after 1 second of no scrolling\n scrollTimeoutRef.current = setTimeout(() => {\n isUserScrollingRef.current = false;\n }, 1000);\n\n // Check if scrolled to top\n if (container.scrollTop === 0 && onScrollTop) {\n onScrollTop();\n }\n };\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, []);\n\n // Default message renderer\n const defaultRenderMessage = (message: Message) => (\n <div\n key={message.id}\n className={`message message--${message.role}`}\n data-message-id={message.id}\n data-role={message.role}\n >\n {message.content}\n </div>\n );\n\n return (\n <MessagesListContainer\n ref={containerRef}\n onScroll={handleScroll}\n className={className}\n $maxHeight={maxHeight}\n >\n <MessagesListContent ref={contentRef}>\n {messages.map(renderMessage || defaultRenderMessage)}\n </MessagesListContent>\n </MessagesListContainer>\n );\n};\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n/**\n * Container for the user message, aligned to the right\n */\nexport const StyledUserMessage = styled.div`\n display: flex;\n justify-content: flex-end;\n align-items: flex-start;\n margin: ${tokens.spacing.xs} 0;\n padding: 0;\n width: 100%;\n`;\n\n/**\n * The message bubble containing the user's text\n */\nexport const MessageBubble = styled.div`\n display: flex;\n flex-direction: column;\n max-width: 85%;\n padding: ${tokens.spacing.sm};\n border-radius: ${tokens.borderRadius.lg};\n\n /* User message colors - dark blue from brand */\n background: ${tokens.colors.message.user};\n color: ${tokens.colors.text.primary};\n\n /* Smooth transitions */\n transition: all ${tokens.transitions.fast};\n\n /* Ensure long strings don't overflow */\n overflow: hidden;\n overflow-wrap: break-word;\n word-break: break-word;\n\n /* Username styling */\n strong {\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.semibold};\n margin-bottom: ${tokens.spacing.xs};\n opacity: 0.9;\n }\n`;\n\n/**\n * The actual message text content\n */\nexport const MessageContent = styled.p`\n margin: 0;\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n word-wrap: break-word;\n overflow-wrap: break-word;\n word-break: break-word;\n white-space: pre-wrap;\n`;\n\n/**\n * Optional timestamp display\n */\nexport const MessageTime = styled.time`\n font-size: ${tokens.typography.fontSize.xs};\n opacity: 0.7;\n margin-top: ${tokens.spacing.xs};\n text-align: right;\n`;\n","import type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { StreamingText } from '../StreamingText';\nimport {\n MessageBubble,\n MessageContent,\n MessageTime,\n StyledUserMessage,\n} from './UserMessage.styles';\n\nconst ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n margin-top: ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.secondary};\n background: ${tokens.colors.surface.overlay};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${tokens.colors.surface.overlayHover};\n border-color: ${tokens.colors.border.hover};\n }\n\n &:active {\n transform: scale(0.98);\n }\n`;\n\nconst ActionsContainer = styled.div`\n display: flex;\n gap: ${tokens.spacing.xs};\n flex-wrap: wrap;\n`;\n\nconst Avatar = styled.img`\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n border-radius: ${tokens.borderRadius.full};\n margin-left: ${tokens.spacing.sm};\n object-fit: cover;\n border: 2px solid ${tokens.colors.border.default};\n`;\n\nexport interface ActionButtonType {\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n}\n\nexport interface UserMessageProps {\n /** The message content to display */\n content: string;\n /** Optional timestamp for the message */\n timestamp?: string;\n /** Optional CSS class name */\n className?: string;\n /** Optional avatar URL */\n avatarUrl?: string;\n /** Optional username */\n username?: string;\n /** Whether the message is currently streaming */\n isStreaming?: boolean;\n /** Action buttons to display below the message */\n actions?: ActionButtonType[];\n /** Whether to enable markdown rendering */\n enableMarkdown?: boolean;\n}\n\n/**\n * UserMessage component displays a user's message in a chat interface.\n * Styled with right alignment and pink/purple gradient from Figma design.\n *\n * Features:\n * - Right-aligned layout\n * - Pink/purple gradient background (#D8B4FE)\n * - Support for streaming state\n * - Optional timestamp display\n * - Action buttons support\n * - Avatar display\n */\nexport const UserMessage = ({\n content,\n timestamp,\n className,\n avatarUrl,\n username,\n isStreaming = false,\n actions = [],\n enableMarkdown = true,\n}: UserMessageProps) => {\n return (\n <StyledUserMessage className={className}>\n <MessageBubble>\n {username && <strong>{username}</strong>}\n <MessageContent>\n <StreamingText\n content={content}\n isStreaming={isStreaming}\n variant={enableMarkdown ? 'markdown' : 'default'}\n cursor={false}\n />\n </MessageContent>\n {timestamp && <MessageTime>{timestamp}</MessageTime>}\n {actions.length > 0 && (\n <ActionsContainer>\n {actions.map((action, index) => (\n <ActionButton key={index} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ActionButton>\n ))}\n </ActionsContainer>\n )}\n </MessageBubble>\n {avatarUrl && <Avatar src={avatarUrl} alt={username || 'User'} />}\n </StyledUserMessage>\n );\n};\n","/**\n * StreamErrorMessage Component\n *\n * Displays inline chat errors with retry support.\n *\n * @see specs/015-restyle-ai-chat/spec.md\n */\n\nimport type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\nconst ErrorContainer = styled.div<{ variant: 'inline' | 'banner' }>`\n display: flex;\n align-items: flex-start;\n gap: ${tokens.spacing.sm};\n padding: ${(props) => (props.variant === 'banner' ? tokens.spacing.md : `${tokens.spacing.sm} ${tokens.spacing.md}`)};\n background-color: ${(props) =>\n props.variant === 'banner' ? `${tokens.colors.error}1a` : `${tokens.colors.error}0d`};\n border: 1px solid ${tokens.colors.error}4d;\n border-radius: ${(props) => (props.variant === 'banner' ? tokens.borderRadius.md : tokens.borderRadius.lg)};\n color: ${tokens.colors.text.primary};\n font-family: ${tokens.typography.fontFamily.primary};\n margin: ${tokens.spacing.sm} 0;\n width: ${(props) => (props.variant === 'banner' ? '100%' : 'auto')};\n max-width: ${(props) => (props.variant === 'banner' ? '100%' : '600px')};\n`;\n\nconst IconContainer = styled.div`\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: ${tokens.colors.error};\n`;\n\nconst ErrorIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n width=\"20\"\n height=\"20\"\n >\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\n </svg>\n);\n\nconst Content = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n`;\n\nconst ErrorMessage = styled.div`\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n color: ${tokens.colors.text.primary};\n`;\n\nconst ErrorDetails = styled.div`\n font-size: ${tokens.typography.fontSize.xs};\n line-height: 1.4;\n color: ${tokens.colors.text.secondary};\n margin-top: ${tokens.spacing.xs};\n`;\n\nconst Actions = styled.div`\n display: flex;\n gap: ${tokens.spacing.sm};\n margin-top: ${tokens.spacing.sm};\n`;\n\nconst Button = styled.button<{ variant: 'primary' | 'secondary' }>`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${(props) => (props.variant === 'primary' ? tokens.colors.text.primary : tokens.colors.text.secondary)};\n background: ${(props) => (props.variant === 'primary' ? tokens.colors.error : tokens.colors.surface.overlay)};\n border: 1px solid\n ${(props) => (props.variant === 'primary' ? tokens.colors.error : tokens.colors.border.default)};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${(props) =>\n props.variant === 'primary'\n ? tokens.colors.status.failed\n : tokens.colors.surface.overlayHover};\n border-color: ${(props) =>\n props.variant === 'primary' ? tokens.colors.status.failed : tokens.colors.border.hover};\n }\n\n &:active {\n transform: scale(0.98);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nconst CloseButton = styled.button`\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: ${tokens.colors.text.secondary};\n cursor: pointer;\n border-radius: ${tokens.borderRadius.sm};\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${tokens.colors.surface.overlayHover};\n color: ${tokens.colors.text.primary};\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nconst CloseIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n width=\"16\"\n height=\"16\"\n >\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n\nexport interface StreamErrorMessageProps {\n /** Error message to display */\n error: string | Error;\n /** Visual variant */\n variant?: 'inline' | 'banner';\n /** Whether the error can be retried */\n retryable?: boolean;\n /** Callback when retry is clicked */\n onRetry?: () => void;\n /** Callback when dismiss is clicked */\n onDismiss?: () => void;\n /** Additional error details */\n details?: string;\n /** Custom className */\n className?: string;\n}\n\n/**\n * StreamErrorMessage component for inline chat errors\n *\n * Features:\n * - Inline and banner variants\n * - Retry support for recoverable errors\n * - Dismissible errors\n * - Error details display\n * - Accessible error reporting\n */\nexport const StreamErrorMessage: React.FC<StreamErrorMessageProps> = ({\n error,\n variant = 'inline',\n retryable = false,\n onRetry,\n onDismiss,\n details,\n className,\n}) => {\n const errorMessage = typeof error === 'string' ? error : error.message;\n\n return (\n <ErrorContainer variant={variant} className={className} role=\"alert\" aria-live=\"assertive\">\n <IconContainer aria-hidden=\"true\">\n <ErrorIcon />\n </IconContainer>\n <Content>\n <ErrorMessage>{errorMessage}</ErrorMessage>\n {details && <ErrorDetails>{details}</ErrorDetails>}\n {(retryable || onDismiss) && (\n <Actions>\n {retryable && onRetry && (\n <Button variant=\"primary\" onClick={onRetry}>\n Retry\n </Button>\n )}\n {onDismiss && (\n <Button variant=\"secondary\" onClick={onDismiss}>\n Dismiss\n </Button>\n )}\n </Actions>\n )}\n </Content>\n {onDismiss && (\n <CloseButton onClick={onDismiss} aria-label=\"Dismiss error\">\n <CloseIcon />\n </CloseButton>\n )}\n </ErrorContainer>\n );\n};\n\nStreamErrorMessage.displayName = 'StreamErrorMessage';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const SuggestionsContainer = styled.div`\n display: flex;\n flex-wrap: nowrap; /* Single row */\n gap: ${tokens.spacing.sm};\n\n /* Reduced padding for tighter height */\n padding: ${tokens.spacing.xs} 0;\n\n /* Horizontal scrolling */\n overflow-x: auto;\n overflow-y: hidden;\n\n /* Smooth scrolling on mobile */\n -webkit-overflow-scrolling: touch;\n scroll-behavior: smooth;\n\n /* Align items to ensure single-row height */\n align-items: center;\n\n /* Constrain to exact height of buttons + minimal padding */\n /* Button height: ~14px font + 16px padding + 2px border = ~32px */\n /* Add small padding: 8px total = 40px */\n max-height: 40px;\n min-height: 40px;\n\n /* Hide scrollbar but keep functionality */\n scrollbar-width: none; /* Firefox */\n -ms-overflow-style: none; /* IE/Edge */\n\n &::-webkit-scrollbar {\n display: none; /* Chrome/Safari/Opera */\n }\n`;\n\ninterface StyledSuggestionProps {\n $isPressed: boolean;\n}\n\nexport const StyledSuggestion = styled.button<StyledSuggestionProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.primary};\n background-color: ${tokens.colors.surface.elevated};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.lg};\n cursor: pointer;\n transition: all ${tokens.transitions.normal};\n white-space: nowrap;\n user-select: none;\n flex-shrink: 0; /* Prevent shrinking to maintain size */\n\n /* Hover state */\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlayHover};\n border-color: ${tokens.colors.primary};\n transform: translateY(-1px);\n box-shadow: ${tokens.shadows.sm};\n }\n\n /* Active/Pressed state */\n &:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: none;\n }\n\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: scale(0.98);\n `}\n\n /* Focus state */\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n\n /* Remove default focus outline */\n &:focus {\n outline: none;\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport { useRef } from 'react';\nimport { StyledSuggestion, SuggestionsContainer } from './Suggestions.styles';\n\nexport interface SuggestionsProps {\n suggestions: string[];\n onSelect: (suggestion: string) => void;\n className?: string;\n}\n\nexport function Suggestions({ suggestions, onSelect, className }: SuggestionsProps) {\n if (suggestions.length === 0) {\n return null;\n }\n\n return (\n <SuggestionsContainer className={className} role=\"list\" aria-label=\"Suggested prompts\">\n {suggestions.map((suggestion) => (\n <SuggestionChip key={suggestion} suggestion={suggestion} onSelect={onSelect} />\n ))}\n </SuggestionsContainer>\n );\n}\n\ninterface SuggestionChipProps {\n suggestion: string;\n onSelect: (suggestion: string) => void;\n}\n\nfunction SuggestionChip({ suggestion, onSelect }: SuggestionChipProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps, isPressed } = useButton(\n {\n onPress: () => onSelect(suggestion),\n 'aria-label': `Select suggestion: ${suggestion}`,\n },\n ref\n );\n\n return (\n <StyledSuggestion {...buttonProps} ref={ref} $isPressed={isPressed} role=\"listitem\">\n {suggestion}\n </StyledSuggestion>\n );\n}\n\nSuggestions.displayName = 'Suggestions';\n"]}
1
+ {"version":3,"sources":["../../src/theme/tokens.ts","../../src/components/copilotkit/Button/Button.styles.ts","../../src/components/copilotkit/Button/Button.tsx","../../src/components/copilotkit/Actions/Actions.styles.ts","../../src/components/copilotkit/Actions/Actions.tsx","../../src/components/copilotkit/Response/Response.styles.ts","../../src/components/copilotkit/Response/Response.tsx","../../src/components/copilotkit/AgentState/AgentState.styles.ts","../../src/components/copilotkit/AgentState/AgentState.tsx","../../src/components/copilotkit/adapters/ActionExecutionAdapter.tsx","../../src/components/AssistantThinking/AssistantThinking.styles.ts","../../src/components/AssistantThinking/AssistantThinking.tsx","../../src/components/copilotkit/StreamingText.tsx","../../src/components/copilotkit/Messages/AssistantMessage.styles.ts","../../src/components/copilotkit/Messages/FileAttachment.styles.ts","../../src/components/copilotkit/Messages/FileAttachment.tsx","../../src/components/copilotkit/Messages/AssistantMessage.tsx","../../src/components/copilotkit/adapters/AssistantMessageAdapter.tsx","../../src/components/ChatInput/ChatInput.styles.ts","../../src/components/ChatInput/ChatInput.tsx","../../src/components/copilotkit/adapters/InputAdapter.tsx","../../src/components/UserMessage/UserMessage.styles.ts","../../src/components/UserMessage/UserMessage.tsx","../../src/components/copilotkit/adapters/UserMessageAdapter.tsx","../../src/components/copilotkit/StreamStatusIndicator.tsx","../../src/components/copilotkit/Header/Header.styles.ts","../../src/components/copilotkit/Header/Header.tsx","../../src/components/copilotkit/Messages/Messages.styles.ts","../../src/components/copilotkit/Messages/Messages.tsx","../../src/components/copilotkit/Window/Window.styles.ts","../../src/components/copilotkit/Window/Window.tsx","../../src/components/copilotkit/CopilotSidebarIntegration.tsx","../../src/components/copilotkit/CustomCopilotSidebar/CustomCopilotSidebar.tsx","../../src/components/copilotkit/Footer/Footer.styles.ts","../../src/components/copilotkit/Footer/Footer.tsx","../../src/components/copilotkit/Input/Input.styles.ts","../../src/components/copilotkit/Input/Input.tsx","../../src/components/copilotkit/Messages/MessagesList.styles.ts","../../src/components/copilotkit/Messages/MessagesList.tsx","../../src/components/copilotkit/Messages/UserMessage.styles.ts","../../src/components/copilotkit/Messages/UserMessage.tsx","../../src/components/copilotkit/StreamErrorMessage.tsx","../../src/components/copilotkit/Suggestions/Suggestions.styles.ts","../../src/components/copilotkit/Suggestions/Suggestions.tsx"],"names":["css","styled","useRef","useButton","jsx","jsxs","keyframes","dotPulse","Container","LoadingDots","Dot","Message","useEffect","useMemo","StreamingText","memo","Avatar","pulse","ActionsContainer","Fragment","useCopilotChat","useState","useCallback","ActionButton","createGlobalStyle","useChatContext","WindowAdapter","CopilotSidebar","GlobalSidebarStyles","StyledChatButton","CustomCopilotSidebar","InputWrapper","useTextField","StyledUserMessage","MessageContent","MessageTime","UserMessage","Content","Actions","Button"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Design Tokens\n * Centralized design system tokens for colors, typography, spacing, etc.\n * These tokens are the single source of truth for styling across all components.\n */\n\nexport const tokens = {\n colors: {\n // Brand colors\n primary: '#2CB0AB', // Teal (main brand color)\n secondary: '#264E68', // Deep Blue\n accent: '#459FB9', // Sky Blue\n seaGreen: '#4EB999', // Sea Green (additional brand color)\n\n // Backgrounds - dark theme optimized\n background: {\n darkest: '#0a1b2a', // Darkest Blue (brand color)\n darker: '#151a26', // Discord gray (preserved)\n dark: '#1b2230', // Discord surface gray (preserved)\n light: '#252d3d', // Discord border gray (preserved)\n },\n\n // Text hierarchy\n text: {\n primary: '#FFFFFF',\n secondary: '#B4B8C5',\n tertiary: '#6B7280',\n disabled: '#4B5563',\n },\n\n // Semantic colors\n success: '#2CB0AB', // Teal (brand aligned)\n error: '#EF4444',\n warning: '#F59E0B',\n info: '#459FB9', // Sky Blue (brand aligned)\n\n // Status colors (for workflow/SSE events)\n status: {\n pending: '#6B7280',\n editing: '#3B82F6',\n idle: '#6B7280',\n running: '#459FB9', // Sky Blue (brand aligned)\n completed: '#2CB0AB', // Teal (brand aligned)\n failed: '#EF4444',\n timeout: '#F59E0B',\n // Badge status (online/offline pattern)\n online: '#2CB0AB',\n offline: '#EF4444',\n busy: '#459FB9',\n },\n\n // Connection status\n connection: {\n connected: '#2CB0AB', // Teal (brand aligned)\n streaming: '#459FB9', // Sky Blue (brand aligned)\n disconnected: '#EF4444',\n reconnecting: '#F59E0B',\n },\n\n // Surface variants (for overlays, cards, panels)\n surface: {\n base: '#1b2230',\n elevated: '#252d3d',\n overlay: 'rgba(255, 255, 255, 0.05)',\n overlayHover: 'rgba(255, 255, 255, 0.1)',\n overlayActive: 'rgba(255, 255, 255, 0.15)',\n subtle: 'rgba(255, 255, 255, 0.02)',\n glass: 'rgba(255, 255, 255, 0.26)',\n glassBorder: 'rgba(255, 255, 255, 0.3)',\n },\n\n // UI Element colors\n border: {\n default: 'rgba(255, 255, 255, 0.1)',\n subtle: 'rgba(255, 255, 255, 0.05)',\n hover: 'rgba(255, 255, 255, 0.2)',\n focus: '#2CB0AB', // Teal (brand aligned)\n error: '#EF4444',\n },\n\n // Scrollbar colors\n scrollbar: {\n track: 'transparent',\n thumb: 'rgba(255, 255, 255, 0.2)',\n thumbHover: 'rgba(255, 255, 255, 0.3)',\n },\n\n // Message bubbles\n message: {\n user: '#264E68', // Deep Blue (brand color)\n ai: '#1b2230', // Dark background\n system: '#151a26', // Darker background\n },\n\n // Overlays and backdrops\n overlay: 'rgba(0, 0, 0, 0.5)',\n backdrop: 'rgba(27, 34, 48, 0.95)',\n\n // Icon colors\n icon: {\n default: '#B4B8C5',\n muted: '#6B7280',\n active: '#2CB0AB',\n },\n\n // Platform brand colors (for social media icons)\n platform: {\n facebook: '#1877F2',\n instagram: '#E4405F',\n linkedin: '#0A66C2',\n x: '#000000',\n twitter: '#1DA1F2',\n youtube: '#FF0000',\n reddit: '#FF4500',\n slack: '#4A154B',\n telegram: '#0088CC',\n whatsapp: '#25D366',\n gmail: '#EA4335',\n },\n },\n\n typography: {\n fontFamily: {\n primary:\n \"'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', sans-serif\",\n heading:\n \"'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', sans-serif\",\n monospace: \"'Roboto Mono', 'Monaco', 'Menlo', 'Ubuntu Mono', monospace\",\n },\n fontSize: {\n xs: '0.875rem', // 14px (was 12px, increased for better readability)\n sm: '1rem', // 16px (was 14px, increased for better readability)\n base: '1.125rem', // 18px (was 16px, increased for better readability)\n lg: '1.125rem', // 18px (heading size, unchanged)\n xl: '1.25rem', // 20px (heading size, unchanged)\n '2xl': '1.5rem', // 24px (heading size, unchanged)\n '3xl': '1.875rem', // 30px (heading size, unchanged)\n '4xl': '2.25rem', // 36px (heading size, unchanged)\n },\n fontWeight: {\n light: 300,\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeight: {\n tight: 1.25,\n normal: 1.5,\n relaxed: 1.75,\n },\n },\n\n spacing: {\n xs: '0.25rem', // 4px\n sm: '0.5rem', // 8px\n md: '1rem', // 16px\n lg: '1.5rem', // 24px\n xl: '2rem', // 32px\n '2xl': '3rem', // 48px\n '3xl': '4rem', // 64px\n },\n\n borderRadius: {\n none: '0',\n sm: '0.25rem', // 4px\n md: '0.5rem', // 8px\n lg: '0.75rem', // 12px\n xl: '1rem', // 16px\n '2xl': '1.5rem', // 24px\n full: '9999px', // Fully rounded\n },\n\n shadows: {\n none: 'none',\n sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',\n md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',\n xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',\n card: '0 4px 20px rgba(0, 0, 0, 0.3)',\n glow: {\n primary: '0 0 20px rgba(44, 176, 171, 0.3)',\n secondary: '0 0 20px rgba(38, 78, 104, 0.3)',\n accent: '0 0 20px rgba(69, 159, 185, 0.3)',\n },\n },\n\n transitions: {\n fast: '150ms ease-in-out',\n normal: '250ms ease-in-out',\n slow: '350ms ease-in-out',\n },\n\n animation: {\n duration: {\n micro: '150ms',\n short: '200ms',\n medium: '300ms',\n long: '500ms',\n },\n easing: {\n enter: 'cubic-bezier(0.4, 0, 0.2, 1)',\n exit: 'cubic-bezier(0.4, 0, 1, 1)',\n smooth: 'cubic-bezier(0.4, 0, 0.2, 1)',\n linear: 'linear',\n },\n },\n\n zIndex: {\n base: 0,\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n overlay: 1100,\n modal: 1200,\n popover: 1300,\n tooltip: 1400,\n toast: 1500,\n },\n\n breakpoints: {\n mobile: 640,\n tablet: 1024,\n desktop: 1280,\n },\n} as const;\n\nexport type Tokens = typeof tokens;\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport type { ButtonSize, ButtonVariant } from './Button.types';\n\ninterface StyledButtonProps {\n $variant: ButtonVariant;\n $size: ButtonSize;\n $isPressed: boolean;\n $isLoading: boolean;\n}\n\nconst variantStyles = {\n primary: css`\n background-color: ${tokens.colors.primary};\n color: ${tokens.colors.text.primary};\n border: none;\n\n &:hover:not(:disabled) {\n opacity: 0.9;\n transform: translateY(-1px);\n }\n\n &:active:not(:disabled) {\n opacity: 0.8;\n transform: translateY(0);\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n `,\n secondary: css`\n background-color: transparent;\n color: ${tokens.colors.text.primary};\n border: 1px solid ${tokens.colors.border.default};\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlay};\n border-color: ${tokens.colors.primary};\n }\n\n &:active:not(:disabled) {\n background-color: ${tokens.colors.surface.overlayActive};\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n `,\n icon: css`\n background-color: transparent;\n color: ${tokens.colors.text.primary};\n border: none;\n padding: ${tokens.spacing.sm};\n min-width: auto;\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlayHover};\n opacity: 0.8;\n }\n\n &:active:not(:disabled) {\n opacity: 0.6;\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n `,\n};\n\nconst sizeStyles = {\n small: css`\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.sm};\n min-width: 60px;\n height: 28px;\n `,\n medium: css`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n font-size: ${tokens.typography.fontSize.base};\n min-width: 80px;\n height: 36px;\n `,\n large: css`\n padding: ${tokens.spacing.md} ${tokens.spacing.lg};\n font-size: ${tokens.typography.fontSize.lg};\n min-width: 100px;\n height: 44px;\n `,\n};\n\nexport const StyledButton = styled.button<StyledButtonProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: ${tokens.spacing.xs};\n font-family: ${tokens.typography.fontFamily.primary};\n font-weight: ${tokens.typography.fontWeight.medium};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.normal};\n white-space: nowrap;\n user-select: none;\n\n /* Variant styles */\n ${({ $variant }) => variantStyles[$variant]}\n\n /* Size styles */\n ${({ $size, $variant }) => $variant !== 'icon' && sizeStyles[$size]}\n\n /* Icon variant size overrides */\n ${({ $variant, $size }) =>\n $variant === 'icon' &&\n css`\n width: ${$size === 'small' ? '28px' : $size === 'large' ? '44px' : '36px'};\n height: ${$size === 'small' ? '28px' : $size === 'large' ? '44px' : '36px'};\n border-radius: ${tokens.borderRadius.sm};\n `}\n\n /* Pressed state */\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: scale(0.98);\n `}\n\n /* Loading state */\n ${({ $isLoading }) =>\n $isLoading &&\n css`\n cursor: wait;\n opacity: 0.7;\n `}\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n }\n\n /* Remove default focus outline, using focus-visible instead */\n &:focus {\n outline: none;\n }\n`;\n","import type { AriaButtonProps } from '@react-aria/button';\nimport { useButton } from '@react-aria/button';\nimport { useRef } from 'react';\nimport { StyledButton } from './Button.styles';\nimport type { ButtonSize, ButtonVariant } from './Button.types';\n\n// Re-export types for public API\nexport type { ButtonSize, ButtonVariant } from './Button.types';\n\nexport interface ButtonProps extends AriaButtonProps {\n variant?: ButtonVariant;\n size?: ButtonSize;\n children: React.ReactNode;\n className?: string;\n disabled?: boolean;\n isLoading?: boolean;\n}\n\nexport function Button({\n variant = 'primary',\n size = 'medium',\n children,\n className,\n disabled = false,\n isLoading = false,\n ...ariaProps\n}: ButtonProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps, isPressed } = useButton(\n {\n ...ariaProps,\n isDisabled: disabled || isLoading,\n },\n ref\n );\n\n return (\n <StyledButton\n {...buttonProps}\n ref={ref}\n className={className}\n $variant={variant}\n $size={size}\n $isPressed={isPressed}\n $isLoading={isLoading}\n disabled={disabled || isLoading}\n >\n {isLoading ? (\n <span aria-live=\"polite\" aria-busy=\"true\">\n Loading...\n </span>\n ) : (\n children\n )}\n </StyledButton>\n );\n}\n\nButton.displayName = 'Button';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport type { ActionsLayout } from './Actions.types';\n\ninterface ActionsContainerProps {\n $layout: ActionsLayout;\n}\n\nexport const ActionsContainer = styled.div<ActionsContainerProps>`\n display: flex;\n gap: ${tokens.spacing.sm};\n align-items: center;\n\n ${({ $layout }) =>\n $layout === 'horizontal'\n ? css`\n flex-direction: row;\n flex-wrap: wrap;\n `\n : css`\n flex-direction: column;\n align-items: stretch;\n\n button {\n width: 100%;\n }\n `}\n`;\n","import { Button } from '../Button';\nimport { ActionsContainer } from './Actions.styles';\nimport type { Action, ActionsLayout } from './Actions.types';\n\n// Re-export types for public API\nexport type { Action, ActionsLayout, ActionVariant } from './Actions.types';\n\nexport interface ActionsProps {\n actions: Action[];\n layout?: ActionsLayout;\n className?: string;\n}\n\nexport function Actions({ actions, layout = 'horizontal', className }: ActionsProps) {\n return (\n <ActionsContainer $layout={layout} className={className}>\n {actions.map((action) => (\n <Button\n key={action.id}\n variant={action.variant || 'secondary'}\n onPress={action.onClick}\n isDisabled={action.disabled}\n aria-label={action.label}\n >\n {action.icon && <span aria-hidden=\"true\">{action.icon}</span>}\n {action.variant !== 'icon' && action.label}\n </Button>\n ))}\n </ActionsContainer>\n );\n}\n\nActions.displayName = 'Actions';\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n// Pulse animation matching AssistantThinking\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Fade in animation for streaming text\nconst fadeIn = keyframes`\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n`;\n\n// Cursor blink animation for streaming\nconst blink = keyframes`\n 0%, 49% {\n opacity: 1;\n }\n 50%, 100% {\n opacity: 0;\n }\n`;\n\nexport const ResponseContainer = styled.div`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: ${tokens.colors.surface.elevated};\n border-radius: ${tokens.borderRadius.xl};\n box-shadow: none;\n font-family: ${tokens.typography.fontFamily.primary};\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const LoadingDots = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: 0 ${tokens.spacing.xs};\n`;\n\nexport const Dot = styled.span<{ delay: number }>`\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${tokens.colors.text.tertiary};\n animation: ${dotPulse} 1.4s ease-in-out infinite;\n animation-delay: ${(props) => props.delay}s;\n`;\n\nexport const TypingIndicator = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: 0 ${tokens.spacing.xs};\n\n ${Dot} {\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.text.tertiary};\n animation: ${dotPulse} 1.4s ease-in-out infinite;\n }\n`;\n\nexport const Message = styled.span`\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.primary};\n font-weight: ${tokens.typography.fontWeight.regular};\n line-height: ${tokens.typography.lineHeight.normal};\n white-space: nowrap;\n`;\n\nexport const StreamingText = styled.div`\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n color: ${tokens.colors.text.primary};\n animation: ${fadeIn} ${tokens.animation.duration.medium} ease-in;\n position: relative;\n font-weight: ${tokens.typography.fontWeight.regular};\n white-space: nowrap;\n\n /* Blinking cursor effect */\n &::after {\n content: '|';\n margin-left: 0.125rem;\n animation: ${blink} 1s infinite;\n color: ${tokens.colors.text.tertiary};\n font-weight: ${tokens.typography.fontWeight.regular};\n }\n`;\n","import {\n Dot,\n LoadingDots,\n Message,\n ResponseContainer,\n StreamingText,\n TypingIndicator,\n} from './Response.styles';\n\nexport interface ResponseProps {\n /** Loading state - shows animated dots */\n isLoading?: boolean;\n /** Typing state - shows typing indicator */\n isTyping?: boolean;\n /** Streaming state - shows text being typed */\n isStreaming?: boolean;\n /** Content to display when streaming */\n streamingContent?: string;\n /** Message to display with loading/typing state */\n message?: string;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * Response component for displaying loading and streaming states\n * Shows animated loading dots, typing indicators, and streaming text\n */\nexport const Response = ({\n isLoading = false,\n isTyping = false,\n isStreaming = false,\n streamingContent = '',\n message = 'Thinking...',\n className,\n}: ResponseProps) => {\n // Show loading dots\n if (isLoading) {\n return (\n <ResponseContainer className={className} data-testid=\"response-loading\">\n <LoadingDots aria-hidden=\"true\">\n <Dot delay={0} />\n <Dot delay={0.15} />\n <Dot delay={0.3} />\n </LoadingDots>\n <Message>{message}</Message>\n </ResponseContainer>\n );\n }\n\n // Show typing indicator\n if (isTyping) {\n return (\n <ResponseContainer className={className} data-testid=\"response-typing\">\n <TypingIndicator aria-hidden=\"true\">\n <Dot delay={0} />\n <Dot delay={0.15} />\n <Dot delay={0.3} />\n </TypingIndicator>\n <Message>{message}</Message>\n </ResponseContainer>\n );\n }\n\n // Show streaming text\n if (isStreaming && streamingContent) {\n return (\n <ResponseContainer className={className} data-testid=\"response-streaming\">\n <StreamingText>{streamingContent}</StreamingText>\n </ResponseContainer>\n );\n }\n\n // Empty state\n return null;\n};\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n// Pulse animation matching AssistantThinking\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Shake animation for error indicator\nconst shake = keyframes`\n 0%, 100% {\n transform: translateX(0);\n }\n 25% {\n transform: translateX(-5px);\n }\n 75% {\n transform: translateX(5px);\n }\n`;\n\nexport const AgentStateContainer = styled.div<{ isError?: boolean }>`\n display: inline-flex;\n flex-direction: column;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: ${(props) => (props.isError ? 'rgba(239, 68, 68, 0.15)' : tokens.colors.surface.elevated)};\n border-radius: ${tokens.borderRadius.xl};\n border: ${(props) => (props.isError ? `1px solid ${tokens.colors.error}` : 'none')};\n box-shadow: none;\n font-family: ${tokens.typography.fontFamily.primary};\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const StateContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n align-items: center;\n width: 100%;\n`;\n\nexport const IdleIndicator = styled.div`\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.status.idle};\n border-radius: ${tokens.borderRadius.full};\n animation: ${dotPulse} 2s infinite ease-in-out;\n`;\n\nexport const ErrorIndicator = styled.div`\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.error};\n border-radius: ${tokens.borderRadius.full};\n animation: ${shake} 0.5s ease-in-out;\n`;\n\nexport const StateLabel = styled.span`\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.regular};\n color: ${tokens.colors.text.primary};\n line-height: ${tokens.typography.lineHeight.normal};\n white-space: nowrap;\n`;\n\nexport const MessageText = styled.p`\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.tertiary};\n line-height: ${tokens.typography.lineHeight.normal};\n margin: 0;\n text-align: center;\n white-space: nowrap;\n`;\n\nexport const ProgressBar = styled.div`\n width: 100%;\n height: ${tokens.spacing.xs};\n background-color: ${tokens.colors.surface.elevated};\n border-radius: ${tokens.borderRadius.sm};\n overflow: hidden;\n margin-top: ${tokens.spacing.xs};\n`;\n\nexport const ProgressBarFill = styled.div<{ progress: number }>`\n height: 100%;\n width: ${(props) => Math.min(Math.max(props.progress, 0), 100)}%;\n background: linear-gradient(135deg, ${tokens.colors.accent} 0%, ${tokens.colors.primary} 100%);\n border-radius: ${tokens.borderRadius.sm};\n transition: width ${tokens.transitions.normal};\n`;\n","import { Response } from '../Response';\nimport {\n AgentStateContainer,\n ErrorIndicator,\n IdleIndicator,\n ProgressBar,\n ProgressBarFill,\n StateContent,\n StateLabel,\n} from './AgentState.styles';\n\nexport interface AgentStateProps {\n /** Current agent state */\n state: 'idle' | 'thinking' | 'responding' | 'error';\n /** Optional message to display */\n message?: string;\n /** Optional progress percentage (0-100) */\n progress?: number;\n /** Additional CSS class name */\n className?: string;\n}\n\n/**\n * AgentState component for displaying agent status\n * Styled to match AssistantThinking and Response components with dark theme\n */\nexport const AgentState = ({ state, message, progress, className }: AgentStateProps) => {\n // Idle state - show pulsing indicator\n if (state === 'idle') {\n return (\n <AgentStateContainer className={className} data-testid=\"agent-state-idle\">\n <StateContent>\n <IdleIndicator />\n <StateLabel>{message || 'Agent is idle'}</StateLabel>\n {progress !== undefined && (\n <ProgressBar>\n <ProgressBarFill progress={progress} />\n </ProgressBar>\n )}\n </StateContent>\n </AgentStateContainer>\n );\n }\n\n // Error state - show error indicator\n if (state === 'error') {\n return (\n <AgentStateContainer className={className} data-testid=\"agent-state-error\" isError>\n <StateContent>\n <ErrorIndicator />\n <StateLabel>{message || 'Error occurred'}</StateLabel>\n </StateContent>\n </AgentStateContainer>\n );\n }\n\n // Thinking state - use Response component with loading dots\n if (state === 'thinking') {\n return <Response isLoading message={message || 'Agent is thinking...'} className={className} />;\n }\n\n // Responding state - use Response component with typing indicator\n if (state === 'responding') {\n return (\n <Response isTyping message={message || 'Agent is responding...'} className={className} />\n );\n }\n\n return null;\n};\n","/**\n * ActionExecutionAdapter Component\n *\n * Adapter for CopilotKit's action execution messages.\n * Displays tool calls using the AgentState component.\n */\n\nimport type { RenderMessageProps } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { AgentState } from '../AgentState';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * ActionExecutionMessage shape from CopilotKit\n * We define this interface because the runtime-client-gql types aren't\n * directly exported in a way TypeScript can use with the react-ui types.\n */\ninterface ActionExecutionMessageShape {\n type: string;\n name: string;\n arguments: Record<string, unknown>;\n}\n\n// =============================================================================\n// Styled Components\n// =============================================================================\n\nconst Container = styled.div`\n margin: ${tokens.spacing.sm} 0;\n padding: 0 ${tokens.spacing.sm};\n`;\n\nconst ToolName = styled.div`\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.tertiary};\n margin-bottom: ${tokens.spacing.xs};\n font-family: ${tokens.typography.fontFamily.monospace};\n`;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Check if a message is an ActionExecutionMessage\n */\nfunction isActionExecutionMessage(message: unknown): message is ActionExecutionMessageShape {\n if (!message || typeof message !== 'object') return false;\n\n const msg = message as Record<string, unknown>;\n\n // Check for CopilotKit's message type indicator\n if (typeof msg.isActionExecutionMessage === 'function') {\n return (msg.isActionExecutionMessage as () => boolean)();\n }\n\n // Fallback: check for action execution message properties\n return (\n msg.type === 'ActionExecutionMessage' ||\n (typeof msg.name === 'string' && 'arguments' in msg && !('content' in msg))\n );\n}\n\n/**\n * Format tool name for display\n * e.g., \"create-social-media-posts\" -> \"Create Social Media Posts\"\n */\nfunction formatToolName(name: string): string {\n return name\n .split('-')\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\n/**\n * Extract a human-readable message from tool arguments\n */\nfunction getToolMessage(name: string, args: Record<string, unknown>): string {\n // Handle common tool patterns\n if (name.includes('social-media')) {\n const topic = args.topic as string | undefined;\n if (topic) {\n return `Creating posts about \"${topic}\"`;\n }\n return 'Creating social media posts...';\n }\n\n // Default message\n return `Running ${formatToolName(name)}...`;\n}\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * ActionExecutionAdapter - Renders tool/action execution messages in chat\n *\n * Uses the AgentState component to show:\n * - Tool name\n * - Current status (thinking/responding)\n * - Progress message based on tool arguments\n */\nexport const ActionExecutionAdapter: React.FC<RenderMessageProps> = ({ message, inProgress }) => {\n // Only handle ActionExecutionMessage types\n if (!isActionExecutionMessage(message)) {\n return null;\n }\n\n const toolName = message.name;\n // Handle arguments as either object or JSON string (from GraphQL)\n let toolArgs: Record<string, unknown> = {};\n if (typeof message.arguments === 'string') {\n try {\n toolArgs = JSON.parse(message.arguments);\n } catch {\n toolArgs = {};\n }\n } else if (message.arguments && typeof message.arguments === 'object') {\n toolArgs = message.arguments;\n }\n\n // Determine state based on whether still in progress\n const state = inProgress ? 'thinking' : 'responding';\n const statusMessage = getToolMessage(toolName, toolArgs);\n\n return (\n <Container data-testid=\"action-execution-message\">\n <ToolName>{formatToolName(toolName)}</ToolName>\n <AgentState state={state} message={statusMessage} />\n </Container>\n );\n};\n\nActionExecutionAdapter.displayName = 'ActionExecutionAdapter';\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\nconst dotPulse = keyframes`\n 0%, 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\nconst pulse = keyframes`\n 0%, 100% {\n opacity: 0.5;\n transform: scale(1);\n }\n 50% {\n opacity: 1;\n transform: scale(1.2);\n }\n`;\n\nconst wave = keyframes`\n 0%, 40%, 100% {\n transform: translateY(0);\n }\n 20% {\n transform: translateY(-8px);\n }\n`;\n\ninterface SizeProps {\n size?: 'sm' | 'md' | 'lg';\n}\n\nconst getSizeValue = (size: 'sm' | 'md' | 'lg' = 'md') => {\n switch (size) {\n case 'sm':\n return {\n padding: `${tokens.spacing.sm} ${tokens.spacing.md}`,\n avatar: '32px',\n icon: '16px',\n fontSize: tokens.typography.fontSize.xs,\n dotSize: '4px',\n };\n case 'lg':\n return {\n padding: `${tokens.spacing.md} ${tokens.spacing.xl}`,\n avatar: '48px',\n icon: '24px',\n fontSize: tokens.typography.fontSize.base,\n dotSize: '8px',\n };\n case 'md':\n default:\n return {\n padding: `${tokens.spacing.md} ${tokens.spacing.md}`,\n avatar: '40px',\n icon: '20px',\n fontSize: tokens.typography.fontSize.sm,\n dotSize: '6px',\n };\n }\n};\n\nexport const Container = styled.div<SizeProps>`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.md};\n padding: ${(props) => getSizeValue(props.size).padding};\n background-color: ${tokens.colors.surface.base};\n border-radius: ${tokens.borderRadius.xl};\n box-shadow: ${tokens.shadows.none};\n font-family: ${tokens.typography.fontFamily.primary};\n max-width: fit-content;\n margin: 0 auto;\n`;\n\nexport const Avatar = styled.div<SizeProps>`\n width: ${(props) => getSizeValue(props.size).avatar};\n height: ${(props) => getSizeValue(props.size).avatar};\n border-radius: ${tokens.borderRadius.full};\n background: linear-gradient(135deg, ${tokens.colors.secondary} 0%, ${tokens.colors.primary} 100%);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n box-shadow: ${tokens.shadows.glow.primary};\n`;\n\nexport const HeadphonesIcon = styled.svg<SizeProps>`\n width: ${(props) => getSizeValue(props.size).icon};\n height: ${(props) => getSizeValue(props.size).icon};\n color: ${tokens.colors.text.primary};\n`;\n\nexport const Content = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n`;\n\ninterface LoadingDotsProps extends SizeProps {\n variant?: 'dots' | 'pulse' | 'wave';\n}\n\nexport const LoadingDots = styled.div<LoadingDotsProps>`\n display: flex;\n align-items: center;\n gap: ${(props) => (props.variant === 'wave' ? '2px' : `${tokens.spacing.xs}`)};\n padding: 0 ${tokens.spacing.xs};\n`;\n\ninterface DotProps extends SizeProps {\n variant?: 'dots' | 'pulse' | 'wave';\n}\n\nexport const Dot = styled.span<DotProps>`\n width: ${(props) => getSizeValue(props.size).dotSize};\n height: ${(props) => getSizeValue(props.size).dotSize};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${tokens.colors.text.tertiary};\n animation: ${(props) => {\n switch (props.variant) {\n case 'pulse':\n return pulse;\n case 'wave':\n return wave;\n case 'dots':\n default:\n return dotPulse;\n }\n }}\n 1.4s ease-in-out infinite;\n`;\n\nexport const Message = styled.span<SizeProps>`\n font-size: ${(props) => getSizeValue(props.size).fontSize};\n color: ${tokens.colors.text.secondary};\n font-weight: ${tokens.typography.fontWeight.regular};\n line-height: ${tokens.typography.lineHeight.normal};\n white-space: nowrap;\n`;\n","import { useRef } from 'react';\nimport {\n Avatar,\n Container,\n Content,\n Dot,\n HeadphonesIcon,\n LoadingDots,\n Message,\n} from './AssistantThinking.styles';\n\nexport interface AssistantThinkingProps {\n message?: string;\n className?: string;\n ariaLabel?: string;\n /** Visual variant for the loading indicator */\n variant?: 'dots' | 'pulse' | 'wave' | 'text';\n /** Size of the component */\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport function AssistantThinking({\n message = 'Analyzing data, please wait...',\n className,\n ariaLabel = 'Assistant is thinking',\n variant = 'dots',\n size = 'md',\n}: AssistantThinkingProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n const renderLoadingIndicator = () => {\n switch (variant) {\n case 'dots':\n return (\n <LoadingDots aria-hidden=\"true\" size={size}>\n <Dot style={{ animationDelay: '0ms' }} size={size} />\n <Dot style={{ animationDelay: '150ms' }} size={size} />\n <Dot style={{ animationDelay: '300ms' }} size={size} />\n </LoadingDots>\n );\n case 'pulse':\n return (\n <LoadingDots aria-hidden=\"true\" size={size} variant=\"pulse\">\n <Dot style={{ animationDelay: '0ms' }} size={size} variant=\"pulse\" />\n </LoadingDots>\n );\n case 'wave':\n return (\n <LoadingDots aria-hidden=\"true\" size={size} variant=\"wave\">\n <Dot style={{ animationDelay: '0ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '100ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '200ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '300ms' }} size={size} variant=\"wave\" />\n <Dot style={{ animationDelay: '400ms' }} size={size} variant=\"wave\" />\n </LoadingDots>\n );\n case 'text':\n return null; // Just show the message with no indicator\n default:\n return null;\n }\n };\n\n return (\n <Container\n ref={containerRef}\n className={className}\n role=\"status\"\n aria-live=\"polite\"\n aria-label={ariaLabel}\n size={size}\n >\n <Avatar aria-hidden=\"true\" size={size}>\n <HeadphonesIcon viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17 13a4 4 0 0 1 0 8c-2.142 0-4-1.79-4-4h-2a4 4 0 1 1-.535-2h3.07A4 4 0 0 1 17 13M2 12v-2h2V7a4 4 0 0 1 4-4h8a4 4 0 0 1 4 4v3h2v2z\" />\n </HeadphonesIcon>\n </Avatar>\n <Content>\n {renderLoadingIndicator()}\n <Message size={size}>{message}</Message>\n </Content>\n </Container>\n );\n}\n\nAssistantThinking.displayName = 'AssistantThinking';\n","/**\n * StreamingText Component\n *\n * Provides typewriter animation for streaming AI responses.\n * Supports basic markdown rendering (bold, italic, code, links).\n *\n * @see specs/015-restyle-ai-chat/spec.md:FR-031, FR-042\n * @see UI_COMPONENTS_SSE.md:548-595\n */\n\nimport { memo, useEffect, useMemo, useRef } from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\n/**\n * Parse basic markdown and return React elements.\n * Supports: **bold**, *italic*, `code`, [links](url), and line breaks.\n */\nfunction parseMarkdown(text: string): React.ReactNode[] {\n if (!text) return [];\n\n const elements: React.ReactNode[] = [];\n let key = 0;\n\n // Split by double newlines for paragraphs, single newlines for line breaks\n const paragraphs = text.split(/\\n\\n+/);\n\n paragraphs.forEach((paragraph, pIndex) => {\n if (pIndex > 0) {\n // Add paragraph break\n elements.push(<br key={key++} />);\n elements.push(<br key={key++} />);\n }\n\n // Process lines within paragraph\n const lines = paragraph.split('\\n');\n lines.forEach((line, lineIndex) => {\n if (lineIndex > 0) {\n elements.push(<br key={key++} />);\n }\n\n // Parse inline markdown\n const parsed = parseInlineMarkdown(line, key);\n elements.push(...parsed.elements);\n key = parsed.nextKey;\n });\n });\n\n return elements;\n}\n\n/**\n * Parse inline markdown elements within a line of text.\n */\nfunction parseInlineMarkdown(\n text: string,\n startKey: number\n): { elements: React.ReactNode[]; nextKey: number } {\n const elements: React.ReactNode[] = [];\n let key = startKey;\n\n // Combined regex for all inline patterns\n // Order matters: bold (**) before italic (*), and code backticks need escaping\n const inlineRegex =\n /(\\*\\*(.+?)\\*\\*)|(\\*(.+?)\\*)|(`([^`]+)`)|(\\[([^\\]]+)\\]\\(([^)]+)\\))/g;\n\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n // biome-ignore lint/suspicious/noAssignInExpressions: regex exec loop pattern\n while ((match = inlineRegex.exec(text)) !== null) {\n // Add text before match\n if (match.index > lastIndex) {\n elements.push(text.slice(lastIndex, match.index));\n }\n\n if (match[1]) {\n // **bold**\n elements.push(<strong key={key++}>{match[2]}</strong>);\n } else if (match[3]) {\n // *italic*\n elements.push(<em key={key++}>{match[4]}</em>);\n } else if (match[5]) {\n // `code`\n elements.push(<code key={key++}>{match[6]}</code>);\n } else if (match[7]) {\n // [link](url)\n elements.push(\n <a key={key++} href={match[9]} target=\"_blank\" rel=\"noopener noreferrer\">\n {match[8]}\n </a>\n );\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text after last match\n if (lastIndex < text.length) {\n elements.push(text.slice(lastIndex));\n }\n\n // If no matches, just return the original text\n if (elements.length === 0) {\n elements.push(text);\n }\n\n return { elements, nextKey: key };\n}\n\nexport interface StreamingTextProps {\n /** The text content to display */\n content: string;\n /** Whether text is currently streaming */\n isStreaming?: boolean;\n /** Typing speed in milliseconds per character */\n typingSpeed?: number;\n /** Whether to show blinking cursor */\n cursor?: boolean;\n /** Visual variant */\n variant?: 'default' | 'code' | 'markdown';\n /** Callback when streaming completes */\n onStreamComplete?: () => void;\n /** Additional CSS class name */\n className?: string;\n}\n\nconst Container = styled.div<{ $variant: 'default' | 'code' | 'markdown' }>`\n font-family: ${(props) =>\n props.$variant === 'code'\n ? tokens.typography.fontFamily.monospace\n : tokens.typography.fontFamily.primary};\n white-space: pre-wrap;\n word-break: break-word;\n line-height: ${tokens.typography.lineHeight.normal};\n /* Performance optimizations for streaming text */\n text-rendering: optimizeSpeed;\n contain: content;\n\n /* Markdown element styles */\n strong {\n font-weight: ${tokens.typography.fontWeight.bold};\n color: ${tokens.colors.text.primary};\n }\n\n em {\n font-style: italic;\n }\n\n code {\n font-family: ${tokens.typography.fontFamily.monospace};\n background: ${tokens.colors.surface.overlay};\n padding: 0.15em 0.4em;\n border-radius: ${tokens.borderRadius.sm};\n font-size: 0.9em;\n }\n\n a {\n color: ${tokens.colors.primary};\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`;\n\nconst Cursor = styled.span`\n display: inline-block;\n width: 2px;\n height: 1em;\n background-color: currentColor;\n margin-left: 2px;\n vertical-align: text-bottom;\n animation: blink 1s infinite;\n\n @keyframes blink {\n 0%,\n 49% {\n opacity: 1;\n }\n 50%,\n 100% {\n opacity: 0;\n }\n }\n`;\n\n/**\n * StreamingText component for displaying streaming AI responses\n *\n * Features:\n * - Renders content directly without extra state (optimal performance)\n * - Optional blinking cursor during streaming\n * - Code and markdown variants\n * - Completion callback when streaming ends\n *\n * Memoized to prevent unnecessary re-renders during parent updates.\n */\nconst StreamingTextBase: React.FC<StreamingTextProps> = ({\n content,\n isStreaming = false,\n typingSpeed: _typingSpeed = 50, // Reserved for future use\n cursor = true,\n variant = 'default',\n onStreamComplete,\n className,\n}) => {\n const wasStreamingRef = useRef(isStreaming);\n const completionCalledRef = useRef(false);\n\n // Handle streaming completion callback without causing re-renders\n useEffect(() => {\n // Track when streaming transitions from true to false (completion)\n if (wasStreamingRef.current && !isStreaming && !completionCalledRef.current) {\n completionCalledRef.current = true;\n onStreamComplete?.();\n }\n\n // Reset completion flag when streaming starts again\n if (isStreaming) {\n completionCalledRef.current = false;\n }\n\n wasStreamingRef.current = isStreaming;\n }, [isStreaming, onStreamComplete]);\n\n const showCursor = isStreaming && cursor;\n\n // Parse markdown content when variant is 'markdown'\n const renderedContent = useMemo(() => {\n if (variant === 'markdown') {\n return parseMarkdown(content);\n }\n return content;\n }, [content, variant]);\n\n // Render content directly - no intermediate state for optimal performance\n return (\n <Container $variant={variant} className={className}>\n {renderedContent}\n {showCursor && <Cursor />}\n </Container>\n );\n};\n\n// Memoize to prevent re-renders when parent updates but props are the same\nexport const StreamingText = memo(StreamingTextBase);\n\nStreamingText.displayName = 'StreamingText';\n","import styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const MessageContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} 0;\n max-width: 100%;\n /* GPU acceleration hint for smooth rendering during streaming */\n will-change: contents;\n contain: content;\n`;\n\nexport const AvatarContainer = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n flex-shrink: 0;\n`;\n\nexport const Avatar = styled.img`\n width: 20px;\n height: 20px;\n border-radius: ${tokens.borderRadius.full};\n object-fit: cover;\n background-color: transparent;\n`;\n\nexport const AvatarInitials = styled.div`\n width: 20px;\n height: 20px;\n border-radius: ${tokens.borderRadius.full};\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: ${tokens.colors.secondary};\n padding: 2px;\n box-sizing: border-box;\n\n img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n }\n`;\n\nexport const AvatarLabel = styled.span`\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.secondary};\n`;\n\nexport const ContentContainer = styled.div`\n width: 100%;\n min-width: 0;\n`;\n\nexport const MessageContent = styled.div`\n /* Use solid color instead of backdrop-filter for performance during streaming */\n background-color: ${tokens.colors.surface.elevated};\n padding: ${tokens.spacing.sm};\n border-radius: ${tokens.borderRadius.lg};\n color: ${tokens.colors.text.primary};\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n font-family: ${tokens.typography.fontFamily.primary};\n word-wrap: break-word;\n white-space: pre-wrap;\n /* Optimize text rendering */\n text-rendering: optimizeSpeed;\n`;\n\nexport const LoadingDots = styled.div`\n display: flex;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.sm};\n /* Use solid color instead of backdrop-filter for performance */\n background-color: ${tokens.colors.surface.elevated};\n border-radius: ${tokens.borderRadius.lg};\n width: fit-content;\n`;\n\n/* Simplified pulse animation - opacity only, no transform */\nconst pulse = keyframes`\n 0%, 100% {\n opacity: 0.4;\n }\n 50% {\n opacity: 1;\n }\n`;\n\nexport const LoadingDot = styled.div<{ delay: number }>`\n width: ${tokens.spacing.sm};\n height: ${tokens.spacing.sm};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${tokens.colors.text.tertiary};\n /* Use simple opacity animation instead of transform bounce */\n animation: ${pulse} 1.4s ease-in-out infinite;\n animation-delay: ${(props) => props.delay}s;\n`;\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\ninterface FileAttachmentContainerProps {\n $isInteractive?: boolean;\n}\n\nexport const FileAttachmentContainer = styled.div<FileAttachmentContainerProps>`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm};\n background-color: ${tokens.colors.surface.elevated};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n max-width: 320px;\n cursor: ${(props) => (props.$isInteractive ? 'pointer' : 'default')};\n transition: border-color ${tokens.transitions.fast};\n\n /* Remove default button styles when used as button */\n ${(props) =>\n props.$isInteractive &&\n `\n font: inherit;\n color: inherit;\n text-align: left;\n appearance: none;\n -webkit-appearance: none;\n\n &:hover {\n border-color: ${tokens.colors.border.hover};\n background-color: ${tokens.colors.surface.overlayHover};\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n border-color: ${tokens.colors.accent};\n }\n\n &:active {\n border-color: ${tokens.colors.border.hover};\n }\n `}\n`;\n\nexport const FileIconContainer = styled.div`\n flex-shrink: 0;\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: ${tokens.typography.fontSize['2xl']};\n line-height: 1;\n`;\n\nexport const FileInfo = styled.div`\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n`;\n\nexport const FileTitle = styled.div`\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.primary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const FileMetadata = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.tertiary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n overflow: hidden;\n`;\n\nexport const FileSubtitle = styled.span`\n color: ${tokens.colors.text.tertiary};\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n\n &:last-child {\n flex-shrink: 0;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type { AriaButtonProps } from '@react-types/button';\nimport type { PressEvent } from '@react-types/shared';\nimport type React from 'react';\nimport { useRef } from 'react';\nimport {\n FileAttachmentContainer,\n FileIconContainer,\n FileInfo,\n FileMetadata,\n FileSubtitle,\n FileTitle,\n} from './FileAttachment.styles';\n\nexport interface FileAttachmentProps extends Omit<AriaButtonProps, 'children'> {\n /** File name/title */\n title: string;\n /** File subtitle/category (e.g., \"Downloads\", \"Documents\") */\n subtitle?: string;\n /** File size in human-readable format (e.g., \"500 KB\", \"2.5 MB\") */\n size?: string;\n /** File icon emoji or Unicode character */\n icon?: string;\n /** Click handler for file interaction */\n onClick?: () => void;\n /** Custom className for styling */\n className?: string;\n}\n\n/**\n * FileAttachment component displays file information in assistant messages\n *\n * Features:\n * - File icon display (emoji or Unicode)\n * - File metadata (title, subtitle, size)\n * - Accessible keyboard navigation via React ARIA\n * - Clean, minimal card-based design\n * - WCAG 2.1 AA compliant\n *\n * @example\n * ```tsx\n * <FileAttachment\n * title=\"Example File\"\n * subtitle=\"Downloads\"\n * size=\"500 KB\"\n * icon=\"📄\"\n * onPress={() => console.log('File clicked')}\n * />\n * ```\n */\nexport const FileAttachment: React.FC<FileAttachmentProps> = ({\n title,\n subtitle,\n size,\n icon = '📄',\n onClick,\n onPress,\n className,\n ...ariaProps\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const isInteractive = !!(onClick || onPress);\n\n // Combine onClick and onPress handlers\n const handlePress = (e: PressEvent) => {\n if (onClick) onClick();\n if (onPress) onPress(e);\n };\n\n const { buttonProps } = useButton(\n {\n ...ariaProps,\n onPress: isInteractive ? handlePress : undefined,\n isDisabled: !isInteractive,\n },\n ref\n );\n\n return (\n <FileAttachmentContainer\n {...(isInteractive ? buttonProps : {})}\n ref={isInteractive ? ref : undefined}\n className={className}\n $isInteractive={isInteractive}\n as={isInteractive ? 'button' : 'div'}\n >\n <FileIconContainer>{icon}</FileIconContainer>\n <FileInfo>\n <FileTitle>{title}</FileTitle>\n <FileMetadata>\n {subtitle && <FileSubtitle>{subtitle}</FileSubtitle>}\n {size && subtitle && <FileSubtitle aria-hidden=\"true\"> • </FileSubtitle>}\n {size && <FileSubtitle>{size}</FileSubtitle>}\n </FileMetadata>\n </FileInfo>\n </FileAttachmentContainer>\n );\n};\n\nexport default FileAttachment;\n","import { memo, type FC } from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { StreamingText } from '../StreamingText';\nimport {\n Avatar,\n AvatarContainer,\n AvatarInitials,\n AvatarLabel,\n ContentContainer,\n LoadingDot,\n LoadingDots,\n MessageContainer,\n MessageContent,\n} from './AssistantMessage.styles';\nimport { FileAttachment, type FileAttachmentProps } from './FileAttachment';\n\nconst AttachmentsContainer = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n margin-top: ${tokens.spacing.sm};\n`;\n\nconst ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.secondary};\n background: ${tokens.colors.surface.overlay};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${tokens.colors.surface.overlayHover};\n border-color: ${tokens.colors.border.hover};\n color: ${tokens.colors.text.primary};\n }\n\n &:active {\n transform: scale(0.98);\n }\n`;\n\nconst ActionsContainer = styled.div`\n display: flex;\n gap: ${tokens.spacing.xs};\n flex-wrap: wrap;\n margin-top: ${tokens.spacing.sm};\n`;\n\nconst MessageTime = styled.time`\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.tertiary};\n margin-top: ${tokens.spacing.xs};\n display: block;\n`;\n\nconst StreamingIndicator = styled.span`\n display: inline-block;\n width: ${tokens.spacing.xs};\n height: ${tokens.spacing.xs};\n margin-left: ${tokens.spacing.xs};\n background-color: ${tokens.colors.accent};\n border-radius: ${tokens.borderRadius.full};\n animation: pulse 1.5s ease-in-out infinite;\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 0.3;\n transform: scale(0.8);\n }\n 50% {\n opacity: 1;\n transform: scale(1.2);\n }\n }\n`;\n\nexport interface ActionButtonType {\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n}\n\nexport interface AssistantMessageProps {\n /** Message content to display */\n content?: string;\n /** Avatar image URL */\n avatarUrl?: string;\n /** Avatar initials when no image is provided */\n avatarInitials?: string;\n /** Whether to show loading state */\n isLoading?: boolean;\n /** Whether message is currently streaming */\n isStreaming?: boolean;\n /** Custom className for styling */\n className?: string;\n /** Support for markdown rendering (future enhancement) */\n enableMarkdown?: boolean;\n /** File attachments to display below the message */\n attachments?: FileAttachmentProps[];\n /** Optional timestamp */\n timestamp?: string;\n /** Action buttons to display */\n actions?: ActionButtonType[];\n}\n\n/**\n * AssistantMessage component displays AI assistant messages with avatar\n *\n * Features:\n * - Avatar with image or initials fallback\n * - Loading state with animated dots\n * - Streaming state indicator\n * - Markdown support (optional)\n * - Dark gray bubble (#2D2D3D) from Figma design\n * - Left-aligned layout\n * - Action buttons support\n * - Timestamp display\n *\n * Memoized to prevent unnecessary re-renders during parent updates.\n */\nconst AssistantMessageBase: FC<AssistantMessageProps> = ({\n content = '',\n avatarUrl,\n avatarInitials: _avatarInitials = 'AI',\n isLoading = false,\n isStreaming = false,\n className,\n attachments = [],\n enableMarkdown = false,\n timestamp,\n actions = [],\n}) => {\n const renderContent = () => {\n if (isLoading) {\n return (\n <LoadingDots>\n <LoadingDot delay={0} />\n <LoadingDot delay={0.2} />\n <LoadingDot delay={0.4} />\n </LoadingDots>\n );\n }\n\n // Use StreamingText for typewriter effect\n return (\n <>\n {content && (\n <MessageContent>\n <StreamingText\n content={content}\n isStreaming={isStreaming}\n typingSpeed={30}\n cursor={false}\n variant={enableMarkdown ? 'markdown' : 'default'}\n />\n {isStreaming && <StreamingIndicator />}\n </MessageContent>\n )}\n {attachments.length > 0 && (\n <AttachmentsContainer>\n {attachments.map((attachment, index) => (\n <FileAttachment key={`${attachment.title}-${index}`} {...attachment} />\n ))}\n </AttachmentsContainer>\n )}\n {timestamp && <MessageTime>{timestamp}</MessageTime>}\n {actions.length > 0 && (\n <ActionsContainer>\n {actions.map((action, index) => (\n <ActionButton key={index} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ActionButton>\n ))}\n </ActionsContainer>\n )}\n </>\n );\n };\n\n return (\n <MessageContainer className={className}>\n <AvatarContainer>\n {avatarUrl ? (\n <Avatar src={avatarUrl} alt=\"Assistant avatar\" />\n ) : (\n <AvatarInitials>\n <Avatar src=\"/assets/avatar-transparent-bg.png\" alt=\"AI Assistant\" />\n </AvatarInitials>\n )}\n <AvatarLabel>Assistant</AvatarLabel>\n </AvatarContainer>\n <ContentContainer>{renderContent()}</ContentContainer>\n </MessageContainer>\n );\n};\n\n// Memoize to prevent re-renders when parent updates but props are the same\nexport const AssistantMessage = memo(AssistantMessageBase);\n\nAssistantMessage.displayName = 'AssistantMessage';\n\nexport default AssistantMessage;\n","/**\n * Adapter component that bridges custom AssistantMessage with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's AssistantMessageProps to our custom component props\n * 2. Handles loading states by showing AssistantThinking component\n * 3. Extracts message content and renders with our styled component\n * 4. Renders generativeUI (tool call renders) when present\n * 5. Detects errors and provides \"Report Issue\" action button\n */\n\nimport { useCopilotChat } from '@copilotkit/react-core';\nimport type { AssistantMessageProps as CopilotAssistantMessageProps } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport { type FC, memo, type ReactNode, useMemo, useRef } from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { AssistantThinking } from '../../AssistantThinking/AssistantThinking';\nimport { AssistantMessage, type ActionButtonType } from '../Messages/AssistantMessage';\n\n/**\n * Extended message type that includes generativeUI for tool call renders\n */\ninterface MessageWithGenerativeUI {\n content?: string;\n generativeUI?: () => ReactNode;\n}\n\n/**\n * Regex to match tool call markers embedded in message content\n * Format: <!--TOOL_CALL:tool_name:json_args-->\n */\nconst TOOL_CALL_MARKER_REGEX = /<!--TOOL_CALL:([^:]+):(.+?)-->/g;\n\n/**\n * Strip tool call markers from message content\n * These are internal markers used for state sync, not meant for display\n */\nfunction stripToolCallMarkers(content: string): string {\n return content.replace(TOOL_CALL_MARKER_REGEX, '').trim();\n}\n\n/**\n * Error category types matching the mobile client's error system\n */\nexport type ErrorCategory = 'Network' | 'Auth' | 'OAuth' | 'Workflow' | 'Unknown';\n\n/**\n * Error context extracted from a message\n */\nexport interface ExtractedErrorContext {\n /** Whether the message contains an error */\n hasError: boolean;\n /** Inferred error category */\n category?: ErrorCategory;\n /** Correlation ID if present in the message */\n correlationId?: string;\n /** The error message text */\n errorMessage?: string;\n}\n\n/**\n * Callback for reporting issues from chat\n */\nexport interface ReportIssueCallback {\n (context: {\n errorCategory?: ErrorCategory;\n correlationId?: string;\n chatSnippet?: string;\n }): void;\n}\n\n/**\n * Error detection patterns\n * These patterns identify error messages in assistant responses\n */\nconst ERROR_PATTERNS = [\n /\\bfailed\\b/i,\n /\\berror\\b/i,\n /\\bunable to\\b/i,\n /\\bcouldn't\\b/i,\n /\\bcan't\\b/i,\n /\\bcannot\\b/i,\n /\\bsomething went wrong\\b/i,\n /\\btry again\\b/i,\n /\\bunexpected\\b/i,\n /\\btimed out\\b/i,\n /\\bconnection\\b.*\\b(lost|failed|refused)\\b/i,\n];\n\n/**\n * Patterns to extract correlation IDs from error messages\n * Format: \"Reference: abc123\" or \"Correlation ID: abc123\" or \"[abc123]\"\n */\nconst CORRELATION_ID_PATTERNS = [\n /reference:\\s*([a-f0-9-]+)/i,\n /correlation[_\\s]?id:\\s*([a-f0-9-]+)/i,\n /\\[([a-f0-9]{8,})\\]/i,\n];\n\n/**\n * Infer error category from message content\n */\nfunction inferErrorCategory(content: string): ErrorCategory {\n const lowerContent = content.toLowerCase();\n\n // Network errors\n if (\n lowerContent.includes('network') ||\n lowerContent.includes('internet') ||\n lowerContent.includes('connection') ||\n lowerContent.includes('offline') ||\n lowerContent.includes('timed out')\n ) {\n return 'Network';\n }\n\n // Auth errors\n if (\n lowerContent.includes('unauthorized') ||\n lowerContent.includes('authentication') ||\n lowerContent.includes('login') ||\n lowerContent.includes('session expired') ||\n lowerContent.includes('credentials')\n ) {\n return 'Auth';\n }\n\n // OAuth errors\n if (\n lowerContent.includes('oauth') ||\n lowerContent.includes('reconnect') ||\n lowerContent.includes('authorization') ||\n (lowerContent.includes('token') && lowerContent.includes('expired'))\n ) {\n return 'OAuth';\n }\n\n // Workflow errors\n if (\n lowerContent.includes('workflow') ||\n lowerContent.includes('execution') ||\n lowerContent.includes('failed to start') ||\n lowerContent.includes('automation')\n ) {\n return 'Workflow';\n }\n\n return 'Unknown';\n}\n\n/**\n * Extract correlation ID from message content\n */\nfunction extractCorrelationId(content: string): string | undefined {\n for (const pattern of CORRELATION_ID_PATTERNS) {\n const match = content.match(pattern);\n if (match?.[1]) {\n return match[1];\n }\n }\n return undefined;\n}\n\n/**\n * Detect if a message contains an error and extract context\n */\nexport function detectErrorInMessage(content: string): ExtractedErrorContext {\n // Check if any error patterns match\n const hasError = ERROR_PATTERNS.some((pattern) => pattern.test(content));\n\n if (!hasError) {\n return { hasError: false };\n }\n\n return {\n hasError: true,\n category: inferErrorCategory(content),\n correlationId: extractCorrelationId(content),\n errorMessage: content,\n };\n}\n\n/**\n * CopilotKit message type (simplified for our use)\n */\ninterface CopilotMessage {\n role?: string;\n content?: string;\n}\n\n/**\n * Build a chat snippet from recent messages for error context.\n * Includes recent user messages and the error message itself.\n *\n * @param messages - Array of chat messages from useCopilotChat\n * @param errorMessageContent - The current error message content\n * @param maxMessages - Maximum number of recent messages to include (default: 5)\n * @param maxLength - Maximum total character length (default: 1500)\n */\nfunction buildChatSnippet(\n messages: CopilotMessage[],\n errorMessageContent: string,\n maxMessages = 5,\n maxLength = 1500\n): string {\n // Get last N messages (excluding the current error message if it's already in the list)\n const recentMessages = messages\n .filter((msg) => msg.content && msg.content !== errorMessageContent)\n .slice(-maxMessages);\n\n // Format messages with role labels\n const formattedMessages = recentMessages.map((msg) => {\n const role = msg.role === 'user' ? 'User' : 'Assistant';\n const content = msg.content || '';\n // Truncate individual messages if too long\n const truncatedContent = content.length > 300 ? content.slice(0, 300) + '...' : content;\n return `[${role}]: ${truncatedContent}`;\n });\n\n // Add the error message\n const errorSnippet =\n errorMessageContent.length > 500\n ? errorMessageContent.slice(0, 500) + '...'\n : errorMessageContent;\n formattedMessages.push(`[Assistant - Error]: ${errorSnippet}`);\n\n // Join and truncate if total is too long\n let result = formattedMessages.join('\\n\\n');\n if (result.length > maxLength) {\n result = result.slice(0, maxLength) + '\\n...[truncated]';\n }\n\n return result;\n}\n\n/**\n * Container for generative UI (tool call renders)\n */\nconst GenerativeUIContainer = styled.div`\n margin-top: ${tokens.spacing.sm};\n margin-bottom: ${tokens.spacing.sm};\n`;\n\n/**\n * Adapter that converts CopilotKit's AssistantMessageProps to our custom component\n * Memoized to prevent re-renders when props haven't changed.\n */\nconst AssistantMessageAdapterBase: FC<CopilotAssistantMessageProps> = ({\n message,\n isLoading,\n isGenerating,\n // These are available but not used in our current implementation:\n // isCurrentMessage,\n // onRegenerate,\n // onCopy,\n // onThumbsUp,\n // onThumbsDown,\n // markdownTagRenderers,\n // ImageRenderer,\n}) => {\n // Cache the last generative UI output so it persists after tool completion\n // CopilotKit may stop calling generativeUI() after the tool completes, but we want\n // to keep showing the tool call render with its final \"completed\" state\n const lastGenerativeUIRef = useRef<ReactNode>(null);\n\n // Extract content from the message and strip internal markers\n const rawContent = message?.content || '';\n const content = stripToolCallMarkers(rawContent);\n\n // Invoke generativeUI to get tool call render output\n // This is how CopilotKit renders custom tool call UIs from useRenderToolCall\n // IMPORTANT: Check for generative UI BEFORE showing \"Thinking...\" state\n // so that workflow progress UI is visible even when AI text hasn't arrived yet\n let generativeUIOutput: ReactNode = null;\n const msgWithUI = message as MessageWithGenerativeUI | undefined;\n if (msgWithUI && typeof msgWithUI.generativeUI === 'function') {\n try {\n const newOutput = msgWithUI.generativeUI();\n if (newOutput !== null && newOutput !== undefined) {\n generativeUIOutput = newOutput;\n // Cache the output so we can show it even after CopilotKit stops calling the function\n lastGenerativeUIRef.current = newOutput;\n }\n } catch (e) {\n console.warn('[AssistantMessageAdapter] Error rendering generativeUI:', e);\n }\n }\n\n // Fall back to cached generative UI if current call returned null\n // This keeps the tool call visible after completion\n if (!generativeUIOutput && lastGenerativeUIRef.current) {\n generativeUIOutput = lastGenerativeUIRef.current;\n }\n\n const hasGenerativeUI = generativeUIOutput !== null;\n\n // Show thinking when loading/generating and no content yet\n // Tool calls are rendered separately via RenderActionExecutionMessage/useRenderToolCall\n const showThinking = (isLoading || (isGenerating && !content)) && !hasGenerativeUI;\n\n if (showThinking) {\n return <AssistantThinking message=\"Thinking...\" />;\n }\n\n // Parse attachments if present in the message\n // TODO: Implement attachments parsing from CopilotKit message data\n const attachments: never[] = [];\n\n return (\n <>\n {/* Render generative UI (tool call renders) above the message if present */}\n {generativeUIOutput && <GenerativeUIContainer>{generativeUIOutput}</GenerativeUIContainer>}\n {/* Only render AssistantMessage if there's content */}\n {content && (\n <AssistantMessage\n content={content}\n avatarInitials=\"AI\"\n isLoading={false} // Don't show loading dots when we have content\n isStreaming={isGenerating} // Show streaming indicator while generating\n attachments={attachments}\n enableMarkdown={true}\n />\n )}\n </>\n );\n};\n\n// Memoize to prevent re-renders when parent updates but props are the same\nexport const AssistantMessageAdapter = memo(AssistantMessageAdapterBase);\n\nAssistantMessageAdapter.displayName = 'AssistantMessageAdapter';\n\n/**\n * Props for custom thinking indicator component\n */\nexport interface ThinkingIndicatorProps {\n isLoading?: boolean;\n isGenerating?: boolean;\n}\n\n/**\n * Creates a custom AssistantMessageAdapter with a custom thinking indicator\n * and an optional tool calls component that renders before the message.\n *\n * @param ThinkingIndicator - Custom component to render during loading/generating state (optional)\n * @param ToolCallsComponent - Component to render before message content, shown during loading/generating (optional)\n * @returns A memoized AssistantMessageAdapter component\n */\nexport function createAssistantMessageAdapter(\n ThinkingIndicator?: React.ComponentType<ThinkingIndicatorProps>,\n _ToolCallsComponent?: React.ComponentType // Kept for backwards compat, no longer used\n): FC<CopilotAssistantMessageProps> {\n const CustomAssistantMessageAdapter: FC<CopilotAssistantMessageProps> = ({\n message,\n isLoading,\n isGenerating,\n // isCurrentMessage and ToolCallsComponent are no longer used but kept for backwards compat\n }) => {\n // Cache the last generative UI output so it persists after tool completion\n const lastGenerativeUIRef = useRef<ReactNode>(null);\n\n // Extract content from the message and strip internal markers\n const rawContent = message?.content || '';\n const content = stripToolCallMarkers(rawContent);\n\n // Invoke generativeUI to get tool call render output\n // IMPORTANT: Check for generative UI BEFORE showing \"Thinking...\" state\n // so that workflow progress UI is visible even when AI text hasn't arrived yet\n let generativeUIOutput: ReactNode = null;\n const msgWithUI = message as MessageWithGenerativeUI | undefined;\n if (msgWithUI && typeof msgWithUI.generativeUI === 'function') {\n try {\n const newOutput = msgWithUI.generativeUI();\n if (newOutput !== null && newOutput !== undefined) {\n generativeUIOutput = newOutput;\n // Cache the output so we can show it even after CopilotKit stops calling the function\n lastGenerativeUIRef.current = newOutput;\n }\n } catch (e) {\n console.warn('[AssistantMessageAdapter] Error rendering generativeUI:', e);\n }\n }\n\n // Fall back to cached generative UI if current call returned null\n // This keeps the tool call visible after completion\n if (!generativeUIOutput && lastGenerativeUIRef.current) {\n generativeUIOutput = lastGenerativeUIRef.current;\n }\n\n const attachments: never[] = [];\n\n const hasGenerativeUI = generativeUIOutput !== null;\n\n // NOTE: ToolCallsComponent is intentionally NOT rendered here to avoid duplication.\n // Tool calls are already rendered by CopilotKit via RenderActionExecutionMessage/useRenderToolCall.\n\n // Show thinking when loading/generating and no content yet\n const showThinking = (isLoading || (isGenerating && !content)) && !hasGenerativeUI;\n\n if (showThinking) {\n return (\n <>\n {ThinkingIndicator ? (\n <ThinkingIndicator isLoading={isLoading} isGenerating={isGenerating} />\n ) : (\n <AssistantThinking message=\"Thinking...\" />\n )}\n </>\n );\n }\n\n // Once we have content, show message (tool calls rendered separately via RenderActionExecutionMessage)\n return (\n <>\n {generativeUIOutput && <GenerativeUIContainer>{generativeUIOutput}</GenerativeUIContainer>}\n {content && (\n <AssistantMessage\n content={content}\n avatarInitials=\"AI\"\n isLoading={false}\n isStreaming={isGenerating}\n attachments={attachments}\n enableMarkdown={true}\n />\n )}\n </>\n );\n };\n\n CustomAssistantMessageAdapter.displayName = 'CustomAssistantMessageAdapter';\n return memo(CustomAssistantMessageAdapter);\n}\n\n/**\n * Creates a custom AssistantMessageAdapter with error detection and reporting.\n * When an error is detected in the message, a \"Report Issue\" button is shown.\n *\n * @param onReportIssue - Callback fired when user clicks \"Report Issue\" button\n * @param ThinkingIndicator - Custom component to render during loading/generating state (optional)\n * @param ToolCallsComponent - Component to render before message content, shown during loading/generating (optional)\n * @returns A memoized AssistantMessageAdapter component with error reporting\n */\nexport function createAssistantMessageAdapterWithErrorReporting(\n onReportIssue?: ReportIssueCallback,\n ThinkingIndicator?: React.ComponentType<ThinkingIndicatorProps>,\n _ToolCallsComponent?: React.ComponentType // Kept for backwards compat, no longer used\n): FC<CopilotAssistantMessageProps> {\n const ErrorReportingAssistantMessageAdapter: FC<CopilotAssistantMessageProps> = ({\n message,\n isLoading,\n isGenerating,\n // isCurrentMessage and ToolCallsComponent are no longer used but kept for backwards compat\n }) => {\n // Cache the last generative UI output so it persists after tool completion\n const lastGenerativeUIRef = useRef<ReactNode>(null);\n\n // Access conversation history for error context\n const { visibleMessages } = useCopilotChat();\n\n // Extract content from the message and strip internal markers\n const rawContent = message?.content || '';\n const content = stripToolCallMarkers(rawContent);\n\n // Detect errors in the message content\n const errorContext = useMemo(() => detectErrorInMessage(content), [content]);\n\n // Build chat snippet including conversation history\n const chatSnippet = useMemo(() => {\n if (!errorContext.hasError) return '';\n // Cast visibleMessages to our simplified type for building snippet\n return buildChatSnippet(visibleMessages as CopilotMessage[], content);\n }, [visibleMessages, content, errorContext.hasError]);\n\n // Build action buttons - add \"Report Issue\" if error detected and callback provided\n const actions: ActionButtonType[] = useMemo(() => {\n // Only show report button for completed messages with errors (not while streaming)\n if (!errorContext.hasError || !onReportIssue || isGenerating) {\n return [];\n }\n\n return [\n {\n label: 'Report Issue',\n onClick: () => {\n onReportIssue({\n errorCategory: errorContext.category,\n correlationId: errorContext.correlationId,\n // Include conversation history leading to the error\n chatSnippet,\n });\n },\n icon: (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n ),\n },\n ];\n }, [errorContext, chatSnippet, isGenerating]);\n\n // Invoke generativeUI to get tool call render output\n // IMPORTANT: Check for generative UI BEFORE showing \"Thinking...\" state\n // so that workflow progress UI is visible even when AI text hasn't arrived yet\n let generativeUIOutput: ReactNode = null;\n const msgWithUI = message as MessageWithGenerativeUI | undefined;\n\n if (msgWithUI && typeof msgWithUI.generativeUI === 'function') {\n try {\n const newOutput = msgWithUI.generativeUI();\n if (newOutput !== null && newOutput !== undefined) {\n generativeUIOutput = newOutput;\n // Cache the output so we can show it even after CopilotKit stops calling the function\n lastGenerativeUIRef.current = newOutput;\n }\n } catch (e) {\n console.warn('[AssistantMessageAdapter] Error rendering generativeUI:', e);\n }\n }\n\n // Fall back to cached generative UI if current call returned null\n // This keeps the tool call visible after completion\n if (!generativeUIOutput && lastGenerativeUIRef.current) {\n generativeUIOutput = lastGenerativeUIRef.current;\n }\n\n const attachments: never[] = [];\n\n const hasGenerativeUI = generativeUIOutput !== null;\n\n // NOTE: ToolCallsComponent is intentionally NOT rendered here to avoid duplication.\n // Tool calls are already rendered by CopilotKit via RenderActionExecutionMessage/useRenderToolCall.\n\n // Show thinking when loading/generating and no content yet\n const showThinking = (isLoading || (isGenerating && !content)) && !hasGenerativeUI;\n\n if (showThinking) {\n return (\n <>\n {ThinkingIndicator ? (\n <ThinkingIndicator isLoading={isLoading} isGenerating={isGenerating} />\n ) : (\n <AssistantThinking message=\"Thinking...\" />\n )}\n </>\n );\n }\n\n // Once we have content, show message (tool calls rendered separately via RenderActionExecutionMessage)\n return (\n <>\n {generativeUIOutput && <GenerativeUIContainer>{generativeUIOutput}</GenerativeUIContainer>}\n {content && (\n <AssistantMessage\n content={content}\n avatarInitials=\"AI\"\n isLoading={false}\n isStreaming={isGenerating}\n attachments={attachments}\n enableMarkdown={true}\n actions={actions}\n />\n )}\n </>\n );\n };\n\n ErrorReportingAssistantMessageAdapter.displayName = 'ErrorReportingAssistantMessageAdapter';\n return memo(ErrorReportingAssistantMessageAdapter);\n}\n","import styled from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\n/**\n * Main container for the chat input component with dark theme\n * Matches header style with backdrop blur\n */\nexport const ChatInputContainer = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n padding: ${tokens.spacing.sm};\n background-color: ${tokens.colors.backdrop};\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-radius: ${tokens.borderRadius.none};\n box-shadow: ${tokens.shadows.none};\n box-sizing: border-box;\n\n @media (min-width: ${tokens.breakpoints.mobile}px) {\n padding: ${tokens.spacing.md};\n }\n`;\n\n/**\n * Container for suggestion buttons - horizontal layout with wrapping\n */\nexport const SuggestionsWrapper = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: ${tokens.spacing.sm};\n margin-bottom: ${tokens.spacing.md};\n width: 100%;\n box-sizing: border-box;\n`;\n\n/**\n * Minimal pill-shaped suggestion button - Dark theme\n */\nexport const SuggestionButton = styled.button`\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: 13px;\n font-weight: ${tokens.typography.fontWeight.regular};\n text-align: center;\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.full};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n white-space: nowrap;\n\n /* Dark theme colors */\n background-color: ${tokens.colors.surface.base};\n color: ${tokens.colors.text.secondary};\n\n /* Hover state */\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.elevated};\n border-color: ${tokens.colors.border.hover};\n }\n\n /* Active state */\n &:active:not(:disabled) {\n background-color: ${tokens.colors.background.light};\n }\n\n /* Focus state */\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.4;\n }\n`;\n\n/**\n * Input wrapper with dark theme\n */\nexport const InputWrapper = styled.div`\n display: flex;\n align-items: flex-end; /* Align button to bottom when textarea expands */\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: rgba(25, 25, 25, 0.4);\n border: 1px solid ${tokens.colors.border.subtle};\n border-radius: ${tokens.borderRadius.lg};\n transition: all ${tokens.transitions.normal};\n width: 100%;\n box-sizing: border-box;\n\n &:focus-within {\n /* Subtle focus indication without bold colored border */\n border-color: ${tokens.colors.border.hover};\n background-color: rgba(50, 50, 52, 0.6);\n }\n`;\n\n/**\n * Text input field - Dark theme (textarea for multiline support)\n */\nexport const InputField = styled.textarea`\n flex: 1;\n border: none;\n outline: none;\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.secondary};\n background: transparent;\n resize: none; /* Disable manual resize, we auto-resize */\n min-height: 24px; /* Single line height */\n max-height: 150px; /* Max ~6 lines before scrolling */\n overflow-y: auto;\n line-height: 1.5;\n padding: 0;\n margin: 0;\n\n &::placeholder {\n color: ${tokens.colors.text.tertiary};\n }\n\n &:disabled {\n color: ${tokens.colors.text.tertiary};\n cursor: not-allowed;\n }\n`;\n\n/**\n * Circular submit button with arrow icon\n */\ninterface SubmitButtonProps {\n disabled?: boolean;\n}\n\nexport const SubmitButton = styled.button<SubmitButtonProps>`\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: none;\n border-radius: ${tokens.borderRadius.full};\n background-color: ${(props) => (props.disabled ? tokens.colors.surface.elevated : tokens.colors.accent)};\n color: ${(props) => (props.disabled ? tokens.colors.text.tertiary : tokens.colors.text.primary)};\n cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n transition: all ${tokens.transitions.normal};\n flex-shrink: 0;\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.status.running};\n transform: scale(1.05);\n }\n\n &:active:not(:disabled) {\n transform: scale(0.98);\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.accent};\n outline-offset: 2px;\n }\n\n svg {\n width: 18px;\n height: 18px;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type { AriaTextFieldProps } from '@react-aria/textfield';\nimport React, { type KeyboardEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport {\n ChatInputContainer,\n InputField,\n InputWrapper,\n SubmitButton,\n SuggestionButton,\n SuggestionsWrapper,\n} from './ChatInput.styles';\n\nexport interface Suggestion {\n /** The text content of the suggestion */\n text: string;\n}\n\nexport interface ChatInputProps extends Omit<AriaTextFieldProps, 'onChange'> {\n /** Array of suggestion items to display above the input */\n suggestions?: Suggestion[];\n /** Callback when a suggestion is selected */\n onSuggestionSelect?: (suggestion: string) => void;\n /** Current message value */\n value?: string;\n /** Callback when message value changes */\n onChange?: (value: string) => void;\n /** Callback when message is submitted */\n onSubmit?: (message: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n isDisabled?: boolean;\n /** Whether the input is read-only */\n isReadOnly?: boolean;\n /** Whether to auto-focus the input */\n autoFocus?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** ARIA label for the input */\n 'aria-label'?: string;\n}\n\n/**\n * ChatInput component with minimal pill-shaped suggestion buttons\n *\n * Features:\n * - Horizontal pill-shaped suggestion buttons with minimal design\n * - Auto-expanding multiline input (up to ~6 lines, then scrolls)\n * - Enter to submit, Shift+Enter for new line\n * - React ARIA for accessibility\n * - Keyboard navigation support\n * - Clean, modern design matching vendor image\n *\n * @example\n * ```tsx\n * <ChatInput\n * suggestions={[\n * { text: \"Create in-depth analysis\" },\n * { text: \"Identify actionable tasks\" }\n * ]}\n * placeholder=\"Ask, write or search for anything...\"\n * onSubmit={(message) => console.log(message)}\n * onSuggestionSelect={(suggestion) => console.log(suggestion)}\n * />\n * ```\n */\nexport const ChatInput: React.FC<ChatInputProps> = ({\n suggestions = [],\n onSuggestionSelect,\n value = '',\n onChange,\n onSubmit,\n placeholder = 'Ask, write or search for anything...',\n isDisabled = false,\n isReadOnly = false,\n autoFocus = false,\n className,\n 'aria-label': ariaLabel = 'Chat message input',\n // Note: Additional AriaTextFieldProps are accepted but not spread to textarea\n // since useTextField is not compatible with textarea elements\n}) => {\n const [internalValue, setInternalValue] = useState(value);\n const inputRef = useRef<HTMLTextAreaElement>(null);\n\n // Use controlled value if provided, otherwise use internal state\n const currentValue = value !== undefined ? value : internalValue;\n const setValue = onChange || setInternalValue;\n\n // Auto-resize textarea based on content\n const autoResize = useCallback(() => {\n const textarea = inputRef.current;\n if (textarea) {\n // Reset height to auto to get the correct scrollHeight\n textarea.style.height = 'auto';\n // Set height to scrollHeight (capped by max-height in CSS)\n textarea.style.height = `${textarea.scrollHeight}px`;\n }\n }, []);\n\n // Resize on value change\n useEffect(() => {\n autoResize();\n }, [currentValue, autoResize]);\n\n // Note: useTextField is not compatible with textarea, so we handle accessibility manually\n // The aria-label and other accessibility props are passed directly to the InputField\n\n // Direct onChange handler as backup\n const handleDirectChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setValue(e.target.value);\n };\n\n // Handle keyboard events\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift for new line)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n // Handle submit\n const handleSubmit = () => {\n if (currentValue.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(currentValue.trim());\n setValue('');\n // Reset textarea height after clearing\n if (inputRef.current) {\n inputRef.current.style.height = 'auto';\n }\n }\n };\n\n // Handle suggestion selection\n const handleSuggestionClick = (suggestionText: string) => {\n if (onSuggestionSelect && !isDisabled && !isReadOnly) {\n onSuggestionSelect(suggestionText);\n }\n };\n\n const canSubmit = currentValue.trim().length > 0 && !isDisabled && !isReadOnly;\n\n return (\n <ChatInputContainer className={className}>\n {/* Suggestions */}\n {suggestions.length > 0 && (\n <SuggestionsWrapper role=\"list\" aria-label=\"Suggested prompts\">\n {suggestions.map((suggestion, index) => (\n <SuggestionButtonComponent\n key={`${suggestion.text}-${index}`}\n suggestion={suggestion}\n onSelect={handleSuggestionClick}\n isDisabled={isDisabled || isReadOnly}\n />\n ))}\n </SuggestionsWrapper>\n )}\n\n {/* Input field */}\n <InputWrapper>\n <InputField\n ref={inputRef}\n aria-label={ariaLabel}\n placeholder={placeholder}\n onKeyDown={handleKeyDown}\n onChange={handleDirectChange}\n autoFocus={autoFocus}\n disabled={isDisabled}\n readOnly={isReadOnly}\n value={currentValue}\n rows={1}\n />\n <SubmitButtonComponent\n onPress={handleSubmit}\n isDisabled={!canSubmit}\n ariaLabel=\"Send message\"\n />\n </InputWrapper>\n </ChatInputContainer>\n );\n};\n\n/**\n * Individual suggestion button component\n */\ninterface SuggestionButtonComponentProps {\n suggestion: Suggestion;\n onSelect: (text: string) => void;\n isDisabled?: boolean;\n}\n\nconst SuggestionButtonComponent: React.FC<SuggestionButtonComponentProps> = ({\n suggestion,\n onSelect,\n isDisabled = false,\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n onPress: () => onSelect(suggestion.text),\n isDisabled,\n 'aria-label': `Select suggestion: ${suggestion.text}`,\n },\n ref\n );\n\n return (\n <SuggestionButton {...buttonProps} ref={ref} role=\"listitem\">\n {suggestion.text}\n </SuggestionButton>\n );\n};\n\n/**\n * Submit button component with arrow icon\n */\ninterface SubmitButtonComponentProps {\n onPress: () => void;\n isDisabled?: boolean;\n ariaLabel?: string;\n}\n\nconst SubmitButtonComponent: React.FC<SubmitButtonComponentProps> = ({\n onPress,\n isDisabled = false,\n ariaLabel = 'Send message',\n}) => {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps } = useButton(\n {\n onPress,\n isDisabled,\n 'aria-label': ariaLabel,\n },\n ref\n );\n\n return (\n <SubmitButton {...buttonProps} ref={ref} disabled={isDisabled} title={ariaLabel}>\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Arrow Right Icon</title>\n <path\n d=\"M4 10H16M16 10L10 4M16 10L10 16\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </SubmitButton>\n );\n};\n\nChatInput.displayName = 'ChatInput';\n","/**\n * Adapter component that bridges custom Input with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's InputProps to our custom component props\n * 2. Handles the onSend callback to work with CopilotKit's message system\n * 3. Manages input state and submission\n */\n\nimport type { InputProps as CopilotInputProps } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport { useState } from 'react';\nimport { ChatInput } from '../../ChatInput/ChatInput';\n\n/**\n * Adapter that converts CopilotKit's InputProps to our custom component\n */\nexport const InputAdapter: React.FC<CopilotInputProps> = ({\n inProgress,\n onSend,\n isVisible: _isVisible = true,\n}) => {\n const [value, setValue] = useState('');\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleSubmit = async (message: string) => {\n if (!message.trim()) {\n console.log('[InputAdapter] handleSubmit: empty message, ignoring');\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n // Call CopilotKit's onSend which returns a Promise<Message>\n await onSend(message);\n setValue(''); // Clear input after sending\n } catch (error) {\n console.error('[InputAdapter] Error sending message:', error);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleSuggestionSelect = async (suggestion: string) => {\n // Directly call onSend with the suggestion text without setting value first\n // This avoids potential race conditions and ensures the message is sent\n if (!suggestion.trim()) {\n return;\n }\n\n if (inProgress || isSubmitting) {\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n await onSend(suggestion);\n // Don't set value since we're submitting directly\n } catch (error) {\n console.error('[InputAdapter] Error sending suggestion:', error);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n // TODO: Add support for stop button and file upload if needed\n const shouldDisableInput = isSubmitting;\n\n return (\n <ChatInput\n value={value}\n onChange={setValue}\n onSubmit={handleSubmit}\n placeholder=\"Ask, write or search for anything...\"\n isDisabled={shouldDisableInput}\n autoFocus={false}\n aria-label=\"Chat message input\"\n suggestions={[{ text: 'Explore workflows' }]}\n onSuggestionSelect={handleSuggestionSelect}\n />\n );\n};\n\nInputAdapter.displayName = 'InputAdapter';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\ninterface StyledUserMessageProps {\n $isPressed: boolean;\n}\n\nexport const StyledUserMessage = styled.button<StyledUserMessageProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.md} ${tokens.spacing.xl};\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.regular};\n line-height: ${tokens.typography.lineHeight.normal};\n border: none;\n cursor: default;\n user-select: none;\n white-space: pre-wrap;\n word-wrap: break-word;\n word-break: break-word;\n position: relative;\n text-align: left;\n\n /* Force override CopilotKit's default user message styles */\n && {\n background: ${tokens.colors.message.user} !important;\n color: ${tokens.colors.text.primary} !important;\n border-radius: ${tokens.borderRadius['2xl']} !important; /* Rounded corners that work for multi-line */\n }\n\n /* Subtle shadow and glow effect */\n box-shadow: ${tokens.shadows.glow.secondary};\n\n /* Smooth transitions */\n transition: all ${tokens.transitions.normal};\n\n /* Speech bubble tail - matches bubble background */\n &::after {\n content: '';\n position: absolute;\n bottom: -6px;\n right: ${tokens.spacing.md};\n width: 14px;\n height: 14px;\n background: ${tokens.colors.message.user} !important;\n transform: rotate(45deg);\n border-radius: 0 0 ${tokens.borderRadius.sm} 0;\n clip-path: polygon(0 0, 100% 100%, 0 100%);\n box-shadow: ${tokens.shadows.sm};\n transition: all ${tokens.transitions.normal};\n z-index: -1;\n }\n\n /* Hover state - only for button elements */\n &[role=\"button\"]:hover:not(:disabled) {\n transform: translateY(-1px);\n cursor: pointer;\n box-shadow: ${tokens.shadows.lg};\n\n &::after {\n box-shadow: ${tokens.shadows.md};\n }\n }\n\n /* Active/Pressed state - only for button elements */\n &[role=\"button\"]:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: ${tokens.shadows.sm};\n\n &::after {\n box-shadow: ${tokens.shadows.sm};\n }\n }\n\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: translateY(0) scale(0.98);\n box-shadow: ${tokens.shadows.sm};\n\n &::after {\n box-shadow: ${tokens.shadows.sm};\n }\n `}\n\n /* Focus state for accessibility */\n &:focus {\n outline: none;\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.secondary};\n outline-offset: 3px;\n box-shadow: ${tokens.shadows.lg};\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n box-shadow: ${tokens.shadows.none};\n\n &::after {\n opacity: 0.5;\n box-shadow: ${tokens.shadows.none};\n }\n }\n`;\n","import type { AriaButtonProps } from '@react-aria/button';\nimport { useButton } from '@react-aria/button';\nimport { memo, useRef, type ReactNode } from 'react';\nimport { StyledUserMessage } from './UserMessage.styles';\n\nexport interface UserMessageProps extends AriaButtonProps {\n /**\n * The message text to display\n */\n children: ReactNode;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * Whether the message is in a pressed state\n */\n isPressed?: boolean;\n /**\n * Optional click handler\n */\n onPress?: () => void;\n}\n\n/**\n * UserMessage component - Displays a user message in a gradient pill\n *\n * This component renders a user message with a purple-to-blue gradient background,\n * pill-shaped design with fully rounded ends, and white text. It uses React ARIA\n * for accessibility and supports keyboard navigation.\n *\n * Memoized to prevent unnecessary re-renders during parent updates.\n *\n * @example\n * ```tsx\n * <UserMessage onPress={() => console.log('clicked')}>\n * Can you export this as a CSV?\n * </UserMessage>\n * ```\n */\nfunction UserMessageBase({\n children,\n className,\n isPressed = false,\n onPress,\n ...ariaProps\n}: UserMessageProps) {\n const ref = useRef<HTMLButtonElement>(null);\n\n // If no onPress handler, render as non-interactive div\n if (!onPress) {\n return (\n <StyledUserMessage as=\"div\" className={className} $isPressed={isPressed} role=\"presentation\">\n {children}\n </StyledUserMessage>\n );\n }\n\n // Otherwise render as interactive button with React ARIA\n const { buttonProps, isPressed: ariaPressedState } = useButton(\n {\n ...ariaProps,\n onPress,\n },\n ref\n );\n\n return (\n <StyledUserMessage\n {...buttonProps}\n ref={ref}\n className={className}\n $isPressed={isPressed || ariaPressedState}\n role=\"button\"\n tabIndex={0}\n >\n {children}\n </StyledUserMessage>\n );\n}\n\n// Memoize to prevent re-renders when parent updates but props are the same\nexport const UserMessage = memo(UserMessageBase);\n\nUserMessage.displayName = 'UserMessage';\n","/**\n * Adapter component that bridges custom UserMessage with CopilotKit's expected interface\n *\n * This adapter:\n * 1. Converts CopilotKit's UserMessageProps to our custom component props\n * 2. Extracts message content from CopilotKit's message object\n * 3. Handles image messages appropriately\n */\n\nimport type { UserMessageProps as CopilotUserMessageProps } from '@copilotkit/react-ui';\nimport { memo, type FC } from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { UserMessage } from '../../UserMessage/UserMessage';\n\n// Wrapper to align user messages to the right\nconst UserMessageWrapper = styled.div`\n display: flex;\n justify-content: flex-end;\n width: 100%;\n padding: ${tokens.spacing.sm} 0;\n /* Performance optimization - isolate layout/paint */\n contain: content;\n`;\n\n/**\n * Adapter that converts CopilotKit's UserMessageProps to our custom component\n * Memoized to prevent re-renders when props haven't changed.\n */\nconst UserMessageAdapterBase: FC<CopilotUserMessageProps> = ({\n message,\n ImageRenderer,\n}) => {\n // Handle image messages\n if (message?.image) {\n return <ImageRenderer image={message.image} content={message.content} />;\n }\n\n // Extract text content\n const content = message?.content || '';\n\n // Our UserMessage is a button-like component with React ARIA\n // In the chat context, it's not interactive, so we don't provide onPress\n return (\n <UserMessageWrapper>\n <UserMessage>{content}</UserMessage>\n </UserMessageWrapper>\n );\n};\n\n// Memoize to prevent re-renders when parent updates but props are the same\nexport const UserMessageAdapter = memo(UserMessageAdapterBase);\n\nUserMessageAdapter.displayName = 'UserMessageAdapter';\n","/**\n * StreamStatusIndicator Component\n *\n * Displays connection status for streaming chat (SSE).\n *\n * @see specs/015-restyle-ai-chat/spec.md\n */\n\nimport type React from 'react';\nimport styled, { keyframes } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\nconst pulse = keyframes`\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.6;\n transform: scale(1.1);\n }\n`;\n\nconst Container = styled.div<{ size: 'sm' | 'md' | 'lg' }>`\n display: inline-flex;\n align-items: center;\n gap: ${(props) => {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.xs;\n }\n }};\n font-family: ${tokens.typography.fontFamily.primary};\n`;\n\nconst StatusDot = styled.div<{\n status: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n size: 'sm' | 'md' | 'lg';\n variant: 'dot' | 'badge';\n}>`\n width: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.borderRadius.lg;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }};\n height: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.borderRadius.lg;\n case 'md':\n default:\n return tokens.spacing.sm;\n }\n }};\n border-radius: ${tokens.borderRadius.full};\n background-color: ${(props) => {\n switch (props.status) {\n case 'connected':\n return tokens.colors.connection.connected;\n case 'streaming':\n return tokens.colors.connection.streaming;\n case 'disconnected':\n return tokens.colors.connection.disconnected;\n case 'reconnecting':\n return tokens.colors.connection.reconnecting;\n }\n }};\n animation: ${(props) => (props.status === 'streaming' ? pulse : 'none')} 2s ease-in-out infinite;\n flex-shrink: 0;\n`;\n\nconst Label = styled.span<{ size: 'sm' | 'md' | 'lg'; variant: 'dot' | 'badge' }>`\n font-size: ${(props) => {\n if (props.variant === 'badge') {\n switch (props.size) {\n case 'sm':\n return tokens.typography.fontSize.xs;\n case 'lg':\n return tokens.typography.fontSize.base;\n case 'md':\n default:\n return tokens.typography.fontSize.sm;\n }\n }\n switch (props.size) {\n case 'sm':\n return tokens.typography.fontSize.xs;\n case 'lg':\n return tokens.typography.fontSize.base;\n case 'md':\n default:\n return tokens.typography.fontSize.sm;\n }\n }};\n font-weight: ${(props) => (props.variant === 'badge' ? tokens.typography.fontWeight.medium : tokens.typography.fontWeight.regular)};\n color: ${tokens.colors.text.secondary};\n line-height: ${tokens.typography.lineHeight.tight};\n`;\n\nconst BadgeContainer = styled.div<{ size: 'sm' | 'md' | 'lg' }>`\n display: inline-flex;\n align-items: center;\n gap: ${(props) => {\n switch (props.size) {\n case 'sm':\n return tokens.spacing.xs;\n case 'lg':\n return tokens.spacing.sm;\n case 'md':\n default:\n return tokens.spacing.xs;\n }\n }};\n padding: ${(props) => {\n switch (props.size) {\n case 'sm':\n return `${tokens.spacing.xs} ${tokens.spacing.sm}`;\n case 'lg':\n return `${tokens.spacing.sm} ${tokens.spacing.md}`;\n case 'md':\n default:\n return `${tokens.spacing.xs} ${tokens.spacing.sm}`;\n }\n }};\n background-color: ${tokens.colors.surface.overlay};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${(props) => {\n switch (props.size) {\n case 'sm':\n return tokens.borderRadius.sm;\n case 'lg':\n return tokens.borderRadius.md;\n case 'md':\n default:\n return tokens.borderRadius.md;\n }\n }};\n`;\n\nexport interface StreamStatusIndicatorProps {\n /** Connection status */\n status: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n /** Visual variant */\n variant?: 'dot' | 'badge';\n /** Size of the indicator */\n size?: 'sm' | 'md' | 'lg';\n /** Whether to show text label */\n showLabel?: boolean;\n /** Custom className */\n className?: string;\n}\n\nconst getStatusLabel = (status: StreamStatusIndicatorProps['status']): string => {\n switch (status) {\n case 'connected':\n return 'Connected';\n case 'streaming':\n return 'Streaming';\n case 'disconnected':\n return 'Disconnected';\n case 'reconnecting':\n return 'Reconnecting...';\n }\n};\n\n/**\n * StreamStatusIndicator component for showing connection status\n *\n * Features:\n * - Visual status indicators (connected/streaming/disconnected/reconnecting)\n * - Color-coded status (green/blue/red/yellow)\n * - Pulsing animation for streaming state\n * - Dot and badge variants\n * - Size options (sm/md/lg)\n * - Optional text labels\n */\nexport const StreamStatusIndicator: React.FC<StreamStatusIndicatorProps> = ({\n status,\n variant = 'dot',\n size = 'md',\n showLabel = false,\n className,\n}) => {\n const content = (\n <>\n <StatusDot status={status} size={size} variant={variant} aria-hidden=\"true\" />\n {showLabel && (\n <Label size={size} variant={variant}>\n {getStatusLabel(status)}\n </Label>\n )}\n </>\n );\n\n if (variant === 'badge') {\n return (\n <BadgeContainer\n size={size}\n className={className}\n role=\"status\"\n aria-label={getStatusLabel(status)}\n >\n {content}\n </BadgeContainer>\n );\n }\n\n return (\n <Container size={size} className={className} role=\"status\" aria-label={getStatusLabel(status)}>\n {content}\n </Container>\n );\n};\n\nStreamStatusIndicator.displayName = 'StreamStatusIndicator';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const HeaderContainer = styled.header`\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n background-color: ${tokens.colors.backdrop};\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n border-bottom: 1px solid ${tokens.colors.border.default};\n min-height: 44px;\n box-sizing: border-box;\n\n @media (min-width: ${tokens.breakpoints.mobile}px) {\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n }\n`;\n\nexport const HeaderContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.xs};\n flex: 1;\n min-width: 0;\n`;\n\nexport const HeaderTitle = styled.h1`\n margin: 0;\n font-size: ${tokens.typography.fontSize.base};\n font-weight: ${tokens.typography.fontWeight.semibold};\n color: ${tokens.colors.text.primary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.normal};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const HeaderSubtitle = styled.p`\n margin: 0;\n font-size: ${tokens.typography.fontSize.sm};\n color: ${tokens.colors.text.secondary};\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport const HeaderActions = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n margin-left: ${tokens.spacing.md};\n`;\n\nexport const ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n padding: 0;\n background-color: transparent;\n border: none;\n border-radius: ${tokens.borderRadius.md};\n color: ${tokens.colors.text.primary};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlay};\n }\n\n &:active:not(:disabled) {\n transform: scale(0.95);\n background-color: ${tokens.colors.surface.overlayActive};\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n\n &:disabled {\n cursor: not-allowed;\n opacity: 0.3;\n }\n\n svg {\n width: ${tokens.spacing.md};\n height: ${tokens.spacing.md};\n display: block;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport type React from 'react';\nimport { useRef } from 'react';\nimport { tokens } from '../../../theme/tokens';\nimport { StreamStatusIndicator } from '../StreamStatusIndicator';\nimport {\n ActionButton,\n HeaderActions,\n HeaderContainer,\n HeaderContent,\n HeaderSubtitle,\n HeaderTitle,\n} from './Header.styles';\n\nexport interface HeaderProps {\n /**\n * The main title text displayed in the header\n */\n title: string;\n\n /**\n * Optional subtitle text displayed below the title\n */\n subtitle?: string;\n\n /**\n * Optional stream status indicator (connected/streaming/disconnected/reconnecting)\n * When provided, displays a StreamStatusIndicator next to the title\n */\n streamStatus?: 'connected' | 'streaming' | 'disconnected' | 'reconnecting';\n\n /**\n * Callback function triggered when the close button is clicked\n */\n onClose?: () => void;\n\n /**\n * Callback function triggered when the minimize button is clicked\n */\n onMinimize?: () => void;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n}\n\n/**\n * Header Component\n *\n * A chat header component that displays a title, optional subtitle, and action buttons.\n * Built with React ARIA for accessibility and Styled Components for theming.\n *\n * @example\n * ```tsx\n * <Header\n * title=\"AI Assistant\"\n * subtitle=\"How can I help you today?\"\n * onClose={() => console.log('Close clicked')}\n * onMinimize={() => console.log('Minimize clicked')}\n * />\n * ```\n */\nexport const Header: React.FC<HeaderProps> = ({\n title,\n subtitle,\n streamStatus,\n onClose,\n onMinimize,\n className,\n}) => {\n const minimizeRef = useRef<HTMLButtonElement>(null);\n const closeRef = useRef<HTMLButtonElement>(null);\n\n const { buttonProps: minimizeProps } = useButton(\n {\n onPress: onMinimize,\n 'aria-label': 'Minimize',\n isDisabled: !onMinimize,\n },\n minimizeRef\n );\n\n const { buttonProps: closeProps } = useButton(\n {\n onPress: onClose,\n 'aria-label': 'Close',\n isDisabled: !onClose,\n },\n closeRef\n );\n\n return (\n <HeaderContainer className={className}>\n <HeaderContent>\n <div style={{ display: 'flex', alignItems: 'center', gap: tokens.spacing.sm }}>\n <HeaderTitle>{title}</HeaderTitle>\n {streamStatus && (\n <StreamStatusIndicator\n status={streamStatus}\n variant=\"badge\"\n size=\"sm\"\n showLabel={streamStatus === 'streaming' || streamStatus === 'reconnecting'}\n />\n )}\n </div>\n {subtitle && <HeaderSubtitle>{subtitle}</HeaderSubtitle>}\n </HeaderContent>\n\n <HeaderActions>\n {onMinimize && (\n <ActionButton ref={minimizeRef} {...minimizeProps} data-action=\"minimize\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <title>Minimize</title>\n <line x1=\"3\" y1=\"8\" x2=\"13\" y2=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </ActionButton>\n )}\n\n {onClose && (\n <ActionButton ref={closeRef} {...closeProps} data-action=\"close\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <title>Close</title>\n <line x1=\"4\" y1=\"4\" x2=\"12\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <line x1=\"12\" y1=\"4\" x2=\"4\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"2\" />\n </svg>\n </ActionButton>\n )}\n </HeaderActions>\n </HeaderContainer>\n );\n};\n\nHeader.displayName = 'Header';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n/**\n * Styled container for the messages area\n * Provides flexible layout and responsive spacing\n */\nexport const MessagesContainer = styled.div`\n display: flex;\n flex-direction: column;\n flex: 1;\n overflow: hidden;\n /* Gradient background - brand aligned */\n background: linear-gradient(\n to right bottom,\n ${tokens.colors.background.dark},\n ${tokens.colors.background.darker},\n ${tokens.colors.background.darkest}\n );\n /* Minimal horizontal padding to maximize message width */\n padding: ${tokens.spacing.sm} ${tokens.spacing.xs};\n gap: ${tokens.spacing.sm};\n box-sizing: border-box;\n\n /* Ensure proper scrolling behavior for child components */\n position: relative;\n min-height: 0;\n`;\n","import type React from 'react';\nimport { MessagesContainer } from './Messages.styles';\n\nexport interface MessagesProps {\n /**\n * Children elements to be rendered inside the messages container\n */\n children?: React.ReactNode;\n /**\n * Additional CSS class name\n */\n className?: string;\n /**\n * ARIA label for accessibility\n */\n ariaLabel?: string;\n}\n\n/**\n * Messages component - Container for message list\n *\n * This component serves as a wrapper for the messages area,\n * providing consistent spacing and layout for chat messages.\n *\n * @example\n * ```tsx\n * <Messages ariaLabel=\"Chat messages\">\n * <MessagesList messages={messages} />\n * </Messages>\n * ```\n */\nexport const Messages: React.FC<MessagesProps> = ({\n children,\n className,\n ariaLabel = 'Messages',\n}) => {\n return (\n <MessagesContainer className={className} role=\"region\" aria-label={ariaLabel}>\n {children}\n </MessagesContainer>\n );\n};\n\nMessages.displayName = 'Messages';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\ninterface WindowContainerProps {\n $isMinimized: boolean;\n $isFullscreen: boolean;\n $width: string;\n $height: string;\n}\n\nexport const WindowContainer = styled.div<WindowContainerProps>`\n display: flex;\n flex-direction: column;\n /* Glassmorphism effect */\n background: transparent;\n backdrop-filter: blur(3.8px);\n -webkit-backdrop-filter: blur(3.8px);\n border: 1px solid ${tokens.colors.surface.glassBorder};\n border-radius: ${tokens.borderRadius.xl};\n box-shadow: ${tokens.shadows.lg};\n overflow: hidden;\n transition: all ${tokens.animation.duration.short} ${tokens.animation.easing.smooth};\n position: relative;\n\n /* Default dimensions */\n width: ${({ $width }) => $width};\n height: ${({ $height }) => $height};\n\n /* Fullscreen state */\n ${({ $isFullscreen }) =>\n $isFullscreen &&\n css`\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n box-shadow: none;\n position: fixed;\n top: 0;\n left: 0;\n z-index: ${tokens.zIndex.modal};\n `}\n\n /* Minimized state */\n ${({ $isMinimized }) =>\n $isMinimized &&\n css`\n height: 60px;\n width: 300px;\n box-shadow: ${tokens.shadows.sm};\n cursor: pointer;\n\n /* Hide all content except header when minimized */\n > *:not(:first-child) {\n display: none;\n }\n\n /* Keep header visible but adjust styling */\n > *:first-child {\n border-bottom: none;\n }\n `}\n\n /* Responsive behavior for smaller screens */\n @media (max-width: ${tokens.breakpoints.tablet}px) {\n ${({ $isFullscreen, $isMinimized }) =>\n !$isFullscreen &&\n !$isMinimized &&\n css`\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n max-width: 100%;\n max-height: 100%;\n `}\n }\n\n /* Focus states for accessibility */\n &:focus-visible {\n outline: 2px solid ${tokens.colors.primary};\n outline-offset: 2px;\n }\n\n /* Ensure proper stacking context */\n z-index: ${({ $isFullscreen }) => ($isFullscreen ? tokens.zIndex.modal : tokens.zIndex.fixed)};\n`;\n","import type React from 'react';\nimport { WindowContainer } from './Window.styles';\n\nexport interface WindowProps {\n /**\n * Whether the window is minimized to a small bar\n */\n isMinimized?: boolean;\n\n /**\n * Whether the window is fullscreen (100vw x 100vh)\n */\n isFullscreen?: boolean;\n\n /**\n * Custom width for the window (e.g., \"400px\", \"50vw\")\n * @default \"400px\"\n */\n width?: string;\n\n /**\n * Custom height for the window (e.g., \"600px\", \"80vh\")\n * @default \"600px\"\n */\n height?: string;\n\n /**\n * Children elements to be rendered inside the window\n */\n children: React.ReactNode;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n\n /**\n * ARIA label for the window\n */\n ariaLabel?: string;\n}\n\n/**\n * Window Component\n *\n * Main container/window wrapper for the CopilotKit chat interface.\n * This component holds the Header, Messages, Input, and Footer components.\n *\n * Features:\n * - Default: 400px width x 600px height with rounded corners and shadow\n * - Minimized: Collapsed to a small bar\n * - Fullscreen: Takes full viewport (100vw x 100vh)\n * - Smooth transitions between states\n * - Customizable dimensions via width/height props\n *\n * @example\n * ```tsx\n * // Default window\n * <Window>\n * <Header title=\"AI Assistant\" />\n * <Messages>...</Messages>\n * <MessageInput />\n * <Footer />\n * </Window>\n *\n * // Minimized window\n * <Window isMinimized>\n * <Header title=\"AI Assistant\" />\n * </Window>\n *\n * // Fullscreen window\n * <Window isFullscreen>\n * <Header title=\"AI Assistant\" />\n * <Messages>...</Messages>\n * <MessageInput />\n * </Window>\n *\n * // Custom dimensions\n * <Window width=\"500px\" height=\"700px\">\n * ...\n * </Window>\n * ```\n */\nexport const Window: React.FC<WindowProps> = ({\n isMinimized = false,\n isFullscreen = false,\n width = '400px',\n height = '600px',\n children,\n className,\n ariaLabel = 'Chat window',\n}) => {\n return (\n <WindowContainer\n className={className}\n $isMinimized={isMinimized}\n $isFullscreen={isFullscreen}\n $width={width}\n $height={height}\n role=\"dialog\"\n aria-label={ariaLabel}\n aria-modal=\"false\"\n >\n {children}\n </WindowContainer>\n );\n};\n\nWindow.displayName = 'Window';\n","/**\n * Complete CopilotSidebar Integration Example\n *\n * This file demonstrates how to integrate custom-designed components\n * (AssistantMessage, UserMessage, AssistantThinking, Input) with CopilotKit's\n * CopilotSidebar component using adapter components.\n *\n * Usage:\n * ```tsx\n * import { CopilotKit } from \"@copilotkit/react-core\";\n * import { CustomCopilotSidebar } from \"./CopilotSidebarIntegration\";\n *\n * function App() {\n * return (\n * <CopilotKit runtimeUrl=\"/api/copilotkit\">\n * <CustomCopilotSidebar>\n * <YourApp />\n * </CustomCopilotSidebar>\n * </CopilotKit>\n * );\n * }\n * ```\n */\n\nimport type {\n ButtonProps as CopilotButtonProps,\n HeaderProps as CopilotHeaderProps,\n MessagesProps as CopilotMessagesProps,\n WindowProps as CopilotWindowProps,\n} from '@copilotkit/react-ui';\nimport { CopilotSidebar, useChatContext } from '@copilotkit/react-ui';\nimport type React from 'react';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport { tokens } from '../../theme/tokens';\nimport { AssistantMessageAdapter, InputAdapter, UserMessageAdapter } from './adapters';\nimport { Header } from './Header/Header';\nimport { Messages } from './Messages/Messages';\nimport { Window } from './Window/Window';\n\n// Global styles to ensure sidebar starts hidden and button visibility\nconst GlobalSidebarStyles = createGlobalStyle`\n /* Override CopilotKit's default positioning - start off-screen */\n .copilotKitSidebar {\n position: fixed !important;\n right: -100vw !important;\n bottom: 0 !important;\n transition: right 0.3s ease !important;\n }\n\n /* Move sidebar container into view when expanded */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar {\n right: 0 !important;\n }\n\n /* Mobile-first: Full viewport sidebar */\n .copilotKitSidebar .copilotKitWindow {\n position: fixed !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: auto !important;\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw !important;\n max-height: 100vh !important;\n margin: 0 !important;\n border-radius: 0 !important;\n z-index: 1001 !important;\n\n transform: translateX(100%) !important;\n visibility: hidden !important;\n pointer-events: none !important;\n opacity: 0 !important;\n display: none !important;\n\n transition: transform 0.3s ease, visibility 0.3s ease, opacity 0.3s ease !important;\n }\n\n /* When window has .open class (CopilotKit's native class), show it */\n .copilotKitSidebar .copilotKitWindow.open {\n display: flex !important;\n transform: translateX(0) !important;\n visibility: visible !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n }\n\n /* Desktop: Sidebar panel on the right (640px = CopilotKit's breakpoint) */\n @media (min-width: 640px) {\n .copilotKitSidebar .copilotKitWindow {\n inset: auto !important;\n top: 0 !important;\n right: 0 !important;\n bottom: 0 !important;\n left: auto !important;\n width: 28rem !important;\n height: 100vh !important;\n max-width: 28rem !important;\n max-height: 100vh !important;\n }\n }\n\n /* Hide button when sidebar is open */\n .copilotKitSidebarContentWrapper.sidebarExpanded {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: none !important;\n }\n }\n\n /* Show button when sidebar is closed */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: flex !important;\n }\n }\n\n /* Override CopilotKit's default message styles with our custom components */\n .copilotKitSidebar {\n /* Reset all default CopilotKit message styling */\n [class*=\"copilotKitMessage\"],\n [class*=\"Message-module\"] {\n all: unset !important;\n display: contents !important;\n }\n\n /* Ensure our custom UserMessage gradient pill shows through */\n button[role=\"presentation\"] {\n all: revert !important;\n display: inline-flex !important;\n }\n\n /* Reset input styles to allow our custom ChatInput */\n [class*=\"Input-module\"],\n [class*=\"copilotKitInput\"] {\n all: unset !important;\n display: contents !important;\n }\n\n /* Reset header styles */\n [class*=\"Header-module\"],\n [class*=\"copilotKitHeader\"] {\n all: unset !important;\n display: contents !important;\n }\n }\n`;\n\n// Styled button positioned in the bottom-right corner\nconst StyledChatButton = styled.button`\n position: fixed;\n bottom: 8px;\n right: 8px;\n width: 36px;\n height: 36px;\n border-radius: 18px;\n border: none;\n background: linear-gradient(135deg, ${tokens.colors.primary} 0%, ${tokens.colors.accent} 100%);\n box-shadow: 0 4px 12px rgba(44, 176, 171, 0.4);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n z-index: 1000;\n transition: all 0.2s ease;\n\n &:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 16px rgba(44, 176, 171, 0.5);\n }\n\n &:active {\n transform: scale(0.95);\n }\n\n svg {\n width: 20px;\n height: 20px;\n fill: white;\n }\n`;\n\nexport interface CustomCopilotSidebarProps {\n /**\n * Children to render alongside the sidebar\n */\n children?: React.ReactNode;\n /**\n * Instructions for the AI assistant\n */\n instructions?: string;\n /**\n * Custom labels for the UI\n */\n labels?: Record<string, string>;\n /**\n * Custom icons for the UI\n */\n icons?: Record<string, React.ReactNode>;\n /**\n * Whether the sidebar should be open by default\n */\n defaultOpen?: boolean;\n /**\n * Whether clicking outside should close the sidebar\n */\n clickOutsideToClose?: boolean;\n /**\n * Whether hitting escape should close the sidebar\n */\n hitEscapeToClose?: boolean;\n /**\n * Keyboard shortcut to open the sidebar\n */\n shortcut?: string;\n /**\n * Callback when the sidebar open state changes\n */\n onSetOpen?: (open: boolean) => void;\n /**\n * Additional CSS class name\n */\n className?: string;\n}\n\n/**\n * CopilotSidebar with custom-designed components\n *\n * This component wraps CopilotKit's CopilotSidebar and injects our\n * custom components via adapter components.\n *\n * Features:\n * - Custom AssistantMessage with avatar and loading states\n * - AssistantThinking component shown during loading\n * - Custom UserMessage with gradient pill design\n * - Custom Input with React ARIA accessibility\n * - Styled chat button with gradient\n */\nexport const CustomCopilotSidebar: React.FC<CustomCopilotSidebarProps> = ({\n children,\n instructions = 'You are a helpful AI assistant.',\n labels,\n icons,\n defaultOpen = false,\n clickOutsideToClose = true,\n hitEscapeToClose = true,\n shortcut = '/',\n onSetOpen,\n className,\n}) => {\n // Header adapter with close handler\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const HeaderAdapter = (_props: CopilotHeaderProps) => {\n const { setOpen } = useChatContext();\n\n const handleClose = () => {\n setOpen(false);\n onSetOpen?.(false);\n };\n\n return (\n <Header title=\"AI Assistant\" subtitle=\"How can I help you today?\" onClose={handleClose} />\n );\n };\n\n // Window adapter - wraps our custom Window component\n // biome-ignore lint/correctness/noNestedComponentDefinitions: Simple adapter component\n const WindowAdapter = (props: CopilotWindowProps) => {\n return <Window>{props.children}</Window>;\n };\n\n // Messages adapter - wraps our custom Messages component\n // biome-ignore lint/correctness/noNestedComponentDefinitions: Simple adapter component\n const MessagesAdapter = (props: CopilotMessagesProps) => {\n return (\n <Messages>\n {props.messages.map((message, index) => (\n <props.RenderMessage\n key={message.id || `message-${index}`}\n message={message}\n inProgress={props.inProgress}\n index={index}\n isCurrentMessage={index === props.messages.length - 1}\n />\n ))}\n </Messages>\n );\n };\n\n // Custom Button component that uses CopilotKit's ChatContext\n // biome-ignore lint/correctness/noNestedComponentDefinitions: This component must be defined here to access CopilotKit's ChatContext and the onSetOpen prop\n const CustomButton = (_props: CopilotButtonProps) => {\n const { open, setOpen } = useChatContext();\n\n const handleClick = () => {\n const newOpenState = !open;\n setOpen(newOpenState);\n onSetOpen?.(newOpenState);\n };\n\n return (\n <StyledChatButton\n onClick={handleClick}\n aria-label={open ? 'Close chat' : 'Open chat'}\n type=\"button\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"Chat icon\"\n >\n <title>Chat</title>\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\" />\n </svg>\n </StyledChatButton>\n );\n };\n\n return (\n <>\n <GlobalSidebarStyles />\n <CopilotSidebar\n // Pass through custom components via adapters\n AssistantMessage={AssistantMessageAdapter}\n UserMessage={UserMessageAdapter}\n Input={InputAdapter}\n Header={HeaderAdapter}\n Window={WindowAdapter}\n Messages={MessagesAdapter}\n Button={CustomButton}\n // Configuration\n instructions={instructions}\n labels={{\n title: 'AI Assistant',\n initial: 'Hi! How can I help you today?',\n ...labels,\n }}\n icons={icons}\n // Behavior\n defaultOpen={defaultOpen}\n clickOutsideToClose={clickOutsideToClose}\n hitEscapeToClose={hitEscapeToClose}\n shortcut={shortcut}\n onSetOpen={onSetOpen}\n // Styling\n className={className}\n >\n {children}\n </CopilotSidebar>\n </>\n );\n};\n\nCustomCopilotSidebar.displayName = 'CustomCopilotSidebar';\n","import type {\n ButtonProps as CopilotButtonProps,\n HeaderProps as CopilotHeaderProps,\n WindowProps as CopilotWindowProps,\n} from '@copilotkit/react-ui';\nimport { CopilotSidebar, useChatContext } from '@copilotkit/react-ui';\nimport { type ReactNode, useMemo } from 'react';\nimport styled, { createGlobalStyle } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport {\n ActionExecutionAdapter,\n AssistantMessageAdapter,\n InputAdapter,\n UserMessageAdapter,\n createAssistantMessageAdapter,\n createAssistantMessageAdapterWithErrorReporting,\n type ReportIssueCallback,\n} from '../adapters';\nimport { Header } from '../Header/Header';\nimport { Window } from '../Window/Window';\n\n// Global styles to ensure sidebar starts hidden and button visibility\nconst GlobalSidebarStyles = createGlobalStyle`\n /* Override CopilotKit's content wrapper to respect safe areas in landscape */\n @media (orientation: landscape) {\n .copilotKitSidebarContentWrapper {\n right: var(--safe-area-right, 0px) !important;\n left: var(--safe-area-left, 0px) !important;\n }\n }\n\n /* Override CopilotKit's default positioning - keep sidebar container in place */\n /* z-index must be higher than NavHorizontal (sticky: 1020) for button to show above nav */\n .copilotKitSidebar {\n position: fixed !important;\n top: calc(var(--safe-area-top, 0px) + 8px) !important;\n right: calc(var(--safe-area-right, 0px) + 8px) !important;\n bottom: calc(var(--safe-area-bottom, 0px) + 8px) !important;\n left: calc(var(--safe-area-left, 0px) + 8px) !important;\n width: auto !important;\n height: auto !important;\n pointer-events: none !important;\n z-index: ${tokens.zIndex.fixed} !important;\n }\n\n /* Keep sidebar container always visible (the window inside will animate) */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar {\n pointer-events: auto !important;\n }\n\n /* Mobile-first: Glassmorphism sidebar with rounded corners */\n /* Target the actual dialog element that gets rendered */\n .copilotKitSidebar [role=\"dialog\"] {\n /* Override CopilotKit defaults for mobile */\n position: fixed !important;\n /* TOP: Account for status bar safe area (Android notch/status bar) */\n top: calc(${tokens.spacing.sm} + var(--safe-area-top, 0px)) !important;\n /* RIGHT: Account for landscape notch on right side */\n right: calc(${tokens.spacing.sm} + var(--safe-area-right, 0px)) !important;\n /* BOTTOM: Account for horizontal navbar (52px) + safe area for Android nav buttons */\n bottom: calc(52px + ${tokens.spacing.sm} + var(--safe-area-bottom, 0px)) !important;\n /* LEFT: Account for landscape notch on left side */\n left: calc(${tokens.spacing.sm} + var(--safe-area-left, 0px)) !important;\n width: calc(100vw - ${tokens.spacing.lg} - var(--safe-area-left, 0px) - var(--safe-area-right, 0px)) !important;\n /* Adjust height to account for top, bottom safe areas, and navbar */\n height: calc(100vh - ${tokens.spacing.lg} - var(--safe-area-top, 0px) - 52px - var(--safe-area-bottom, 0px)) !important;\n max-width: calc(100vw - ${tokens.spacing.lg} - var(--safe-area-left, 0px) - var(--safe-area-right, 0px)) !important;\n max-height: calc(100vh - ${tokens.spacing.lg} - var(--safe-area-top, 0px) - 52px - var(--safe-area-bottom, 0px)) !important;\n margin: 0 !important;\n border-radius: ${tokens.borderRadius.xl} !important;\n\n /* Glassmorphism effect */\n background: ${tokens.colors.surface.glass} !important;\n box-shadow: ${tokens.shadows.lg} !important;\n backdrop-filter: blur(11.1px) !important;\n -webkit-backdrop-filter: blur(11.1px) !important;\n border: 1px solid ${tokens.colors.surface.glassBorder} !important;\n\n /* Smooth slide transition */\n transition: transform 0.3s ease, visibility 0.3s ease, opacity 0.3s ease !important;\n z-index: ${tokens.zIndex.modal} !important;\n }\n\n /* Hidden by default */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) .copilotKitSidebar [role=\"dialog\"] {\n transform: translateX(100%) !important;\n visibility: hidden !important;\n pointer-events: none !important;\n opacity: 0 !important;\n }\n\n /* Visible when expanded */\n .copilotKitSidebarContentWrapper.sidebarExpanded .copilotKitSidebar [role=\"dialog\"] {\n transform: translateX(0) !important;\n visibility: visible !important;\n pointer-events: auto !important;\n opacity: 1 !important;\n }\n\n /* Desktop: Sidebar panel on the right with glassmorphism (640px = CopilotKit's breakpoint) */\n @media (min-width: ${tokens.breakpoints.mobile}px) {\n .copilotKitSidebar [role=\"dialog\"] {\n inset: auto !important;\n /* TOP: Account for status bar safe area */\n top: calc(${tokens.spacing.sm} + var(--safe-area-top, 0px)) !important;\n /* RIGHT: Account for landscape notch on right side */\n right: calc(${tokens.spacing.sm} + var(--safe-area-right, 0px)) !important;\n /* BOTTOM: Account for horizontal navbar (52px) + safe area */\n bottom: calc(52px + ${tokens.spacing.sm} + var(--safe-area-bottom, 0px)) !important;\n left: auto !important;\n width: 28rem !important;\n /* Adjust height to account for top, bottom safe areas, and navbar */\n height: calc(100vh - ${tokens.spacing.lg} - var(--safe-area-top, 0px) - 52px - var(--safe-area-bottom, 0px)) !important;\n max-width: 28rem !important;\n max-height: calc(100vh - ${tokens.spacing.lg} - var(--safe-area-top, 0px) - 52px - var(--safe-area-bottom, 0px)) !important;\n }\n }\n\n /* Mobile landscape: sidebar on right side, allow background interaction */\n @media (orientation: landscape) and (max-height: 500px) {\n /* Account for vertical nav (60px) in landscape */\n .copilotKitSidebarContentWrapper {\n left: 60px !important;\n width: calc(100% - 60px) !important;\n }\n\n /* Shrink the sidebar container to only cover the right portion where dialog lives */\n /* Also stretch to full height (remove default 8px padding) */\n .copilotKitSidebar {\n top: 0 !important;\n bottom: 0 !important;\n left: 58vw !important;\n width: min(50vw, 22rem) !important;\n height: 100vh !important;\n }\n\n /* Offset the expanded sidebar wrapper to leave space for main content */\n .copilotKitSidebarContentWrapper.sidebarExpanded {\n margin-right: 30vw !important;\n }\n\n .copilotKitSidebar [role=\"dialog\"] {\n width: min(50vw, 20rem) !important;\n max-width: min(50vw, 20rem) !important;\n left: auto !important;\n right: 1.5rem !important;\n /* Use top/bottom ONLY - let browser calculate height (more reliable than explicit height) */\n top: var(--safe-area-top, 0px) !important;\n bottom: calc(52px + var(--safe-area-bottom, 0px)) !important;\n /* Remove explicit height - let top/bottom define it */\n height: auto !important;\n max-height: none !important;\n /* Remove margins */\n margin: 0 !important;\n border-radius: 0 !important;\n border-top-left-radius: ${tokens.borderRadius.xl} !important;\n border-bottom-left-radius: ${tokens.borderRadius.xl} !important;\n }\n\n /* Compact header in landscape - hide title text but keep close button */\n .copilotKitSidebar [role=\"dialog\"] header,\n .copilotKitSidebar [role=\"dialog\"] [data-testid=\"chat-header\"],\n .copilotKitSidebar [role=\"dialog\"] > div:first-child {\n padding: 0.25rem 0.5rem !important;\n min-height: auto !important;\n height: 1.5rem;\n padding-right: 1.5rem !important;\n }\n\n /* Hide the title text but keep close button visible */\n .copilotKitSidebar [role=\"dialog\"] header h1,\n .copilotKitSidebar [role=\"dialog\"] header h2,\n .copilotKitSidebar [role=\"dialog\"] header span:not(:last-child),\n .copilotKitSidebar [role=\"dialog\"] > div:first-child > span,\n .copilotKitSidebar [role=\"dialog\"] > div:first-child > h1,\n .copilotKitSidebar [role=\"dialog\"] > div:first-child > h2 {\n display: none !important;\n }\n\n /* Reduce vertical padding inside chat to preserve space in landscape */\n .copilotKitMessages {\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm} !important;\n }\n\n .copilotKitMessage {\n padding: ${tokens.spacing.xs} 0 !important;\n margin: ${tokens.spacing.xs} 0 !important;\n }\n\n /* Compact input area in landscape */\n .copilotKitInput,\n .copilotKitSidebar [role=\"dialog\"] > div:last-child {\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm} !important;\n }\n\n /* Reduce gap between messages */\n .copilotKitMessages > div {\n gap: 0.25rem !important;\n padding-bottom: 0;\n margin-bottom: -3rem;\n }\n\n /* Compact suggested prompts in landscape */\n div[role=\"list\"][aria-label*=\"Suggested\"] {\n margin: 0 !important;\n padding: 1px !important;\n min-height: auto !important;\n max-height: 32px !important;\n }\n\n /* Compact parent of suggestions (input area) */\n .copilotKitSidebar [role=\"dialog\"] > div:last-child {\n padding: 1px !important;\n }\n }\n\n /* Hide button when sidebar is open */\n .copilotKitSidebarContentWrapper.sidebarExpanded {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: none !important;\n }\n }\n\n /* Show button when sidebar is closed */\n .copilotKitSidebarContentWrapper:not(.sidebarExpanded) {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n display: flex !important;\n }\n }\n\n /* Position chat button with safe area on landscape (right side for Android controls) */\n @media (orientation: landscape) {\n .copilotKitSidebarContentWrapper {\n button[aria-label=\"Open chat\"],\n button[aria-label=\"Close chat\"] {\n bottom: calc(var(--safe-area-bottom, 0px) + 8px) !important;\n right: calc(var(--safe-area-right, 0px) + 8px) !important;\n z-index: 2000 !important;\n }\n }\n }\n\n /* Fix messages container background */\n .copilotKitMessages {\n background-color: transparent !important;\n }\n\n /* Performance optimization for messages - no animations to reduce jitter during streaming */\n .copilotKitMessage {\n /* contain: content isolates layout/paint to this element */\n contain: content;\n }\n\n /* Override CopilotKit suggestions to be single-row with horizontal scroll */\n div[role=\"list\"][aria-label*=\"Suggested\"] {\n display: flex !important;\n flex-wrap: nowrap !important; /* Force single row */\n gap: ${tokens.spacing.sm} !important;\n padding: ${tokens.spacing.xs} 0 !important;\n\n /* Horizontal scrolling */\n overflow-x: auto !important;\n overflow-y: hidden !important;\n\n /* Smooth scrolling */\n -webkit-overflow-scrolling: touch;\n scroll-behavior: smooth;\n\n /* Fixed height for one suggestion */\n max-height: 40px !important;\n min-height: 40px !important;\n align-items: center !important;\n\n /* Hide scrollbar */\n scrollbar-width: none !important;\n -ms-overflow-style: none !important;\n\n &::-webkit-scrollbar {\n display: none !important;\n }\n }\n\n /* Ensure suggestion buttons don't wrap or shrink */\n div[role=\"list\"][aria-label*=\"Suggested\"] button {\n flex-shrink: 0 !important;\n white-space: nowrap !important;\n }\n\n /* Remove teal/cyan outline from all inputs */\n .copilotKitSidebar input,\n .copilotKitSidebar input:focus,\n .copilotKitSidebar input:focus-visible,\n .copilotKitSidebar textarea,\n .copilotKitSidebar textarea:focus,\n .copilotKitSidebar textarea:focus-visible {\n outline: none !important;\n outline-color: transparent !important;\n box-shadow: none !important;\n }\n`;\n\n// Styled button positioned in the bottom-right corner\n// Uses safe area insets to avoid Android system buttons in landscape\nconst StyledChatButton = styled.button<{ $disabled?: boolean }>`\n position: fixed;\n bottom: calc(${tokens.spacing.sm} + var(--safe-area-bottom, 0px));\n right: calc(${tokens.spacing.sm} + var(--safe-area-right, 0px));\n width: 36px;\n height: 36px;\n border-radius: ${tokens.borderRadius.full};\n border: none;\n background: linear-gradient(135deg, ${tokens.colors.primary} 0%, ${tokens.colors.accent} 100%);\n box-shadow: ${({ $disabled }) => ($disabled ? 'none' : tokens.shadows.glow.primary)};\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: ${({ $disabled }) => ($disabled ? 'not-allowed' : 'pointer')};\n opacity: ${({ $disabled }) => ($disabled ? 0.5 : 1)};\n filter: ${({ $disabled }) => ($disabled ? 'grayscale(0.6)' : 'none')};\n z-index: ${tokens.zIndex.fixed};\n transition: all ${tokens.transitions.fast};\n\n &:hover:not([aria-disabled='true']) {\n transform: scale(1.05);\n box-shadow: ${tokens.shadows.glow.accent};\n }\n\n &:active:not([aria-disabled='true']) {\n transform: scale(0.95);\n }\n\n svg {\n width: 20px;\n height: 20px;\n fill: ${tokens.colors.text.primary};\n }\n`;\n\n/**\n * Error event from CopilotKit\n */\nexport interface CopilotErrorEvent {\n status?: number;\n message?: string;\n error?: Error;\n}\n\nexport interface CustomCopilotSidebarProps {\n children: ReactNode;\n defaultOpen?: boolean;\n onSetOpen?: (open: boolean) => void;\n instructions?: string;\n className?: string;\n /**\n * When true, disables the chat button and prevents opening the sidebar.\n */\n disabled?: boolean;\n /**\n * Message to display as tooltip when disabled.\n */\n disabledReason?: string;\n /**\n * Callback fired when an error occurs during chat (e.g., 429 rate limit).\n * Use this to show user-friendly error messages.\n */\n onError?: (errorEvent: CopilotErrorEvent) => void;\n /**\n * Custom renderer for error messages in the chat.\n * If not provided, a default error message will be shown.\n */\n renderError?: (error: { status?: number; message?: string }) => ReactNode;\n /**\n * Optional custom component to render instead of the default \"Thinking...\" indicator.\n * Use this to show tool call progress for server-side tool calls.\n * The component receives isLoading and isGenerating props.\n */\n ThinkingIndicator?: React.ComponentType<{ isLoading?: boolean; isGenerating?: boolean }>;\n /**\n * Optional component to render tool calls underneath thinking and before the message.\n * This is shown during the thinking phase and while the response is still generating.\n * Use this for server-side tool calls that should be visible throughout the response.\n */\n ToolCallsComponent?: React.ComponentType;\n /**\n * Callback fired when user clicks \"Report Issue\" button on error messages.\n * The callback receives error context including category, correlation ID, and chat snippet.\n * Use this to open a support ticket modal with pre-filled error context.\n */\n onReportIssue?: ReportIssueCallback;\n}\n\n// =============================================================================\n// Stable adapter components - defined outside to prevent remounting on parent re-renders\n// These components receive callbacks via props instead of closures to maintain stable references\n// This is critical for preventing chat input state from being lost during re-renders\n// =============================================================================\n\n/**\n * Stable Window adapter - wraps our custom Window component\n * Defined outside CustomCopilotSidebar to prevent recreation on every render\n */\nconst WindowAdapter = (props: CopilotWindowProps) => {\n return <Window>{props.children}</Window>;\n};\nWindowAdapter.displayName = 'WindowAdapter';\n\n/**\n * Creates a memoized Header adapter component\n * The component reference stays stable as long as onSetOpen doesn't change\n */\nfunction createHeaderAdapter(onSetOpen?: (open: boolean) => void) {\n const HeaderAdapterWithClose = (_props: CopilotHeaderProps) => {\n const { setOpen } = useChatContext();\n\n const handleClose = () => {\n setOpen(false);\n onSetOpen?.(false);\n };\n\n return <Header title=\"AI Assistant\" onClose={handleClose} />;\n };\n HeaderAdapterWithClose.displayName = 'HeaderAdapterWithClose';\n return HeaderAdapterWithClose;\n}\n\n/**\n * Creates a memoized Button adapter component\n * The component reference stays stable as long as the dependencies don't change\n */\nfunction createButtonAdapter(\n disabled: boolean,\n disabledReason: string,\n onSetOpen?: (open: boolean) => void\n) {\n const CustomButton = (_props: CopilotButtonProps) => {\n const { open, setOpen } = useChatContext();\n\n const handleClick = () => {\n if (disabled) return;\n const newOpenState = !open;\n setOpen(newOpenState);\n onSetOpen?.(newOpenState);\n };\n\n return (\n <StyledChatButton\n onClick={handleClick}\n aria-label={disabled ? disabledReason : open ? 'Close chat' : 'Open chat'}\n aria-disabled={disabled}\n title={disabled ? disabledReason : undefined}\n type=\"button\"\n $disabled={disabled}\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Chat</title>\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z\" />\n </svg>\n </StyledChatButton>\n );\n };\n CustomButton.displayName = 'CustomButton';\n return CustomButton;\n}\n\n/**\n * CustomCopilotSidebar - A CopilotSidebar wrapper using our custom components\n *\n * This component wraps CopilotKit's CopilotSidebar and provides our custom\n * design system components for a consistent look and feel.\n *\n * IMPORTANT: Uses memoized component factories to prevent unnecessary remounts\n * of the Input component, which would clear the user's typed message.\n *\n * @example\n * ```tsx\n * <CustomCopilotSidebar defaultOpen={false} onSetOpen={(open) => console.log(open)}>\n * <YourApp />\n * </CustomCopilotSidebar>\n * ```\n */\nexport function CustomCopilotSidebar({\n children,\n defaultOpen = false,\n onSetOpen,\n instructions,\n className,\n disabled = false,\n disabledReason = 'Start a free trial to enable AI chat',\n onError,\n renderError,\n ThinkingIndicator,\n ToolCallsComponent,\n onReportIssue,\n}: CustomCopilotSidebarProps) {\n // Memoize the Header adapter - only recreate when onSetOpen changes\n // This prevents the Input component from remounting on every parent re-render\n const HeaderAdapterWithClose = useMemo(\n () => createHeaderAdapter(onSetOpen),\n [onSetOpen]\n );\n\n // Memoize the Button adapter - only recreate when its dependencies change\n const CustomButton = useMemo(\n () => createButtonAdapter(disabled, disabledReason, onSetOpen),\n [disabled, disabledReason, onSetOpen]\n );\n\n // Memoize the AssistantMessage adapter - use custom components if provided\n // Use error reporting adapter if onReportIssue is provided\n const AssistantMessageAdapterMemo = useMemo(\n () =>\n onReportIssue\n ? createAssistantMessageAdapterWithErrorReporting(onReportIssue, ThinkingIndicator, ToolCallsComponent)\n : ThinkingIndicator || ToolCallsComponent\n ? createAssistantMessageAdapter(ThinkingIndicator, ToolCallsComponent)\n : AssistantMessageAdapter,\n [ThinkingIndicator, ToolCallsComponent, onReportIssue]\n );\n\n return (\n <>\n <GlobalSidebarStyles />\n <CopilotSidebar\n // Pass through custom components via adapters\n // CRITICAL: These must be stable references to prevent Input remounting\n AssistantMessage={AssistantMessageAdapterMemo}\n UserMessage={UserMessageAdapter}\n Input={InputAdapter}\n Header={HeaderAdapterWithClose}\n Window={WindowAdapter}\n Button={CustomButton}\n // Custom renderer for action/tool execution messages\n // Note: RenderActionExecutionMessage is deprecated but RenderMessage requires handling ALL message types\n // which ActionExecutionAdapter doesn't do. Keep using the legacy prop until proper migration.\n RenderActionExecutionMessage={ActionExecutionAdapter}\n // Configuration\n instructions={instructions}\n labels={{\n title: 'AI Assistant',\n initial: 'Hi! How can I help you today?',\n }}\n // Behavior\n defaultOpen={defaultOpen}\n clickOutsideToClose={true}\n hitEscapeToClose={true}\n onSetOpen={onSetOpen}\n // Error handling\n onError={onError}\n renderError={renderError}\n // Styling\n className={className}\n >\n {children}\n </CopilotSidebar>\n </>\n );\n}\n\nCustomCopilotSidebar.displayName = 'CustomCopilotSidebar';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const FooterContainer = styled.footer`\n display: flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n background-color: ${tokens.colors.surface.base};\n border-top: 1px solid ${tokens.colors.border.default};\n min-height: 44px;\n`;\n\nexport const FooterContent = styled.div`\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: ${tokens.spacing.md};\n width: 100%;\n max-width: 100%;\n font-size: ${tokens.typography.fontSize.xs};\n color: ${tokens.colors.text.secondary};\n opacity: 0.6;\n font-family: ${tokens.typography.fontFamily.primary};\n line-height: ${tokens.typography.lineHeight.tight};\n`;\n\nexport const FooterBranding = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n flex-shrink: 0;\n`;\n\nexport const FooterStatus = styled.div`\n display: flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: ${tokens.typography.fontSize.xs};\n opacity: 0.8;\n`;\n\nexport const FooterLink = styled.a`\n color: ${tokens.colors.primary};\n text-decoration: none;\n transition: opacity ${tokens.transitions.fast};\n cursor: pointer;\n\n &:hover {\n opacity: 0.8;\n text-decoration: underline;\n }\n\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n border-radius: ${tokens.borderRadius.sm};\n }\n`;\n","import type React from 'react';\nimport {\n FooterBranding,\n FooterContainer,\n FooterContent,\n FooterLink,\n FooterStatus,\n} from './Footer.styles';\n\nexport interface FooterProps {\n /**\n * Branding text to display (e.g., \"Powered by CopilotKit\")\n */\n branding?: string;\n\n /**\n * Optional status text (e.g., \"Connected\", \"Typing...\", \"3 tokens remaining\")\n */\n status?: string;\n\n /**\n * Optional link URL for the branding text\n */\n brandingUrl?: string;\n\n /**\n * Callback when branding link is clicked\n */\n onBrandingClick?: () => void;\n\n /**\n * Additional CSS class name for custom styling\n */\n className?: string;\n}\n\n/**\n * Footer Component\n *\n * A chat footer component that displays branding, status information, and optional links.\n * Typically used at the bottom of a chat interface to show provider information or connection status.\n *\n * @example\n * ```tsx\n * <Footer\n * branding=\"Powered by CopilotKit\"\n * status=\"Connected\"\n * brandingUrl=\"https://copilotkit.ai\"\n * />\n * ```\n */\nexport const Footer: React.FC<FooterProps> = ({\n branding,\n status,\n brandingUrl,\n onBrandingClick,\n className,\n}) => {\n // If no content, don't render\n if (!branding && !status) {\n return null;\n }\n\n const handleBrandingClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (onBrandingClick) {\n e.preventDefault();\n onBrandingClick();\n }\n };\n\n return (\n <FooterContainer className={className}>\n <FooterContent>\n {branding && (\n <FooterBranding>\n {brandingUrl ? (\n <FooterLink\n href={brandingUrl}\n onClick={handleBrandingClick}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {branding}\n </FooterLink>\n ) : (\n branding\n )}\n </FooterBranding>\n )}\n\n {status && <FooterStatus>{status}</FooterStatus>}\n </FooterContent>\n </FooterContainer>\n );\n};\n\nFooter.displayName = 'Footer';\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const InputContainer = styled.div`\n\tdisplay: flex;\n\tflex-direction: column;\n\twidth: 100%;\n\tposition: relative;\n`;\n\nexport const InputWrapper = styled.div`\n\tdisplay: flex;\n\talign-items: flex-end;\n\tgap: ${tokens.spacing.sm};\n\tpadding: ${tokens.spacing.md};\n\tbackground-color: ${tokens.colors.backdrop};\n\tbackdrop-filter: blur(10px);\n\t-webkit-backdrop-filter: blur(10px);\n\tborder: 1px solid ${tokens.colors.border.default};\n\tborder-radius: ${tokens.borderRadius.lg};\n\ttransition: all ${tokens.transitions.normal};\n\n\t&:focus-within {\n\t\tborder-color: ${tokens.colors.border.hover};\n\t}\n\n\t&:hover:not(:focus-within) {\n\t\tborder-color: ${tokens.colors.border.subtle};\n\t}\n`;\n\ninterface TextAreaProps {\n $maxRows?: number;\n disabled?: boolean;\n readOnly?: boolean;\n}\n\nexport const TextArea = styled.textarea<TextAreaProps>`\n\tflex: 1;\n\tmin-height: ${tokens.spacing.lg};\n\tmax-height: ${(props) => `${(props.$maxRows || 5) * 24}px`};\n\tpadding: 0;\n\tborder: none;\n\toutline: none;\n\tresize: none;\n\tfont-family: ${tokens.typography.fontFamily.primary};\n\tfont-size: ${tokens.typography.fontSize.sm};\n\tline-height: ${tokens.spacing.lg};\n\tcolor: ${tokens.colors.text.primary};\n\tbackground: transparent;\n\toverflow-y: auto;\n\n\t&::placeholder {\n\t\tcolor: ${tokens.colors.text.tertiary};\n\t}\n\n\t&:disabled {\n\t\tcolor: ${tokens.colors.text.disabled};\n\t\tcursor: not-allowed;\n\t}\n\n\t&:read-only {\n\t\tcursor: default;\n\t}\n\n\t/* Custom scrollbar */\n\t&::-webkit-scrollbar {\n\t\twidth: ${tokens.spacing.xs};\n\t}\n\n\t&::-webkit-scrollbar-track {\n\t\tbackground: ${tokens.colors.scrollbar.track};\n\t}\n\n\t&::-webkit-scrollbar-thumb {\n\t\tbackground: ${tokens.colors.scrollbar.thumb};\n\t\tborder-radius: ${tokens.borderRadius.sm};\n\t}\n\n\t&::-webkit-scrollbar-thumb:hover {\n\t\tbackground: ${tokens.colors.scrollbar.thumbHover};\n\t}\n`;\n\ninterface SendButtonProps {\n disabled?: boolean;\n}\n\nexport const SendButton = styled.button<SendButtonProps>`\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 36px;\n\theight: 36px;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: ${tokens.borderRadius.md};\n\tbackground-color: ${(props) => (props.disabled ? tokens.colors.surface.overlay : tokens.colors.primary)};\n\tcolor: ${(props) => (props.disabled ? tokens.colors.text.tertiary : tokens.colors.text.primary)};\n\tcursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};\n\ttransition: all ${tokens.transitions.normal};\n\tflex-shrink: 0;\n\n\t&:hover:not(:disabled) {\n\t\tbackground-color: ${tokens.colors.accent};\n\t\ttransform: translateY(-1px);\n\t}\n\n\t&:active:not(:disabled) {\n\t\ttransform: translateY(0);\n\t}\n\n\t&:focus-visible {\n\t\toutline: 2px solid ${tokens.colors.border.focus};\n\t\toutline-offset: 2px;\n\t}\n\n\tsvg {\n\t\twidth: 20px;\n\t\theight: 20px;\n\t}\n`;\n","import type { AriaTextFieldProps } from '@react-aria/textfield';\nimport { useTextField } from '@react-aria/textfield';\nimport React, { type KeyboardEvent, useRef } from 'react';\nimport { InputContainer, InputWrapper, SendButton, TextArea } from './Input.styles';\n\nexport interface InputProps\n extends Omit<AriaTextFieldProps, 'onChange' | 'onFocus' | 'onBlur' | 'onKeyDown' | 'onKeyUp'> {\n /** Current message value */\n value?: string;\n /** Callback when message value changes */\n onChange?: (value: string) => void;\n /** Callback when message is submitted */\n onSubmit?: (message: string) => void;\n /** Placeholder text */\n placeholder?: string;\n /** Whether the input is disabled */\n isDisabled?: boolean;\n /** Whether the input is read-only */\n isReadOnly?: boolean;\n /** Maximum number of rows before scrolling */\n maxRows?: number;\n /** Whether to auto-focus the input */\n autoFocus?: boolean;\n /** Additional CSS class name */\n className?: string;\n /** ARIA label for the input */\n 'aria-label'?: string;\n}\n\n/**\n * Input component for chat interfaces\n * Features:\n * - Multi-line text support\n * - Submit on Enter, Shift+Enter for new line\n * - React ARIA for accessibility\n * - Auto-growing textarea\n * - Integrated send button\n */\nexport const Input: React.FC<InputProps> = ({\n value = '',\n onChange,\n onSubmit,\n placeholder = 'Type a message...',\n isDisabled = false,\n isReadOnly = false,\n maxRows = 5,\n autoFocus = false,\n className,\n 'aria-label': ariaLabel = 'Message input',\n ...ariaProps\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // React ARIA hook for accessibility\n const { inputProps } = useTextField(\n {\n ...ariaProps,\n 'aria-label': ariaLabel,\n value,\n onChange: (newValue: string) => {\n onChange?.(newValue);\n },\n isDisabled,\n isReadOnly,\n inputElementType: 'textarea',\n },\n textareaRef\n );\n\n // Handle keyboard events\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n if (value.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(value.trim());\n // Clear the input after submission\n onChange?.('');\n }\n }\n // Shift+Enter adds a new line (default behavior)\n };\n\n // Handle send button click\n const handleSend = () => {\n if (value.trim() && onSubmit && !isDisabled && !isReadOnly) {\n onSubmit(value.trim());\n onChange?.('');\n // Refocus the textarea after sending\n textareaRef.current?.focus();\n }\n };\n\n const canSend = value.trim().length > 0 && !isDisabled && !isReadOnly;\n\n return (\n <InputContainer className={className}>\n <InputWrapper>\n <TextArea\n {...inputProps}\n ref={textareaRef}\n placeholder={placeholder}\n onKeyDown={handleKeyDown}\n $maxRows={maxRows}\n autoFocus={autoFocus}\n disabled={isDisabled}\n readOnly={isReadOnly}\n />\n <SendButton\n type=\"button\"\n onClick={handleSend}\n disabled={!canSend}\n aria-label=\"Send message\"\n title=\"Send message (Enter)\"\n >\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-hidden=\"true\"\n >\n <title>Send Icon</title>\n <path\n d=\"M2.5 10L17.5 3.75L11.25 18.75L10 12.5L2.5 10Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </SendButton>\n </InputWrapper>\n </InputContainer>\n );\n};\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const MessagesListContainer = styled.div<{ $maxHeight: string }>`\n display: flex;\n flex-direction: column;\n width: 100%;\n max-height: ${(props) => props.$maxHeight};\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n background: ${tokens.colors.surface.base};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n scroll-behavior: smooth;\n\n /* Custom scrollbar styling */\n &::-webkit-scrollbar {\n width: 8px;\n }\n\n &::-webkit-scrollbar-track {\n background: ${tokens.colors.scrollbar.track};\n border-radius: ${tokens.borderRadius.sm};\n }\n\n &::-webkit-scrollbar-thumb {\n background: ${tokens.colors.scrollbar.thumb};\n border-radius: ${tokens.borderRadius.sm};\n transition: background ${tokens.transitions.fast};\n }\n\n &::-webkit-scrollbar-thumb:hover {\n background: ${tokens.colors.scrollbar.thumbHover};\n }\n\n /* Firefox scrollbar styling */\n scrollbar-width: thin;\n scrollbar-color: ${tokens.colors.scrollbar.thumb} ${tokens.colors.scrollbar.track};\n\n /* Ensure proper rendering on mobile */\n -webkit-overflow-scrolling: touch;\n`;\n\nexport const MessagesListContent = styled.div`\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n padding: ${tokens.spacing.md};\n min-height: min-content;\n\n /* Message styling */\n .message {\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n border-radius: ${tokens.borderRadius.md};\n max-width: 85%;\n word-wrap: break-word;\n animation: messageSlideIn ${tokens.animation.duration.short} ease-out;\n }\n\n @keyframes messageSlideIn {\n from {\n opacity: 0;\n transform: translateY(${tokens.spacing.sm});\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n }\n\n /* Role-specific message styling */\n .message--user {\n align-self: flex-end;\n background: ${tokens.colors.message.user};\n color: ${tokens.colors.text.primary};\n border-bottom-right-radius: ${tokens.borderRadius.sm};\n }\n\n .message--assistant {\n align-self: flex-start;\n background: ${tokens.colors.message.ai};\n color: ${tokens.colors.text.primary};\n border-bottom-left-radius: ${tokens.borderRadius.sm};\n }\n\n .message--system {\n align-self: center;\n background: ${tokens.colors.message.system};\n color: ${tokens.colors.text.secondary};\n font-size: ${tokens.typography.fontSize.sm};\n font-style: italic;\n max-width: 100%;\n text-align: center;\n }\n`;\n","import { type ReactNode, useEffect, useRef } from 'react';\nimport { MessagesListContainer, MessagesListContent } from './MessagesList.styles';\n\nexport interface Message {\n id: string;\n content: ReactNode;\n role: 'user' | 'assistant' | 'system';\n timestamp?: Date;\n}\n\nexport interface MessagesListProps {\n /** Array of messages to display */\n messages: Message[];\n /** Whether to automatically scroll to the bottom when new messages arrive */\n autoScroll?: boolean;\n /** Custom class name for the container */\n className?: string;\n /** Custom render function for individual messages */\n renderMessage?: (message: Message) => ReactNode;\n /** Callback when scroll reaches the top (for loading more messages) */\n onScrollTop?: () => void;\n /** Maximum height of the messages list */\n maxHeight?: string;\n}\n\n/**\n * MessagesList Component\n *\n * A scrollable message list component with auto-scroll functionality.\n * Designed for chat interfaces where messages need to be displayed\n * in a scrollable container with automatic scrolling to the latest message.\n *\n * Features:\n * - Auto-scroll to bottom on new messages\n * - Overflow handling with custom scrollbar\n * - Flexible message rendering\n * - Scroll event handling for pagination\n */\nexport const MessagesList = ({\n messages,\n autoScroll = true,\n className,\n renderMessage,\n onScrollTop,\n maxHeight = '600px',\n}: MessagesListProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const isUserScrollingRef = useRef(false);\n const scrollTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Auto-scroll to bottom when new messages arrive\n // biome-ignore lint/correctness/useExhaustiveDependencies: We need messages.length to trigger scroll on new messages\n useEffect(() => {\n if (autoScroll && !isUserScrollingRef.current && containerRef.current) {\n const container = containerRef.current;\n container.scrollTop = container.scrollHeight;\n }\n }, [messages.length, autoScroll]);\n\n // Handle scroll events\n const handleScroll = () => {\n if (!containerRef.current) return;\n\n const container = containerRef.current;\n const isAtBottom = container.scrollHeight - container.scrollTop - container.clientHeight < 10;\n\n // User is scrolling manually\n isUserScrollingRef.current = !isAtBottom;\n\n // Clear existing timeout\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n\n // Reset user scrolling flag after 1 second of no scrolling\n scrollTimeoutRef.current = setTimeout(() => {\n isUserScrollingRef.current = false;\n }, 1000);\n\n // Check if scrolled to top\n if (container.scrollTop === 0 && onScrollTop) {\n onScrollTop();\n }\n };\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, []);\n\n // Default message renderer\n const defaultRenderMessage = (message: Message) => (\n <div\n key={message.id}\n className={`message message--${message.role}`}\n data-message-id={message.id}\n data-role={message.role}\n >\n {message.content}\n </div>\n );\n\n return (\n <MessagesListContainer\n ref={containerRef}\n onScroll={handleScroll}\n className={className}\n $maxHeight={maxHeight}\n >\n <MessagesListContent ref={contentRef}>\n {messages.map(renderMessage || defaultRenderMessage)}\n </MessagesListContent>\n </MessagesListContainer>\n );\n};\n","import styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\n/**\n * Container for the user message, aligned to the right\n */\nexport const StyledUserMessage = styled.div`\n display: flex;\n justify-content: flex-end;\n align-items: flex-start;\n margin: ${tokens.spacing.xs} 0;\n padding: 0;\n width: 100%;\n`;\n\n/**\n * The message bubble containing the user's text\n */\nexport const MessageBubble = styled.div`\n display: flex;\n flex-direction: column;\n max-width: 85%;\n padding: ${tokens.spacing.sm};\n border-radius: ${tokens.borderRadius.lg};\n\n /* User message colors - dark blue from brand */\n background: ${tokens.colors.message.user};\n color: ${tokens.colors.text.primary};\n\n /* Smooth transitions */\n transition: all ${tokens.transitions.fast};\n\n /* Ensure long strings don't overflow */\n overflow: hidden;\n overflow-wrap: break-word;\n word-break: break-word;\n\n /* Username styling */\n strong {\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.semibold};\n margin-bottom: ${tokens.spacing.xs};\n opacity: 0.9;\n }\n`;\n\n/**\n * The actual message text content\n */\nexport const MessageContent = styled.p`\n margin: 0;\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n word-wrap: break-word;\n overflow-wrap: break-word;\n word-break: break-word;\n white-space: pre-wrap;\n`;\n\n/**\n * Optional timestamp display\n */\nexport const MessageTime = styled.time`\n font-size: ${tokens.typography.fontSize.xs};\n opacity: 0.7;\n margin-top: ${tokens.spacing.xs};\n text-align: right;\n`;\n","import type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\nimport { StreamingText } from '../StreamingText';\nimport {\n MessageBubble,\n MessageContent,\n MessageTime,\n StyledUserMessage,\n} from './UserMessage.styles';\n\nconst ActionButton = styled.button`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n margin-top: ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.xs};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.secondary};\n background: ${tokens.colors.surface.overlay};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${tokens.colors.surface.overlayHover};\n border-color: ${tokens.colors.border.hover};\n }\n\n &:active {\n transform: scale(0.98);\n }\n`;\n\nconst ActionsContainer = styled.div`\n display: flex;\n gap: ${tokens.spacing.xs};\n flex-wrap: wrap;\n`;\n\nconst Avatar = styled.img`\n width: ${tokens.spacing.xl};\n height: ${tokens.spacing.xl};\n border-radius: ${tokens.borderRadius.full};\n margin-left: ${tokens.spacing.sm};\n object-fit: cover;\n border: 2px solid ${tokens.colors.border.default};\n`;\n\nexport interface ActionButtonType {\n label: string;\n onClick: () => void;\n icon?: React.ReactNode;\n}\n\nexport interface UserMessageProps {\n /** The message content to display */\n content: string;\n /** Optional timestamp for the message */\n timestamp?: string;\n /** Optional CSS class name */\n className?: string;\n /** Optional avatar URL */\n avatarUrl?: string;\n /** Optional username */\n username?: string;\n /** Whether the message is currently streaming */\n isStreaming?: boolean;\n /** Action buttons to display below the message */\n actions?: ActionButtonType[];\n /** Whether to enable markdown rendering */\n enableMarkdown?: boolean;\n}\n\n/**\n * UserMessage component displays a user's message in a chat interface.\n * Styled with right alignment and pink/purple gradient from Figma design.\n *\n * Features:\n * - Right-aligned layout\n * - Pink/purple gradient background (#D8B4FE)\n * - Support for streaming state\n * - Optional timestamp display\n * - Action buttons support\n * - Avatar display\n */\nexport const UserMessage = ({\n content,\n timestamp,\n className,\n avatarUrl,\n username,\n isStreaming = false,\n actions = [],\n enableMarkdown = true,\n}: UserMessageProps) => {\n return (\n <StyledUserMessage className={className}>\n <MessageBubble>\n {username && <strong>{username}</strong>}\n <MessageContent>\n <StreamingText\n content={content}\n isStreaming={isStreaming}\n variant={enableMarkdown ? 'markdown' : 'default'}\n cursor={false}\n />\n </MessageContent>\n {timestamp && <MessageTime>{timestamp}</MessageTime>}\n {actions.length > 0 && (\n <ActionsContainer>\n {actions.map((action, index) => (\n <ActionButton key={index} onClick={action.onClick}>\n {action.icon}\n {action.label}\n </ActionButton>\n ))}\n </ActionsContainer>\n )}\n </MessageBubble>\n {avatarUrl && <Avatar src={avatarUrl} alt={username || 'User'} />}\n </StyledUserMessage>\n );\n};\n","/**\n * StreamErrorMessage Component\n *\n * Displays inline chat errors with retry support.\n *\n * @see specs/015-restyle-ai-chat/spec.md\n */\n\nimport type React from 'react';\nimport styled from 'styled-components';\nimport { tokens } from '../../theme/tokens';\n\nconst ErrorContainer = styled.div<{ variant: 'inline' | 'banner' }>`\n display: flex;\n align-items: flex-start;\n gap: ${tokens.spacing.sm};\n padding: ${(props) => (props.variant === 'banner' ? tokens.spacing.md : `${tokens.spacing.sm} ${tokens.spacing.md}`)};\n background-color: ${(props) =>\n props.variant === 'banner' ? `${tokens.colors.error}1a` : `${tokens.colors.error}0d`};\n border: 1px solid ${tokens.colors.error}4d;\n border-radius: ${(props) => (props.variant === 'banner' ? tokens.borderRadius.md : tokens.borderRadius.lg)};\n color: ${tokens.colors.text.primary};\n font-family: ${tokens.typography.fontFamily.primary};\n margin: ${tokens.spacing.sm} 0;\n width: ${(props) => (props.variant === 'banner' ? '100%' : 'auto')};\n max-width: ${(props) => (props.variant === 'banner' ? '100%' : '600px')};\n`;\n\nconst IconContainer = styled.div`\n flex-shrink: 0;\n width: 20px;\n height: 20px;\n color: ${tokens.colors.error};\n`;\n\nconst ErrorIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n width=\"20\"\n height=\"20\"\n >\n <path d=\"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-2h2v2zm0-4h-2V7h2v6z\" />\n </svg>\n);\n\nconst Content = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: ${tokens.spacing.sm};\n`;\n\nconst ErrorMessage = styled.div`\n font-size: ${tokens.typography.fontSize.sm};\n line-height: ${tokens.typography.lineHeight.normal};\n color: ${tokens.colors.text.primary};\n`;\n\nconst ErrorDetails = styled.div`\n font-size: ${tokens.typography.fontSize.xs};\n line-height: 1.4;\n color: ${tokens.colors.text.secondary};\n margin-top: ${tokens.spacing.xs};\n`;\n\nconst Actions = styled.div`\n display: flex;\n gap: ${tokens.spacing.sm};\n margin-top: ${tokens.spacing.sm};\n`;\n\nconst Button = styled.button<{ variant: 'primary' | 'secondary' }>`\n display: inline-flex;\n align-items: center;\n gap: ${tokens.spacing.xs};\n padding: ${tokens.spacing.xs} ${tokens.spacing.sm};\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${(props) => (props.variant === 'primary' ? tokens.colors.text.primary : tokens.colors.text.secondary)};\n background: ${(props) => (props.variant === 'primary' ? tokens.colors.error : tokens.colors.surface.overlay)};\n border: 1px solid\n ${(props) => (props.variant === 'primary' ? tokens.colors.error : tokens.colors.border.default)};\n border-radius: ${tokens.borderRadius.md};\n cursor: pointer;\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${(props) =>\n props.variant === 'primary'\n ? tokens.colors.status.failed\n : tokens.colors.surface.overlayHover};\n border-color: ${(props) =>\n props.variant === 'primary' ? tokens.colors.status.failed : tokens.colors.border.hover};\n }\n\n &:active {\n transform: scale(0.98);\n }\n\n &:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n`;\n\nconst CloseButton = styled.button`\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: none;\n color: ${tokens.colors.text.secondary};\n cursor: pointer;\n border-radius: ${tokens.borderRadius.sm};\n transition: all ${tokens.transitions.fast};\n\n &:hover {\n background: ${tokens.colors.surface.overlayHover};\n color: ${tokens.colors.text.primary};\n }\n\n &:active {\n transform: scale(0.95);\n }\n`;\n\nconst CloseIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n width=\"16\"\n height=\"16\"\n >\n <path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" />\n </svg>\n);\n\nexport interface StreamErrorMessageProps {\n /** Error message to display */\n error: string | Error;\n /** Visual variant */\n variant?: 'inline' | 'banner';\n /** Whether the error can be retried */\n retryable?: boolean;\n /** Callback when retry is clicked */\n onRetry?: () => void;\n /** Callback when dismiss is clicked */\n onDismiss?: () => void;\n /** Additional error details */\n details?: string;\n /** Custom className */\n className?: string;\n}\n\n/**\n * StreamErrorMessage component for inline chat errors\n *\n * Features:\n * - Inline and banner variants\n * - Retry support for recoverable errors\n * - Dismissible errors\n * - Error details display\n * - Accessible error reporting\n */\nexport const StreamErrorMessage: React.FC<StreamErrorMessageProps> = ({\n error,\n variant = 'inline',\n retryable = false,\n onRetry,\n onDismiss,\n details,\n className,\n}) => {\n const errorMessage = typeof error === 'string' ? error : error.message;\n\n return (\n <ErrorContainer variant={variant} className={className} role=\"alert\" aria-live=\"assertive\">\n <IconContainer aria-hidden=\"true\">\n <ErrorIcon />\n </IconContainer>\n <Content>\n <ErrorMessage>{errorMessage}</ErrorMessage>\n {details && <ErrorDetails>{details}</ErrorDetails>}\n {(retryable || onDismiss) && (\n <Actions>\n {retryable && onRetry && (\n <Button variant=\"primary\" onClick={onRetry}>\n Retry\n </Button>\n )}\n {onDismiss && (\n <Button variant=\"secondary\" onClick={onDismiss}>\n Dismiss\n </Button>\n )}\n </Actions>\n )}\n </Content>\n {onDismiss && (\n <CloseButton onClick={onDismiss} aria-label=\"Dismiss error\">\n <CloseIcon />\n </CloseButton>\n )}\n </ErrorContainer>\n );\n};\n\nStreamErrorMessage.displayName = 'StreamErrorMessage';\n","import styled, { css } from 'styled-components';\nimport { tokens } from '../../../theme/tokens';\n\nexport const SuggestionsContainer = styled.div`\n display: flex;\n flex-wrap: nowrap; /* Single row */\n gap: ${tokens.spacing.sm};\n\n /* Reduced padding for tighter height */\n padding: ${tokens.spacing.xs} 0;\n\n /* Horizontal scrolling */\n overflow-x: auto;\n overflow-y: hidden;\n\n /* Smooth scrolling on mobile */\n -webkit-overflow-scrolling: touch;\n scroll-behavior: smooth;\n\n /* Align items to ensure single-row height */\n align-items: center;\n\n /* Constrain to exact height of buttons + minimal padding */\n /* Button height: ~14px font + 16px padding + 2px border = ~32px */\n /* Add small padding: 8px total = 40px */\n max-height: 40px;\n min-height: 40px;\n\n /* Hide scrollbar but keep functionality */\n scrollbar-width: none; /* Firefox */\n -ms-overflow-style: none; /* IE/Edge */\n\n &::-webkit-scrollbar {\n display: none; /* Chrome/Safari/Opera */\n }\n`;\n\ninterface StyledSuggestionProps {\n $isPressed: boolean;\n}\n\nexport const StyledSuggestion = styled.button<StyledSuggestionProps>`\n /* Base styles */\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: ${tokens.spacing.sm} ${tokens.spacing.md};\n font-family: ${tokens.typography.fontFamily.primary};\n font-size: ${tokens.typography.fontSize.sm};\n font-weight: ${tokens.typography.fontWeight.medium};\n color: ${tokens.colors.text.primary};\n background-color: ${tokens.colors.surface.elevated};\n border: 1px solid ${tokens.colors.border.default};\n border-radius: ${tokens.borderRadius.lg};\n cursor: pointer;\n transition: all ${tokens.transitions.normal};\n white-space: nowrap;\n user-select: none;\n flex-shrink: 0; /* Prevent shrinking to maintain size */\n\n /* Hover state */\n &:hover:not(:disabled) {\n background-color: ${tokens.colors.surface.overlayHover};\n border-color: ${tokens.colors.primary};\n transform: translateY(-1px);\n box-shadow: ${tokens.shadows.sm};\n }\n\n /* Active/Pressed state */\n &:active:not(:disabled) {\n transform: translateY(0);\n box-shadow: none;\n }\n\n ${({ $isPressed }) =>\n $isPressed &&\n css`\n transform: scale(0.98);\n `}\n\n /* Focus state */\n &:focus-visible {\n outline: 2px solid ${tokens.colors.border.focus};\n outline-offset: 2px;\n }\n\n /* Remove default focus outline */\n &:focus {\n outline: none;\n }\n\n /* Disabled state */\n &:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n transform: none;\n }\n`;\n","import { useButton } from '@react-aria/button';\nimport { useRef } from 'react';\nimport { StyledSuggestion, SuggestionsContainer } from './Suggestions.styles';\n\nexport interface SuggestionsProps {\n suggestions: string[];\n onSelect: (suggestion: string) => void;\n className?: string;\n}\n\nexport function Suggestions({ suggestions, onSelect, className }: SuggestionsProps) {\n if (suggestions.length === 0) {\n return null;\n }\n\n return (\n <SuggestionsContainer className={className} role=\"list\" aria-label=\"Suggested prompts\">\n {suggestions.map((suggestion) => (\n <SuggestionChip key={suggestion} suggestion={suggestion} onSelect={onSelect} />\n ))}\n </SuggestionsContainer>\n );\n}\n\ninterface SuggestionChipProps {\n suggestion: string;\n onSelect: (suggestion: string) => void;\n}\n\nfunction SuggestionChip({ suggestion, onSelect }: SuggestionChipProps) {\n const ref = useRef<HTMLButtonElement>(null);\n const { buttonProps, isPressed } = useButton(\n {\n onPress: () => onSelect(suggestion),\n 'aria-label': `Select suggestion: ${suggestion}`,\n },\n ref\n );\n\n return (\n <StyledSuggestion {...buttonProps} ref={ref} $isPressed={isPressed} role=\"listitem\">\n {suggestion}\n </StyledSuggestion>\n );\n}\n\nSuggestions.displayName = 'Suggestions';\n"]}