@ably/ui 18.4.1 → 19.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/AGENTS.md +2 -2
  2. package/README.md +4 -3
  3. package/core/Code.js.map +1 -1
  4. package/core/DropdownMenu.js +1 -1
  5. package/core/DropdownMenu.js.map +1 -1
  6. package/core/Flash.js.map +1 -1
  7. package/core/Loader.js.map +1 -1
  8. package/core/Meganav/MeganavBlog.js +1 -1
  9. package/core/Meganav/MeganavBlog.js.map +1 -1
  10. package/core/Meganav/MeganavCustomerStories.js +1 -1
  11. package/core/Meganav/MeganavCustomerStories.js.map +1 -1
  12. package/core/Meganav/MeganavPanelItemLinks.js +1 -1
  13. package/core/Meganav/MeganavPanelItemLinks.js.map +1 -1
  14. package/core/Meganav/PanelTitle.js +1 -1
  15. package/core/Meganav/PanelTitle.js.map +1 -1
  16. package/core/Meganav/data.js +1 -1
  17. package/core/Meganav/data.js.map +1 -1
  18. package/core/Meganav/images/cust-logo-fin-dark.svg +5 -0
  19. package/core/Meganav/images/cust-logo-fin-light.svg +5 -0
  20. package/core/Notice.js.map +1 -1
  21. package/core/Pricing/data.js +1 -1
  22. package/core/Pricing/data.js.map +1 -1
  23. package/core/Pricing/data.test.js +2 -0
  24. package/core/Pricing/data.test.js.map +1 -0
  25. package/core/SessionData.js.map +1 -1
  26. package/core/hooks/use-themed-scrollpoints.js.map +1 -1
  27. package/core/insights/bot-detection.js +2 -0
  28. package/core/insights/bot-detection.js.map +1 -0
  29. package/core/insights/bot-detection.test.js +2 -0
  30. package/core/insights/bot-detection.test.js.map +1 -0
  31. package/core/insights/command-queue.js +1 -1
  32. package/core/insights/command-queue.js.map +1 -1
  33. package/core/insights/index.test.js +1 -1
  34. package/core/insights/index.test.js.map +1 -1
  35. package/core/insights/mixpanel.js +1 -1
  36. package/core/insights/mixpanel.js.map +1 -1
  37. package/core/insights/mixpanel.test.js +1 -1
  38. package/core/insights/mixpanel.test.js.map +1 -1
  39. package/core/insights/service.js +1 -1
  40. package/core/insights/service.js.map +1 -1
  41. package/core/styles/colors/utils.js +1 -1
  42. package/core/styles/colors/utils.js.map +1 -1
  43. package/index.d.ts +5 -0
  44. package/package.json +29 -31
  45. package/core/images/cust-logo-split-col-pos.png +0 -0
  46. package/core/images/cust-logo-split-col-pos@2x.png +0 -0
  47. package/core/images/cust-logo-split-mono-pos.svg +0 -9
  48. package/core/images/cust-photo-split-pato-echague.jpg +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/insights/mixpanel.test.ts"],"sourcesContent":["/**\n * @vitest-environment jsdom\n */\n\nimport { describe, expect, beforeEach, it, vi } from \"vitest\";\nimport mixpanel from \"mixpanel-browser\";\n\nimport { initMixpanel, MIXPANEL_EU_API_HOST } from \"./mixpanel\";\n\nvi.mock(\"mixpanel-browser\", () => ({\n default: {\n init: vi.fn(),\n },\n}));\n\ndescribe(\"initMixpanel\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"does not initialize without a token\", () => {\n const consoleSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n initMixpanel(\"\");\n expect(mixpanel.init).not.toHaveBeenCalled();\n consoleSpy.mockRestore();\n });\n\n it(\"blocks [data-mask] elements in autocapture\", () => {\n initMixpanel(\"test-token\", true);\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.autocapture.block_selectors).toEqual([\"[data-mask]\"]);\n });\n\n it(\"does not record sessions\", () => {\n initMixpanel(\"test-token\", true);\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.record_sessions_percent).toBe(0);\n });\n\n it(\"defaults api_host to the EU ingestion endpoint\", () => {\n initMixpanel(\"test-token\");\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.api_host).toBe(MIXPANEL_EU_API_HOST);\n expect(MIXPANEL_EU_API_HOST).toBe(\"https://api-eu.mixpanel.com\");\n });\n\n it(\"allows overriding api_host\", () => {\n initMixpanel(\"test-token\", false, false, \"https://api.mixpanel.com\");\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.api_host).toBe(\"https://api.mixpanel.com\");\n });\n\n it(\"falls back to the EU default when api_host is undefined\", () => {\n initMixpanel(\"test-token\", false, false, undefined);\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.api_host).toBe(MIXPANEL_EU_API_HOST);\n });\n});\n"],"names":["describe","expect","beforeEach","it","vi","mixpanel","initMixpanel","MIXPANEL_EU_API_HOST","mock","default","init","fn","clearAllMocks","consoleSpy","spyOn","console","mockImplementation","not","toHaveBeenCalled","mockRestore","config","calls","autocapture","block_selectors","toEqual","record_sessions_percent","toBe","api_host","undefined"],"mappings":"AAIA,OAASA,QAAQ,CAAEC,MAAM,CAAEC,UAAU,CAAEC,EAAE,CAAEC,EAAE,KAAQ,QAAS,AAC9D,QAAOC,aAAc,kBAAmB,AAExC,QAASC,YAAY,CAAEC,oBAAoB,KAAQ,YAAa,CAEhEH,GAAGI,IAAI,CAAC,mBAAoB,IAAO,CAAA,CACjCC,QAAS,CACPC,KAAMN,GAAGO,EAAE,EACb,CACF,CAAA,GAEAX,SAAS,eAAgB,KACvBE,WAAW,KACTE,GAAGQ,aAAa,EAClB,GAEAT,GAAG,sCAAuC,KACxC,MAAMU,WAAaT,GAAGU,KAAK,CAACC,QAAS,QAAQC,kBAAkB,CAAC,KAAO,GACvEV,aAAa,IACbL,OAAOI,SAASK,IAAI,EAAEO,GAAG,CAACC,gBAAgB,GAC1CL,WAAWM,WAAW,EACxB,GAEAhB,GAAG,6CAA8C,KAC/CG,aAAa,aAAc,MAE3B,MAAMc,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOE,WAAW,CAACC,eAAe,EAAEC,OAAO,CAAC,CAAC,cAAc,CACpE,GAEArB,GAAG,2BAA4B,KAC7BG,aAAa,aAAc,MAE3B,MAAMc,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOK,uBAAuB,EAAEC,IAAI,CAAC,EAC9C,GAEAvB,GAAG,iDAAkD,KACnDG,aAAa,cAEb,MAAMc,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOO,QAAQ,EAAED,IAAI,CAACnB,sBAC7BN,OAAOM,sBAAsBmB,IAAI,CAAC,8BACpC,GAEAvB,GAAG,6BAA8B,KAC/BG,aAAa,aAAc,MAAO,MAAO,4BAEzC,MAAMc,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOO,QAAQ,EAAED,IAAI,CAAC,2BAC/B,GAEAvB,GAAG,0DAA2D,KAC5DG,aAAa,aAAc,MAAO,MAAOsB,WAEzC,MAAMR,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOO,QAAQ,EAAED,IAAI,CAACnB,qBAC/B,EACF"}
