{"version":3,"sources":["../src/components/announcement-overlay.tsx","../src/components/announcement-close.tsx","../src/components/announcement-content.tsx","../src/components/announcement-actions.tsx","../src/components/ui/modal-variants.ts","../src/components/announcement-modal.tsx","../src/components/ui/slideout-variants.ts","../src/components/announcement-slideout.tsx","../src/components/ui/banner-variants.ts","../src/components/announcement-banner.tsx","../src/components/ui/toast-variants.ts","../src/components/announcement-toast.tsx","../src/components/ui/spotlight-variants.ts","../src/components/announcement-spotlight.tsx","../src/hooks/use-filtered-announcements.tsx"],"names":["overlayVariants","cva","AnnouncementOverlay","ae","className","blur","open","onClose","onClick","props","ref","handleClick","event","jsx","cn","defaultIcon","jsxs","AnnouncementClose","se","asChild","children","library","useUILibrary","sharedProps","UnifiedSlot","Slot","visuallyHiddenStyle","AnnouncementContent","ze","title","description","media","asDialogContent","titleProps","descriptionProps","hasTitle","MediaSlot","toMediaSlotProps","ie","buttonVariants","AnnouncementActions","j","primaryAction","secondaryAction","onAction","onDismiss","direction","handlePrimaryClick","handleSecondaryClick","ActionButton","action","defaultVariant","variant","modalOverlayVariants","modalContentVariants","AnnouncementModal","K","id","openProp","onOpenChange","size","options","useConfig","ariaDescribedBy","announcement","useAnnouncement","config","resolvedTitle","useResolvedText","resolvedDescription","isControlled","handleOpenChange","newOpen","handleDismiss","reason","handleComplete","modalOptions","effectiveSize","hasDescription","z","e","Fragment","type","slideoutOverlayVariants","slideoutContentVariants","AnnouncementSlideout","Y","position","slideoutOptions","effectivePosition","B","bannerVariants","AnnouncementBanner","le","intent","sticky","bannerOptions","effectiveIntent","effectiveSticky","toastContainerVariants","toastVariants","toastProgressVariants","AnnouncementToast","w","toastAdapter","useAnnouncementsContext","progress","setProgress","mounted","setMounted","adapterFallback","setAdapterFallback","toastOptions","renderedContent","cancelled","handle","result","portalActive","startTime","duration","timer","elapsed","remaining","toastContent","createPortal","spotlightOverlayVariants","spotlightContentVariants","useResolvedStrokeColor","value","prefersDark","v","cb","mq","ARROW_ROTATION_BY_PLACEMENT","ARROW_SIZE","ARROW_GAP","computeArrowPosition","targetRect","placement","padding","arrowCenterX","arrowCenterY","arrowLeft","arrowTop","AnnouncementSpotlight","placementProp","strokeColorProp","targetElement","setTargetElement","setTargetRect","resolvedStrokeColor","spotlightOptions","effectivePlacement","element","refs","floatingStyles","useFloating","offset","flip","shift","autoUpdate","update","resizeObserver","isLegacy","overlayBg","cutoutStyle","arrowRotation","arrowStyle","spotlightContent","node","useFilteredAnnouncements","announcements","segments","useSegments","Xe","a","evaluateAnnouncementAudience"],"mappings":"86BAMMA,EAAAA,CAAkBC,0BAAAA,CACtB,yMACA,CACE,QAAA,CAAU,CACR,IAAA,CAAM,CACJ,KAAM,EAAA,CACN,EAAA,CAAI,mBACJ,EAAA,CAAI,kBAAA,CACJ,GAAI,kBACN,CACF,EACA,eAAA,CAAiB,CACf,KAAM,MACR,CACF,CACF,CAAA,CAWaC,EAAAA,CAA4BC,wBACvC,CAAC,CAAE,SAAA,CAAAC,CAAAA,CAAW,IAAA,CAAAC,CAAAA,CAAM,KAAAC,CAAAA,CAAO,IAAA,CAAM,QAAAC,CAAAA,CAAS,OAAA,CAAAC,EAAS,GAAGC,CAAM,EAAGC,CAAAA,GAAQ,CACrE,IAAMC,CAAAA,CAAoBR,YAAA,CAAA,WAAA,CACvBS,GAA4C,CAC3CJ,CAAAA,GAAUI,CAAK,CAAA,CACVA,CAAAA,CAAM,gBAAA,EACTL,CAAAA,KAEJ,CAAA,CACA,CAACC,CAAAA,CAASD,CAAO,CACnB,CAAA,CAEA,OAAKD,EAGHO,cAAAA,CAAC,KAAA,CAAA,CACC,IAAKH,CAAAA,CACL,YAAA,CAAYJ,EAAO,MAAA,CAAS,QAAA,CAC5B,UAAWQ,OAAAA,CAAGd,EAAAA,CAAgB,CAAE,IAAA,CAAAK,CAAK,CAAC,CAAA,CAAGD,CAAS,CAAA,CAClD,QAASO,CAAAA,CACT,aAAA,CAAY,OACX,GAAGF,CAAAA,CACN,EAVgB,IAYpB,CACF,EACAP,EAAAA,CAAoB,WAAA,CAAc,sBClDlC,IAAMa,EAAAA,CACJC,gBAAC,KAAA,CAAA,CACC,KAAA,CAAM,6BACN,KAAA,CAAM,IAAA,CACN,MAAA,CAAO,IAAA,CACP,OAAA,CAAQ,WAAA,CACR,KAAK,MAAA,CACL,MAAA,CAAO,eACP,WAAA,CAAY,GAAA,CACZ,cAAc,OAAA,CACd,cAAA,CAAe,QACf,aAAA,CAAY,MAAA,CAEZ,UAAAH,cAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,YAAA,CAAa,CAAA,CACrBA,eAAC,MAAA,CAAA,CAAK,CAAA,CAAE,YAAA,CAAa,CAAA,CAAA,CACvB,CAAA,CAWWI,CAAAA,CAA0BC,wBACrC,CAAC,CAAE,UAAAd,CAAAA,CAAW,OAAA,CAAAe,EAAU,KAAA,CAAO,QAAA,CAAAC,EAAU,OAAA,CAAAZ,CAAAA,CAAS,QAAAD,CAAAA,CAAS,GAAGE,CAAM,CAAA,CAAGC,CAAAA,GAAQ,CAC7E,IAAMW,CAAAA,CAAUC,iBAAAA,EAAa,CAEvBX,CAAAA,CAAoBO,YAAA,CAAA,WAAA,CACvBN,GAA+C,CAC9CJ,CAAAA,GAAUI,CAAK,CAAA,CACVA,CAAAA,CAAM,kBACTL,CAAAA,KAEJ,EACA,CAACC,CAAAA,CAASD,CAAO,CACnB,CAAA,CAEMgB,EAAc,CAClB,GAAA,CAAAb,EACA,OAAA,CAASC,CAAAA,CACT,UAAWG,OAAAA,CACT,+QAAA,CACAV,CACF,CAAA,CACA,YAAA,CAAc,QACd,IAAA,CAAM,QAAA,CACN,GAAGK,CACL,CAAA,CAGA,OAAIU,CAAAA,EAAWE,CAAAA,GAAY,UAClBR,cAAAA,CAACW,gBAAAA,CAAA,CAAa,GAAGD,CAAAA,CAAc,SAAAH,CAAAA,EAAYL,EAAAA,CAAY,CAAA,CAI5DI,CAAAA,CACKN,cAAAA,CAACY,cAAAA,CAAA,CAAM,GAAGF,CAAAA,CAAe,SAAAH,CAAAA,EAAgCL,EAAAA,CAAY,EAIvEF,cAAAA,CAAC,QAAA,CAAA,CAAQ,GAAGU,CAAAA,CAAe,QAAA,CAAAH,GAAgCL,EAAAA,CAAY,CAChF,CACF,EACAE,CAAAA,CAAkB,YAAc,mBAAA,KCjD1BS,EAAAA,CAA2C,CAC/C,SAAU,UAAA,CACV,KAAA,CAAO,CAAA,CACP,MAAA,CAAQ,CAAA,CACR,OAAA,CAAS,EACT,MAAA,CAAQ,EAAA,CACR,SAAU,QAAA,CACV,IAAA,CAAM,mBACN,UAAA,CAAY,QAAA,CACZ,OAAQ,CACV,CAAA,CAEaC,EAA4BC,YAAA,CAAA,UAAA,CACvC,CACE,CACE,SAAA,CAAAxB,CAAAA,CACA,MAAAyB,CAAAA,CACA,WAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,eAAA,CAAAC,EAAkB,KAAA,CAClB,UAAA,CAAAC,EACA,gBAAA,CAAAC,CAAAA,CACA,SAAAd,CAAAA,CACA,GAAGX,CACL,CAAA,CACAC,CAAAA,GACG,CACH,IAAMyB,CAAAA,CAAW,EAAQN,CAAAA,CAEzB,OACEb,gBAAC,KAAA,CAAA,CAAI,GAAA,CAAKN,CAAAA,CAAK,SAAA,CAAWI,OAAAA,CAAG,WAAA,CAAaV,CAAS,CAAA,CAAI,GAAGK,EACvD,QAAA,CAAA,CAAAsB,CAAAA,EACClB,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sCAAsC,WAAA,CAAU,oBAAA,CAC7D,SAAAA,cAAAA,CAACuB,eAAAA,CAAA,CAAW,GAAGC,mBAAAA,CAAiBN,CAAK,CAAA,CAAG,CAAA,CAC1C,CAAA,CAGDC,CAAAA,CACCnB,cAAAA,CAAQyB,YAAA,CAAA,KAAA,CAAP,CACE,GAAGL,CAAAA,CACJ,UAAWnB,OAAAA,CACTqB,CAAAA,EAAY,oDACZF,CAAAA,EAAY,SACd,EACA,KAAA,CAAQE,CAAAA,CAA8DF,GAAY,KAAA,CAA/D,CAAE,GAAGP,EAAAA,CAAqB,GAAGO,GAAY,KAAM,CAAA,CAEjE,QAAA,CAAAE,CAAAA,CAAWN,CAAAA,CAAQ,cAAA,CACtB,EAEAA,CAAAA,EACEhB,cAAAA,CAAC,MACE,GAAGoB,CAAAA,CACJ,UAAWnB,OAAAA,CACT,mDAAA,CACAmB,GAAY,SACd,CAAA,CAEC,SAAAJ,CAAAA,CACH,CAAA,CAIHC,IACEE,CAAAA,CACCnB,cAAAA,CAAQyB,yBAAP,CACE,GAAGJ,EACJ,SAAA,CAAWpB,OAAAA,CAAG,gCAAiCoB,CAAAA,EAAkB,SAAS,EAEzE,QAAA,CAAAJ,CAAAA,CACH,EAEAjB,cAAAA,CAAC,KAAA,CAAA,CACE,GAAGqB,CAAAA,CACJ,SAAA,CAAWpB,QAAG,+BAAA,CAAiCoB,CAAAA,EAAkB,SAAS,CAAA,CAEzE,QAAA,CAAAJ,EACH,CAAA,CAAA,CAGHV,CAAAA,CAAAA,CACH,CAEJ,CACF,EACAO,CAAAA,CAAoB,YAAc,qBAAA,CCtGlC,IAAMY,EAAAA,CAAiBtC,0BAAAA,CACrB,wRAAA,CACA,CACE,QAAA,CAAU,CACR,OAAA,CAAS,CACP,QAAS,wDAAA,CACT,SAAA,CAAW,+DACX,KAAA,CAAO,8CAAA,CACP,KAAM,iDACR,CAAA,CACA,KAAM,CACJ,EAAA,CAAI,sBACJ,EAAA,CAAI,gBAAA,CACJ,GAAI,sBACN,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,UACT,IAAA,CAAM,IACR,CACF,CACF,CAAA,CAeauC,EAA4BC,YAAA,CAAA,UAAA,CACvC,CACE,CACE,SAAA,CAAArC,CAAAA,CACA,cAAAsC,CAAAA,CACA,eAAA,CAAAC,EACA,QAAA,CAAAC,CAAAA,CACA,UAAAC,CAAAA,CACA,SAAA,CAAAC,CAAAA,CAAY,YAAA,CACZ,QAAA,CAAA1B,CAAAA,CACA,GAAGX,CACL,CAAA,CACAC,IACG,CACH,IAAMqC,EAA2BN,YAAA,CAAA,WAAA,CAAY,IAAM,CACjDC,CAAAA,EAAe,OAAA,KACfE,CAAAA,GAAW,SAAS,EAChBF,CAAAA,EAAe,cAAA,EACjBG,MAEJ,CAAA,CAAG,CAACH,CAAAA,CAAeE,CAAAA,CAAUC,CAAS,CAAC,CAAA,CAEjCG,CAAAA,CAA6BP,yBAAY,IAAM,CACnDE,GAAiB,OAAA,IAAU,CAC3BC,IAAW,WAAW,CAAA,CAClBD,GAAiB,cAAA,EACnBE,CAAAA,KAEJ,CAAA,CAAG,CAACF,EAAiBC,CAAAA,CAAUC,CAAS,CAAC,CAAA,CAIzC,OAFmBH,CAAAA,EAAiBC,GAAmBvB,CAAAA,CAKrDJ,eAAAA,CAAC,OACC,GAAA,CAAKN,CAAAA,CACL,UAAWI,OAAAA,CACT,YAAA,CACAgC,IAAc,UAAA,CAAa,UAAA,CAAa,uBACxC1C,CACF,CAAA,CACC,GAAGK,CAAAA,CAEH,QAAA,CAAA,CAAAW,EAEAuB,CAAAA,EACC9B,cAAAA,CAACoC,EAAAA,CAAA,CACC,MAAA,CAAQN,CAAAA,CACR,eAAe,WAAA,CACf,OAAA,CAASK,EACX,CAAA,CAGDN,CAAAA,EACC7B,eAACoC,EAAAA,CAAA,CACC,OAAQP,CAAAA,CACR,cAAA,CAAe,UACf,OAAA,CAASK,CAAAA,CACX,GAEJ,CAAA,CA7BsB,IA+B1B,CACF,EACAP,CAAAA,CAAoB,YAAc,qBAAA,CAQlC,SAASS,GAAa,CAAE,MAAA,CAAAC,EAAQ,cAAA,CAAAC,CAAAA,CAAgB,QAAA3C,CAAQ,CAAA,CAAsB,CAC5E,IAAM4C,CAAAA,CAAUF,EAAO,OAAA,EAAWC,CAAAA,CAElC,OAAID,CAAAA,CAAO,IAAA,CAEPrC,eAAC,GAAA,CAAA,CACC,IAAA,CAAMqC,CAAAA,CAAO,IAAA,CACb,SAAA,CAAWpC,OAAAA,CAAGyB,GAAe,CAAE,OAAA,CAAAa,EAAS,IAAA,CAAM,IAAK,CAAC,CAAC,CAAA,CACrD,QAAS5C,CAAAA,CAER,QAAA,CAAA0C,EAAO,KAAA,CACV,CAAA,CAKFrC,eAAC,QAAA,CAAA,CAAO,IAAA,CAAK,SAAS,SAAA,CAAWC,OAAAA,CAAGyB,EAAAA,CAAe,CAAE,OAAA,CAAAa,CAAAA,CAAS,KAAM,IAAK,CAAC,CAAC,CAAA,CAAG,OAAA,CAAS5C,EACpF,QAAA,CAAA0C,CAAAA,CAAO,MACV,CAEJ,CCtIO,IAAMG,EAAAA,CAAuBpD,2BAClC,wMACF,CAAA,CAEaqD,GAAuBrD,0BAAAA,CAClC,4mBAAA,CACA,CACE,QAAA,CAAU,CACR,KAAM,CACJ,EAAA,CAAI,WACJ,EAAA,CAAI,UAAA,CACJ,GAAI,UAAA,CACJ,EAAA,CAAI,UAAA,CACJ,IAAA,CAAM,2BACR,CACF,EACA,eAAA,CAAiB,CACf,KAAM,IACR,CACF,CACF,ECSO,IAAMsD,EAAAA,CAA0BC,wBACrC,CACE,CACE,EAAA,CAAAC,CAAAA,CACA,IAAA,CAAMC,CAAAA,CACN,aAAAC,CAAAA,CACA,IAAA,CAAAC,EACA,OAAA,CAAAC,CAAAA,CACA,UAAAzD,CAAAA,CACA,QAAA,CAAAgB,EACA,SAAA,CAAA0C,CAAAA,CAAY,KACZ,kBAAA,CAAoBC,CAAAA,CACpB,GAAGtD,CACL,CAAA,CACAC,IACG,CACH,IAAMsD,CAAAA,CAAeC,mBAAAA,CAAgBR,CAAE,CAAA,CACjCS,EAASF,CAAAA,CAAa,MAAA,CAEtBG,EAAgBC,mBAAAA,CAAgBF,CAAAA,EAAQ,KAAK,CAAA,CAC7CG,CAAAA,CAAsBD,oBAAgBF,CAAAA,EAAQ,WAAW,EAGzDI,CAAAA,CAAeZ,CAAAA,GAAa,OAC5BpD,CAAAA,CAAOgE,CAAAA,CAAeZ,EAAWM,CAAAA,CAAa,SAAA,CAE9CO,CAAAA,CAAyBf,YAAA,CAAA,WAAA,CAC5BgB,CAAAA,EAAqB,CACpBb,IAAea,CAAO,CAAA,CACjBF,IACCE,CAAAA,CACFR,CAAAA,CAAa,MAAK,CAElBA,CAAAA,CAAa,MAAK,EAGxB,CAAA,CACA,CAACL,CAAAA,CAAcW,CAAAA,CAAcN,CAAY,CAC3C,CAAA,CAEMS,EAAsBjB,YAAA,CAAA,WAAA,CAC1B,CAACkB,EAA0B,cAAA,GAAmB,CAC5CV,EAAa,OAAA,CAAQU,CAAM,EAC3Bf,CAAAA,GAAe,KAAK,EACtB,CAAA,CACA,CAACK,EAAcL,CAAY,CAC7B,EAEMgB,CAAAA,CAAuBnB,YAAA,CAAA,WAAA,CAAY,IAAM,CAC7CQ,CAAAA,CAAa,UAAS,CACtBL,CAAAA,GAAe,KAAK,EACtB,CAAA,CAAG,CAACK,EAAcL,CAAY,CAAC,EAEzBiB,CAAAA,CAA6B,CACjC,oBAAqB,IAAA,CACrB,aAAA,CAAe,KACf,eAAA,CAAiB,IAAA,CACjB,GAAGf,CAAAA,CACH,GAAGK,GAAQ,YACb,CAAA,CAEMW,EAAgBjB,CAAAA,EAAQM,CAAAA,EAAQ,YAAA,EAAc,IAAA,EAAQ,IAAA,CACtDY,CAAAA,CAAiB,EAAQT,CAAAA,CAE/B,OACExD,eAAQkE,YAAA,CAAA,IAAA,CAAP,CAAY,KAAMzE,CAAAA,CAAM,YAAA,CAAciE,EACrC,QAAA,CAAAvD,eAAAA,CAAQ+D,oBAAP,CACC,QAAA,CAAA,CAAAlE,eAAQkE,YAAA,CAAA,OAAA,CAAP,CACC,UAAWjE,OAAAA,CAAGuC,EAAAA,EAAsB,CAAA,CACpC,OAAA,CACEuB,CAAAA,CAAa,oBAAsB,IAAMH,CAAAA,CAAc,eAAe,CAAA,CAAI,MAAA,CAE9E,EACAzD,eAAAA,CAAQ+D,YAAA,CAAA,OAAA,CAAP,CACC,GAAA,CAAKrE,CAAAA,CACL,aAAW,MAAA,CACX,SAAA,CAAWI,QAAGwC,EAAAA,CAAqB,CAAE,KAAMuB,CAAc,CAAC,CAAA,CAAGzE,CAAS,CAAA,CACtE,eAAA,CACEwE,EAAa,aAAA,CACT,IAAMH,EAAc,YAAY,CAAA,CAC/BO,GAAMA,CAAAA,CAAE,cAAA,GAEf,kBAAA,CAAkBF,CAAAA,CAAiBf,EAAkB,MAAA,CACpD,GAAGtD,EAEH,QAAA,CAAA,CAAAmE,CAAAA,CAAa,iBACZ/D,cAAAA,CAACI,CAAAA,CAAA,CAAkB,OAAA,CAAS,IAAMwD,CAAAA,CAAc,cAAc,CAAA,CAAG,CAAA,CAGlEX,GAAaI,CAAAA,CACZlD,eAAAA,CAAAiE,oBAAA,CACE,QAAA,CAAA,CAAApE,eAACc,CAAAA,CAAA,CACC,MAAOwC,CAAAA,CACP,WAAA,CAAaE,EACb,KAAA,CAAOH,CAAAA,CAAO,MACd,eAAA,CAAe,IAAA,CACjB,CAAA,CACArD,cAAAA,CAAC2B,CAAAA,CAAA,CACC,cAAe0B,CAAAA,CAAO,aAAA,CACtB,gBAAiBA,CAAAA,CAAO,eAAA,CACxB,SAAWgB,CAAAA,EAAS,CACdA,IAAS,SAAA,EACXP,CAAAA,GAEJ,CAAA,CACA,SAAA,CAAW,IAAMF,CAAAA,CAAc,gBAAgB,EACjD,CAAA,CAAA,CACF,CAAA,CAEArD,CAAAA,CAAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CACF,EACAmC,EAAAA,CAAkB,YAAc,mBAAA,CClJzB,IAAM4B,EAAAA,CAA0BlF,2BACrC,wMACF,CAAA,CAEamF,GAA0BnF,0BAAAA,CACrC,0NAAA,CACA,CACE,QAAA,CAAU,CACR,SAAU,CACR,IAAA,CAAM,sIACN,KAAA,CACE,wIACJ,EACA,IAAA,CAAM,CACJ,GAAI,mBAAA,CACJ,EAAA,CAAI,oBACJ,EAAA,CAAI,mBACN,CACF,CAAA,CACA,eAAA,CAAiB,CACf,SAAU,OAAA,CACV,IAAA,CAAM,IACR,CACF,CACF,MCKaoF,EAAAA,CAA6BC,YAAA,CAAA,UAAA,CACxC,CACE,CACE,EAAA,CAAA7B,EACA,IAAA,CAAMC,CAAAA,CACN,YAAA,CAAAC,CAAAA,CACA,QAAA,CAAA4B,CAAAA,CACA,KAAA3B,CAAAA,CACA,OAAA,CAAAC,EACA,SAAA,CAAAzD,CAAAA,CACA,SAAAgB,CAAAA,CACA,SAAA,CAAA0C,EAAY,IAAA,CACZ,kBAAA,CAAoBC,EACpB,GAAGtD,CACL,EACAC,CAAAA,GACG,CACH,IAAMsD,CAAAA,CAAeC,mBAAAA,CAAgBR,CAAE,CAAA,CACjCS,CAAAA,CAASF,CAAAA,CAAa,OAEtBG,CAAAA,CAAgBC,mBAAAA,CAAgBF,GAAQ,KAAK,CAAA,CAC7CG,EAAsBD,mBAAAA,CAAgBF,CAAAA,EAAQ,WAAW,CAAA,CAGzDI,CAAAA,CAAeZ,IAAa,MAAA,CAC5BpD,CAAAA,CAAOgE,EAAeZ,CAAAA,CAAWM,CAAAA,CAAa,UAE9CO,CAAAA,CAAyBe,YAAA,CAAA,WAAA,CAC5Bd,CAAAA,EAAqB,CACpBb,CAAAA,GAAea,CAAO,EACjBF,CAAAA,GACCE,CAAAA,CACFR,EAAa,IAAA,EAAK,CAElBA,EAAa,IAAA,EAAK,EAGxB,EACA,CAACL,CAAAA,CAAcW,EAAcN,CAAY,CAC3C,EAEMS,CAAAA,CAAsBa,YAAA,CAAA,WAAA,CAC1B,CAACZ,CAAAA,CAA0B,cAAA,GAAmB,CAC5CV,CAAAA,CAAa,OAAA,CAAQU,CAAM,EAC3Bf,CAAAA,GAAe,KAAK,EACtB,CAAA,CACA,CAACK,EAAcL,CAAY,CAC7B,EAEMgB,CAAAA,CAAuBW,YAAA,CAAA,WAAA,CAAY,IAAM,CAC7CtB,CAAAA,CAAa,UAAS,CACtBL,CAAAA,GAAe,KAAK,EACtB,CAAA,CAAG,CAACK,CAAAA,CAAcL,CAAY,CAAC,EAEzB6B,CAAAA,CAAmC,CACvC,oBAAqB,IAAA,CACrB,aAAA,CAAe,KACf,eAAA,CAAiB,IAAA,CACjB,GAAG3B,CAAAA,CACH,GAAGK,GAAQ,eACb,CAAA,CAEMuB,EAAoBF,CAAAA,EAAYrB,CAAAA,EAAQ,iBAAiB,QAAA,EAAY,OAAA,CACrEW,CAAAA,CAAgBjB,CAAAA,EAAQM,CAAAA,EAAQ,eAAA,EAAiB,MAAQ,IAAA,CACzDY,CAAAA,CAAiB,EAAQT,CAAAA,CAE/B,OACExD,eAAQ6E,YAAA,CAAA,IAAA,CAAP,CAAY,KAAMpF,CAAAA,CAAM,YAAA,CAAciE,EACrC,QAAA,CAAAvD,eAAAA,CAAQ0E,oBAAP,CACC,QAAA,CAAA,CAAA7E,eAAQ6E,YAAA,CAAA,OAAA,CAAP,CACC,UAAW5E,OAAAA,CAAGqE,EAAAA,EAAyB,CAAA,CACvC,OAAA,CACEK,EAAgB,mBAAA,CAAsB,IAAMf,EAAc,eAAe,CAAA,CAAI,OAEjF,CAAA,CACAzD,eAAAA,CAAQ0E,qBAAP,CACC,GAAA,CAAKhF,EACL,SAAA,CAAWI,OAAAA,CACTsE,GAAwB,CAAE,QAAA,CAAUK,CAAAA,CAAmB,IAAA,CAAMZ,CAAc,CAAC,EAC5EzE,CACF,CAAA,CACA,gBACEoF,CAAAA,CAAgB,aAAA,CACZ,IAAMf,CAAAA,CAAc,YAAY,EAC/BO,CAAAA,EAAMA,CAAAA,CAAE,gBAAe,CAE9B,kBAAA,CAAkBF,EAAiBf,CAAAA,CAAkB,MAAA,CACpD,GAAGtD,CAAAA,CAEH,QAAA,CAAA,CAAA+E,CAAAA,CAAgB,eAAA,EACf3E,cAAAA,CAACI,CAAAA,CAAA,CAAkB,OAAA,CAAS,IAAMwD,EAAc,cAAc,CAAA,CAAG,EAGlEX,CAAAA,EAAaI,CAAAA,CACZlD,gBAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBACb,QAAA,CAAA,CAAAH,cAAAA,CAACc,EAAA,CACC,KAAA,CAAOwC,EACP,WAAA,CAAaE,CAAAA,CACb,KAAA,CAAOH,CAAAA,CAAO,KAAA,CACd,SAAA,CAAU,SACV,eAAA,CAAe,IAAA,CACjB,EACArD,cAAAA,CAAC2B,CAAAA,CAAA,CACC,aAAA,CAAe0B,CAAAA,CAAO,cACtB,eAAA,CAAiBA,CAAAA,CAAO,gBACxB,QAAA,CAAWgB,CAAAA,EAAS,CACdA,CAAAA,GAAS,SAAA,EACXP,IAEJ,CAAA,CACA,SAAA,CAAW,IAAMF,CAAAA,CAAc,gBAAgB,EAC/C,SAAA,CAAU,UAAA,CACV,UAAU,cAAA,CACZ,CAAA,CAAA,CACF,EAEArD,CAAAA,CAAAA,CAEJ,CAAA,CAAA,CACF,EACF,CAEJ,CACF,EACAiE,EAAAA,CAAqB,WAAA,CAAc,2BCzJtBM,EAAAA,CAAiB1F,0BAAAA,CAC5B,6OACA,CACE,QAAA,CAAU,CACR,QAAA,CAAU,CACR,IAAK,2GAAA,CACL,MAAA,CACE,iHACJ,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,mGAAA,CACN,OAAA,CACE,0GACF,OAAA,CACE,+GAAA,CACF,MACE,6FAAA,CACF,OAAA,CAAS,6CACX,CAAA,CACA,MAAA,CAAQ,CACN,IAAA,CAAM,2BAAA,CACN,MAAO,UACT,CACF,EACA,gBAAA,CAAkB,CAChB,CACE,QAAA,CAAU,KAAA,CACV,MAAA,CAAQ,IAAA,CACR,SAAA,CAAW,OACb,EACA,CACE,QAAA,CAAU,SACV,MAAA,CAAQ,IAAA,CACR,UAAW,UACb,CACF,EACA,eAAA,CAAiB,CACf,SAAU,KAAA,CACV,MAAA,CAAQ,OAOR,MAAA,CAAQ,IACV,CACF,CACF,ECpBO,IAAM2F,EAAAA,CAA2BC,wBACtC,CACE,CACE,GAAApC,CAAAA,CACA,IAAA,CAAMC,EACN,YAAA,CAAAC,CAAAA,CACA,SAAA4B,CAAAA,CACA,MAAA,CAAAO,EACA,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAAlC,CAAAA,CACA,SAAA,CAAAzD,CAAAA,CACA,SAAAgB,CAAAA,CACA,SAAA,CAAA0C,EAAY,IAAA,CACZ,GAAGrD,CACL,CAAA,CACAC,CAAAA,GACG,CACH,IAAMsD,CAAAA,CAAeC,oBAAgBR,CAAE,CAAA,CACjCS,EAASF,CAAAA,CAAa,MAAA,CAEtBG,EAAgBC,mBAAAA,CAAgBF,CAAAA,EAAQ,KAAK,CAAA,CAC7CG,CAAAA,CAAsBD,mBAAAA,CAAgBF,GAAQ,WAAW,CAAA,CAIzD5D,EADeoD,CAAAA,GAAa,MAAA,CACNA,EAAWM,CAAAA,CAAa,SAAA,CAE9CS,EAAsBoB,YAAA,CAAA,WAAA,CAC1B,CAACnB,EAA0B,cAAA,GAAmB,CAC5CV,EAAa,OAAA,CAAQU,CAAM,EAC3Bf,CAAAA,GAAe,KAAK,EACtB,CAAA,CACA,CAACK,CAAAA,CAAcL,CAAY,CAC7B,CAAA,CAEMqC,EAA+B,CACnC,WAAA,CAAa,KACb,GAAGnC,CAAAA,CACH,GAAGK,CAAAA,EAAQ,aACb,EAEMuB,CAAAA,CAAoBF,CAAAA,EAAYrB,GAAQ,aAAA,EAAe,QAAA,EAAY,MACnE+B,CAAAA,CAAkBH,CAAAA,EAAU5B,CAAAA,EAAQ,aAAA,EAAe,MAAA,EAAU,MAAA,CAI7DgC,EAAkBH,CAAAA,EAAU7B,CAAAA,EAAQ,eAAe,MAAA,EAAU,IAAA,CAEnE,OAAK5D,CAAAA,CAGHU,eAAAA,CAAC,OACC,GAAA,CAAKN,CAAAA,CACL,KAAK,OAAA,CACL,YAAA,CAAYJ,EAAO,MAAA,CAAS,QAAA,CAC5B,UAAWQ,OAAAA,CACT6E,EAAAA,CAAe,CACb,QAAA,CAAUF,CAAAA,CACV,MAAA,CAAQQ,EACR,MAAA,CAAQC,CACV,CAAC,CAAA,CACD9F,CACF,EACC,GAAGK,CAAAA,CAEJ,UAAAO,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,gCAAA,CACZ,QAAA,CAAA,CAAA8C,GAAaI,CAAAA,EAAQ,KAAA,EACpBrD,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,UAAA,CAAW,WAAA,CAAU,oBAAA,CAAqB,KAAA,CAAO,CAAE,QAAA,CAAU,MAAO,EACjF,QAAA,CAAAA,cAAAA,CAACuB,gBAAA,CAAW,GAAGC,oBAAiB6B,CAAAA,CAAO,KAAK,EAAG,CAAA,CACjD,CAAA,CAEFrD,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,SACZ,QAAA,CAAAiD,CAAAA,EAAaI,CAAAA,CACZlD,eAAAA,CAAAiE,mBAAAA,CAAA,CACG,UAAAd,CAAAA,EAAiBtD,cAAAA,CAAC,QAAK,SAAA,CAAU,aAAA,CAAe,SAAAsD,CAAAA,CAAc,CAAA,CAC9DA,GAAiBE,CAAAA,EAAuB,UAAA,CACxCA,GAAuBxD,cAAAA,CAAC,MAAA,CAAA,CAAM,SAAAwD,CAAAA,CAAoB,CAAA,CAAA,CACrD,EAEAjD,CAAAA,CAEJ,CAAA,CAAA,CACF,EAEC0C,CAAAA,EAAaI,CAAAA,EAAQ,eACpBrD,cAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,SAAA,CAAU,uEACV,OAAA,CAAS,IAAM,CACbqD,CAAAA,CAAO,aAAA,EAAe,WAAU,CAC5BA,CAAAA,CAAO,eAAe,cAAA,EACxBO,CAAAA,CAAc,gBAAgB,EAElC,CAAA,CAEC,QAAA,CAAAP,CAAAA,CAAO,aAAA,CAAc,KAAA,CACxB,EAGD8B,CAAAA,CAAc,WAAA,EACbnF,eAACI,CAAAA,CAAA,CACC,QAAS,IAAMwD,CAAAA,CAAc,cAAc,CAAA,CAC3C,SAAA,CAAU,kCACZ,CAAA,CAAA,CAEJ,CAAA,CAzDgB,IA2DpB,CACF,EACAmB,GAAmB,WAAA,CAAc,oBAAA,KCzIpBO,EAAAA,CAAyBlG,0BAAAA,CAAI,qCAAsC,CAC9E,QAAA,CAAU,CACR,QAAA,CAAU,CACR,UAAA,CAAY,2BACZ,WAAA,CAAa,yBAAA,CACb,aAAc,8CAAA,CACd,aAAA,CAAe,8BACf,cAAA,CAAgB,4BAAA,CAChB,gBAAiB,iDACnB,CACF,EACA,eAAA,CAAiB,CACf,SAAU,cACZ,CACF,CAAC,CAAA,CAEYmG,EAAAA,CAAgBnG,0BAAAA,CAC3B,wQAAA,CACA,CACE,QAAA,CAAU,CACR,MAAA,CAAQ,CACN,KAAM,6CAAA,CACN,OAAA,CACE,0GACF,OAAA,CACE,+GAAA,CACF,MACE,6FACJ,CAAA,CACA,SAAU,CACR,UAAA,CACE,qGACF,WAAA,CACE,sGAAA,CACF,aACE,kGAAA,CACF,aAAA,CACE,oGAAA,CACF,cAAA,CACE,sGAAA,CACF,eAAA,CACE,wGACJ,CACF,CAAA,CACA,gBAAiB,CACf,MAAA,CAAQ,OACR,QAAA,CAAU,cACZ,CACF,CACF,CAAA,CAEaoG,GAAwBpG,0BAAAA,CACnC,0DAAA,CACA,CACE,QAAA,CAAU,CACR,OAAQ,CACN,IAAA,CAAM,YAAA,CACN,OAAA,CAAS,gCAAA,CACT,OAAA,CAAS,mCACT,KAAA,CAAO,4BACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,MAAA,CAAQ,MACV,CACF,CACF,ECnCO,IAAMqG,EAAAA,CAA0BC,YAAA,CAAA,UAAA,CACrC,CACE,CACE,EAAA,CAAA9C,EACA,IAAA,CAAMC,CAAAA,CACN,aAAAC,CAAAA,CACA,QAAA,CAAA4B,EACA,MAAA,CAAAO,CAAAA,CACA,QAAAjC,CAAAA,CACA,SAAA,CAAAzD,EACA,QAAA,CAAAgB,CAAAA,CACA,UAAA0C,CAAAA,CAAY,IAAA,CACZ,GAAGrD,CACL,CAAA,CACAC,IACG,CACH,IAAMsD,EAAeC,mBAAAA,CAAgBR,CAAE,EACjCS,CAAAA,CAASF,CAAAA,CAAa,OACtB,CAAE,YAAA,CAAAwC,CAAa,CAAA,CAAIC,mBAAAA,GACnB,CAACC,CAAAA,CAAUC,CAAW,CAAA,CAAUJ,YAAA,CAAA,QAAA,CAAS,GAAG,CAAA,CAC5C,CAACK,CAAAA,CAASC,CAAU,CAAA,CAAUN,YAAA,CAAA,QAAA,CAAS,KAAK,CAAA,CAK5C,CAACO,EAAiBC,CAAkB,CAAA,CAAUR,sBAAS,KAAK,CAAA,CAE5DpC,EAAgBC,mBAAAA,CAAgBF,CAAAA,EAAQ,KAAK,CAAA,CAC7CG,CAAAA,CAAsBD,oBAAgBF,CAAAA,EAAQ,WAAW,EAIzD5D,CAAAA,CADeoD,CAAAA,GAAa,MAAA,CACNA,CAAAA,CAAWM,CAAAA,CAAa,SAAA,CAE9CuC,uBAAU,IAAM,CACpBM,EAAW,IAAI,EACjB,EAAG,EAAE,EAEL,IAAMpC,CAAAA,CAAsB8B,yBAC1B,CAAC7B,CAAAA,CAA0B,iBAAmB,CAC5CV,CAAAA,CAAa,QAAQU,CAAM,CAAA,CAC3Bf,CAAAA,GAAe,KAAK,EACtB,CAAA,CACA,CAACK,CAAAA,CAAcL,CAAY,CAC7B,CAAA,CAEMqD,CAAAA,CAA6B,CACjC,WAAA,CAAa,IAAA,CACb,iBAAkB,GAAA,CAClB,YAAA,CAAc,KACd,GAAGnD,CAAAA,CACH,GAAGK,CAAAA,EAAQ,YACb,EAEMuB,CAAAA,CAAoBF,CAAAA,EAAYrB,CAAAA,EAAQ,YAAA,EAAc,QAAA,EAAY,cAAA,CAClE+B,EAAkBH,CAAAA,EAAU5B,CAAAA,EAAQ,cAAc,MAAA,EAAU,MAAA,CAO5D+C,EAAwBV,YAAA,CAAA,OAAA,CAC5B,IACEzC,GAAaI,CAAAA,CACXlD,eAAAA,CAAAiE,oBAAA,CACG,QAAA,CAAA,CAAAf,EAAO,KAAA,EACNrD,cAAAA,CAAC,OAAI,SAAA,CAAU,MAAA,CAAO,WAAA,CAAU,oBAAA,CAC9B,QAAA,CAAAA,cAAAA,CAACuB,gBAAA,CAAW,GAAGC,oBAAiB6B,CAAAA,CAAO,KAAK,EAAG,CAAA,CACjD,CAAA,CAEDC,GAAiBtD,cAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,aAAA,CAAe,QAAA,CAAAsD,EAAc,CAAA,CAC7DE,CAAAA,EAAuBxD,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,oBAAA,CAAsB,QAAA,CAAAwD,CAAAA,CAAoB,CAAA,CAAA,CACnF,EAEAjD,CAAAA,CAEJ,CAAC0C,EAAWI,CAAAA,CAAQC,CAAAA,CAAeE,EAAqBjD,CAAQ,CAClE,EAEMmF,YAAA,CAAA,SAAA,CAAU,IAAM,CACpB,GAAI,CAACjG,GAAQ,CAACkG,CAAAA,CAAc,CAC1BO,CAAAA,CAAmB,KAAK,CAAA,CACxB,MACF,CAEA,IAAIG,EAAY,KAAA,CACZC,CAAAA,CAAoC,KACvC,OAAA,CAAC,SAAY,CACZ,IAAMC,CAAAA,CAAS,MAAMZ,CAAAA,CAAa,MAAA,CAAO,CACvC,EAAA,CAAA/C,CAAAA,CACA,QAASwD,CAAAA,CACT,OAAA,CAAS,CACP,QAAA,CAAUD,CAAAA,CAAa,kBAAoB,GAAA,CAC3C,QAAA,CAAUvB,CACZ,CAAA,CACA,SAAA,CAAW,IAAMhB,CAAAA,CAAc,cAAc,CAC/C,CAAC,CAAA,CAED,GAAIyC,CAAAA,CAAW,CACbE,GAAQ,OAAA,EAAQ,CAChB,MACF,CAEIA,CAAAA,CACFD,EAASC,CAAAA,CAITL,CAAAA,CAAmB,IAAI,EAE3B,CAAA,GAAG,CAEI,IAAM,CACXG,CAAAA,CAAY,KACZC,CAAAA,EAAQ,OAAA,GACV,CACF,CAAA,CAAG,CACD7G,CAAAA,CACAkG,CAAAA,CACA/C,EACAwD,CAAAA,CACAD,CAAAA,CAAa,iBACbvB,CAAAA,CACAhB,CACF,CAAC,CAAA,CAGD,IAAM4C,CAAAA,CAAe,CAACb,CAAAA,EAAgBM,CAAAA,CA+BtC,GA1BMP,YAAA,CAAA,SAAA,CAAU,IAAM,CACpB,GAAI,CAACjG,GAAQ,CAAC0G,CAAAA,CAAa,aAAe,CAACK,CAAAA,CAAc,OAEzD,IAAMC,CAAAA,CAAY,KAAK,GAAA,EAAI,CACrBC,EAAWP,CAAAA,CAAa,gBAAA,EAAoB,GAAA,CAE5CQ,CAAAA,CAAQ,WAAA,CAAY,IAAM,CAC9B,IAAMC,EAAAA,CAAU,KAAK,GAAA,EAAI,CAAIH,EACvBI,EAAAA,CAAY,IAAA,CAAK,IAAI,CAAA,CAAG,GAAA,CAAOD,GAAUF,CAAAA,CAAY,GAAG,EAC9DZ,CAAAA,CAAYe,EAAS,EAEjBA,EAAAA,GAAc,CAAA,GAChB,aAAA,CAAcF,CAAK,CAAA,CACnB/C,CAAAA,CAAc,cAAc,CAAA,EAEhC,CAAA,CAAG,EAAE,CAAA,CAEL,OAAO,IAAM,CACX,aAAA,CAAc+C,CAAK,CAAA,CACnBb,CAAAA,CAAY,GAAG,EACjB,CACF,EAAG,CAACrG,CAAAA,CAAM0G,EAAa,WAAA,CAAaA,CAAAA,CAAa,gBAAA,CAAkBvC,CAAAA,CAAe4C,CAAY,CAAC,EAK3F,CAAC/G,CAAAA,EAAQ,CAACsG,CAAAA,EAAW,CAACS,EAAc,OAAO,IAAA,CAE/C,IAAMM,EAAAA,CACJ9G,cAAAA,CAAC,OAAI,SAAA,CAAWC,OAAAA,CAAGqF,GAAuB,CAAE,QAAA,CAAUV,CAAkB,CAAC,CAAC,CAAA,CACxE,QAAA,CAAAzE,eAAAA,CAAC,KAAA,CAAA,CACC,IAAKN,CAAAA,CACL,IAAA,CAAK,QACL,WAAA,CAAU,QAAA,CACV,aAAYJ,CAAAA,CAAO,MAAA,CAAS,SAC5B,SAAA,CAAWQ,OAAAA,CACTsF,GAAc,CAAE,MAAA,CAAQH,EAAiB,QAAA,CAAUR,CAAkB,CAAC,CAAA,CACtErF,CACF,CAAA,CACC,GAAGK,CAAAA,CAEJ,QAAA,CAAA,CAAAI,eAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAoB,QAAA,CAAAoG,CAAAA,CAAgB,EAEnDpG,cAAAA,CAACI,CAAAA,CAAA,CACC,OAAA,CAAS,IAAMwD,EAAc,cAAc,CAAA,CAC3C,UAAU,iCAAA,CACZ,CAAA,CAECuC,EAAa,YAAA,EAAgBA,CAAAA,CAAa,WAAA,EACzCnG,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAWC,QAAGuF,EAAAA,CAAsB,CAAE,OAAQJ,CAAgB,CAAC,CAAC,CAAA,CAChE,KAAA,CAAO,CAAE,KAAA,CAAO,CAAA,EAAGS,CAAQ,CAAA,CAAA,CAAI,CAAA,CACjC,GAEJ,CAAA,CACF,CAAA,CAGF,OAAOkB,qBAAAA,CAAaD,EAAAA,CAAc,QAAA,CAAS,IAAI,CACjD,CACF,EACArB,EAAAA,CAAkB,WAAA,CAAc,wBCjOnBuB,EAAAA,CAA2B5H,0BAAAA,CAAI,yCAA0C,CACpF,QAAA,CAAU,CACR,OAAA,CAAS,CACP,KAAM,aAAA,CACN,KAAA,CAAO,WACT,CACF,CAAA,CACA,eAAA,CAAiB,CACf,OAAA,CAAS,IACX,CACF,CAAC,CAAA,CAEY6H,GAA2B7H,0BAAAA,CACtC,iUAAA,CACA,CACE,QAAA,CAAU,CACR,UAAW,CACT,GAAA,CAAK,uDACL,KAAA,CAAO,oDAAA,CACP,OAAQ,mDAAA,CACR,IAAA,CAAM,qDACR,CAAA,CACA,OAAA,CAAS,CACP,OAAA,CAAS,EAAA,CACT,kBAAA,CAAoB,EACtB,CACF,CAAA,CACA,gBAAiB,CACf,SAAA,CAAW,SACX,OAAA,CAAS,SACX,CACF,CACF,ECmBA,SAAS8H,EAAAA,CAAuBC,CAAAA,CAA4C,CAC1E,IAAMC,EAAoBC,YAAA,CAAA,oBAAA,CAClBA,YAAA,CAAA,WAAA,CAAaC,GAAmB,CACpC,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,UAAA,EAAe,WAChE,OAAO,IAAM,CAEb,CAAA,CAEF,IAAMC,EAAK,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAC3D,OAAI,OAAOA,EAAG,gBAAA,EAAqB,UAAA,EACjCA,EAAG,gBAAA,CAAiB,QAAA,CAAUD,CAAE,CAAA,CACzB,IAAMC,EAAG,mBAAA,CAAoB,QAAA,CAAUD,CAAE,CAAA,GAGlDC,CAAAA,CAAG,YAAYD,CAAE,CAAA,CACV,IAAMC,CAAAA,CAAG,cAAA,CAAeD,CAAE,CAAA,CACnC,CAAA,CAAG,EAAE,CAAA,CACL,IACE,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,MAAA,CAAO,UAAA,EAAe,WAC1D,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,OAAA,CAClD,MACN,IAAM,KACR,EACA,OAAI,OAAOH,GAAU,QAAA,EAAYA,CAAAA,GAAU,OAAeA,CAAAA,CACnDC,CAAAA,CAAc,UAAY,qBACnC,CAKA,IAAMI,EAAAA,CAAmF,CACvF,IAAK,CAAA,CACL,KAAA,CAAO,GACP,MAAA,CAAQ,GAAA,CACR,KAAM,GACR,CAAA,CAEMC,EAAa,EAAA,CACbC,EAAAA,CAAY,CAAA,CAOlB,SAASC,EAAAA,CACPC,CAAAA,CACAC,EACAC,CAAAA,CAC+B,CAC/B,IAAMC,CAAAA,CAAeH,CAAAA,CAAW,KAAOA,CAAAA,CAAW,KAAA,CAAQ,EACpDI,CAAAA,CAAeJ,CAAAA,CAAW,IAAMA,CAAAA,CAAW,MAAA,CAAS,EACtDK,CAAAA,CAAYF,CAAAA,CAAeN,EAAa,CAAA,CACxCS,CAAAA,CAAWF,CAAAA,CAAeP,CAAAA,CAAa,CAAA,CAE3C,OAAII,IAAc,KAAA,CAChBK,CAAAA,CAAWN,EAAW,GAAA,CAAME,CAAAA,CAAUL,EAAaC,EAAAA,CAC1CG,CAAAA,GAAc,QACvBI,CAAAA,CAAYL,CAAAA,CAAW,MAAQE,CAAAA,CAAUJ,EAAAA,CAChCG,IAAc,QAAA,CACvBK,CAAAA,CAAWN,EAAW,MAAA,CAASE,CAAAA,CAAUJ,EAAAA,CAChCG,CAAAA,GAAc,MAAA,GACvBI,CAAAA,CAAYL,EAAW,IAAA,CAAOE,CAAAA,CAAUL,EAAaC,EAAAA,CAAAA,CAGhD,CAAE,IAAKQ,CAAAA,CAAU,IAAA,CAAMD,CAAU,CAC1C,KAEaE,EAAAA,CAA8Bd,YAAA,CAAA,UAAA,CACzC,CACE,CACE,EAAA,CAAAzE,EACA,IAAA,CAAMC,CAAAA,CACN,YAAA,CAAAC,CAAAA,CACA,SAAA,CAAWsF,CAAAA,CACX,QAAApF,CAAAA,CACA,SAAA,CAAAzD,EACA,QAAA,CAAAgB,CAAAA,CACA,UAAA0C,CAAAA,CAAY,IAAA,CACZ,QAAAV,CAAAA,CAAU,SAAA,CACV,YAAa8F,CAAAA,CAAkB,MAAA,CAC/B,GAAGzI,CACL,CAAA,CACAC,IACG,CACH,IAAMsD,CAAAA,CAAeC,mBAAAA,CAAgBR,CAAE,CAAA,CACjCS,EAASF,CAAAA,CAAa,MAAA,CACtB,CAAC4C,CAAAA,CAASC,CAAU,EAAUqB,YAAA,CAAA,QAAA,CAAS,KAAK,EAC5C,CAACiB,CAAAA,CAAeC,CAAgB,CAAA,CAAUlB,YAAA,CAAA,QAAA,CAAyB,IAAI,CAAA,CACvE,CAACO,EAAYY,CAAa,CAAA,CAAUnB,YAAA,CAAA,QAAA,CAAyB,IAAI,CAAA,CAEjE/D,CAAAA,CAAgBC,oBAAgBF,CAAAA,EAAQ,KAAK,EAC7CG,CAAAA,CAAsBD,mBAAAA,CAAgBF,GAAQ,WAAW,CAAA,CACzDoF,EAAsBvB,EAAAA,CAAuBmB,CAAe,EAI5D5I,CAAAA,CADeoD,CAAAA,GAAa,OACNA,CAAAA,CAAWM,CAAAA,CAAa,UAE9CkE,YAAA,CAAA,SAAA,CAAU,IAAM,CACpBrB,CAAAA,CAAW,IAAI,EACjB,EAAG,EAAE,EAEL,IAAM0C,CAAAA,CAAqC,CACzC,cAAA,CAAgB,EAAA,CAChB,UAAW,QAAA,CACX,MAAA,CAAQ,EACR,WAAA,CAAa,IAAA,CACb,eAAgB,EAAA,CAChB,mBAAA,CAAqB,KACrB,GAAG1F,CAAAA,CACH,GAAGK,CAAAA,EAAQ,gBACb,EAEMsF,CAAAA,CAAqBP,CAAAA,EAAiBM,EAAiB,SAAA,EAAa,QAAA,CAGpErB,uBAAU,IAAM,CACpB,GAAI,CAAC5H,CAAAA,EAAQ,CAACiJ,CAAAA,CAAiB,cAAA,CAAgB,CAC7CH,CAAAA,CAAiB,IAAI,EACrB,MACF,CAEA,IAAMK,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAcF,EAAiB,cAAc,CAAA,CACtEH,EAAiBK,CAAO,EAC1B,EAAG,CAACnJ,CAAAA,CAAMiJ,EAAiB,cAAc,CAAC,EAE1C,GAAM,CAAE,KAAAG,CAAAA,CAAM,cAAA,CAAAC,CAAe,CAAA,CAAIC,iBAAAA,CAAY,CAC3C,SAAA,CAAWJ,CAAAA,CACX,UAAA,CAAY,CAACK,YAAAA,CAAON,CAAAA,CAAiB,QAAU,CAAC,CAAA,CAAGO,YAAK,CAAGC,WAAAA,CAAM,CAAE,OAAA,CAAS,CAAE,CAAC,CAAC,CAAA,CAChF,qBAAsBC,gBACxB,CAAC,EAGK9B,YAAA,CAAA,SAAA,CAAU,IAAM,CAChBiB,CAAAA,EACFO,CAAAA,CAAK,YAAA,CAAaP,CAAa,EAEnC,CAAA,CAAG,CAACA,CAAAA,CAAeO,CAAI,CAAC,CAAA,CAMlBxB,YAAA,CAAA,SAAA,CAAU,IAAM,CACpB,GAAI,CAACiB,CAAAA,CAAe,CAClBE,EAAc,IAAI,CAAA,CAClB,MACF,CACA,IAAMY,CAAAA,CAAS,IAAMZ,CAAAA,CAAcF,CAAAA,CAAc,uBAAuB,CAAA,CACxEc,GAAO,CAEP,IAAIC,GAAwC,IAAA,CAC5C,OAAI,OAAO,cAAA,CAAmB,GAAA,GAC5BA,GAAiB,IAAI,cAAA,CAAeD,CAAM,CAAA,CAC1CC,EAAAA,CAAe,QAAQf,CAAa,CAAA,CAAA,CAEtC,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAUc,CAAAA,CAAQ,IAAI,CAAA,CAC9C,MAAA,CAAO,iBAAiB,QAAA,CAAUA,CAAM,EAEjC,IAAM,CACXC,IAAgB,UAAA,EAAW,CAC3B,OAAO,mBAAA,CAAoB,QAAA,CAAUD,EAAQ,IAAI,CAAA,CACjD,OAAO,mBAAA,CAAoB,QAAA,CAAUA,CAAM,EAC7C,CACF,CAAA,CAAG,CAACd,CAAa,CAAC,EAElB,IAAM1E,CAAAA,CAAsByD,yBAC1B,CAACxD,CAAAA,CAA0B,iBAAmB,CAC5CV,CAAAA,CAAa,QAAQU,CAAM,CAAA,CAC3Bf,IAAe,KAAK,EACtB,EACA,CAACK,CAAAA,CAAcL,CAAY,CAC7B,CAAA,CAEMgB,EAAAA,CAAuBuD,yBAAY,IAAM,CAC7ClE,EAAa,QAAA,EAAS,CACtBL,IAAe,KAAK,EACtB,EAAG,CAACK,CAAAA,CAAcL,CAAY,CAAC,CAAA,CAE/B,GAAI,CAACrD,CAAAA,EAAQ,CAACsG,CAAAA,EAAW,CAACuC,GAAiB,CAACV,CAAAA,CAAY,OAAO,IAAA,CAE/D,IAAME,EAAU,CAAA,CACVwB,CAAAA,CAAW/G,IAAY,kBAAA,CAKvBgH,CAAAA,CAAY,6BAA6B3B,CAAAA,CAAW,IAAA,CAAOA,EAAW,KAAA,CAAQ,CAAC,MAAMA,CAAAA,CAAW,GAAA,CAAMA,EAAW,MAAA,CAAS,CAAC,CAAA,gBAAA,EAAmB,IAAA,CAAK,GAAA,CAAIA,CAAAA,CAAW,MAAOA,CAAAA,CAAW,MAAM,EAAI,CAAA,CAAIE,CAAO,qBAAqBY,CAAAA,CAAiB,cAAc,KAAK,IAAA,CAAK,GAAA,CAAId,EAAW,KAAA,CAAOA,CAAAA,CAAW,MAAM,CAAA,CAAI,CAAA,CAAIE,EAAU,CAAC,CAAA,GAAA,CAAA,CAKjU0B,EAAAA,CAAmC,CACvC,QAAA,CAAU,OAAA,CACV,IAAK5B,CAAAA,CAAW,GAAA,CAAME,EACtB,IAAA,CAAMF,CAAAA,CAAW,KAAOE,CAAAA,CACxB,KAAA,CAAOF,EAAW,KAAA,CAAQE,CAAAA,CAAU,EACpC,MAAA,CAAQF,CAAAA,CAAW,OAASE,CAAAA,CAAU,CAAA,CACtC,aAAc,CAAA,CACd,aAAA,CAAe,MAAA,CACf,SAAA,CAAW,CAAA,gBAAA,EAAmBW,CAAmB,GACjD,MAAA,CAAQ,EACV,EAEMgB,EAAAA,CACJjC,EAAAA,CAA4BmB,CAAyD,CAAA,EAAK,CAAA,CACtF,CAAE,GAAA,CAAKT,EAAAA,CAAU,KAAMD,EAAU,CAAA,CAAIN,GACzCC,CAAAA,CACAe,CAAAA,CACAb,CACF,CAAA,CAEM4B,EAAAA,CAAkC,CACtC,QAAA,CAAU,OAAA,CACV,GAAA,CAAKxB,GACL,IAAA,CAAMD,EAAAA,CACN,MAAOR,CAAAA,CACP,MAAA,CAAQA,EACR,SAAA,CAAW,CAAA,OAAA,EAAUgC,EAAa,CAAA,IAAA,CAAA,CAClC,KAAA,CAAOhB,EACP,aAAA,CAAe,MAAA,CACf,OAAQ,EACV,CAAA,CAEMkB,GACJxJ,eAAAA,CAAAiE,mBAAAA,CAAA,CAIG,QAAA,CAAA,CAAAsE,CAAAA,CAAiB,WAAA,GACfA,EAAiB,mBAAA,CAChB1I,cAAAA,CAAC,UACC,IAAA,CAAK,QAAA,CACL,4BAAyB,IAAA,CACzB,cAAA,CAAcuC,EACd,SAAA,CAAWtC,OAAAA,CACT+G,GAAyB,CAAE,OAAA,CAAS,IAAK,CAAC,CAAA,CAC1C,iDACF,CAAA,CACA,KAAA,CAAO,CAAE,UAAA,CAAYuC,CAAU,CAAA,CAC/B,QAAS,IAAM3F,CAAAA,CAAc,eAAe,CAAA,CAC5C,YAAA,CAAW,kBACb,CAAA,CAEA5D,cAAAA,CAAC,OACC,2BAAA,CAAyB,IAAA,CACzB,eAAcuC,CAAAA,CACd,SAAA,CAAWtC,QAAG+G,EAAAA,CAAyB,CAAE,QAAS,IAAK,CAAC,CAAC,CAAA,CACzD,KAAA,CAAO,CAAE,WAAYuC,CAAU,CAAA,CAC/B,cAAY,MAAA,CACd,CAAA,CAAA,CAMH,CAACD,CAAAA,EAAYZ,CAAAA,CAAiB,aAC7BvI,eAAAA,CAAAiE,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAApE,cAAAA,CAAC,OAAI,0BAAA,CAAwB,IAAA,CAAC,cAAY,MAAA,CAAO,KAAA,CAAOwJ,EAAAA,CAAa,CAAA,CACrExJ,cAAAA,CAAC,KAAA,CAAA,CACC,0BAAuB,IAAA,CACvB,aAAA,CAAY,OACZ,KAAA,CAAO0J,EAAAA,CACP,QAAQ,WAAA,CACR,IAAA,CAAK,eACL,KAAA,CAAM,4BAAA,CAEN,SAAA1J,cAAAA,CAAC,MAAA,CAAA,CAAK,EAAE,mBAAA,CAAoB,CAAA,CAC9B,GACF,CAAA,CAIFG,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAMyJ,CAAAA,EAAS,CACbf,EAAK,WAAA,CAAYe,CAAI,EACjB,OAAO/J,CAAAA,EAAQ,WACjBA,CAAAA,CAAI+J,CAAI,EACC/J,CAAAA,GACTA,CAAAA,CAAI,QAAU+J,CAAAA,EAElB,CAAA,CACA,aAAYnK,CAAAA,CAAO,MAAA,CAAS,SAC5B,cAAA,CAAc8C,CAAAA,CACd,SAAA,CAAWtC,OAAAA,CACTgH,EAAAA,CAAyB,CAAE,UAAW0B,CAAAA,CAAoB,OAAA,CAAApG,CAAQ,CAAC,CAAA,CACnE,sBACAhD,CACF,CAAA,CACA,MAAOuJ,CAAAA,CACN,GAAGlJ,EAEJ,QAAA,CAAA,CAAAI,cAAAA,CAACI,EAAA,CAAkB,OAAA,CAAS,IAAMwD,CAAAA,CAAc,cAAc,CAAA,CAAG,CAAA,CAEhEX,CAAAA,EAAaI,CAAAA,CACZlD,gBAAAiE,mBAAAA,CAAA,CACE,UAAApE,cAAAA,CAACc,CAAAA,CAAA,CACC,KAAA,CAAOwC,CAAAA,CACP,YAAaE,CAAAA,CACb,KAAA,CAAOH,EAAO,KAAA,CAChB,CAAA,CACArD,eAAC2B,CAAAA,CAAA,CACC,cAAe0B,CAAAA,CAAO,aAAA,CACtB,eAAA,CAAiBA,CAAAA,CAAO,eAAA,CACxB,QAAA,CAAWgB,GAAS,CACdA,CAAAA,GAAS,WACXP,EAAAA,GAEJ,EACA,SAAA,CAAW,IAAMF,EAAc,gBAAgB,CAAA,CACjD,GACF,CAAA,CAEArD,CAAAA,CAAAA,CAEJ,GACF,CAAA,CAGF,OAAOwG,sBAAa4C,EAAAA,CAAkB,QAAA,CAAS,IAAI,CACrD,CACF,EACAxB,GAAsB,WAAA,CAAc,uBAAA,CC5V7B,SAAS0B,EAAAA,CACdC,EACsB,CACtB,IAAMC,EAAWC,gBAAAA,EAAY,CAC7B,OAAaC,YAAA,CAAA,OAAA,CACX,IAAMH,CAAAA,CAAc,MAAA,CAAQI,CAAAA,EAAMC,mBAAAA,CAASD,EAAE,QAAA,CAAUH,CAAQ,CAAC,CAAA,CAChE,CAACD,EAAeC,CAAQ,CAC1B,CACF","file":"index.cjs","sourcesContent":["'use client'\n\nimport { cn } from '@tour-kit/core'\nimport { type VariantProps, cva } from 'class-variance-authority'\nimport * as React from 'react'\n\nconst overlayVariants = cva(\n  'fixed inset-0 z-50 bg-black/80 data-[state=open]:motion-safe:animate-in data-[state=closed]:motion-safe:animate-out data-[state=closed]:motion-safe:fade-out-0 data-[state=open]:motion-safe:fade-in-0',\n  {\n    variants: {\n      blur: {\n        none: '',\n        sm: 'backdrop-blur-sm',\n        md: 'backdrop-blur-md',\n        lg: 'backdrop-blur-lg',\n      },\n    },\n    defaultVariants: {\n      blur: 'none',\n    },\n  }\n)\n\nexport interface AnnouncementOverlayProps\n  extends React.HTMLAttributes<HTMLDivElement>,\n    VariantProps<typeof overlayVariants> {\n  /** Whether the overlay is visible */\n  open?: boolean\n  /** Callback when overlay is clicked */\n  onClose?: () => void\n}\n\nexport const AnnouncementOverlay = React.forwardRef<HTMLDivElement, AnnouncementOverlayProps>(\n  ({ className, blur, open = true, onClose, onClick, ...props }, ref) => {\n    const handleClick = React.useCallback(\n      (event: React.MouseEvent<HTMLDivElement>) => {\n        onClick?.(event)\n        if (!event.defaultPrevented) {\n          onClose?.()\n        }\n      },\n      [onClick, onClose]\n    )\n\n    if (!open) return null\n\n    return (\n      <div\n        ref={ref}\n        data-state={open ? 'open' : 'closed'}\n        className={cn(overlayVariants({ blur }), className)}\n        onClick={handleClick}\n        aria-hidden=\"true\"\n        {...props}\n      />\n    )\n  }\n)\nAnnouncementOverlay.displayName = 'AnnouncementOverlay'\n","'use client'\n\nimport { cn } from '@tour-kit/core'\nimport type { RenderProp } from '@tour-kit/core'\nimport { useUILibrary } from '@tour-kit/core'\nimport * as React from 'react'\nimport { Slot, UnifiedSlot } from '../lib/slot'\n\nconst defaultIcon = (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width=\"16\"\n    height=\"16\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    strokeWidth=\"2\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n    aria-hidden=\"true\"\n  >\n    <path d=\"M18 6 6 18\" />\n    <path d=\"m6 6 12 12\" />\n  </svg>\n)\n\nexport interface AnnouncementCloseProps\n  extends Omit<React.ComponentPropsWithoutRef<'button'>, 'children'> {\n  asChild?: boolean\n  children?: React.ReactNode | RenderProp\n  /** Callback when close button is clicked */\n  onClose?: () => void\n}\n\nexport const AnnouncementClose = React.forwardRef<HTMLButtonElement, AnnouncementCloseProps>(\n  ({ className, asChild = false, children, onClick, onClose, ...props }, ref) => {\n    const library = useUILibrary()\n\n    const handleClick = React.useCallback(\n      (event: React.MouseEvent<HTMLButtonElement>) => {\n        onClick?.(event)\n        if (!event.defaultPrevented) {\n          onClose?.()\n        }\n      },\n      [onClick, onClose]\n    )\n\n    const sharedProps = {\n      ref,\n      onClick: handleClick,\n      className: cn(\n        'absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground',\n        className\n      ),\n      'aria-label': 'Close',\n      type: 'button' as const,\n      ...props,\n    }\n\n    // When asChild is true and using Base UI, use UnifiedSlot which accepts RenderProp\n    if (asChild && library === 'base-ui') {\n      return <UnifiedSlot {...sharedProps}>{children ?? defaultIcon}</UnifiedSlot>\n    }\n\n    // When asChild is true and using Radix UI, use Slot\n    if (asChild) {\n      return <Slot {...sharedProps}>{(children as React.ReactNode) ?? defaultIcon}</Slot>\n    }\n\n    // Default: render as button\n    return <button {...sharedProps}>{(children as React.ReactNode) ?? defaultIcon}</button>\n  }\n)\nAnnouncementClose.displayName = 'AnnouncementClose'\n","'use client'\n\nimport * as Dialog from '@radix-ui/react-dialog'\nimport { cn } from '@tour-kit/core'\nimport { MediaSlot } from '@tour-kit/media'\nimport * as React from 'react'\nimport { toMediaSlotProps } from '../lib/media-slot-adapter'\nimport type { AnnouncementMedia } from '../types/announcement'\n\nexport interface AnnouncementContentProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n  /** Title of the announcement (any ReactNode — strings render as <h2>, JSX passes through). */\n  title?: React.ReactNode\n  /** Description/body content */\n  description?: React.ReactNode\n  /** Media to display */\n  media?: AnnouncementMedia\n  /** Render title/description using Radix Dialog primitives. */\n  asDialogContent?: boolean\n  /** Title element props */\n  titleProps?: React.HTMLAttributes<HTMLHeadingElement>\n  /** Description element props */\n  descriptionProps?: React.HTMLAttributes<HTMLDivElement>\n}\n\nconst visuallyHiddenStyle: React.CSSProperties = {\n  position: 'absolute',\n  width: 1,\n  height: 1,\n  padding: 0,\n  margin: -1,\n  overflow: 'hidden',\n  clip: 'rect(0, 0, 0, 0)',\n  whiteSpace: 'nowrap',\n  border: 0,\n}\n\nexport const AnnouncementContent = React.forwardRef<HTMLDivElement, AnnouncementContentProps>(\n  (\n    {\n      className,\n      title,\n      description,\n      media,\n      asDialogContent = false,\n      titleProps,\n      descriptionProps,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const hasTitle = Boolean(title)\n\n    return (\n      <div ref={ref} className={cn('space-y-4', className)} {...props}>\n        {media && (\n          <div className=\"relative overflow-hidden rounded-lg\" data-slot=\"announcement-media\">\n            <MediaSlot {...toMediaSlotProps(media)} />\n          </div>\n        )}\n\n        {asDialogContent ? (\n          <Dialog.Title\n            {...titleProps}\n            className={cn(\n              hasTitle && 'text-lg font-semibold leading-none tracking-tight',\n              titleProps?.className\n            )}\n            style={!hasTitle ? { ...visuallyHiddenStyle, ...titleProps?.style } : titleProps?.style}\n          >\n            {hasTitle ? title : 'Announcement'}\n          </Dialog.Title>\n        ) : (\n          title && (\n            <h2\n              {...titleProps}\n              className={cn(\n                'text-lg font-semibold leading-none tracking-tight',\n                titleProps?.className\n              )}\n            >\n              {title}\n            </h2>\n          )\n        )}\n\n        {description &&\n          (asDialogContent ? (\n            <Dialog.Description\n              {...descriptionProps}\n              className={cn('text-sm text-muted-foreground', descriptionProps?.className)}\n            >\n              {description}\n            </Dialog.Description>\n          ) : (\n            <div\n              {...descriptionProps}\n              className={cn('text-sm text-muted-foreground', descriptionProps?.className)}\n            >\n              {description}\n            </div>\n          ))}\n\n        {children}\n      </div>\n    )\n  }\n)\nAnnouncementContent.displayName = 'AnnouncementContent'\n","'use client'\n\nimport { cn } from '@tour-kit/core'\nimport { cva } from 'class-variance-authority'\nimport * as React from 'react'\nimport type { AnnouncementAction } from '../types/announcement'\n\nconst buttonVariants = cva(\n  'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n  {\n    variants: {\n      variant: {\n        primary: 'bg-primary text-primary-foreground hover:bg-primary/90',\n        secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n        ghost: 'hover:bg-accent hover:text-accent-foreground',\n        link: 'text-primary underline-offset-4 hover:underline',\n      },\n      size: {\n        sm: 'h-9 rounded-md px-3',\n        md: 'h-10 px-4 py-2',\n        lg: 'h-11 rounded-md px-8',\n      },\n    },\n    defaultVariants: {\n      variant: 'primary',\n      size: 'md',\n    },\n  }\n)\n\nexport interface AnnouncementActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n  /** Primary action configuration */\n  primaryAction?: AnnouncementAction\n  /** Secondary action configuration */\n  secondaryAction?: AnnouncementAction\n  /** Callback when any action is clicked */\n  onAction?: (type: 'primary' | 'secondary') => void\n  /** Callback when dismiss should happen (if action.dismissOnClick is true) */\n  onDismiss?: () => void\n  /** Layout direction */\n  direction?: 'horizontal' | 'vertical'\n}\n\nexport const AnnouncementActions = React.forwardRef<HTMLDivElement, AnnouncementActionsProps>(\n  (\n    {\n      className,\n      primaryAction,\n      secondaryAction,\n      onAction,\n      onDismiss,\n      direction = 'horizontal',\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const handlePrimaryClick = React.useCallback(() => {\n      primaryAction?.onClick?.()\n      onAction?.('primary')\n      if (primaryAction?.dismissOnClick) {\n        onDismiss?.()\n      }\n    }, [primaryAction, onAction, onDismiss])\n\n    const handleSecondaryClick = React.useCallback(() => {\n      secondaryAction?.onClick?.()\n      onAction?.('secondary')\n      if (secondaryAction?.dismissOnClick) {\n        onDismiss?.()\n      }\n    }, [secondaryAction, onAction, onDismiss])\n\n    const hasActions = primaryAction || secondaryAction || children\n\n    if (!hasActions) return null\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          'flex gap-2',\n          direction === 'vertical' ? 'flex-col' : 'flex-row justify-end',\n          className\n        )}\n        {...props}\n      >\n        {children}\n\n        {secondaryAction && (\n          <ActionButton\n            action={secondaryAction}\n            defaultVariant=\"secondary\"\n            onClick={handleSecondaryClick}\n          />\n        )}\n\n        {primaryAction && (\n          <ActionButton\n            action={primaryAction}\n            defaultVariant=\"primary\"\n            onClick={handlePrimaryClick}\n          />\n        )}\n      </div>\n    )\n  }\n)\nAnnouncementActions.displayName = 'AnnouncementActions'\n\ninterface ActionButtonProps {\n  action: AnnouncementAction\n  defaultVariant: 'primary' | 'secondary'\n  onClick: () => void\n}\n\nfunction ActionButton({ action, defaultVariant, onClick }: ActionButtonProps) {\n  const variant = action.variant ?? defaultVariant\n\n  if (action.href) {\n    return (\n      <a\n        href={action.href}\n        className={cn(buttonVariants({ variant, size: 'md' }))}\n        onClick={onClick}\n      >\n        {action.label}\n      </a>\n    )\n  }\n\n  return (\n    <button type=\"button\" className={cn(buttonVariants({ variant, size: 'md' }))} onClick={onClick}>\n      {action.label}\n    </button>\n  )\n}\n","import { cva } from 'class-variance-authority'\n\nexport const modalOverlayVariants = cva(\n  'fixed inset-0 z-50 bg-black/80 data-[state=open]:motion-safe:animate-in data-[state=closed]:motion-safe:animate-out data-[state=closed]:motion-safe:fade-out-0 data-[state=open]:motion-safe:fade-in-0'\n)\n\nexport const modalContentVariants = cva(\n  'fixed left-[50%] top-[50%] z-50 grid w-full translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:motion-safe:animate-in data-[state=closed]:motion-safe:animate-out data-[state=closed]:motion-safe:fade-out-0 data-[state=open]:motion-safe:fade-in-0 data-[state=closed]:motion-safe:zoom-out-95 data-[state=open]:motion-safe:zoom-in-95 data-[state=closed]:motion-safe:slide-out-to-left-1/2 data-[state=closed]:motion-safe:slide-out-to-top-[48%] data-[state=open]:motion-safe:slide-in-from-left-1/2 data-[state=open]:motion-safe:slide-in-from-top-[48%] sm:rounded-lg',\n  {\n    variants: {\n      size: {\n        sm: 'max-w-sm',\n        md: 'max-w-md',\n        lg: 'max-w-lg',\n        xl: 'max-w-xl',\n        full: 'max-w-[95vw] max-h-[95vh]',\n      },\n    },\n    defaultVariants: {\n      size: 'md',\n    },\n  }\n)\n","'use client'\n\nimport * as Dialog from '@radix-ui/react-dialog'\nimport { cn } from '@tour-kit/core'\nimport type { VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\nimport { useAnnouncement } from '../hooks/use-announcement'\nimport { useResolvedText } from '../lib/use-resolved-text'\nimport type { DismissalReason, ModalOptions } from '../types/announcement'\nimport { AnnouncementActions } from './announcement-actions'\nimport { AnnouncementClose } from './announcement-close'\nimport { AnnouncementContent } from './announcement-content'\nimport { modalContentVariants, modalOverlayVariants } from './ui/modal-variants'\n\nexport interface AnnouncementModalProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>,\n    VariantProps<typeof modalContentVariants> {\n  /** Announcement ID */\n  id: string\n  /** Whether the modal is open (controlled) */\n  open?: boolean\n  /** Callback when open state changes */\n  onOpenChange?: (open: boolean) => void\n  /** Modal options */\n  options?: ModalOptions\n  /** Content to render inside modal */\n  children?: React.ReactNode\n  /** Use config from provider */\n  useConfig?: boolean\n}\n\nexport const AnnouncementModal = React.forwardRef<HTMLDivElement, AnnouncementModalProps>(\n  (\n    {\n      id,\n      open: openProp,\n      onOpenChange,\n      size,\n      options,\n      className,\n      children,\n      useConfig = true,\n      'aria-describedby': ariaDescribedBy,\n      ...props\n    },\n    ref\n  ) => {\n    const announcement = useAnnouncement(id)\n    const config = announcement.config\n\n    const resolvedTitle = useResolvedText(config?.title)\n    const resolvedDescription = useResolvedText(config?.description)\n\n    // Controlled or uncontrolled open state\n    const isControlled = openProp !== undefined\n    const open = isControlled ? openProp : announcement.isVisible\n\n    const handleOpenChange = React.useCallback(\n      (newOpen: boolean) => {\n        onOpenChange?.(newOpen)\n        if (!isControlled) {\n          if (newOpen) {\n            announcement.show()\n          } else {\n            announcement.hide()\n          }\n        }\n      },\n      [onOpenChange, isControlled, announcement]\n    )\n\n    const handleDismiss = React.useCallback(\n      (reason: DismissalReason = 'close_button') => {\n        announcement.dismiss(reason)\n        onOpenChange?.(false)\n      },\n      [announcement, onOpenChange]\n    )\n\n    const handleComplete = React.useCallback(() => {\n      announcement.complete()\n      onOpenChange?.(false)\n    }, [announcement, onOpenChange])\n\n    const modalOptions: ModalOptions = {\n      closeOnOverlayClick: true,\n      closeOnEscape: true,\n      showCloseButton: true,\n      ...options,\n      ...config?.modalOptions,\n    }\n\n    const effectiveSize = size ?? config?.modalOptions?.size ?? 'md'\n    const hasDescription = Boolean(resolvedDescription)\n\n    return (\n      <Dialog.Root open={open} onOpenChange={handleOpenChange}>\n        <Dialog.Portal>\n          <Dialog.Overlay\n            className={cn(modalOverlayVariants())}\n            onClick={\n              modalOptions.closeOnOverlayClick ? () => handleDismiss('overlay_click') : undefined\n            }\n          />\n          <Dialog.Content\n            ref={ref}\n            aria-modal=\"true\"\n            className={cn(modalContentVariants({ size: effectiveSize }), className)}\n            onEscapeKeyDown={\n              modalOptions.closeOnEscape\n                ? () => handleDismiss('escape_key')\n                : (e) => e.preventDefault()\n            }\n            aria-describedby={hasDescription ? ariaDescribedBy : undefined}\n            {...props}\n          >\n            {modalOptions.showCloseButton && (\n              <AnnouncementClose onClose={() => handleDismiss('close_button')} />\n            )}\n\n            {useConfig && config ? (\n              <>\n                <AnnouncementContent\n                  title={resolvedTitle}\n                  description={resolvedDescription}\n                  media={config.media}\n                  asDialogContent\n                />\n                <AnnouncementActions\n                  primaryAction={config.primaryAction}\n                  secondaryAction={config.secondaryAction}\n                  onAction={(type) => {\n                    if (type === 'primary') {\n                      handleComplete()\n                    }\n                  }}\n                  onDismiss={() => handleDismiss('primary_action')}\n                />\n              </>\n            ) : (\n              children\n            )}\n          </Dialog.Content>\n        </Dialog.Portal>\n      </Dialog.Root>\n    )\n  }\n)\nAnnouncementModal.displayName = 'AnnouncementModal'\n","import { cva } from 'class-variance-authority'\n\nexport const slideoutOverlayVariants = cva(\n  'fixed inset-0 z-50 bg-black/80 data-[state=open]:motion-safe:animate-in data-[state=closed]:motion-safe:animate-out data-[state=closed]:motion-safe:fade-out-0 data-[state=open]:motion-safe:fade-in-0'\n)\n\nexport const slideoutContentVariants = cva(\n  'fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:motion-safe:animate-in data-[state=closed]:motion-safe:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500',\n  {\n    variants: {\n      position: {\n        left: 'inset-y-0 left-0 h-full border-r data-[state=closed]:motion-safe:slide-out-to-left data-[state=open]:motion-safe:slide-in-from-left',\n        right:\n          'inset-y-0 right-0 h-full border-l data-[state=closed]:motion-safe:slide-out-to-right data-[state=open]:motion-safe:slide-in-from-right',\n      },\n      size: {\n        sm: 'w-3/4 sm:max-w-sm',\n        md: 'w-3/4 sm:max-w-md',\n        lg: 'w-3/4 sm:max-w-lg',\n      },\n    },\n    defaultVariants: {\n      position: 'right',\n      size: 'md',\n    },\n  }\n)\n","'use client'\n\nimport * as Dialog from '@radix-ui/react-dialog'\nimport { cn } from '@tour-kit/core'\nimport type { VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\nimport { useAnnouncement } from '../hooks/use-announcement'\nimport { useResolvedText } from '../lib/use-resolved-text'\nimport type { DismissalReason, SlideoutOptions } from '../types/announcement'\nimport { AnnouncementActions } from './announcement-actions'\nimport { AnnouncementClose } from './announcement-close'\nimport { AnnouncementContent } from './announcement-content'\nimport { slideoutContentVariants, slideoutOverlayVariants } from './ui/slideout-variants'\n\nexport interface AnnouncementSlideoutProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>,\n    VariantProps<typeof slideoutContentVariants> {\n  /** Announcement ID */\n  id: string\n  /** Whether the slideout is open (controlled) */\n  open?: boolean\n  /** Callback when open state changes */\n  onOpenChange?: (open: boolean) => void\n  /** Slideout options */\n  options?: SlideoutOptions\n  /** Content to render inside slideout */\n  children?: React.ReactNode\n  /** Use config from provider */\n  useConfig?: boolean\n}\n\nexport const AnnouncementSlideout = React.forwardRef<HTMLDivElement, AnnouncementSlideoutProps>(\n  (\n    {\n      id,\n      open: openProp,\n      onOpenChange,\n      position,\n      size,\n      options,\n      className,\n      children,\n      useConfig = true,\n      'aria-describedby': ariaDescribedBy,\n      ...props\n    },\n    ref\n  ) => {\n    const announcement = useAnnouncement(id)\n    const config = announcement.config\n\n    const resolvedTitle = useResolvedText(config?.title)\n    const resolvedDescription = useResolvedText(config?.description)\n\n    // Controlled or uncontrolled open state\n    const isControlled = openProp !== undefined\n    const open = isControlled ? openProp : announcement.isVisible\n\n    const handleOpenChange = React.useCallback(\n      (newOpen: boolean) => {\n        onOpenChange?.(newOpen)\n        if (!isControlled) {\n          if (newOpen) {\n            announcement.show()\n          } else {\n            announcement.hide()\n          }\n        }\n      },\n      [onOpenChange, isControlled, announcement]\n    )\n\n    const handleDismiss = React.useCallback(\n      (reason: DismissalReason = 'close_button') => {\n        announcement.dismiss(reason)\n        onOpenChange?.(false)\n      },\n      [announcement, onOpenChange]\n    )\n\n    const handleComplete = React.useCallback(() => {\n      announcement.complete()\n      onOpenChange?.(false)\n    }, [announcement, onOpenChange])\n\n    const slideoutOptions: SlideoutOptions = {\n      closeOnOverlayClick: true,\n      closeOnEscape: true,\n      showCloseButton: true,\n      ...options,\n      ...config?.slideoutOptions,\n    }\n\n    const effectivePosition = position ?? config?.slideoutOptions?.position ?? 'right'\n    const effectiveSize = size ?? config?.slideoutOptions?.size ?? 'md'\n    const hasDescription = Boolean(resolvedDescription)\n\n    return (\n      <Dialog.Root open={open} onOpenChange={handleOpenChange}>\n        <Dialog.Portal>\n          <Dialog.Overlay\n            className={cn(slideoutOverlayVariants())}\n            onClick={\n              slideoutOptions.closeOnOverlayClick ? () => handleDismiss('overlay_click') : undefined\n            }\n          />\n          <Dialog.Content\n            ref={ref}\n            className={cn(\n              slideoutContentVariants({ position: effectivePosition, size: effectiveSize }),\n              className\n            )}\n            onEscapeKeyDown={\n              slideoutOptions.closeOnEscape\n                ? () => handleDismiss('escape_key')\n                : (e) => e.preventDefault()\n            }\n            aria-describedby={hasDescription ? ariaDescribedBy : undefined}\n            {...props}\n          >\n            {slideoutOptions.showCloseButton && (\n              <AnnouncementClose onClose={() => handleDismiss('close_button')} />\n            )}\n\n            {useConfig && config ? (\n              <div className=\"flex h-full flex-col\">\n                <AnnouncementContent\n                  title={resolvedTitle}\n                  description={resolvedDescription}\n                  media={config.media}\n                  className=\"flex-1\"\n                  asDialogContent\n                />\n                <AnnouncementActions\n                  primaryAction={config.primaryAction}\n                  secondaryAction={config.secondaryAction}\n                  onAction={(type) => {\n                    if (type === 'primary') {\n                      handleComplete()\n                    }\n                  }}\n                  onDismiss={() => handleDismiss('primary_action')}\n                  direction=\"vertical\"\n                  className=\"mt-auto pt-4\"\n                />\n              </div>\n            ) : (\n              children\n            )}\n          </Dialog.Content>\n        </Dialog.Portal>\n      </Dialog.Root>\n    )\n  }\n)\nAnnouncementSlideout.displayName = 'AnnouncementSlideout'\n","import { cva } from 'class-variance-authority'\n\nexport const bannerVariants = cva(\n  'relative flex items-center justify-between gap-4 px-4 py-3 text-sm data-[state=open]:motion-safe:animate-in data-[state=closed]:motion-safe:animate-out data-[state=closed]:motion-safe:fade-out-0 data-[state=open]:motion-safe:fade-in-0',\n  {\n    variants: {\n      position: {\n        top: 'border-b data-[state=closed]:motion-safe:slide-out-to-top data-[state=open]:motion-safe:slide-in-from-top',\n        bottom:\n          'border-t data-[state=closed]:motion-safe:slide-out-to-bottom data-[state=open]:motion-safe:slide-in-from-bottom',\n      },\n      intent: {\n        info: 'bg-blue-50 text-blue-900 border-blue-200 dark:bg-blue-950 dark:text-blue-100 dark:border-blue-800',\n        success:\n          'bg-green-50 text-green-900 border-green-200 dark:bg-green-950 dark:text-green-100 dark:border-green-800',\n        warning:\n          'bg-yellow-50 text-yellow-900 border-yellow-200 dark:bg-yellow-950 dark:text-yellow-100 dark:border-yellow-800',\n        error:\n          'bg-red-50 text-red-900 border-red-200 dark:bg-red-950 dark:text-red-100 dark:border-red-800',\n        neutral: 'bg-background text-foreground border-border',\n      },\n      sticky: {\n        true: 'fixed left-0 right-0 z-50',\n        false: 'relative',\n      },\n    },\n    compoundVariants: [\n      {\n        position: 'top',\n        sticky: true,\n        className: 'top-0',\n      },\n      {\n        position: 'bottom',\n        sticky: true,\n        className: 'bottom-0',\n      },\n    ],\n    defaultVariants: {\n      position: 'top',\n      intent: 'info',\n      // Banners pin to the viewport by default — the alternative (relative\n      // flow positioning) silently breaks any consumer who renders\n      // <AnnouncementBanner /> as a sibling inside a flex/grid container,\n      // because the banner then competes for layout space instead of\n      // overlaying. Opt out with `<AnnouncementBanner sticky={false}>` or\n      // `config.bannerOptions.sticky = false` when banner needs flow position.\n      sticky: true,\n    },\n  }\n)\n","'use client'\n\nimport { cn } from '@tour-kit/core'\nimport { MediaSlot } from '@tour-kit/media'\nimport type { VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\nimport { useAnnouncement } from '../hooks/use-announcement'\nimport { toMediaSlotProps } from '../lib/media-slot-adapter'\nimport { useResolvedText } from '../lib/use-resolved-text'\nimport type { BannerOptions, DismissalReason } from '../types/announcement'\nimport { AnnouncementClose } from './announcement-close'\nimport { bannerVariants } from './ui/banner-variants'\n\nexport interface AnnouncementBannerProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>,\n    VariantProps<typeof bannerVariants> {\n  /** Announcement ID */\n  id: string\n  /** Whether the banner is visible (controlled) */\n  open?: boolean\n  /** Callback when visibility changes */\n  onOpenChange?: (open: boolean) => void\n  /** Banner options */\n  options?: BannerOptions\n  /** Content to render inside banner */\n  children?: React.ReactNode\n  /** Use config from provider */\n  useConfig?: boolean\n}\n\nexport const AnnouncementBanner = React.forwardRef<HTMLDivElement, AnnouncementBannerProps>(\n  (\n    {\n      id,\n      open: openProp,\n      onOpenChange,\n      position,\n      intent,\n      sticky,\n      options,\n      className,\n      children,\n      useConfig = true,\n      ...props\n    },\n    ref\n  ) => {\n    const announcement = useAnnouncement(id)\n    const config = announcement.config\n\n    const resolvedTitle = useResolvedText(config?.title)\n    const resolvedDescription = useResolvedText(config?.description)\n\n    // Controlled or uncontrolled open state\n    const isControlled = openProp !== undefined\n    const open = isControlled ? openProp : announcement.isVisible\n\n    const handleDismiss = React.useCallback(\n      (reason: DismissalReason = 'close_button') => {\n        announcement.dismiss(reason)\n        onOpenChange?.(false)\n      },\n      [announcement, onOpenChange]\n    )\n\n    const bannerOptions: BannerOptions = {\n      dismissable: true,\n      ...options,\n      ...config?.bannerOptions,\n    }\n\n    const effectivePosition = position ?? config?.bannerOptions?.position ?? 'top'\n    const effectiveIntent = intent ?? config?.bannerOptions?.intent ?? 'info'\n    // Default to sticky so a flow-positioned banner never silently competes\n    // for layout space inside a parent flex/grid container. Consumers opt\n    // out via `sticky={false}` or `bannerOptions.sticky: false`.\n    const effectiveSticky = sticky ?? config?.bannerOptions?.sticky ?? true\n\n    if (!open) return null\n\n    return (\n      <div\n        ref={ref}\n        role=\"alert\"\n        data-state={open ? 'open' : 'closed'}\n        className={cn(\n          bannerVariants({\n            position: effectivePosition,\n            intent: effectiveIntent,\n            sticky: effectiveSticky,\n          }),\n          className\n        )}\n        {...props}\n      >\n        <div className=\"flex flex-1 items-center gap-3\">\n          {useConfig && config?.media && (\n            <div className=\"shrink-0\" data-slot=\"announcement-media\" style={{ maxWidth: '8rem' }}>\n              <MediaSlot {...toMediaSlotProps(config.media)} />\n            </div>\n          )}\n          <div className=\"flex-1\">\n            {useConfig && config ? (\n              <>\n                {resolvedTitle && <span className=\"font-medium\">{resolvedTitle}</span>}\n                {resolvedTitle && resolvedDescription && ' — '}\n                {resolvedDescription && <span>{resolvedDescription}</span>}\n              </>\n            ) : (\n              children\n            )}\n          </div>\n        </div>\n\n        {useConfig && config?.primaryAction && (\n          <button\n            type=\"button\"\n            className=\"shrink-0 font-medium underline underline-offset-4 hover:no-underline\"\n            onClick={() => {\n              config.primaryAction?.onClick?.()\n              if (config.primaryAction?.dismissOnClick) {\n                handleDismiss('primary_action')\n              }\n            }}\n          >\n            {config.primaryAction.label}\n          </button>\n        )}\n\n        {bannerOptions.dismissable && (\n          <AnnouncementClose\n            onClose={() => handleDismiss('close_button')}\n            className=\"relative right-0 top-0 shrink-0\"\n          />\n        )}\n      </div>\n    )\n  }\n)\nAnnouncementBanner.displayName = 'AnnouncementBanner'\n","import { cva } from 'class-variance-authority'\n\nexport const toastContainerVariants = cva('fixed z-50 flex flex-col gap-2 p-4', {\n  variants: {\n    position: {\n      'top-left': 'top-0 left-0 items-start',\n      'top-right': 'top-0 right-0 items-end',\n      'top-center': 'top-0 left-1/2 -translate-x-1/2 items-center',\n      'bottom-left': 'bottom-0 left-0 items-start',\n      'bottom-right': 'bottom-0 right-0 items-end',\n      'bottom-center': 'bottom-0 left-1/2 -translate-x-1/2 items-center',\n    },\n  },\n  defaultVariants: {\n    position: 'bottom-right',\n  },\n})\n\nexport const toastVariants = cva(\n  'relative flex w-full max-w-sm items-start gap-3 rounded-lg border p-4 shadow-lg transition-all data-[state=open]:motion-safe:animate-in data-[state=closed]:motion-safe:animate-out data-[state=closed]:motion-safe:fade-out-0 data-[state=open]:motion-safe:fade-in-0',\n  {\n    variants: {\n      intent: {\n        info: 'bg-background text-foreground border-border',\n        success:\n          'bg-green-50 text-green-900 border-green-200 dark:bg-green-950 dark:text-green-100 dark:border-green-800',\n        warning:\n          'bg-yellow-50 text-yellow-900 border-yellow-200 dark:bg-yellow-950 dark:text-yellow-100 dark:border-yellow-800',\n        error:\n          'bg-red-50 text-red-900 border-red-200 dark:bg-red-950 dark:text-red-100 dark:border-red-800',\n      },\n      position: {\n        'top-left':\n          'data-[state=closed]:motion-safe:slide-out-to-left data-[state=open]:motion-safe:slide-in-from-left',\n        'top-right':\n          'data-[state=closed]:motion-safe:slide-out-to-right data-[state=open]:motion-safe:slide-in-from-right',\n        'top-center':\n          'data-[state=closed]:motion-safe:slide-out-to-top data-[state=open]:motion-safe:slide-in-from-top',\n        'bottom-left':\n          'data-[state=closed]:motion-safe:slide-out-to-left data-[state=open]:motion-safe:slide-in-from-left',\n        'bottom-right':\n          'data-[state=closed]:motion-safe:slide-out-to-right data-[state=open]:motion-safe:slide-in-from-right',\n        'bottom-center':\n          'data-[state=closed]:motion-safe:slide-out-to-bottom data-[state=open]:motion-safe:slide-in-from-bottom',\n      },\n    },\n    defaultVariants: {\n      intent: 'info',\n      position: 'bottom-right',\n    },\n  }\n)\n\nexport const toastProgressVariants = cva(\n  'absolute bottom-0 left-0 h-1 rounded-b-lg transition-all',\n  {\n    variants: {\n      intent: {\n        info: 'bg-primary',\n        success: 'bg-green-600 dark:bg-green-400',\n        warning: 'bg-yellow-600 dark:bg-yellow-400',\n        error: 'bg-red-600 dark:bg-red-400',\n      },\n    },\n    defaultVariants: {\n      intent: 'info',\n    },\n  }\n)\n","'use client'\n\nimport { cn } from '@tour-kit/core'\nimport { MediaSlot } from '@tour-kit/media'\nimport type { VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { useAnnouncementsContext } from '../context/announcements-context'\nimport { useAnnouncement } from '../hooks/use-announcement'\nimport { toMediaSlotProps } from '../lib/media-slot-adapter'\nimport { useResolvedText } from '../lib/use-resolved-text'\nimport type { DismissalReason, ToastOptions } from '../types/announcement'\nimport type { ToastAdapterHandle } from '../types/toast-adapter'\nimport { AnnouncementClose } from './announcement-close'\nimport { toastContainerVariants, toastProgressVariants, toastVariants } from './ui/toast-variants'\n\nexport interface AnnouncementToastProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>,\n    VariantProps<typeof toastVariants> {\n  /** Announcement ID */\n  id: string\n  /** Whether the toast is visible (controlled) */\n  open?: boolean\n  /** Callback when visibility changes */\n  onOpenChange?: (open: boolean) => void\n  /** Toast options */\n  options?: ToastOptions\n  /** Content to render inside toast */\n  children?: React.ReactNode\n  /** Use config from provider */\n  useConfig?: boolean\n}\n\nexport const AnnouncementToast = React.forwardRef<HTMLDivElement, AnnouncementToastProps>(\n  (\n    {\n      id,\n      open: openProp,\n      onOpenChange,\n      position,\n      intent,\n      options,\n      className,\n      children,\n      useConfig = true,\n      ...props\n    },\n    ref\n  ) => {\n    const announcement = useAnnouncement(id)\n    const config = announcement.config\n    const { toastAdapter } = useAnnouncementsContext()\n    const [progress, setProgress] = React.useState(100)\n    const [mounted, setMounted] = React.useState(false)\n    // When `toastAdapter` is non-null, suppress the portal by default and\n    // only fall back to it if the adapter explicitly returns `null` (e.g.,\n    // sonner isn't installed). This avoids a one-frame flash of the portal\n    // while the adapter's async render resolves.\n    const [adapterFallback, setAdapterFallback] = React.useState(false)\n\n    const resolvedTitle = useResolvedText(config?.title)\n    const resolvedDescription = useResolvedText(config?.description)\n\n    // Controlled or uncontrolled open state\n    const isControlled = openProp !== undefined\n    const open = isControlled ? openProp : announcement.isVisible\n\n    React.useEffect(() => {\n      setMounted(true)\n    }, [])\n\n    const handleDismiss = React.useCallback(\n      (reason: DismissalReason = 'close_button') => {\n        announcement.dismiss(reason)\n        onOpenChange?.(false)\n      },\n      [announcement, onOpenChange]\n    )\n\n    const toastOptions: ToastOptions = {\n      autoDismiss: true,\n      autoDismissDelay: 5000,\n      showProgress: true,\n      ...options,\n      ...config?.toastOptions,\n    }\n\n    const effectivePosition = position ?? config?.toastOptions?.position ?? 'bottom-right'\n    const effectiveIntent = intent ?? config?.toastOptions?.intent ?? 'info'\n\n    // Phase 7 — Toast adapter routing. When the provider is wired with a\n    // `toastAdapter` (e.g., Sonner), dispatch the toast through the adapter\n    // and suppress the built-in portal. If the adapter returns null\n    // (e.g., sonner isn't installed), `adapterHandled` stays false and we\n    // fall back to the portal render below.\n    const renderedContent = React.useMemo(\n      () =>\n        useConfig && config ? (\n          <>\n            {config.media && (\n              <div className=\"mb-2\" data-slot=\"announcement-media\">\n                <MediaSlot {...toMediaSlotProps(config.media)} />\n              </div>\n            )}\n            {resolvedTitle && <div className=\"font-medium\">{resolvedTitle}</div>}\n            {resolvedDescription && <div className=\"text-sm opacity-90\">{resolvedDescription}</div>}\n          </>\n        ) : (\n          children\n        ),\n      [useConfig, config, resolvedTitle, resolvedDescription, children]\n    )\n\n    React.useEffect(() => {\n      if (!open || !toastAdapter) {\n        setAdapterFallback(false)\n        return\n      }\n\n      let cancelled = false\n      let handle: ToastAdapterHandle | null = null\n      ;(async () => {\n        const result = await toastAdapter.render({\n          id,\n          content: renderedContent,\n          options: {\n            duration: toastOptions.autoDismissDelay ?? 5000,\n            position: effectivePosition,\n          },\n          onDismiss: () => handleDismiss('auto_dismiss'),\n        })\n\n        if (cancelled) {\n          result?.dismiss()\n          return\n        }\n\n        if (result) {\n          handle = result\n          // adapter handled — keep portal suppressed (adapterFallback stays false)\n        } else {\n          // adapter returned null (sonner missing, etc.) → use the portal\n          setAdapterFallback(true)\n        }\n      })()\n\n      return () => {\n        cancelled = true\n        handle?.dismiss()\n      }\n    }, [\n      open,\n      toastAdapter,\n      id,\n      renderedContent,\n      toastOptions.autoDismissDelay,\n      effectivePosition,\n      handleDismiss,\n    ])\n\n    // Whether the built-in portal is the active render path.\n    const portalActive = !toastAdapter || adapterFallback\n\n    // Auto-dismiss timer — only runs when the built-in portal is the render\n    // path. Adapter-handled toasts manage their own lifecycle via the\n    // adapter's `duration`/`onDismiss` plumbing.\n    React.useEffect(() => {\n      if (!open || !toastOptions.autoDismiss || !portalActive) return\n\n      const startTime = Date.now()\n      const duration = toastOptions.autoDismissDelay ?? 5000\n\n      const timer = setInterval(() => {\n        const elapsed = Date.now() - startTime\n        const remaining = Math.max(0, 100 - (elapsed / duration) * 100)\n        setProgress(remaining)\n\n        if (remaining === 0) {\n          clearInterval(timer)\n          handleDismiss('auto_dismiss')\n        }\n      }, 50)\n\n      return () => {\n        clearInterval(timer)\n        setProgress(100)\n      }\n    }, [open, toastOptions.autoDismiss, toastOptions.autoDismissDelay, handleDismiss, portalActive])\n\n    // Suppress the portal whenever an adapter is wired (pessimistic) — only\n    // render it when no adapter is set OR the adapter has explicitly fallen\n    // back via null. Prevents a one-frame flash on toast open.\n    if (!open || !mounted || !portalActive) return null\n\n    const toastContent = (\n      <div className={cn(toastContainerVariants({ position: effectivePosition }))}>\n        <div\n          ref={ref}\n          role=\"alert\"\n          aria-live=\"polite\"\n          data-state={open ? 'open' : 'closed'}\n          className={cn(\n            toastVariants({ intent: effectiveIntent, position: effectivePosition }),\n            className\n          )}\n          {...props}\n        >\n          <div className=\"flex-1 space-y-1\">{renderedContent}</div>\n\n          <AnnouncementClose\n            onClose={() => handleDismiss('close_button')}\n            className=\"relative right-0 top-0 shrink-0\"\n          />\n\n          {toastOptions.showProgress && toastOptions.autoDismiss && (\n            <div\n              className={cn(toastProgressVariants({ intent: effectiveIntent }))}\n              style={{ width: `${progress}%` }}\n            />\n          )}\n        </div>\n      </div>\n    )\n\n    return createPortal(toastContent, document.body)\n  }\n)\nAnnouncementToast.displayName = 'AnnouncementToast'\n","import { cva } from 'class-variance-authority'\n\nexport const spotlightOverlayVariants = cva('fixed inset-0 z-40 pointer-events-none', {\n  variants: {\n    visible: {\n      true: 'opacity-100',\n      false: 'opacity-0',\n    },\n  },\n  defaultVariants: {\n    visible: true,\n  },\n})\n\nexport const spotlightContentVariants = cva(\n  'z-50 w-full max-w-sm rounded-lg border bg-background p-4 shadow-lg data-[state=open]:motion-safe:animate-in data-[state=closed]:motion-safe:animate-out data-[state=closed]:motion-safe:fade-out-0 data-[state=open]:motion-safe:fade-in-0 data-[state=closed]:motion-safe:zoom-out-95 data-[state=open]:motion-safe:zoom-in-95',\n  {\n    variants: {\n      placement: {\n        top: 'data-[state=open]:motion-safe:slide-in-from-bottom-2',\n        right: 'data-[state=open]:motion-safe:slide-in-from-left-2',\n        bottom: 'data-[state=open]:motion-safe:slide-in-from-top-2',\n        left: 'data-[state=open]:motion-safe:slide-in-from-right-2',\n      },\n      variant: {\n        default: '',\n        'legacy-spotlight': '',\n      },\n    },\n    defaultVariants: {\n      placement: 'bottom',\n      variant: 'default',\n    },\n  }\n)\n","'use client'\n\nimport { type Placement, autoUpdate, flip, offset, shift, useFloating } from '@floating-ui/react'\nimport { cn } from '@tour-kit/core'\nimport type { VariantProps } from 'class-variance-authority'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { useAnnouncement } from '../hooks/use-announcement'\nimport { useResolvedText } from '../lib/use-resolved-text'\nimport type { DismissalReason, SpotlightOptions } from '../types/announcement'\nimport { AnnouncementActions } from './announcement-actions'\nimport { AnnouncementClose } from './announcement-close'\nimport { AnnouncementContent } from './announcement-content'\nimport { spotlightContentVariants, spotlightOverlayVariants } from './ui/spotlight-variants'\n\nexport interface AnnouncementSpotlightProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'>,\n    VariantProps<typeof spotlightContentVariants> {\n  /** Announcement ID */\n  id: string\n  /** Whether the spotlight is visible (controlled) */\n  open?: boolean\n  /** Callback when visibility changes */\n  onOpenChange?: (open: boolean) => void\n  /** Spotlight options */\n  options?: SpotlightOptions\n  /** Content to render inside spotlight */\n  children?: React.ReactNode\n  /** Use config from provider */\n  useConfig?: boolean\n  /**\n   * Visual variant.\n   * - `'default'` (v4.0+) renders an inset-stroke cutout + directional arrow,\n   *   passing WCAG 2.1 AA contrast on light backgrounds.\n   * - `'legacy-spotlight'` keeps the v3.0 soft radial-gradient cutout for one\n   *   minor cycle (until v4.1) so themes that rely on the legacy look can\n   *   migrate without a hard break.\n   */\n  variant?: 'default' | 'legacy-spotlight'\n  /**\n   * Color of the inset stroke (and the directional arrow). `'auto'` resolves\n   * to white on dark and `hsl(var(--primary))` on light via\n   * `prefers-color-scheme`. Pass any CSS color string to override.\n   * Ignored when `variant=\"legacy-spotlight\"`.\n   */\n  strokeColor?: 'auto' | string\n}\n\n/**\n * SSR-safe resolver for `strokeColor='auto'`. Reads\n * `prefers-color-scheme: dark` via `useSyncExternalStore` so the component\n * re-renders if the user flips OS theme mid-session.\n */\nfunction useResolvedStrokeColor(value: 'auto' | string | undefined): string {\n  const prefersDark = React.useSyncExternalStore(\n    React.useCallback((cb: () => void) => {\n      if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n        return () => {\n          /* no-op */\n        }\n      }\n      const mq = window.matchMedia('(prefers-color-scheme: dark)')\n      if (typeof mq.addEventListener === 'function') {\n        mq.addEventListener('change', cb)\n        return () => mq.removeEventListener('change', cb)\n      }\n      // Older jsdom / Safari fallback\n      mq.addListener(cb)\n      return () => mq.removeListener(cb)\n    }, []),\n    () =>\n      typeof window !== 'undefined' && typeof window.matchMedia === 'function'\n        ? window.matchMedia('(prefers-color-scheme: dark)').matches\n        : false,\n    () => false\n  )\n  if (typeof value === 'string' && value !== 'auto') return value\n  return prefersDark ? '#ffffff' : 'hsl(var(--primary))'\n}\n\n// Matches the SVG path `M6 0 L12 8 L0 8 Z` — apex is at the top by default,\n// so for each Floating UI placement we rotate the apex to point AT the\n// content panel (which sits on the named side of the target).\nconst ARROW_ROTATION_BY_PLACEMENT: Record<'top' | 'right' | 'bottom' | 'left', number> = {\n  top: 0, // content above target → apex up\n  right: 90, // content right of target → apex right\n  bottom: 180, // content below target → apex down\n  left: 270, // content left of target → apex left\n}\n\nconst ARROW_SIZE = 12\nconst ARROW_GAP = 6\n\n/**\n * Compute the screen position of the decorative arrow given the target rect\n * and the placement chosen by Floating UI. The arrow sits between the cutout\n * edge and the content panel for the matching side.\n */\nfunction computeArrowPosition(\n  targetRect: DOMRect,\n  placement: string,\n  padding: number\n): { top: number; left: number } {\n  const arrowCenterX = targetRect.left + targetRect.width / 2\n  const arrowCenterY = targetRect.top + targetRect.height / 2\n  let arrowLeft = arrowCenterX - ARROW_SIZE / 2\n  let arrowTop = arrowCenterY - ARROW_SIZE / 2\n\n  if (placement === 'top') {\n    arrowTop = targetRect.top - padding - ARROW_SIZE - ARROW_GAP\n  } else if (placement === 'right') {\n    arrowLeft = targetRect.right + padding + ARROW_GAP\n  } else if (placement === 'bottom') {\n    arrowTop = targetRect.bottom + padding + ARROW_GAP\n  } else if (placement === 'left') {\n    arrowLeft = targetRect.left - padding - ARROW_SIZE - ARROW_GAP\n  }\n\n  return { top: arrowTop, left: arrowLeft }\n}\n\nexport const AnnouncementSpotlight = React.forwardRef<HTMLDivElement, AnnouncementSpotlightProps>(\n  (\n    {\n      id,\n      open: openProp,\n      onOpenChange,\n      placement: placementProp,\n      options,\n      className,\n      children,\n      useConfig = true,\n      variant = 'default',\n      strokeColor: strokeColorProp = 'auto',\n      ...props\n    },\n    ref\n  ) => {\n    const announcement = useAnnouncement(id)\n    const config = announcement.config\n    const [mounted, setMounted] = React.useState(false)\n    const [targetElement, setTargetElement] = React.useState<Element | null>(null)\n    const [targetRect, setTargetRect] = React.useState<DOMRect | null>(null)\n\n    const resolvedTitle = useResolvedText(config?.title)\n    const resolvedDescription = useResolvedText(config?.description)\n    const resolvedStrokeColor = useResolvedStrokeColor(strokeColorProp)\n\n    // Controlled or uncontrolled open state\n    const isControlled = openProp !== undefined\n    const open = isControlled ? openProp : announcement.isVisible\n\n    React.useEffect(() => {\n      setMounted(true)\n    }, [])\n\n    const spotlightOptions: SpotlightOptions = {\n      targetSelector: '',\n      placement: 'bottom',\n      offset: 8,\n      showOverlay: true,\n      overlayOpacity: 0.5,\n      closeOnOverlayClick: true,\n      ...options,\n      ...config?.spotlightOptions,\n    }\n\n    const effectivePlacement = placementProp ?? spotlightOptions.placement ?? 'bottom'\n\n    // Find target element\n    React.useEffect(() => {\n      if (!open || !spotlightOptions.targetSelector) {\n        setTargetElement(null)\n        return\n      }\n\n      const element = document.querySelector(spotlightOptions.targetSelector)\n      setTargetElement(element)\n    }, [open, spotlightOptions.targetSelector])\n\n    const { refs, floatingStyles } = useFloating({\n      placement: effectivePlacement as Placement,\n      middleware: [offset(spotlightOptions.offset ?? 8), flip(), shift({ padding: 8 })],\n      whileElementsMounted: autoUpdate,\n    })\n\n    // Set reference element when target is found\n    React.useEffect(() => {\n      if (targetElement) {\n        refs.setReference(targetElement)\n      }\n    }, [targetElement, refs])\n\n    // Track target rect on scroll/resize/element-resize so the cutout + arrow\n    // follow the target. Without this, scrolling the page would leave the\n    // bordered cutout pinned to its initial screen coordinates while the\n    // content panel (which Floating UI auto-updates) drifts away.\n    React.useEffect(() => {\n      if (!targetElement) {\n        setTargetRect(null)\n        return\n      }\n      const update = () => setTargetRect(targetElement.getBoundingClientRect())\n      update()\n\n      let resizeObserver: ResizeObserver | null = null\n      if (typeof ResizeObserver !== 'undefined') {\n        resizeObserver = new ResizeObserver(update)\n        resizeObserver.observe(targetElement)\n      }\n      window.addEventListener('scroll', update, true)\n      window.addEventListener('resize', update)\n\n      return () => {\n        resizeObserver?.disconnect()\n        window.removeEventListener('scroll', update, true)\n        window.removeEventListener('resize', update)\n      }\n    }, [targetElement])\n\n    const handleDismiss = React.useCallback(\n      (reason: DismissalReason = 'close_button') => {\n        announcement.dismiss(reason)\n        onOpenChange?.(false)\n      },\n      [announcement, onOpenChange]\n    )\n\n    const handleComplete = React.useCallback(() => {\n      announcement.complete()\n      onOpenChange?.(false)\n    }, [announcement, onOpenChange])\n\n    if (!open || !mounted || !targetElement || !targetRect) return null\n\n    const padding = 4\n    const isLegacy = variant === 'legacy-spotlight'\n\n    // Radial-gradient dim layer — same for default and legacy variants. Legacy\n    // uses this as the entire cutout; default layers an inset-stroke cutout\n    // on top for the AA-compliant boundary.\n    const overlayBg = `radial-gradient(circle at ${targetRect.left + targetRect.width / 2}px ${targetRect.top + targetRect.height / 2}px, transparent ${Math.max(targetRect.width, targetRect.height) / 2 + padding}px, rgba(0, 0, 0, ${spotlightOptions.overlayOpacity}) ${Math.max(targetRect.width, targetRect.height) / 2 + padding + 1}px)`\n\n    // Position style for the 2px inset-stroke cutout. Sized to the target rect\n    // plus padding; pointer-events disabled so clicks pass through to the\n    // overlay button (or content beneath).\n    const cutoutStyle: React.CSSProperties = {\n      position: 'fixed',\n      top: targetRect.top - padding,\n      left: targetRect.left - padding,\n      width: targetRect.width + padding * 2,\n      height: targetRect.height + padding * 2,\n      borderRadius: 8,\n      pointerEvents: 'none',\n      boxShadow: `inset 0 0 0 2px ${resolvedStrokeColor}`,\n      zIndex: 41,\n    }\n\n    const arrowRotation =\n      ARROW_ROTATION_BY_PLACEMENT[effectivePlacement as 'top' | 'right' | 'bottom' | 'left'] ?? 0\n    const { top: arrowTop, left: arrowLeft } = computeArrowPosition(\n      targetRect,\n      effectivePlacement,\n      padding\n    )\n\n    const arrowStyle: React.CSSProperties = {\n      position: 'fixed',\n      top: arrowTop,\n      left: arrowLeft,\n      width: ARROW_SIZE,\n      height: ARROW_SIZE,\n      transform: `rotate(${arrowRotation}deg)`,\n      color: resolvedStrokeColor,\n      pointerEvents: 'none',\n      zIndex: 42,\n    }\n\n    const spotlightContent = (\n      <>\n        {/* Overlay with cutout — statically either an interactive <button> or\n            an inert aria-hidden div so the element shape never mixes\n            interactive ARIA on a non-interactive element. */}\n        {spotlightOptions.showOverlay &&\n          (spotlightOptions.closeOnOverlayClick ? (\n            <button\n              type=\"button\"\n              data-tk-spotlight-overlay\n              data-variant={variant}\n              className={cn(\n                spotlightOverlayVariants({ visible: true }),\n                'pointer-events-auto cursor-pointer border-0 p-0'\n              )}\n              style={{ background: overlayBg }}\n              onClick={() => handleDismiss('overlay_click')}\n              aria-label=\"Close spotlight\"\n            />\n          ) : (\n            <div\n              data-tk-spotlight-overlay\n              data-variant={variant}\n              className={cn(spotlightOverlayVariants({ visible: true }))}\n              style={{ background: overlayBg }}\n              aria-hidden=\"true\"\n            />\n          ))}\n\n        {/* Inset-stroke cutout + directional arrow — default variant only.\n            Skipped entirely when overlay is hidden so consumers who opt out\n            of the dim layer don't get a stray bordered rectangle. */}\n        {!isLegacy && spotlightOptions.showOverlay && (\n          <>\n            <div data-tk-spotlight-cutout aria-hidden=\"true\" style={cutoutStyle} />\n            <svg\n              data-tk-spotlight-arrow\n              aria-hidden=\"true\"\n              style={arrowStyle}\n              viewBox=\"0 0 12 12\"\n              fill=\"currentColor\"\n              xmlns=\"http://www.w3.org/2000/svg\"\n            >\n              <path d=\"M6 0 L12 8 L0 8 Z\" />\n            </svg>\n          </>\n        )}\n\n        {/* Spotlight content */}\n        <div\n          ref={(node) => {\n            refs.setFloating(node)\n            if (typeof ref === 'function') {\n              ref(node)\n            } else if (ref) {\n              ref.current = node\n            }\n          }}\n          data-state={open ? 'open' : 'closed'}\n          data-variant={variant}\n          className={cn(\n            spotlightContentVariants({ placement: effectivePlacement, variant }),\n            'pointer-events-auto',\n            className\n          )}\n          style={floatingStyles}\n          {...props}\n        >\n          <AnnouncementClose onClose={() => handleDismiss('close_button')} />\n\n          {useConfig && config ? (\n            <>\n              <AnnouncementContent\n                title={resolvedTitle}\n                description={resolvedDescription}\n                media={config.media}\n              />\n              <AnnouncementActions\n                primaryAction={config.primaryAction}\n                secondaryAction={config.secondaryAction}\n                onAction={(type) => {\n                  if (type === 'primary') {\n                    handleComplete()\n                  }\n                }}\n                onDismiss={() => handleDismiss('primary_action')}\n              />\n            </>\n          ) : (\n            children\n          )}\n        </div>\n      </>\n    )\n\n    return createPortal(spotlightContent, document.body)\n  }\n)\nAnnouncementSpotlight.displayName = 'AnnouncementSpotlight'\n","'use client'\n\nimport { useSegments } from '@tour-kit/core'\nimport * as React from 'react'\nimport { evaluateAnnouncementAudience as evaluate } from '../lib/announcements-engine/eligibility'\nimport type { AnnouncementConfig } from '../types/announcement'\n\n/**\n * Segment-audience resolution lives in the ENGINE — `lib/announcements-engine/\n * eligibility.ts` — because the engine owns eligibility (plan Decision 7a) and\n * must answer `show()` / `canShow()` with no React present. Re-exported here\n * under the same name so `import { evaluateAnnouncementAudience } from\n * '@tour-kit/announcements'` is unchanged for consumers.\n *\n * One implementation, deliberately: a second copy on this side would let the\n * hook and the engine disagree about what \"segment-eligible\" means inside a\n * single package.\n */\nexport { evaluateAnnouncementAudience } from '../lib/announcements-engine/eligibility'\n\n/**\n * Filter a list of announcement configs by their `audience` prop. Mirror of\n * `@tour-kit/hints`'s `useHintFilter` for `AnnouncementConfig[]`. Uses\n * `useSegments()` (bulk read) once at the top of the provider to satisfy\n * rules-of-hooks under dynamic announcement lists — never call `useSegment`\n * inside `.filter`. Only the segment-shape audience branch is filtered here;\n * array-shape audiences pass through to the scheduler for backward compat.\n */\nexport function useFilteredAnnouncements(\n  announcements: AnnouncementConfig[]\n): AnnouncementConfig[] {\n  const segments = useSegments()\n  return React.useMemo(\n    () => announcements.filter((a) => evaluate(a.audience, segments)),\n    [announcements, segments]\n  )\n}\n"]}