1
+ {"version":3,"sources":["../../../src/core/insights/mixpanel.test.ts"],"sourcesContent":["/**\n * @vitest-environment jsdom\n */\n\nimport { describe, expect, beforeEach, it, vi } from \"vitest\";\nimport mixpanel from \"mixpanel-browser\";\n\nimport { initMixpanel, MIXPANEL_EU_API_HOST } from \"./mixpanel\";\n\nvi.mock(\"mixpanel-browser\", () => ({\n default: {\n init: vi.fn(),\n },\n}));\n\ndescribe(\"initMixpanel\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"does not initialize without a token\", () => {\n const consoleSpy = vi.spyOn(console, \"warn\").mockImplementation(() => {});\n initMixpanel(\"\");\n expect(mixpanel.init).not.toHaveBeenCalled();\n consoleSpy.mockRestore();\n });\n\n it(\"blocks [data-mask] elements in autocapture\", () => {\n initMixpanel(\"test-token\", true);\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.autocapture.block_selectors).toEqual([\"[data-mask]\"]);\n });\n\n it(\"captures clicks and submits, with noisy interaction events disabled\", () => {\n initMixpanel(\"test-token\", true);\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.autocapture).toMatchObject({\n scroll: false,\n input: false,\n dead_click: false,\n rage_click: false,\n });\n // click and submit deliberately stay on (SDK default) — an explicit\n // `false` here would silently defeat the intent of keeping them\n expect(config.autocapture.click).not.toBe(false);\n expect(config.autocapture.submit).not.toBe(false);\n });\n\n it(\"does not record sessions\", () => {\n initMixpanel(\"test-token\", true);\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.record_sessions_percent).toBe(0);\n });\n\n it(\"defaults api_host to the EU ingestion endpoint\", () => {\n initMixpanel(\"test-token\");\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.api_host).toBe(MIXPANEL_EU_API_HOST);\n expect(MIXPANEL_EU_API_HOST).toBe(\"https://api-eu.mixpanel.com\");\n });\n\n it(\"allows overriding api_host\", () => {\n initMixpanel(\"test-token\", false, false, \"https://api.mixpanel.com\");\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.api_host).toBe(\"https://api.mixpanel.com\");\n });\n\n it(\"falls back to the EU default when api_host is undefined\", () => {\n initMixpanel(\"test-token\", false, false, undefined);\n\n const config = (mixpanel.init as ReturnType<typeof vi.fn>).mock.calls[0][1];\n expect(config.api_host).toBe(MIXPANEL_EU_API_HOST);\n });\n});\n"],"names":["describe","expect","beforeEach","it","vi","mixpanel","initMixpanel","MIXPANEL_EU_API_HOST","mock","default","init","fn","clearAllMocks","consoleSpy","spyOn","console","mockImplementation","not","toHaveBeenCalled","mockRestore","config","calls","autocapture","block_selectors","toEqual","toMatchObject","scroll","input","dead_click","rage_click","click","toBe","submit","record_sessions_percent","api_host","undefined"],"mappings":"AAIA,OAASA,QAAQ,CAAEC,MAAM,CAAEC,UAAU,CAAEC,EAAE,CAAEC,EAAE,KAAQ,QAAS,AAC9D,QAAOC,aAAc,kBAAmB,AAExC,QAASC,YAAY,CAAEC,oBAAoB,KAAQ,YAAa,CAEhEH,GAAGI,IAAI,CAAC,mBAAoB,IAAO,CAAA,CACjCC,QAAS,CACPC,KAAMN,GAAGO,EAAE,EACb,CACF,CAAA,GAEAX,SAAS,eAAgB,KACvBE,WAAW,KACTE,GAAGQ,aAAa,EAClB,GAEAT,GAAG,sCAAuC,KACxC,MAAMU,WAAaT,GAAGU,KAAK,CAACC,QAAS,QAAQC,kBAAkB,CAAC,KAAO,GACvEV,aAAa,IACbL,OAAOI,SAASK,IAAI,EAAEO,GAAG,CAACC,gBAAgB,GAC1CL,WAAWM,WAAW,EACxB,GAEAhB,GAAG,6CAA8C,KAC/CG,aAAa,aAAc,MAE3B,MAAMc,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOE,WAAW,CAACC,eAAe,EAAEC,OAAO,CAAC,CAAC,cAAc,CACpE,GAEArB,GAAG,sEAAuE,KACxEG,aAAa,aAAc,MAE3B,MAAMc,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOE,WAAW,EAAEG,aAAa,CAAC,CACvCC,OAAQ,MACRC,MAAO,MACPC,WAAY,MACZC,WAAY,KACd,GAGA5B,OAAOmB,OAAOE,WAAW,CAACQ,KAAK,EAAEb,GAAG,CAACc,IAAI,CAAC,OAC1C9B,OAAOmB,OAAOE,WAAW,CAACU,MAAM,EAAEf,GAAG,CAACc,IAAI,CAAC,MAC7C,GAEA5B,GAAG,2BAA4B,KAC7BG,aAAa,aAAc,MAE3B,MAAMc,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOa,uBAAuB,EAAEF,IAAI,CAAC,EAC9C,GAEA5B,GAAG,iDAAkD,KACnDG,aAAa,cAEb,MAAMc,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOc,QAAQ,EAAEH,IAAI,CAACxB,sBAC7BN,OAAOM,sBAAsBwB,IAAI,CAAC,8BACpC,GAEA5B,GAAG,6BAA8B,KAC/BG,aAAa,aAAc,MAAO,MAAO,4BAEzC,MAAMc,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOc,QAAQ,EAAEH,IAAI,CAAC,2BAC/B,GAEA5B,GAAG,0DAA2D,KAC5DG,aAAa,aAAc,MAAO,MAAO6B,WAEzC,MAAMf,OAAS,AAACf,SAASK,IAAI,CAA8BF,IAAI,CAACa,KAAK,CAAC,EAAE,CAAC,EAAE,CAC3EpB,OAAOmB,OAAOc,QAAQ,EAAEH,IAAI,CAACxB,qBAC/B,EACF"}
@@ -1,2 +1,2 @@
1
- function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else{obj[key]=value}return obj}import*as datalayer from"./datalayer";import*as mixpanel from"./mixpanel";import*as posthog from"./posthog";import*as logger from"./logger";export class InsightsService{initInsights({mixpanelToken,mixpanelAutoCapture,mixpanelApiHost,posthogApiKey,posthogApiHost,debug=false}){this.debugMode=!!debug;if(this.debugMode){logger.debug("InsightService: Initializing insights")}try{mixpanel.initMixpanel(mixpanelToken,mixpanelAutoCapture,this.debugMode,mixpanelApiHost)}catch(e){if(this.debugMode){logger.error("Failed to initialize Mixpanel",e)}}try{posthog.initPosthog(posthogApiKey,posthogApiHost)}catch(e){if(this.debugMode){logger.error("Failed to initialize Posthog",e)}}}enableDebugMode(){this.debugMode=true;logger.debug("Enabling debug mode");try{mixpanel.enableDebugMode();posthog.enableDebugMode()}catch(e){logger.error("Failed to enable debug mode",e)}}disableDebugMode(){this.debugMode=false;logger.debug("Disabling debug mode");try{mixpanel.disableDebugMode();posthog.disableDebugMode()}catch(e){logger.error("Failed to disable debug mode",e)}}identify(identity){const{userId,accountId,organisationId,email,name,...properties}=identity;if(!userId){if(this.debugMode){logger.warn("User ID not provided, skipping identify")}return}if(this.debugMode){logger.info("Identifying user",{userId,accountId,organisationId,email,name,...properties})}try{mixpanel.identify({userId,accountId,organisationId,email,name,...properties})}catch(e){if(this.debugMode){logger.error("Failed to identify user in Mixpanel",e)}}try{posthog.identify({userId,accountId,organisationId,email,name,...properties})}catch(e){if(this.debugMode){logger.error("Failed to identify user in Posthog",e)}}}trackPageView(options){const{excludeIds,includeDataLayer,...properties}=options??{};if(this.debugMode){logger.info("Tracking page view")}try{mixpanel.trackPageView({excludeIds,...properties})}catch(e){if(this.debugMode){logger.error("Failed to track page view in Mixpanel",e)}}try{posthog.trackPageView(properties)}catch(e){if(this.debugMode){logger.error("Failed to track page view in Posthog",e)}}if(includeDataLayer){try{datalayer.trackPageView(properties)}catch(e){if(this.debugMode){logger.error("Failed to track page view in GTM",e)}}}}track(event,properties){if(this.debugMode){logger.info("Tracking event",{event,properties})}try{mixpanel.track(event,properties)}catch(e){if(this.debugMode){logger.error("Failed to track event in Mixpanel",e)}}try{posthog.track(event,properties)}catch(e){if(this.debugMode){logger.error("Failed to track event in Posthog",e)}}try{datalayer.track(event,properties)}catch(e){if(this.debugMode){logger.error("Failed to track event in Datalayer",e)}}}setupObserver(){const getInsightAttributes=element=>{const MAX_ATTRIBUTES=10;let count=0;const attributes={};for(const attr of Array.from(element.attributes)){if(count>=MAX_ATTRIBUTES)break;if(attr.name.startsWith("data-insight-")){if(!/^data-insight-[a-zA-Z0-9-]+$/.test(attr.name))continue;if(typeof attr.value!=="string"||attr.value.length>100)continue;const key=attr.name.replace("data-insight-","").split("-").map((part,index)=>index===0?part:part.charAt(0).toUpperCase()+part.slice(1)).join("");attributes[key]=attr.value;count++}}return attributes};const findClosestElementWithInsights=element=>{let current=element;while(current&&current!==document.body){const insights=getInsightAttributes(current);if(Object.keys(insights).length>0){return insights}current=current.parentElement}return null};const handleClick=event=>{if(!(event.target instanceof HTMLElement))return;const insights=findClosestElementWithInsights(event.target);if(insights){const{event:eventName,...properties}=insights;this.track(eventName||"element_clicked",properties)}};document.body.addEventListener("click",handleClick);return()=>{document.body.removeEventListener("click",handleClick)}}constructor(){_define_property(this,"debugMode",false)}}
1
+ function _define_property(obj,key,value){if(key in obj){Object.defineProperty(obj,key,{value:value,enumerable:true,configurable:true,writable:true})}else obj[key]=value;return obj}import*as datalayer from"./datalayer";import*as mixpanel from"./mixpanel";import*as posthog from"./posthog";import*as logger from"./logger";import{isLikelyAutomated}from"./bot-detection";export class InsightsService{initInsights({mixpanelToken,mixpanelAutoCapture,mixpanelApiHost,posthogApiKey,posthogApiHost,debug=false}){this.debugMode=!!debug;if(isLikelyAutomated()){if(this.debugMode){logger.debug("InsightService: automated client detected, skipping insights initialization")}return}if(this.debugMode){logger.debug("InsightService: Initializing insights")}try{mixpanel.initMixpanel(mixpanelToken,mixpanelAutoCapture,this.debugMode,mixpanelApiHost)}catch(e){if(this.debugMode){logger.error("Failed to initialize Mixpanel",e)}}try{posthog.initPosthog(posthogApiKey,posthogApiHost)}catch(e){if(this.debugMode){logger.error("Failed to initialize Posthog",e)}}}enableDebugMode(){this.debugMode=true;logger.debug("Enabling debug mode");try{mixpanel.enableDebugMode();posthog.enableDebugMode()}catch(e){logger.error("Failed to enable debug mode",e)}}disableDebugMode(){this.debugMode=false;logger.debug("Disabling debug mode");try{mixpanel.disableDebugMode();posthog.disableDebugMode()}catch(e){logger.error("Failed to disable debug mode",e)}}identify(identity){const{userId,accountId,organisationId,email,name,...properties}=identity;if(!userId){if(this.debugMode){logger.warn("User ID not provided, skipping identify")}return}if(this.debugMode){logger.info("Identifying user",{userId,accountId,organisationId,email,name,...properties})}try{mixpanel.identify({userId,accountId,organisationId,email,name,...properties})}catch(e){if(this.debugMode){logger.error("Failed to identify user in Mixpanel",e)}}try{posthog.identify({userId,accountId,organisationId,email,name,...properties})}catch(e){if(this.debugMode){logger.error("Failed to identify user in Posthog",e)}}}trackPageView(options){const{excludeIds,includeDataLayer,...properties}=options??{};if(this.debugMode){logger.info("Tracking page view")}try{mixpanel.trackPageView({excludeIds,...properties})}catch(e){if(this.debugMode){logger.error("Failed to track page view in Mixpanel",e)}}try{posthog.trackPageView(properties)}catch(e){if(this.debugMode){logger.error("Failed to track page view in Posthog",e)}}if(includeDataLayer){try{datalayer.trackPageView(properties)}catch(e){if(this.debugMode){logger.error("Failed to track page view in GTM",e)}}}}track(event,properties){if(this.debugMode){logger.info("Tracking event",{event,properties})}try{mixpanel.track(event,properties)}catch(e){if(this.debugMode){logger.error("Failed to track event in Mixpanel",e)}}try{posthog.track(event,properties)}catch(e){if(this.debugMode){logger.error("Failed to track event in Posthog",e)}}try{datalayer.track(event,properties)}catch(e){if(this.debugMode){logger.error("Failed to track event in Datalayer",e)}}}setupObserver(){const getInsightAttributes=element=>{const MAX_ATTRIBUTES=10;let count=0;const attributes={};for(const attr of Array.from(element.attributes)){if(count>=MAX_ATTRIBUTES)break;if(attr.name.startsWith("data-insight-")){if(!/^data-insight-[a-zA-Z0-9-]+$/.test(attr.name))continue;if(typeof attr.value!=="string"||attr.value.length>100)continue;const key=attr.name.replace("data-insight-","").split("-").map((part,index)=>index===0?part:part.charAt(0).toUpperCase()+part.slice(1)).join("");attributes[key]=attr.value;count++}}return attributes};const findClosestElementWithInsights=element=>{let current=element;while(current&&current!==document.body){const insights=getInsightAttributes(current);if(Object.keys(insights).length>0){return insights}current=current.parentElement}return null};const handleClick=event=>{if(!(event.target instanceof HTMLElement))return;const insights=findClosestElementWithInsights(event.target);if(insights){const{event:eventName,...properties}=insights;this.track(eventName||"element_clicked",properties)}};document.body.addEventListener("click",handleClick);return()=>{document.body.removeEventListener("click",handleClick)}}constructor(){_define_property(this,"debugMode",false)}}
2
2
  //# sourceMappingURL=service.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/insights/service.ts"],"sourcesContent":["import type {\n AnalyticsService,\n InsightsConfig,\n InsightsIdentity,\n TrackPageViewOptions,\n} from \"./types\";\nimport * as datalayer from \"./datalayer\";\nimport * as mixpanel from \"./mixpanel\";\nimport * as posthog from \"./posthog\";\nimport * as logger from \"./logger\";\n\n// The real implementation that will be used after initialization\nexport class InsightsService implements AnalyticsService {\n private debugMode: boolean = false;\n\n initInsights({\n mixpanelToken,\n mixpanelAutoCapture,\n mixpanelApiHost,\n posthogApiKey,\n posthogApiHost,\n debug = false,\n }: InsightsConfig): void {\n this.debugMode = !!debug;\n\n if (this.debugMode) {\n logger.debug(\"InsightService: Initializing insights\");\n }\n\n try {\n mixpanel.initMixpanel(\n mixpanelToken,\n mixpanelAutoCapture,\n this.debugMode,\n mixpanelApiHost,\n );\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to initialize Mixpanel\", e);\n }\n }\n\n try {\n posthog.initPosthog(posthogApiKey, posthogApiHost);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to initialize Posthog\", e);\n }\n }\n }\n\n enableDebugMode(): void {\n this.debugMode = true;\n logger.debug(\"Enabling debug mode\");\n\n try {\n mixpanel.enableDebugMode();\n posthog.enableDebugMode();\n } catch (e) {\n logger.error(\"Failed to enable debug mode\", e);\n }\n }\n\n disableDebugMode(): void {\n this.debugMode = false;\n logger.debug(\"Disabling debug mode\");\n\n try {\n mixpanel.disableDebugMode();\n posthog.disableDebugMode();\n } catch (e) {\n logger.error(\"Failed to disable debug mode\", e);\n }\n }\n\n identify(identity: InsightsIdentity): void {\n const { userId, accountId, organisationId, email, name, ...properties } =\n identity;\n\n // In very rare cases we might have a user without an account, so we'll\n // let null/undefined/blank strings through on that one\n if (!userId) {\n if (this.debugMode) {\n logger.warn(\"User ID not provided, skipping identify\");\n }\n return;\n }\n\n if (this.debugMode) {\n logger.info(\"Identifying user\", {\n userId,\n accountId,\n organisationId,\n email,\n name,\n ...properties,\n });\n }\n\n try {\n mixpanel.identify({\n userId,\n accountId,\n organisationId,\n email,\n name,\n ...properties,\n });\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to identify user in Mixpanel\", e);\n }\n }\n\n try {\n posthog.identify({\n userId,\n accountId,\n organisationId,\n email,\n name,\n ...properties,\n });\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to identify user in Posthog\", e);\n }\n }\n }\n\n trackPageView(options?: TrackPageViewOptions): void {\n const { excludeIds, includeDataLayer, ...properties } = options ?? {};\n\n if (this.debugMode) {\n logger.info(\"Tracking page view\");\n }\n\n try {\n mixpanel.trackPageView({ excludeIds, ...properties });\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track page view in Mixpanel\", e);\n }\n }\n\n try {\n posthog.trackPageView(properties);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track page view in Posthog\", e);\n }\n }\n\n if (includeDataLayer) {\n try {\n datalayer.trackPageView(properties);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track page view in GTM\", e);\n }\n }\n }\n }\n\n track(event: string, properties?: Record<string, unknown>): void {\n if (this.debugMode) {\n logger.info(\"Tracking event\", { event, properties });\n }\n\n try {\n mixpanel.track(event, properties);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track event in Mixpanel\", e);\n }\n }\n\n try {\n posthog.track(event, properties);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track event in Posthog\", e);\n }\n }\n\n try {\n datalayer.track(event, properties);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track event in Datalayer\", e);\n }\n }\n }\n\n setupObserver(): () => void {\n // Helper to get all data-insight-* attributes from an element\n const getInsightAttributes = (\n element: HTMLElement,\n ): { event?: string; [key: string]: string | undefined } => {\n // limit how many data attributes we'll process\n const MAX_ATTRIBUTES = 10;\n let count = 0;\n\n const attributes: { event?: string; [key: string]: string | undefined } =\n {};\n\n for (const attr of Array.from(element.attributes)) {\n if (count >= MAX_ATTRIBUTES) break;\n if (attr.name.startsWith(\"data-insight-\")) {\n // Validate attribute name format\n if (!/^data-insight-[a-zA-Z0-9-]+$/.test(attr.name)) continue;\n\n // Sanitize attribute value\n if (typeof attr.value !== \"string\" || attr.value.length > 100)\n continue;\n\n // Convert data-insight-event-name to eventName\n const key = attr.name\n .replace(\"data-insight-\", \"\")\n .split(\"-\")\n .map((part: string, index: number) =>\n index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1),\n )\n .join(\"\");\n attributes[key] = attr.value;\n count++;\n }\n }\n return attributes;\n };\n\n // Helper to find closest element with data-insight attributes\n const findClosestElementWithInsights = (element: HTMLElement) => {\n let current = element;\n while (current && current !== document.body) {\n const insights = getInsightAttributes(current);\n if (Object.keys(insights).length > 0) {\n return insights;\n }\n\n current = current.parentElement as HTMLElement;\n }\n return null;\n };\n\n // Global click handler\n const handleClick = (event: MouseEvent): void => {\n if (!(event.target instanceof HTMLElement)) return;\n const insights = findClosestElementWithInsights(event.target);\n if (insights) {\n // Extract special properties if they exist\n const { event: eventName, ...properties } = insights;\n this.track(eventName || \"element_clicked\", properties);\n }\n };\n\n // Add listener to document body to catch all clicks\n document.body.addEventListener(\"click\", handleClick);\n\n // Return cleanup function in case it's needed\n return () => {\n document.body.removeEventListener(\"click\", handleClick);\n };\n }\n}\n"],"names":["datalayer","mixpanel","posthog","logger","InsightsService","initInsights","mixpanelToken","mixpanelAutoCapture","mixpanelApiHost","posthogApiKey","posthogApiHost","debug","debugMode","initMixpanel","e","error","initPosthog","enableDebugMode","disableDebugMode","identify","identity","userId","accountId","organisationId","email","name","properties","warn","info","trackPageView","options","excludeIds","includeDataLayer","track","event","setupObserver","getInsightAttributes","element","MAX_ATTRIBUTES","count","attributes","attr","Array","from","startsWith","test","value","length","key","replace","split","map","part","index","charAt","toUpperCase","slice","join","findClosestElementWithInsights","current","document","body","insights","Object","keys","parentElement","handleClick","target","HTMLElement","eventName","addEventListener","removeEventListener"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/core/insights/service.ts"],"sourcesContent":["import type {\n AnalyticsService,\n InsightsConfig,\n InsightsIdentity,\n TrackPageViewOptions,\n} from \"./types\";\nimport * as datalayer from \"./datalayer\";\nimport * as mixpanel from \"./mixpanel\";\nimport * as posthog from \"./posthog\";\nimport * as logger from \"./logger\";\nimport { isLikelyAutomated } from \"./bot-detection\";\n\n// The real implementation that will be used after initialization\nexport class InsightsService implements AnalyticsService {\n private debugMode: boolean = false;\n\n initInsights({\n mixpanelToken,\n mixpanelAutoCapture,\n mixpanelApiHost,\n posthogApiKey,\n posthogApiHost,\n debug = false,\n }: InsightsConfig): void {\n this.debugMode = !!debug;\n\n if (isLikelyAutomated()) {\n if (this.debugMode) {\n logger.debug(\n \"InsightService: automated client detected, skipping insights initialization\",\n );\n }\n return;\n }\n\n if (this.debugMode) {\n logger.debug(\"InsightService: Initializing insights\");\n }\n\n try {\n mixpanel.initMixpanel(\n mixpanelToken,\n mixpanelAutoCapture,\n this.debugMode,\n mixpanelApiHost,\n );\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to initialize Mixpanel\", e);\n }\n }\n\n try {\n posthog.initPosthog(posthogApiKey, posthogApiHost);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to initialize Posthog\", e);\n }\n }\n }\n\n enableDebugMode(): void {\n this.debugMode = true;\n logger.debug(\"Enabling debug mode\");\n\n try {\n mixpanel.enableDebugMode();\n posthog.enableDebugMode();\n } catch (e) {\n logger.error(\"Failed to enable debug mode\", e);\n }\n }\n\n disableDebugMode(): void {\n this.debugMode = false;\n logger.debug(\"Disabling debug mode\");\n\n try {\n mixpanel.disableDebugMode();\n posthog.disableDebugMode();\n } catch (e) {\n logger.error(\"Failed to disable debug mode\", e);\n }\n }\n\n identify(identity: InsightsIdentity): void {\n const { userId, accountId, organisationId, email, name, ...properties } =\n identity;\n\n // In very rare cases we might have a user without an account, so we'll\n // let null/undefined/blank strings through on that one\n if (!userId) {\n if (this.debugMode) {\n logger.warn(\"User ID not provided, skipping identify\");\n }\n return;\n }\n\n if (this.debugMode) {\n logger.info(\"Identifying user\", {\n userId,\n accountId,\n organisationId,\n email,\n name,\n ...properties,\n });\n }\n\n try {\n mixpanel.identify({\n userId,\n accountId,\n organisationId,\n email,\n name,\n ...properties,\n });\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to identify user in Mixpanel\", e);\n }\n }\n\n try {\n posthog.identify({\n userId,\n accountId,\n organisationId,\n email,\n name,\n ...properties,\n });\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to identify user in Posthog\", e);\n }\n }\n }\n\n trackPageView(options?: TrackPageViewOptions): void {\n const { excludeIds, includeDataLayer, ...properties } = options ?? {};\n\n if (this.debugMode) {\n logger.info(\"Tracking page view\");\n }\n\n try {\n mixpanel.trackPageView({ excludeIds, ...properties });\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track page view in Mixpanel\", e);\n }\n }\n\n try {\n posthog.trackPageView(properties);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track page view in Posthog\", e);\n }\n }\n\n if (includeDataLayer) {\n try {\n datalayer.trackPageView(properties);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track page view in GTM\", e);\n }\n }\n }\n }\n\n track(event: string, properties?: Record<string, unknown>): void {\n if (this.debugMode) {\n logger.info(\"Tracking event\", { event, properties });\n }\n\n try {\n mixpanel.track(event, properties);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track event in Mixpanel\", e);\n }\n }\n\n try {\n posthog.track(event, properties);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track event in Posthog\", e);\n }\n }\n\n try {\n datalayer.track(event, properties);\n } catch (e) {\n if (this.debugMode) {\n logger.error(\"Failed to track event in Datalayer\", e);\n }\n }\n }\n\n setupObserver(): () => void {\n // Helper to get all data-insight-* attributes from an element\n const getInsightAttributes = (\n element: HTMLElement,\n ): { event?: string; [key: string]: string | undefined } => {\n // limit how many data attributes we'll process\n const MAX_ATTRIBUTES = 10;\n let count = 0;\n\n const attributes: { event?: string; [key: string]: string | undefined } =\n {};\n\n for (const attr of Array.from(element.attributes)) {\n if (count >= MAX_ATTRIBUTES) break;\n if (attr.name.startsWith(\"data-insight-\")) {\n // Validate attribute name format\n if (!/^data-insight-[a-zA-Z0-9-]+$/.test(attr.name)) continue;\n\n // Sanitize attribute value\n if (typeof attr.value !== \"string\" || attr.value.length > 100)\n continue;\n\n // Convert data-insight-event-name to eventName\n const key = attr.name\n .replace(\"data-insight-\", \"\")\n .split(\"-\")\n .map((part: string, index: number) =>\n index === 0 ? part : part.charAt(0).toUpperCase() + part.slice(1),\n )\n .join(\"\");\n attributes[key] = attr.value;\n count++;\n }\n }\n return attributes;\n };\n\n // Helper to find closest element with data-insight attributes\n const findClosestElementWithInsights = (element: HTMLElement) => {\n let current = element;\n while (current && current !== document.body) {\n const insights = getInsightAttributes(current);\n if (Object.keys(insights).length > 0) {\n return insights;\n }\n\n current = current.parentElement as HTMLElement;\n }\n return null;\n };\n\n // Global click handler\n const handleClick = (event: MouseEvent): void => {\n if (!(event.target instanceof HTMLElement)) return;\n const insights = findClosestElementWithInsights(event.target);\n if (insights) {\n // Extract special properties if they exist\n const { event: eventName, ...properties } = insights;\n this.track(eventName || \"element_clicked\", properties);\n }\n };\n\n // Add listener to document body to catch all clicks\n document.body.addEventListener(\"click\", handleClick);\n\n // Return cleanup function in case it's needed\n return () => {\n document.body.removeEventListener(\"click\", handleClick);\n };\n }\n}\n"],"names":["datalayer","mixpanel","posthog","logger","isLikelyAutomated","InsightsService","initInsights","mixpanelToken","mixpanelAutoCapture","mixpanelApiHost","posthogApiKey","posthogApiHost","debug","debugMode","initMixpanel","e","error","initPosthog","enableDebugMode","disableDebugMode","identify","identity","userId","accountId","organisationId","email","name","properties","warn","info","trackPageView","options","excludeIds","includeDataLayer","track","event","setupObserver","getInsightAttributes","element","MAX_ATTRIBUTES","count","attributes","attr","Array","from","startsWith","test","value","length","key","replace","split","map","part","index","charAt","toUpperCase","slice","join","findClosestElementWithInsights","current","document","body","insights","Object","keys","parentElement","handleClick","target","HTMLElement","eventName","addEventListener","removeEventListener"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{colorGroupLengths}from"./types";export const convertTailwindClassToVar=className=>className.replace(/(text|bg|from|to)-([a-z0-9-]+)/gi,"var(--color-$2)");export const invertTailwindClassVariant=className=>{const splitMatch=className.split("-");if(splitMatch.length<3){throw new Error("Invalid TW class format")}const color=splitMatch[splitMatch.length-2];const variant=splitMatch[splitMatch.length-1];const property=splitMatch.slice(0,splitMatch.length-1).join("-");const numericalVariant=Number(variant.slice(0,-2))??0;if(isNaN(numericalVariant)){throw new Error(`Invalid variant value in TW class: ${className}`)}const flippedVariant=colorGroupLengths[color]-numericalVariant-(color==="neutral"?1:-1);const flippedMatch=`${property}-${flippedVariant}00`;return flippedMatch};
1
+ import{colorGroupLengths}from"./types";export const convertTailwindClassToVar=className=>className.replace(/(text|bg|from|to)-([a-z0-9-]+)/gi,"var(--color-$2)");export const invertTailwindClassVariant=className=>{const splitMatch=className.split("-");if(splitMatch.length<3){throw new Error("Invalid TW class format")}const color=splitMatch[splitMatch.length-2];const variant=splitMatch[splitMatch.length-1];const property=splitMatch.slice(0,splitMatch.length-1).join("-");const numericalVariant=Number(variant.slice(0,-2));if(isNaN(numericalVariant)){throw new Error(`Invalid variant value in TW class: ${className}`)}const flippedVariant=colorGroupLengths[color]-numericalVariant-(color==="neutral"?1:-1);const flippedMatch=`${property}-${flippedVariant}00`;return flippedMatch};
2
2
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/styles/colors/utils.ts"],"sourcesContent":["import { ColorClass, ColorClassColorGroups, colorGroupLengths } from \"./types\";\n\nexport const convertTailwindClassToVar = (className: string) =>\n className.replace(/(text|bg|from|to)-([a-z0-9-]+)/gi, \"var(--color-$2)\");\n\nexport const invertTailwindClassVariant = (className: string): ColorClass => {\n const splitMatch = className.split(\"-\");\n if (splitMatch.length < 3) {\n throw new Error(\"Invalid TW class format\");\n }\n\n const color = splitMatch[splitMatch.length - 2];\n const variant = splitMatch[splitMatch.length - 1];\n const property = splitMatch.slice(0, splitMatch.length - 1).join(\"-\");\n\n const numericalVariant = Number(variant.slice(0, -2)) ?? 0;\n if (isNaN(numericalVariant)) {\n throw new Error(`Invalid variant value in TW class: ${className}`);\n }\n\n const flippedVariant =\n colorGroupLengths[color as ColorClassColorGroups] -\n numericalVariant -\n (color === \"neutral\" ? 1 : -1);\n const flippedMatch = `${property}-${flippedVariant}00`;\n\n return flippedMatch as ColorClass;\n};\n"],"names":["colorGroupLengths","convertTailwindClassToVar","className","replace","invertTailwindClassVariant","splitMatch","split","length","Error","color","variant","property","slice","join","numericalVariant","Number","isNaN","flippedVariant","flippedMatch"],"mappings":"AAAA,OAA4CA,iBAAiB,KAAQ,SAAU,AAE/E,QAAO,MAAMC,0BAA4B,AAACC,WACxCA,UAAUC,OAAO,CAAC,mCAAoC,kBAAmB,AAE3E,QAAO,MAAMC,2BAA6B,AAACF,YACzC,MAAMG,WAAaH,UAAUI,KAAK,CAAC,KACnC,GAAID,WAAWE,MAAM,CAAG,EAAG,CACzB,MAAM,IAAIC,MAAM,0BAClB,CAEA,MAAMC,MAAQJ,UAAU,CAACA,WAAWE,MAAM,CAAG,EAAE,CAC/C,MAAMG,QAAUL,UAAU,CAACA,WAAWE,MAAM,CAAG,EAAE,CACjD,MAAMI,SAAWN,WAAWO,KAAK,CAAC,EAAGP,WAAWE,MAAM,CAAG,GAAGM,IAAI,CAAC,KAEjE,MAAMC,iBAAmBC,OAAOL,QAAQE,KAAK,CAAC,EAAG,CAAC,KAAO,EACzD,GAAII,MAAMF,kBAAmB,CAC3B,MAAM,IAAIN,MAAM,CAAC,mCAAmC,EAAEN,UAAU,CAAC,CACnE,CAEA,MAAMe,eACJjB,iBAAiB,CAACS,MAA+B,CACjDK,iBACCL,CAAAA,QAAU,UAAY,EAAI,CAAC,CAAA,EAC9B,MAAMS,aAAe,CAAC,EAAEP,SAAS,CAAC,EAAEM,eAAe,EAAE,CAAC,CAEtD,OAAOC,YACT,CAAE"}
1
+ {"version":3,"sources":["../../../../src/core/styles/colors/utils.ts"],"sourcesContent":["import { ColorClass, ColorClassColorGroups, colorGroupLengths } from \"./types\";\n\nexport const convertTailwindClassToVar = (className: string) =>\n className.replace(/(text|bg|from|to)-([a-z0-9-]+)/gi, \"var(--color-$2)\");\n\nexport const invertTailwindClassVariant = (className: string): ColorClass => {\n const splitMatch = className.split(\"-\");\n if (splitMatch.length < 3) {\n throw new Error(\"Invalid TW class format\");\n }\n\n const color = splitMatch[splitMatch.length - 2];\n const variant = splitMatch[splitMatch.length - 1];\n const property = splitMatch.slice(0, splitMatch.length - 1).join(\"-\");\n\n const numericalVariant = Number(variant.slice(0, -2));\n if (isNaN(numericalVariant)) {\n throw new Error(`Invalid variant value in TW class: ${className}`);\n }\n\n const flippedVariant =\n colorGroupLengths[color as ColorClassColorGroups] -\n numericalVariant -\n (color === \"neutral\" ? 1 : -1);\n const flippedMatch = `${property}-${flippedVariant}00`;\n\n return flippedMatch as ColorClass;\n};\n"],"names":["colorGroupLengths","convertTailwindClassToVar","className","replace","invertTailwindClassVariant","splitMatch","split","length","Error","color","variant","property","slice","join","numericalVariant","Number","isNaN","flippedVariant","flippedMatch"],"mappings":"AAAA,OAA4CA,iBAAiB,KAAQ,SAAU,AAE/E,QAAO,MAAMC,0BAA4B,AAACC,WACxCA,UAAUC,OAAO,CAAC,mCAAoC,kBAAmB,AAE3E,QAAO,MAAMC,2BAA6B,AAACF,YACzC,MAAMG,WAAaH,UAAUI,KAAK,CAAC,KACnC,GAAID,WAAWE,MAAM,CAAG,EAAG,CACzB,MAAM,IAAIC,MAAM,0BAClB,CAEA,MAAMC,MAAQJ,UAAU,CAACA,WAAWE,MAAM,CAAG,EAAE,CAC/C,MAAMG,QAAUL,UAAU,CAACA,WAAWE,MAAM,CAAG,EAAE,CACjD,MAAMI,SAAWN,WAAWO,KAAK,CAAC,EAAGP,WAAWE,MAAM,CAAG,GAAGM,IAAI,CAAC,KAEjE,MAAMC,iBAAmBC,OAAOL,QAAQE,KAAK,CAAC,EAAG,CAAC,IAClD,GAAII,MAAMF,kBAAmB,CAC3B,MAAM,IAAIN,MAAM,CAAC,mCAAmC,EAAEN,UAAU,CAAC,CACnE,CAEA,MAAMe,eACJjB,iBAAiB,CAACS,MAA+B,CACjDK,iBACCL,CAAAA,QAAU,UAAY,EAAI,CAAC,CAAA,EAC9B,MAAMS,aAAe,CAAC,EAAEP,SAAS,CAAC,EAAEM,eAAe,EAAE,CAAC,CAEtD,OAAOC,YACT,CAAE"}
package/index.d.ts CHANGED
@@ -6329,6 +6329,11 @@ export function useThemedScrollpoints(scrollpoints: ThemedScrollpoint[]): string
6329
6329
  //# sourceMappingURL=use-themed-scrollpoints.d.ts.map
6330
6330
  }
6331
6331
 
6332
+ declare module '@ably/ui/core/insights/bot-detection' {
6333
+ export const isLikelyAutomated: () => boolean;
6334
+ //# sourceMappingURL=bot-detection.d.ts.map
6335
+ }
6336
+
6332
6337
  declare module '@ably/ui/core/insights/command-queue' {
6333
6338
  import { AnalyticsService, InsightsConfig, InsightsIdentity, TrackPageViewOptions } from "@ably/ui/core/types";
6334
6339
  export class InsightsCommandQueue implements AnalyticsService {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ably/ui",
3
- "version": "18.4.1",
3
+ "version": "19.0.0",
4
4
  "description": "Home of the Ably design system library ([design.ably.com](https://design.ably.com)). It provides a showcase, development/test environment and a publishing pipeline for different distributables.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -21,15 +21,15 @@
21
21
  "workerDirectory": "./public"
22
22
  },
23
23
  "devDependencies": {
24
- "@storybook/addon-docs": "^10.5.0",
25
- "@storybook/addon-themes": "^10.5.0",
26
- "@storybook/addon-vitest": "^10.5.0",
27
- "@storybook/react-vite": "^10.5.0",
24
+ "@storybook/addon-docs": "^10.6.0",
25
+ "@storybook/addon-themes": "^10.6.0",
26
+ "@storybook/addon-vitest": "^10.6.0",
27
+ "@storybook/react-vite": "^10.6.0",
28
28
  "@svgr/core": "^8.1.0",
29
29
  "@svgr/plugin-jsx": "^8.1.0",
30
30
  "@svgr/plugin-svgo": "^8.1.0",
31
31
  "@swc/cli": "^0.8.1",
32
- "@swc/core": "^1.13.5",
32
+ "@swc/core": "^1.16.0",
33
33
  "@tailwindcss/container-queries": "^0.1.1",
34
34
  "@testing-library/react": "^16.3.0",
35
35
  "@types/js-cookie": "^3.0.6",
@@ -37,36 +37,33 @@
37
37
  "@types/react": "^18.3.1",
38
38
  "@types/react-dom": "^18.3.0",
39
39
  "@types/svg-sprite": "^0.0.39",
40
- "@typescript-eslint/eslint-plugin": "^8.64.0",
41
- "@typescript-eslint/parser": "^8.64.0",
40
+ "@typescript-eslint/parser": "^8.70.0",
42
41
  "@vitejs/plugin-react-swc": "^4.3.0",
43
42
  "@vitest/browser": "^4.1.10",
44
43
  "@vitest/browser-playwright": "^4.1.10",
45
44
  "@vitest/coverage-v8": "^4.1.10",
46
45
  "autoprefixer": "^10.5.0",
47
- "eslint": "^8.57.1",
48
- "eslint-config-prettier": "^10.1.8",
49
- "eslint-plugin-jsx-a11y": "^6.10.2",
50
- "eslint-plugin-react": "^7.35.0",
51
- "eslint-plugin-react-hooks": "^7.1.1",
52
- "eslint-plugin-react-perf": "^3.3.3",
53
- "eslint-plugin-storybook": "^10.5.0",
46
+ "eslint": "^10.8.1",
47
+ "eslint-plugin-storybook": "^10.6.0",
54
48
  "heroicons": "^2.2.0",
55
49
  "http-server": "14.1.1",
56
- "jsdom": "^29.1.0",
57
- "mixpanel-browser": "^2.81.0",
50
+ "jsdom": "^30.0.1",
51
+ "mixpanel-browser": "^2.82.1",
58
52
  "msw": "2.15.0",
59
- "msw-storybook-addon": "^2.0.7",
60
- "playwright": "^1.61.1",
61
- "posthog-js": "1.403.0",
53
+ "msw-storybook-addon": "^3.0.0",
54
+ "oxlint": "1.87.0",
55
+ "playwright": "^1.62.1",
56
+ "posthog-js": "1.434.2",
62
57
  "prettier": "^3.9.4",
63
- "storybook": "^10.5.0",
58
+ "react": "^18.2.0",
59
+ "react-dom": "^18.3.1",
60
+ "storybook": "^10.6.0",
64
61
  "svg-sprite": "^2.0.4",
65
62
  "tailwindcss": "^3.3.6",
66
63
  "ts-node": "^10.9.2",
67
64
  "typescript": "6.0.2",
68
- "update-browserslist-db": "^1.2.3",
69
- "vite": "^8.1.2",
65
+ "update-browserslist-db": "^1.3.1",
66
+ "vite": "^8.2.1",
70
67
  "vitest": "^4.1.10"
71
68
  },
72
69
  "dependencies": {
@@ -80,23 +77,24 @@
80
77
  "@radix-ui/react-tooltip": "^1.2.8",
81
78
  "array-flat-polyfill": "^1.0.1",
82
79
  "clsx": "^2.1.1",
83
- "dompurify": "^3.4.12",
80
+ "dompurify": "^3.4.16",
84
81
  "embla-carousel": "^8.6.0",
85
82
  "embla-carousel-autoplay": "^8.6.0",
86
83
  "embla-carousel-react": "^8.6.0",
87
84
  "es-toolkit": "^1.49.0",
88
- "highlight.js": "^11.11.1",
85
+ "highlight.js": "^11.12.0",
89
86
  "highlightjs-curl": "^1.3.0",
87
+ "isbot": "5.2.1",
90
88
  "js-cookie": "^3.0.7",
91
- "react": "^18.2.0",
92
- "react-dom": "^18.3.1",
93
89
  "scroll-lock": "^2.1.4",
94
- "swr": "^2.4.0",
95
- "tailwind-merge": "^3.6.0"
90
+ "swr": "^2.5.0",
91
+ "tailwind-merge": "^3.7.0"
96
92
  },
97
93
  "peerDependencies": {
98
94
  "mixpanel-browser": "^2.60.0 || <3",
99
- "posthog-js": "^1.217.4 || <2"
95
+ "posthog-js": "^1.217.4 || <2",
96
+ "react": "^18.2.0 || ^19.0.0",
97
+ "react-dom": "^18.2.0 || ^19.0.0"
100
98
  },
101
99
  "bugs": {
102
100
  "url": "https://github.com/ably/ably-ui/issues"
@@ -119,7 +117,7 @@
119
117
  "watch": "pnpm build:swc -w",
120
118
  "format:check": "prettier -c \"*.{js,ts}\" \".storybook/*.{js,ts,tsx}\" \"src/**/*.{js,ts,tsx}\"",
121
119
  "format:write": "prettier -w \"*.{js,ts}\" \".storybook/*.{js,ts,tsx}\" \"src/**/*.{js,ts,tsx}\"",
122
- "lint": "eslint \"*.{js,ts}\" \".storybook/*.{js,ts,tsx}\" \"src/**/*.{js,ts,tsx}\"",
120
+ "lint": "oxlint --report-unused-disable-directives *.js *.ts .storybook src && eslint \"*.{js,ts}\" \".storybook/*.{js,ts,tsx}\" \"src/**/*.{js,ts,tsx}\"",
123
121
  "update:all": "./scripts/update-dependents.sh",
124
122
  "pre-release": "./scripts/pre-release.sh",
125
123
  "release": "./scripts/release.sh",
@@ -1,9 +0,0 @@
1
- <svg width="244" height="122" viewBox="0 0 244 122" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M71.2253 77.7648V87.7101L100.67 71.0517V61.1064L71.2253 77.7648Z" fill="#03020D"/>
3
- <path d="M71.2253 54.1445L100.67 70.8028V60.8576L71.2253 44.1992V54.1445Z" fill="#03020D"/>
4
- <path d="M58 61.8515L87.4448 78.5099V68.5646L58 51.9062V61.8515Z" fill="#03020D"/>
5
- <path d="M58 61.8515L87.4448 78.5099V68.5646L58 51.9062V61.8515Z" fill="#03020D"/>
6
- <path d="M87.4448 35L58 51.6583V61.6036L87.4448 44.9453V35Z" fill="#03020D"/>
7
- <path fill-rule="evenodd" clip-rule="evenodd" d="M79.9946 49.1603L71.2253 44.1992V54.1213L79.9946 49.1603ZM78.6755 73.5494L87.4449 78.5104V68.5884L78.6755 73.5494Z" fill="#03020D"/>
8
- <path fill-rule="evenodd" clip-rule="evenodd" d="M158.472 72.6461H162.694V42.7075H158.472V72.6461ZM186 54.0766V50.2328H182.305V42.7075H178.082V50.2328H175.037V54.0766H178.082V72.6461H182.305V54.0766H186ZM167.932 72.6461H172.155V50.2328H167.932V72.6461ZM172.155 47.6437H167.932V42.7075H172.155V47.6437ZM142.596 69.3692C147.022 69.3692 150.189 65.769 150.189 61.4801C150.189 57.2318 146.818 53.4691 142.474 53.4691C138.13 53.4691 134.962 57.192 134.962 61.3997C134.962 65.7284 138.13 69.3692 142.596 69.3692ZM154.412 61.7229C154.412 54.9668 149.702 49.6228 142.759 49.6228C139.551 49.6228 136.628 50.9986 134.759 53.6689H134.676V50.2328H130.821V80.1308H135.044V69.4098H135.127C136.751 72.0801 140.039 73.2122 143.045 73.2122C149.496 73.2122 154.412 68.0746 154.412 61.7229ZM120.629 58.7692C124.325 59.9021 127.411 61.7229 127.411 66.0516C127.411 70.4615 124.162 73.2122 119.856 73.2122C118.873 73.1984 117.898 73.0205 116.974 72.6859C113.646 71.5132 111.9 68.8023 111.9 65.2825H116.119C116.282 67.5881 117.419 69.3683 119.936 69.3683C121.804 69.3683 123.184 68.2354 123.184 66.2936C123.184 64.2537 121.243 63.5595 119.047 62.7747C116.194 61.7545 112.912 60.5812 112.912 56.0997C112.912 52.2558 116.282 49.6261 119.977 49.6261C123.836 49.6261 126.798 52.2964 126.881 56.1801H122.658C122.455 54.5623 121.48 53.4692 119.775 53.4692C118.354 53.4692 117.136 54.3593 117.136 55.856C117.136 57.6957 118.815 58.2114 120.29 58.6643C120.405 58.6994 120.518 58.7342 120.629 58.7692Z" fill="#03020D"/>
9
- </svg>