posthog-js 1.347.2 → 1.349.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 (78) hide show
  1. package/dist/array.full.es5.js +1 -1
  2. package/dist/array.full.js +1 -1
  3. package/dist/array.full.no-external.js +1 -1
  4. package/dist/array.js +1 -1
  5. package/dist/array.no-external.js +1 -1
  6. package/dist/conversations.js +1 -1
  7. package/dist/conversations.js.map +1 -1
  8. package/dist/customizations.full.js +1 -1
  9. package/dist/lazy-recorder.js +1 -1
  10. package/dist/main.js +1 -1
  11. package/dist/main.js.map +1 -1
  12. package/dist/module.d.ts +56 -2
  13. package/dist/module.full.d.ts +56 -2
  14. package/dist/module.full.js +1 -1
  15. package/dist/module.full.js.map +1 -1
  16. package/dist/module.full.no-external.d.ts +56 -2
  17. package/dist/module.full.no-external.js +1 -1
  18. package/dist/module.full.no-external.js.map +1 -1
  19. package/dist/module.js +1 -1
  20. package/dist/module.js.map +1 -1
  21. package/dist/module.no-external.d.ts +56 -2
  22. package/dist/module.no-external.js +1 -1
  23. package/dist/module.no-external.js.map +1 -1
  24. package/dist/posthog-recorder.js +1 -1
  25. package/dist/product-tours-preview.d.ts +14 -0
  26. package/dist/product-tours-preview.js +1 -1
  27. package/dist/product-tours-preview.js.map +1 -1
  28. package/dist/product-tours.js +1 -1
  29. package/dist/product-tours.js.map +1 -1
  30. package/dist/src/extensions/conversations/external/components/ConversationsWidget.d.ts +43 -2
  31. package/dist/src/extensions/conversations/external/components/TicketListItem.d.ts +13 -0
  32. package/dist/src/extensions/conversations/external/components/TicketListView.d.ts +15 -0
  33. package/dist/src/extensions/conversations/external/components/styles.d.ts +184 -0
  34. package/dist/src/extensions/conversations/external/components/utils.d.ts +8 -0
  35. package/dist/src/extensions/conversations/external/index.d.ts +39 -1
  36. package/dist/src/extensions/product-tours/product-tours-utils.d.ts +1 -0
  37. package/dist/src/extensions/product-tours/product-tours.d.ts +3 -0
  38. package/dist/src/posthog-product-tours-types.d.ts +54 -0
  39. package/dist/surveys-preview.d.ts +14 -0
  40. package/lib/package.json +1 -1
  41. package/lib/src/extensions/conversations/external/components/ConversationsWidget.d.ts +43 -2
  42. package/lib/src/extensions/conversations/external/components/ConversationsWidget.js +96 -28
  43. package/lib/src/extensions/conversations/external/components/ConversationsWidget.js.map +1 -1
  44. package/lib/src/extensions/conversations/external/components/TicketListItem.d.ts +13 -0
  45. package/lib/src/extensions/conversations/external/components/TicketListItem.js +47 -0
  46. package/lib/src/extensions/conversations/external/components/TicketListItem.js.map +1 -0
  47. package/lib/src/extensions/conversations/external/components/TicketListView.d.ts +15 -0
  48. package/lib/src/extensions/conversations/external/components/TicketListView.js +75 -0
  49. package/lib/src/extensions/conversations/external/components/TicketListView.js.map +1 -0
  50. package/lib/src/extensions/conversations/external/components/styles.d.ts +184 -0
  51. package/lib/src/extensions/conversations/external/components/styles.js +189 -0
  52. package/lib/src/extensions/conversations/external/components/styles.js.map +1 -1
  53. package/lib/src/extensions/conversations/external/components/utils.d.ts +8 -0
  54. package/lib/src/extensions/conversations/external/components/utils.js +49 -0
  55. package/lib/src/extensions/conversations/external/components/utils.js.map +1 -0
  56. package/lib/src/extensions/conversations/external/index.d.ts +39 -1
  57. package/lib/src/extensions/conversations/external/index.js +253 -31
  58. package/lib/src/extensions/conversations/external/index.js.map +1 -1
  59. package/lib/src/extensions/product-tours/components/ProductTourSurveyStepInner.js +1 -1
  60. package/lib/src/extensions/product-tours/components/ProductTourSurveyStepInner.js.map +1 -1
  61. package/lib/src/extensions/product-tours/product-tours-utils.d.ts +1 -0
  62. package/lib/src/extensions/product-tours/product-tours-utils.js +34 -0
  63. package/lib/src/extensions/product-tours/product-tours-utils.js.map +1 -1
  64. package/lib/src/extensions/product-tours/product-tours.d.ts +3 -0
  65. package/lib/src/extensions/product-tours/product-tours.js +104 -75
  66. package/lib/src/extensions/product-tours/product-tours.js.map +1 -1
  67. package/lib/src/posthog-product-tours-types.d.ts +54 -0
  68. package/lib/src/posthog-product-tours-types.js +43 -1
  69. package/lib/src/posthog-product-tours-types.js.map +1 -1
  70. package/lib/src/utils/product-tour-event-receiver.js +2 -1
  71. package/lib/src/utils/product-tour-event-receiver.js.map +1 -1
  72. package/lib/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +3 -3
  74. package/react/dist/esm/index.js +25 -1
  75. package/react/dist/esm/index.js.map +1 -1
  76. package/react/dist/types/index.d.ts +4 -2
  77. package/react/dist/umd/index.js +25 -0
  78. package/react/dist/umd/index.js.map +1 -1
@@ -93,6 +93,6 @@ function ProductTourSurveyStepInner(_a) {
93
93
  if (!survey) {
94
94
  return (0, jsx_runtime_1.jsx)("div", {});
95
95
  }
96
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("button", { class: "ph-tour-dismiss", onClick: onDismiss, "aria-label": "Close survey", style: cursorStyle, children: (0, icons_1.cancelSVG)() }), (0, jsx_runtime_1.jsx)("div", { class: "ph-tour-survey-question", children: survey.questionText }), isOpenText ? ((0, jsx_runtime_1.jsx)(OpenTextInput, { value: textValue, onChange: setTextValue, onSubmit: handleTextSubmit, isInteractive: isInteractive })) : ((0, jsx_runtime_1.jsx)(RatingInput, { survey: survey, onSubmit: onSubmit, isInteractive: isInteractive })), (0, jsx_runtime_1.jsxs)("div", { class: "ph-tour-footer", children: [(0, jsx_runtime_1.jsxs)("span", { class: "ph-tour-progress", children: [stepIndex + 1, " of ", totalSteps] }), (0, jsx_runtime_1.jsxs)("div", { class: "ph-tour-buttons", children: [!isFirstStep && ((0, jsx_runtime_1.jsx)("button", { class: "ph-tour-button ph-tour-button--secondary", onClick: onPrevious, style: cursorStyle, children: "Back" })), isOpenText && ((0, jsx_runtime_1.jsx)("button", { class: "ph-tour-button ph-tour-button--primary", onClick: handleTextSubmit, style: cursorStyle, children: "Submit" }))] })] }), !whiteLabel && ((0, jsx_runtime_1.jsxs)("a", { href: isInteractive ? 'https://posthog.com/product-tours' : undefined, target: isInteractive ? '_blank' : undefined, rel: isInteractive ? 'noopener noreferrer' : undefined, class: "ph-tour-branding", style: isInteractive ? undefined : { cursor: 'default', pointerEvents: 'none' }, children: ["Survey by ", icons_1.IconPosthogLogo] }))] }));
96
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("button", { class: "ph-tour-dismiss", onClick: onDismiss, "aria-label": "Close survey", style: cursorStyle, children: (0, icons_1.cancelSVG)() }), (0, jsx_runtime_1.jsx)("div", { class: "ph-tour-survey-question", children: survey.questionText }), isOpenText ? ((0, jsx_runtime_1.jsx)(OpenTextInput, { value: textValue, onChange: setTextValue, onSubmit: handleTextSubmit, isInteractive: isInteractive })) : ((0, jsx_runtime_1.jsx)(RatingInput, { survey: survey, onSubmit: onSubmit, isInteractive: isInteractive })), (0, jsx_runtime_1.jsxs)("div", { class: "ph-tour-footer", children: [(0, jsx_runtime_1.jsxs)("span", { class: "ph-tour-progress", children: [stepIndex + 1, " of ", totalSteps] }), (0, jsx_runtime_1.jsxs)("div", { class: "ph-tour-buttons", children: [!isFirstStep && ((0, jsx_runtime_1.jsx)("button", { class: "ph-tour-button ph-tour-button--secondary", onClick: onPrevious, style: cursorStyle, children: survey.backButtonText || 'Back' })), isOpenText && ((0, jsx_runtime_1.jsx)("button", { class: "ph-tour-button ph-tour-button--primary", onClick: handleTextSubmit, style: cursorStyle, children: survey.submitButtonText || 'Submit' }))] })] }), !whiteLabel && ((0, jsx_runtime_1.jsxs)("a", { href: isInteractive ? 'https://posthog.com/product-tours' : undefined, target: isInteractive ? '_blank' : undefined, rel: isInteractive ? 'noopener noreferrer' : undefined, class: "ph-tour-branding", style: isInteractive ? undefined : { cursor: 'default', pointerEvents: 'none' }, children: ["Survey by ", icons_1.IconPosthogLogo] }))] }));
97
97
  }
98
98
  //# sourceMappingURL=ProductTourSurveyStepInner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProductTourSurveyStepInner.js","sourceRoot":"","sources":["../../../../../src/extensions/product-tours/components/ProductTourSurveyStepInner.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAqKA,gEAqFC;;AAzPD,sCAA0D;AAE1D,6CAAgE;AAChE,6CAM4B;AAY5B,IAAM,gBAAgB,GAAG,CAAC,yBAAiB,EAAE,oBAAY,EAAE,sBAAc,CAAC,CAAA;AAC1E,IAAM,eAAe,GAAG,CAAC,6BAAqB,EAAE,yBAAiB,EAAE,oBAAY,EAAE,sBAAc,EAAE,0BAAkB,CAAC,CAAA;AAEpH,SAAS,eAAe,CAAC,KAAa;IAClC,QAAQ,KAAK,EAAE,CAAC;QACZ,KAAK,CAAC;YACF,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;QAC1B,KAAK,EAAE;YACH,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC7C;YACI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9B,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,EAUtB;QATG,KAAK,WAAA,EACL,QAAQ,cAAA,EACR,QAAQ,cAAA,EACR,aAAa,mBAAA;IAOb,IAAM,QAAQ,GAAG,IAAA,cAAM,EAAsB,IAAI,CAAC,CAAA;IAElD,IAAA,iBAAS,EAAC;QACN,IAAI,aAAa,EAAE,CAAC;YAChB,UAAU,CAAC,sBAAM,OAAA,MAAA,QAAQ,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAA,EAAA,EAAE,GAAG,CAAC,CAAA;QACpD,CAAC;IACL,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAA;IAEnB,IAAM,aAAa,GAAG,UAAC,CAAgB;QACnC,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,OAAO,IAAI,aAAa,EAAE,CAAC;YAClD,CAAC,CAAC,cAAc,EAAE,CAAA;YAClB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,EAAI,CAAA;QAChB,CAAC;IACL,CAAC,CAAA;IAED,OAAO,CACH,qCACI,GAAG,EAAE,QAAQ,EACb,KAAK,EAAC,yBAAyB,EAC/B,IAAI,EAAE,CAAC,EACP,WAAW,EAAC,6BAA6B,EACzC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,UAAC,CAAC,IAAK,OAAA,QAAQ,CAAE,CAAC,CAAC,MAA8B,CAAC,KAAK,CAAC,EAAjD,CAAiD,EACjE,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,CAAC,aAAa,EACxB,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,GAC1D,CACL,CAAA;AACL,CAAC;AAED,SAAS,WAAW,CAAC,EAQpB;QAPG,MAAM,YAAA,EACN,QAAQ,cAAA,EACR,aAAa,mBAAA;IAMP,IAAA,KAAA,OAAsC,IAAA,gBAAQ,EAAgB,IAAI,CAAC,IAAA,EAAlE,cAAc,QAAA,EAAE,iBAAiB,QAAiC,CAAA;IACzE,IAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,OAAO,CAAA;IACzC,IAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAA;IAE/B,IAAM,YAAY,GAAG,UAAC,MAAc;QAChC,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAM;QACV,CAAC;QACD,iBAAiB,CAAC,MAAM,CAAC,CAAA;QACzB,uCAAuC;QACvC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,MAAM,CAAC,CAAA;IACtB,CAAC,CAAA;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACtB,IAAM,MAAM,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,eAAe,CAAA;QAC/D,OAAO,CACH,iCAAK,KAAK,EAAC,iCAAiC,aACxC,gCAAK,KAAK,EAAC,6BAA6B,YACnC,MAAM,CAAC,GAAG,CAAC,UAAC,KAAK,EAAE,GAAG;wBACnB,IAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAA;wBACtB,IAAM,QAAQ,GAAG,cAAc,KAAK,MAAM,CAAA;wBAC1C,OAAO,CACH,mCAEI,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,sCAA+B,QAAQ,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,EAAE,CAAE,EAC7F,OAAO,EAAE,cAAM,OAAA,YAAY,CAAC,MAAM,CAAC,EAApB,CAAoB,EACnC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,gBAC5C,eAAQ,MAAM,CAAE,YAE3B,KAAK,IAPD,GAAG,CAQH,CACZ,CAAA;oBACL,CAAC,CAAC,GACA,EACL,CAAC,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,CACnD,iCAAK,KAAK,EAAC,8BAA8B,aACrC,2CAAO,MAAM,CAAC,eAAe,GAAQ,EACrC,2CAAO,MAAM,CAAC,eAAe,GAAQ,IACnC,CACT,IACC,CACT,CAAA;IACL,CAAC;IAED,iBAAiB;IACjB,IAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACtC,OAAO,CACH,iCAAK,KAAK,EAAC,iCAAiC,aACxC,gCACI,KAAK,EAAC,+BAA+B,EACrC,KAAK,EAAE,EAAE,mBAAmB,EAAE,iBAAU,OAAO,CAAC,MAAM,sBAAmB,EAAE,YAE1E,OAAO,CAAC,GAAG,CAAC,UAAC,GAAG;oBACb,IAAM,QAAQ,GAAG,cAAc,KAAK,GAAG,CAAA;oBACvC,OAAO,CACH,mCAEI,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,uCAAgC,QAAQ,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,CAAE,EAC/F,OAAO,EAAE,cAAM,OAAA,YAAY,CAAC,GAAG,CAAC,EAAjB,CAAiB,EAChC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,gBAC5C,eAAQ,GAAG,CAAE,YAExB,GAAG,IAPC,GAAG,CAQH,CACZ,CAAA;gBACL,CAAC,CAAC,GACA,EACL,CAAC,MAAM,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC,IAAI,CACnD,iCAAK,KAAK,EAAC,8BAA8B,aACrC,2CAAO,MAAM,CAAC,eAAe,GAAQ,EACrC,2CAAO,MAAM,CAAC,eAAe,GAAQ,IACnC,CACT,IACC,CACT,CAAA;AACL,CAAC;AAED,SAAgB,0BAA0B,CAAC,EAQT;;QAP9B,IAAI,UAAA,EACJ,UAAU,gBAAA,EACV,SAAS,eAAA,EACT,UAAU,gBAAA,EACV,UAAU,gBAAA,EACV,QAAQ,cAAA,EACR,SAAS,eAAA;IAEH,IAAA,KAAA,OAA4B,IAAA,gBAAQ,EAAC,EAAE,CAAC,IAAA,EAAvC,SAAS,QAAA,EAAE,YAAY,QAAgB,CAAA;IAC9C,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;IAC1B,IAAM,UAAU,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,UAAU,mCAAI,KAAK,CAAA;IAClD,IAAM,WAAW,GAAG,SAAS,KAAK,CAAC,CAAA;IACnC,IAAM,UAAU,GAAG,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,MAAK,MAAM,CAAA;IAE1C,IAAM,aAAa,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,QAAQ,IAAI,SAAS,CAAC,CAAA;IAC7D,IAAM,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAErE,IAAM,gBAAgB,GAAG;QACrB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,SAAS,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAA;IACxC,CAAC,CAAA;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,iCAAO,CAAA;IAClB,CAAC;IAED,OAAO,CACH,6DACI,mCAAQ,KAAK,EAAC,iBAAiB,EAAC,OAAO,EAAE,SAAS,gBAAa,cAAc,EAAC,KAAK,EAAE,WAAW,YAC3F,IAAA,iBAAS,GAAE,GACP,EAET,gCAAK,KAAK,EAAC,yBAAyB,YAAE,MAAM,CAAC,YAAY,GAAO,EAE/D,UAAU,CAAC,CAAC,CAAC,CACV,uBAAC,aAAa,IACV,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,EAAE,aAAa,GAC9B,CACL,CAAC,CAAC,CAAC,CACA,uBAAC,WAAW,IAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,GAAI,CACpF,EAED,iCAAK,KAAK,EAAC,gBAAgB,aACvB,kCAAM,KAAK,EAAC,kBAAkB,aACzB,SAAS,GAAG,CAAC,UAAM,UAAU,IAC3B,EAEP,iCAAK,KAAK,EAAC,iBAAiB,aACvB,CAAC,WAAW,IAAI,CACb,mCACI,KAAK,EAAC,0CAA0C,EAChD,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,WAAW,qBAGb,CACZ,EACA,UAAU,IAAI,CACX,mCACI,KAAK,EAAC,wCAAwC,EAC9C,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,WAAW,uBAGb,CACZ,IACC,IACJ,EAEL,CAAC,UAAU,IAAI,CACZ,+BACI,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,SAAS,EACrE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAC5C,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,EACtD,KAAK,EAAC,kBAAkB,EACxB,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,2BAEpE,uBAAe,IAC1B,CACP,IACF,CACN,CAAA;AACL,CAAC","sourcesContent":["import { h } from 'preact'\nimport { useState, useRef, useEffect } from 'preact/hooks'\nimport { ProductTourStep, ProductTourAppearance, ProductTourSurveyQuestion } from '../../../posthog-product-tours-types'\nimport { cancelSVG, IconPosthogLogo } from '../../surveys/icons'\nimport {\n dissatisfiedEmoji,\n neutralEmoji,\n satisfiedEmoji,\n veryDissatisfiedEmoji,\n verySatisfiedEmoji,\n} from '../../surveys/icons'\n\nexport interface ProductTourSurveyStepInnerProps {\n step: ProductTourStep\n appearance?: ProductTourAppearance\n stepIndex: number\n totalSteps: number\n onPrevious?: () => void\n onSubmit?: (response: string | number | null) => void\n onDismiss?: () => void\n}\n\nconst threeScaleEmojis = [dissatisfiedEmoji, neutralEmoji, satisfiedEmoji]\nconst fiveScaleEmojis = [veryDissatisfiedEmoji, dissatisfiedEmoji, neutralEmoji, satisfiedEmoji, verySatisfiedEmoji]\n\nfunction getScaleNumbers(scale: number): number[] {\n switch (scale) {\n case 5:\n return [1, 2, 3, 4, 5]\n case 10:\n return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n default:\n return [1, 2, 3, 4, 5]\n }\n}\n\nfunction OpenTextInput({\n value,\n onChange,\n onSubmit,\n isInteractive,\n}: {\n value: string\n onChange: (text: string) => void\n onSubmit?: () => void\n isInteractive: boolean\n}): h.JSX.Element {\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n useEffect(() => {\n if (isInteractive) {\n setTimeout(() => inputRef.current?.focus(), 100)\n }\n }, [isInteractive])\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && e.metaKey && isInteractive) {\n e.preventDefault()\n onSubmit?.()\n }\n }\n\n return (\n <textarea\n ref={inputRef}\n class=\"ph-tour-survey-textarea\"\n rows={3}\n placeholder=\"Your feedback (optional)...\"\n value={value}\n onInput={(e) => onChange((e.target as HTMLTextAreaElement).value)}\n onKeyDown={handleKeyDown}\n disabled={!isInteractive}\n style={isInteractive ? undefined : { cursor: 'default' }}\n />\n )\n}\n\nfunction RatingInput({\n survey,\n onSubmit,\n isInteractive,\n}: {\n survey: ProductTourSurveyQuestion\n onSubmit?: (rating: number) => void\n isInteractive: boolean\n}): h.JSX.Element {\n const [selectedRating, setSelectedRating] = useState<number | null>(null)\n const display = survey.display || 'emoji'\n const scale = survey.scale || 5\n\n const handleSelect = (rating: number) => {\n if (!isInteractive) {\n return\n }\n setSelectedRating(rating)\n // Auto-submit on selection for ratings\n onSubmit?.(rating)\n }\n\n if (display === 'emoji') {\n const emojis = scale === 3 ? threeScaleEmojis : fiveScaleEmojis\n return (\n <div class=\"ph-tour-survey-rating-container\">\n <div class=\"ph-tour-survey-rating-emoji\">\n {emojis.map((emoji, idx) => {\n const rating = idx + 1\n const isActive = selectedRating === rating\n return (\n <button\n key={idx}\n type=\"button\"\n class={`ph-tour-survey-emoji-button ${isActive ? 'ph-tour-survey-emoji-button--active' : ''}`}\n onClick={() => handleSelect(rating)}\n style={isInteractive ? undefined : { cursor: 'default' }}\n aria-label={`Rate ${rating}`}\n >\n {emoji}\n </button>\n )\n })}\n </div>\n {(survey.lowerBoundLabel || survey.upperBoundLabel) && (\n <div class=\"ph-tour-survey-rating-labels\">\n <span>{survey.lowerBoundLabel}</span>\n <span>{survey.upperBoundLabel}</span>\n </div>\n )}\n </div>\n )\n }\n\n // Number display\n const numbers = getScaleNumbers(scale)\n return (\n <div class=\"ph-tour-survey-rating-container\">\n <div\n class=\"ph-tour-survey-rating-numbers\"\n style={{ gridTemplateColumns: `repeat(${numbers.length}, minmax(0, 1fr))` }}\n >\n {numbers.map((num) => {\n const isActive = selectedRating === num\n return (\n <button\n key={num}\n type=\"button\"\n class={`ph-tour-survey-number-button ${isActive ? 'ph-tour-survey-number-button--active' : ''}`}\n onClick={() => handleSelect(num)}\n style={isInteractive ? undefined : { cursor: 'default' }}\n aria-label={`Rate ${num}`}\n >\n {num}\n </button>\n )\n })}\n </div>\n {(survey.lowerBoundLabel || survey.upperBoundLabel) && (\n <div class=\"ph-tour-survey-rating-labels\">\n <span>{survey.lowerBoundLabel}</span>\n <span>{survey.upperBoundLabel}</span>\n </div>\n )}\n </div>\n )\n}\n\nexport function ProductTourSurveyStepInner({\n step,\n appearance,\n stepIndex,\n totalSteps,\n onPrevious,\n onSubmit,\n onDismiss,\n}: ProductTourSurveyStepInnerProps): h.JSX.Element {\n const [textValue, setTextValue] = useState('')\n const survey = step.survey\n const whiteLabel = appearance?.whiteLabel ?? false\n const isFirstStep = stepIndex === 0\n const isOpenText = survey?.type === 'open'\n\n const isInteractive = !!(onPrevious || onSubmit || onDismiss)\n const cursorStyle = isInteractive ? undefined : { cursor: 'default' }\n\n const handleTextSubmit = () => {\n onSubmit?.(textValue.trim() || null)\n }\n\n if (!survey) {\n return <div />\n }\n\n return (\n <>\n <button class=\"ph-tour-dismiss\" onClick={onDismiss} aria-label=\"Close survey\" style={cursorStyle}>\n {cancelSVG()}\n </button>\n\n <div class=\"ph-tour-survey-question\">{survey.questionText}</div>\n\n {isOpenText ? (\n <OpenTextInput\n value={textValue}\n onChange={setTextValue}\n onSubmit={handleTextSubmit}\n isInteractive={isInteractive}\n />\n ) : (\n <RatingInput survey={survey} onSubmit={onSubmit} isInteractive={isInteractive} />\n )}\n\n <div class=\"ph-tour-footer\">\n <span class=\"ph-tour-progress\">\n {stepIndex + 1} of {totalSteps}\n </span>\n\n <div class=\"ph-tour-buttons\">\n {!isFirstStep && (\n <button\n class=\"ph-tour-button ph-tour-button--secondary\"\n onClick={onPrevious}\n style={cursorStyle}\n >\n Back\n </button>\n )}\n {isOpenText && (\n <button\n class=\"ph-tour-button ph-tour-button--primary\"\n onClick={handleTextSubmit}\n style={cursorStyle}\n >\n Submit\n </button>\n )}\n </div>\n </div>\n\n {!whiteLabel && (\n <a\n href={isInteractive ? 'https://posthog.com/product-tours' : undefined}\n target={isInteractive ? '_blank' : undefined}\n rel={isInteractive ? 'noopener noreferrer' : undefined}\n class=\"ph-tour-branding\"\n style={isInteractive ? undefined : { cursor: 'default', pointerEvents: 'none' }}\n >\n Survey by {IconPosthogLogo}\n </a>\n )}\n </>\n )\n}\n"]}
1
+ {"version":3,"file":"ProductTourSurveyStepInner.js","sourceRoot":"","sources":["../../../../../src/extensions/product-tours/components/ProductTourSurveyStepInner.tsx"],"names":[],"mappings":"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","sourcesContent":["import { h } from 'preact'\nimport { useState, useRef, useEffect } from 'preact/hooks'\nimport { ProductTourStep, ProductTourAppearance, ProductTourSurveyQuestion } from '../../../posthog-product-tours-types'\nimport { cancelSVG, IconPosthogLogo } from '../../surveys/icons'\nimport {\n dissatisfiedEmoji,\n neutralEmoji,\n satisfiedEmoji,\n veryDissatisfiedEmoji,\n verySatisfiedEmoji,\n} from '../../surveys/icons'\n\nexport interface ProductTourSurveyStepInnerProps {\n step: ProductTourStep\n appearance?: ProductTourAppearance\n stepIndex: number\n totalSteps: number\n onPrevious?: () => void\n onSubmit?: (response: string | number | null) => void\n onDismiss?: () => void\n}\n\nconst threeScaleEmojis = [dissatisfiedEmoji, neutralEmoji, satisfiedEmoji]\nconst fiveScaleEmojis = [veryDissatisfiedEmoji, dissatisfiedEmoji, neutralEmoji, satisfiedEmoji, verySatisfiedEmoji]\n\nfunction getScaleNumbers(scale: number): number[] {\n switch (scale) {\n case 5:\n return [1, 2, 3, 4, 5]\n case 10:\n return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n default:\n return [1, 2, 3, 4, 5]\n }\n}\n\nfunction OpenTextInput({\n value,\n onChange,\n onSubmit,\n isInteractive,\n}: {\n value: string\n onChange: (text: string) => void\n onSubmit?: () => void\n isInteractive: boolean\n}): h.JSX.Element {\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n useEffect(() => {\n if (isInteractive) {\n setTimeout(() => inputRef.current?.focus(), 100)\n }\n }, [isInteractive])\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Enter' && e.metaKey && isInteractive) {\n e.preventDefault()\n onSubmit?.()\n }\n }\n\n return (\n <textarea\n ref={inputRef}\n class=\"ph-tour-survey-textarea\"\n rows={3}\n placeholder=\"Your feedback (optional)...\"\n value={value}\n onInput={(e) => onChange((e.target as HTMLTextAreaElement).value)}\n onKeyDown={handleKeyDown}\n disabled={!isInteractive}\n style={isInteractive ? undefined : { cursor: 'default' }}\n />\n )\n}\n\nfunction RatingInput({\n survey,\n onSubmit,\n isInteractive,\n}: {\n survey: ProductTourSurveyQuestion\n onSubmit?: (rating: number) => void\n isInteractive: boolean\n}): h.JSX.Element {\n const [selectedRating, setSelectedRating] = useState<number | null>(null)\n const display = survey.display || 'emoji'\n const scale = survey.scale || 5\n\n const handleSelect = (rating: number) => {\n if (!isInteractive) {\n return\n }\n setSelectedRating(rating)\n // Auto-submit on selection for ratings\n onSubmit?.(rating)\n }\n\n if (display === 'emoji') {\n const emojis = scale === 3 ? threeScaleEmojis : fiveScaleEmojis\n return (\n <div class=\"ph-tour-survey-rating-container\">\n <div class=\"ph-tour-survey-rating-emoji\">\n {emojis.map((emoji, idx) => {\n const rating = idx + 1\n const isActive = selectedRating === rating\n return (\n <button\n key={idx}\n type=\"button\"\n class={`ph-tour-survey-emoji-button ${isActive ? 'ph-tour-survey-emoji-button--active' : ''}`}\n onClick={() => handleSelect(rating)}\n style={isInteractive ? undefined : { cursor: 'default' }}\n aria-label={`Rate ${rating}`}\n >\n {emoji}\n </button>\n )\n })}\n </div>\n {(survey.lowerBoundLabel || survey.upperBoundLabel) && (\n <div class=\"ph-tour-survey-rating-labels\">\n <span>{survey.lowerBoundLabel}</span>\n <span>{survey.upperBoundLabel}</span>\n </div>\n )}\n </div>\n )\n }\n\n // Number display\n const numbers = getScaleNumbers(scale)\n return (\n <div class=\"ph-tour-survey-rating-container\">\n <div\n class=\"ph-tour-survey-rating-numbers\"\n style={{ gridTemplateColumns: `repeat(${numbers.length}, minmax(0, 1fr))` }}\n >\n {numbers.map((num) => {\n const isActive = selectedRating === num\n return (\n <button\n key={num}\n type=\"button\"\n class={`ph-tour-survey-number-button ${isActive ? 'ph-tour-survey-number-button--active' : ''}`}\n onClick={() => handleSelect(num)}\n style={isInteractive ? undefined : { cursor: 'default' }}\n aria-label={`Rate ${num}`}\n >\n {num}\n </button>\n )\n })}\n </div>\n {(survey.lowerBoundLabel || survey.upperBoundLabel) && (\n <div class=\"ph-tour-survey-rating-labels\">\n <span>{survey.lowerBoundLabel}</span>\n <span>{survey.upperBoundLabel}</span>\n </div>\n )}\n </div>\n )\n}\n\nexport function ProductTourSurveyStepInner({\n step,\n appearance,\n stepIndex,\n totalSteps,\n onPrevious,\n onSubmit,\n onDismiss,\n}: ProductTourSurveyStepInnerProps): h.JSX.Element {\n const [textValue, setTextValue] = useState('')\n const survey = step.survey\n const whiteLabel = appearance?.whiteLabel ?? false\n const isFirstStep = stepIndex === 0\n const isOpenText = survey?.type === 'open'\n\n const isInteractive = !!(onPrevious || onSubmit || onDismiss)\n const cursorStyle = isInteractive ? undefined : { cursor: 'default' }\n\n const handleTextSubmit = () => {\n onSubmit?.(textValue.trim() || null)\n }\n\n if (!survey) {\n return <div />\n }\n\n return (\n <>\n <button class=\"ph-tour-dismiss\" onClick={onDismiss} aria-label=\"Close survey\" style={cursorStyle}>\n {cancelSVG()}\n </button>\n\n <div class=\"ph-tour-survey-question\">{survey.questionText}</div>\n\n {isOpenText ? (\n <OpenTextInput\n value={textValue}\n onChange={setTextValue}\n onSubmit={handleTextSubmit}\n isInteractive={isInteractive}\n />\n ) : (\n <RatingInput survey={survey} onSubmit={onSubmit} isInteractive={isInteractive} />\n )}\n\n <div class=\"ph-tour-footer\">\n <span class=\"ph-tour-progress\">\n {stepIndex + 1} of {totalSteps}\n </span>\n\n <div class=\"ph-tour-buttons\">\n {!isFirstStep && (\n <button\n class=\"ph-tour-button ph-tour-button--secondary\"\n onClick={onPrevious}\n style={cursorStyle}\n >\n {survey.backButtonText || 'Back'}\n </button>\n )}\n {isOpenText && (\n <button\n class=\"ph-tour-button ph-tour-button--primary\"\n onClick={handleTextSubmit}\n style={cursorStyle}\n >\n {survey.submitButtonText || 'Submit'}\n </button>\n )}\n </div>\n </div>\n\n {!whiteLabel && (\n <a\n href={isInteractive ? 'https://posthog.com/product-tours' : undefined}\n target={isInteractive ? '_blank' : undefined}\n rel={isInteractive ? 'noopener noreferrer' : undefined}\n class=\"ph-tour-branding\"\n style={isInteractive ? undefined : { cursor: 'default', pointerEvents: 'none' }}\n >\n Survey by {IconPosthogLogo}\n </a>\n )}\n </>\n )\n}\n"]}
@@ -37,5 +37,6 @@ export declare function getSpotlightStyle(targetRect: DOMRect, padding?: number)
37
37
  export declare function addProductTourCSSVariablesToElement(element: HTMLElement, appearance?: ProductTourAppearance): void;
38
38
  export declare function renderTipTapContent(content: any): string;
39
39
  export declare function normalizeUrl(url: string): string;
40
+ export declare function resolveStepTranslation(step: ProductTourStep, lang: string | null): ProductTourStep;
40
41
  export declare function getStepImageUrls(step: ProductTourStep): string[];
41
42
  export declare function getStepHtml(step: ProductTourStep): string;
@@ -36,6 +36,7 @@ exports.getSpotlightStyle = getSpotlightStyle;
36
36
  exports.addProductTourCSSVariablesToElement = addProductTourCSSVariablesToElement;
37
37
  exports.renderTipTapContent = renderTipTapContent;
38
38
  exports.normalizeUrl = normalizeUrl;
39
+ exports.resolveStepTranslation = resolveStepTranslation;
39
40
  exports.getStepImageUrls = getStepImageUrls;
40
41
  exports.getStepHtml = getStepHtml;
41
42
  var dompurify_1 = __importDefault(require("dompurify"));
@@ -44,7 +45,10 @@ var element_inference_1 = require("./element-inference");
44
45
  var stylesheet_loader_1 = require("../utils/stylesheet-loader");
45
46
  var globals_1 = require("../../utils/globals");
46
47
  var surveys_extension_utils_1 = require("../surveys/surveys-extension-utils");
48
+ var logger_1 = require("../../utils/logger");
47
49
  var product_tour_css_1 = __importDefault(require("./product-tour.css"));
50
+ var core_1 = require("@posthog/core");
51
+ var logger = (0, logger_1.createLogger)('[Product Tours]');
48
52
  var document = globals_1.document;
49
53
  var window = globals_1.window;
50
54
  function getProductTourStylesheet() {
@@ -261,6 +265,36 @@ function escapeHtml(text) {
261
265
  div.textContent = text;
262
266
  return div.innerHTML;
263
267
  }
268
+ function resolveStepTranslation(step, lang) {
269
+ var _a;
270
+ if (!lang || !step.translations) {
271
+ return step;
272
+ }
273
+ var translations = step.translations;
274
+ // exact match (en-US === en-US), then base match (en-US falls back to en)
275
+ var t = (_a = translations[lang]) !== null && _a !== void 0 ? _a : translations[lang.split('-')[0]];
276
+ if (!t) {
277
+ logger.info("No matching translation for \"".concat(lang, "\" in step ").concat(step.id, ", using default"));
278
+ return step;
279
+ }
280
+ var resolved = __assign({}, step);
281
+ if (!(0, core_1.isUndefined)(t.content)) {
282
+ resolved.content = t.content;
283
+ }
284
+ if (!(0, core_1.isUndefined)(t.contentHtml)) {
285
+ resolved.contentHtml = t.contentHtml;
286
+ }
287
+ if (t.buttons && resolved.buttons) {
288
+ resolved.buttons = {
289
+ primary: resolved.buttons.primary && __assign(__assign({}, resolved.buttons.primary), t.buttons.primary),
290
+ secondary: resolved.buttons.secondary && __assign(__assign({}, resolved.buttons.secondary), t.buttons.secondary),
291
+ };
292
+ }
293
+ if (t.survey && resolved.survey) {
294
+ resolved.survey = __assign(__assign({}, resolved.survey), t.survey);
295
+ }
296
+ return resolved;
297
+ }
264
298
  function getStepImageUrls(step) {
265
299
  var urls = [];
266
300
  function walk(node) {
@@ -1 +1 @@
1
- {"version":3,"file":"product-tours-utils.js","sourceRoot":"","sources":["../../../../src/extensions/product-tours/product-tours-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import DOMPurify from 'dompurify'\n\nimport {\n JSONContent,\n ProductTourAppearance,\n ProductTourSelectorError,\n ProductTourStep,\n DEFAULT_PRODUCT_TOUR_APPEARANCE,\n} from '../../posthog-product-tours-types'\nimport { findElement } from './element-inference'\nimport { prepareStylesheet } from '../utils/stylesheet-loader'\nimport { document as _document, window as _window } from '../../utils/globals'\nimport { getFontFamily, getContrastingTextColor, hexToRgba } from '../surveys/surveys-extension-utils'\n\nimport productTourStyles from './product-tour.css'\n\nconst document = _document as Document\nconst window = _window as Window & typeof globalThis\n\nexport function getProductTourStylesheet(): HTMLStyleElement | null {\n const stylesheet = prepareStylesheet(document, typeof productTourStyles === 'string' ? productTourStyles : '')\n stylesheet?.setAttribute('data-ph-product-tour-style', 'true')\n return stylesheet\n}\n\nexport interface ElementFindResult {\n element: HTMLElement | null\n error: ProductTourSelectorError | null\n matchCount: number\n}\n\nexport function hasElementTarget(step: ProductTourStep): boolean {\n if (step.useManualSelector) {\n return !!step.selector\n }\n return !!step.inferenceData\n}\n\nexport function findElementBySelector(selector: string): ElementFindResult {\n try {\n const elements = document.querySelectorAll(selector)\n\n if (elements.length === 0) {\n return { element: null, error: 'not_found', matchCount: 0 }\n }\n\n const element = elements[0] as HTMLElement\n\n if (!isElementVisible(element)) {\n return { element: null, error: 'not_visible', matchCount: elements.length }\n }\n\n if (elements.length > 1) {\n return { element, error: 'multiple_matches', matchCount: elements.length }\n }\n\n return { element, error: null, matchCount: 1 }\n } catch {\n return { element: null, error: 'not_found', matchCount: 0 }\n }\n}\n\n/**\n * Find element for a step based on its lookup mode.\n * Default: use inference. If useManualSelector is true: use CSS selector.\n */\nexport function findStepElement(step: ProductTourStep): ElementFindResult {\n const useManualSelector = step.useManualSelector ?? false\n\n if (useManualSelector) {\n if (!step.selector) {\n return { element: null, error: 'not_found', matchCount: 0 }\n }\n return findElementBySelector(step.selector)\n }\n\n if (!step.inferenceData) {\n return { element: null, error: 'not_found', matchCount: 0 }\n }\n\n const element = findElement(step.inferenceData)\n return element ? { element, error: null, matchCount: 1 } : { element: null, error: 'not_found', matchCount: 0 }\n}\n\nexport function isElementVisible(element: HTMLElement): boolean {\n const style = window.getComputedStyle(element)\n\n if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') {\n return false\n }\n\n const rect = element.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) {\n return false\n }\n\n return true\n}\n\nexport function getElementMetadata(element: HTMLElement): {\n tag: string\n id: string | undefined\n classes: string | undefined\n text: string | undefined\n} {\n return {\n tag: element.tagName,\n id: element.id || undefined,\n classes: element.className || undefined,\n text: element.innerText?.slice(0, 100) || undefined,\n }\n}\n\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right'\n\nexport interface PositionResult {\n position: TooltipPosition\n top?: number\n bottom?: number\n left?: number\n right?: number\n arrowOffset: number // pixels from center (positive = right/down)\n}\n\nconst TOOLTIP_MARGIN = 12\nconst VIEWPORT_PADDING = 8\n\nfunction clampToViewport(\n value: number,\n dimension: number,\n viewportDimension: number\n): { clamped: number; offset: number } {\n const min = VIEWPORT_PADDING + dimension / 2\n const max = viewportDimension - VIEWPORT_PADDING - dimension / 2\n const clamped = Math.max(min, Math.min(max, value))\n return { clamped, offset: value - clamped }\n}\n\nexport interface TooltipDimensions {\n width: number\n height: number\n}\n\nexport function calculateTooltipPosition(targetRect: DOMRect, tooltipDimensions: TooltipDimensions): PositionResult {\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n const { width, height } = tooltipDimensions\n const spaceAbove = targetRect.top\n const spaceBelow = viewportHeight - targetRect.bottom\n const spaceLeft = targetRect.left\n const spaceRight = viewportWidth - targetRect.right\n\n const targetCenterY = targetRect.top + targetRect.height / 2\n const targetCenterX = targetRect.left + targetRect.width / 2\n\n if (spaceRight >= width + TOOLTIP_MARGIN) {\n // right of element\n const left = targetRect.right + TOOLTIP_MARGIN\n const { clamped: top, offset: arrowOffset } = clampToViewport(targetCenterY, height, viewportHeight)\n return { position: 'right', top, left, arrowOffset }\n }\n if (spaceLeft >= width + TOOLTIP_MARGIN) {\n // left of element\n const right = viewportWidth - targetRect.left + TOOLTIP_MARGIN\n const { clamped: top, offset: arrowOffset } = clampToViewport(targetCenterY, height, viewportHeight)\n return { position: 'left', top, right, arrowOffset }\n }\n if (spaceAbove >= height + TOOLTIP_MARGIN && spaceBelow < height + TOOLTIP_MARGIN) {\n // above element\n const bottom = viewportHeight - targetRect.top + TOOLTIP_MARGIN\n const { clamped: left, offset: arrowOffset } = clampToViewport(targetCenterX, width, viewportWidth)\n return { position: 'top', bottom, left, arrowOffset }\n }\n\n // default: below element\n const top = targetRect.bottom + TOOLTIP_MARGIN\n const { clamped: left, offset: arrowOffset } = clampToViewport(targetCenterX, width, viewportWidth)\n return { position: 'bottom', top, left, arrowOffset }\n}\n\nexport function getSpotlightStyle(targetRect: DOMRect, padding: number = 8): Record<string, string> {\n return {\n top: `${targetRect.top - padding}px`,\n left: `${targetRect.left - padding}px`,\n width: `${targetRect.width + padding * 2}px`,\n height: `${targetRect.height + padding * 2}px`,\n }\n}\n\nexport function addProductTourCSSVariablesToElement(element: HTMLElement, appearance?: ProductTourAppearance): void {\n const merged = { ...DEFAULT_PRODUCT_TOUR_APPEARANCE, ...appearance }\n const style = element.style\n\n // User-customizable variables\n style.setProperty('--ph-tour-background-color', merged.backgroundColor)\n style.setProperty('--ph-tour-text-color', merged.textColor)\n style.setProperty('--ph-tour-button-color', merged.buttonColor)\n style.setProperty('--ph-tour-border-radius', `${merged.borderRadius}px`)\n style.setProperty('--ph-tour-button-border-radius', `${merged.buttonBorderRadius}px`)\n style.setProperty('--ph-tour-border-color', merged.borderColor)\n style.setProperty('--ph-tour-font-family', getFontFamily(merged.fontFamily))\n\n // Derived colors\n style.setProperty('--ph-tour-text-secondary-color', hexToRgba(merged.textColor, 0.6))\n style.setProperty('--ph-tour-branding-text-color', getContrastingTextColor(merged.backgroundColor))\n style.setProperty('--ph-tour-button-text-color', getContrastingTextColor(merged.buttonColor))\n style.setProperty('--ph-tour-box-shadow', merged.boxShadow)\n style.setProperty('--ph-tour-overlay-color', merged.showOverlay ? 'rgba(0, 0, 0, 0.5)' : 'transparent')\n style.setProperty('--ph-tour-z-index', String(merged.zIndex))\n\n // Internal styling variables (not customizable)\n style.setProperty('--ph-tour-button-secondary-color', 'transparent')\n style.setProperty('--ph-tour-button-secondary-text-color', merged.textColor)\n style.setProperty('--ph-tour-max-width', '320px')\n style.setProperty('--ph-tour-padding', '16px')\n}\n\nexport function renderTipTapContent(content: any): string {\n if (!content) {\n return ''\n }\n\n if (typeof content === 'string') {\n return escapeHtml(content)\n }\n\n if (content.type === 'text') {\n let text = escapeHtml(content.text || '')\n\n if (content.marks) {\n for (const mark of content.marks) {\n switch (mark.type) {\n case 'bold':\n text = `<strong>${text}</strong>`\n break\n case 'italic':\n text = `<em>${text}</em>`\n break\n case 'underline':\n text = `<u>${text}</u>`\n break\n case 'strike':\n text = `<s>${text}</s>`\n break\n }\n }\n }\n\n return text\n }\n\n const children = content.content?.map(renderTipTapContent).join('') || ''\n\n switch (content.type) {\n case 'doc':\n return children\n case 'paragraph':\n return `<p>${children}</p>`\n case 'heading': {\n const level = content.attrs?.level || 1\n return `<h${level}>${children}</h${level}>`\n }\n case 'bulletList':\n return `<ul>${children}</ul>`\n case 'orderedList':\n return `<ol>${children}</ol>`\n case 'listItem':\n return `<li>${children}</li>`\n case 'hardBreak':\n return '<br>'\n default:\n return children\n }\n}\n\nexport function normalizeUrl(url: string): string {\n return url.endsWith('/') ? url.slice(0, -1) : url\n}\n\nfunction escapeHtml(text: string): string {\n const div = document.createElement('div')\n div.textContent = text\n return div.innerHTML\n}\n\nexport function getStepImageUrls(step: ProductTourStep): string[] {\n const urls: string[] = []\n function walk(node: JSONContent) {\n if (node.type === 'image' && node.attrs?.src) {\n urls.push(node.attrs.src)\n }\n node.content?.forEach(walk)\n }\n if (step.content) {\n walk(step.content)\n }\n return urls\n}\n\nexport function getStepHtml(step: ProductTourStep): string {\n if (step.contentHtml) {\n return DOMPurify.sanitize(step.contentHtml, {\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['allowfullscreen', 'frameborder', 'referrerpolicy'],\n })\n }\n\n // backwards compat, will be deprecated\n return renderTipTapContent(step.content)\n}\n"]}
1
+ {"version":3,"file":"product-tours-utils.js","sourceRoot":"","sources":["../../../../src/extensions/product-tours/product-tours-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import DOMPurify from 'dompurify'\n\nimport {\n JSONContent,\n ProductTourAppearance,\n ProductTourSelectorError,\n ProductTourStep,\n DEFAULT_PRODUCT_TOUR_APPEARANCE,\n} from '../../posthog-product-tours-types'\nimport { findElement } from './element-inference'\nimport { prepareStylesheet } from '../utils/stylesheet-loader'\nimport { document as _document, window as _window } from '../../utils/globals'\nimport { getFontFamily, getContrastingTextColor, hexToRgba } from '../surveys/surveys-extension-utils'\nimport { createLogger } from '../../utils/logger'\n\nimport productTourStyles from './product-tour.css'\nimport { isUndefined } from '@posthog/core'\n\nconst logger = createLogger('[Product Tours]')\n\nconst document = _document as Document\nconst window = _window as Window & typeof globalThis\n\nexport function getProductTourStylesheet(): HTMLStyleElement | null {\n const stylesheet = prepareStylesheet(document, typeof productTourStyles === 'string' ? productTourStyles : '')\n stylesheet?.setAttribute('data-ph-product-tour-style', 'true')\n return stylesheet\n}\n\nexport interface ElementFindResult {\n element: HTMLElement | null\n error: ProductTourSelectorError | null\n matchCount: number\n}\n\nexport function hasElementTarget(step: ProductTourStep): boolean {\n if (step.useManualSelector) {\n return !!step.selector\n }\n return !!step.inferenceData\n}\n\nexport function findElementBySelector(selector: string): ElementFindResult {\n try {\n const elements = document.querySelectorAll(selector)\n\n if (elements.length === 0) {\n return { element: null, error: 'not_found', matchCount: 0 }\n }\n\n const element = elements[0] as HTMLElement\n\n if (!isElementVisible(element)) {\n return { element: null, error: 'not_visible', matchCount: elements.length }\n }\n\n if (elements.length > 1) {\n return { element, error: 'multiple_matches', matchCount: elements.length }\n }\n\n return { element, error: null, matchCount: 1 }\n } catch {\n return { element: null, error: 'not_found', matchCount: 0 }\n }\n}\n\n/**\n * Find element for a step based on its lookup mode.\n * Default: use inference. If useManualSelector is true: use CSS selector.\n */\nexport function findStepElement(step: ProductTourStep): ElementFindResult {\n const useManualSelector = step.useManualSelector ?? false\n\n if (useManualSelector) {\n if (!step.selector) {\n return { element: null, error: 'not_found', matchCount: 0 }\n }\n return findElementBySelector(step.selector)\n }\n\n if (!step.inferenceData) {\n return { element: null, error: 'not_found', matchCount: 0 }\n }\n\n const element = findElement(step.inferenceData)\n return element ? { element, error: null, matchCount: 1 } : { element: null, error: 'not_found', matchCount: 0 }\n}\n\nexport function isElementVisible(element: HTMLElement): boolean {\n const style = window.getComputedStyle(element)\n\n if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') {\n return false\n }\n\n const rect = element.getBoundingClientRect()\n if (rect.width === 0 || rect.height === 0) {\n return false\n }\n\n return true\n}\n\nexport function getElementMetadata(element: HTMLElement): {\n tag: string\n id: string | undefined\n classes: string | undefined\n text: string | undefined\n} {\n return {\n tag: element.tagName,\n id: element.id || undefined,\n classes: element.className || undefined,\n text: element.innerText?.slice(0, 100) || undefined,\n }\n}\n\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right'\n\nexport interface PositionResult {\n position: TooltipPosition\n top?: number\n bottom?: number\n left?: number\n right?: number\n arrowOffset: number // pixels from center (positive = right/down)\n}\n\nconst TOOLTIP_MARGIN = 12\nconst VIEWPORT_PADDING = 8\n\nfunction clampToViewport(\n value: number,\n dimension: number,\n viewportDimension: number\n): { clamped: number; offset: number } {\n const min = VIEWPORT_PADDING + dimension / 2\n const max = viewportDimension - VIEWPORT_PADDING - dimension / 2\n const clamped = Math.max(min, Math.min(max, value))\n return { clamped, offset: value - clamped }\n}\n\nexport interface TooltipDimensions {\n width: number\n height: number\n}\n\nexport function calculateTooltipPosition(targetRect: DOMRect, tooltipDimensions: TooltipDimensions): PositionResult {\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n const { width, height } = tooltipDimensions\n const spaceAbove = targetRect.top\n const spaceBelow = viewportHeight - targetRect.bottom\n const spaceLeft = targetRect.left\n const spaceRight = viewportWidth - targetRect.right\n\n const targetCenterY = targetRect.top + targetRect.height / 2\n const targetCenterX = targetRect.left + targetRect.width / 2\n\n if (spaceRight >= width + TOOLTIP_MARGIN) {\n // right of element\n const left = targetRect.right + TOOLTIP_MARGIN\n const { clamped: top, offset: arrowOffset } = clampToViewport(targetCenterY, height, viewportHeight)\n return { position: 'right', top, left, arrowOffset }\n }\n if (spaceLeft >= width + TOOLTIP_MARGIN) {\n // left of element\n const right = viewportWidth - targetRect.left + TOOLTIP_MARGIN\n const { clamped: top, offset: arrowOffset } = clampToViewport(targetCenterY, height, viewportHeight)\n return { position: 'left', top, right, arrowOffset }\n }\n if (spaceAbove >= height + TOOLTIP_MARGIN && spaceBelow < height + TOOLTIP_MARGIN) {\n // above element\n const bottom = viewportHeight - targetRect.top + TOOLTIP_MARGIN\n const { clamped: left, offset: arrowOffset } = clampToViewport(targetCenterX, width, viewportWidth)\n return { position: 'top', bottom, left, arrowOffset }\n }\n\n // default: below element\n const top = targetRect.bottom + TOOLTIP_MARGIN\n const { clamped: left, offset: arrowOffset } = clampToViewport(targetCenterX, width, viewportWidth)\n return { position: 'bottom', top, left, arrowOffset }\n}\n\nexport function getSpotlightStyle(targetRect: DOMRect, padding: number = 8): Record<string, string> {\n return {\n top: `${targetRect.top - padding}px`,\n left: `${targetRect.left - padding}px`,\n width: `${targetRect.width + padding * 2}px`,\n height: `${targetRect.height + padding * 2}px`,\n }\n}\n\nexport function addProductTourCSSVariablesToElement(element: HTMLElement, appearance?: ProductTourAppearance): void {\n const merged = { ...DEFAULT_PRODUCT_TOUR_APPEARANCE, ...appearance }\n const style = element.style\n\n // User-customizable variables\n style.setProperty('--ph-tour-background-color', merged.backgroundColor)\n style.setProperty('--ph-tour-text-color', merged.textColor)\n style.setProperty('--ph-tour-button-color', merged.buttonColor)\n style.setProperty('--ph-tour-border-radius', `${merged.borderRadius}px`)\n style.setProperty('--ph-tour-button-border-radius', `${merged.buttonBorderRadius}px`)\n style.setProperty('--ph-tour-border-color', merged.borderColor)\n style.setProperty('--ph-tour-font-family', getFontFamily(merged.fontFamily))\n\n // Derived colors\n style.setProperty('--ph-tour-text-secondary-color', hexToRgba(merged.textColor, 0.6))\n style.setProperty('--ph-tour-branding-text-color', getContrastingTextColor(merged.backgroundColor))\n style.setProperty('--ph-tour-button-text-color', getContrastingTextColor(merged.buttonColor))\n style.setProperty('--ph-tour-box-shadow', merged.boxShadow)\n style.setProperty('--ph-tour-overlay-color', merged.showOverlay ? 'rgba(0, 0, 0, 0.5)' : 'transparent')\n style.setProperty('--ph-tour-z-index', String(merged.zIndex))\n\n // Internal styling variables (not customizable)\n style.setProperty('--ph-tour-button-secondary-color', 'transparent')\n style.setProperty('--ph-tour-button-secondary-text-color', merged.textColor)\n style.setProperty('--ph-tour-max-width', '320px')\n style.setProperty('--ph-tour-padding', '16px')\n}\n\nexport function renderTipTapContent(content: any): string {\n if (!content) {\n return ''\n }\n\n if (typeof content === 'string') {\n return escapeHtml(content)\n }\n\n if (content.type === 'text') {\n let text = escapeHtml(content.text || '')\n\n if (content.marks) {\n for (const mark of content.marks) {\n switch (mark.type) {\n case 'bold':\n text = `<strong>${text}</strong>`\n break\n case 'italic':\n text = `<em>${text}</em>`\n break\n case 'underline':\n text = `<u>${text}</u>`\n break\n case 'strike':\n text = `<s>${text}</s>`\n break\n }\n }\n }\n\n return text\n }\n\n const children = content.content?.map(renderTipTapContent).join('') || ''\n\n switch (content.type) {\n case 'doc':\n return children\n case 'paragraph':\n return `<p>${children}</p>`\n case 'heading': {\n const level = content.attrs?.level || 1\n return `<h${level}>${children}</h${level}>`\n }\n case 'bulletList':\n return `<ul>${children}</ul>`\n case 'orderedList':\n return `<ol>${children}</ol>`\n case 'listItem':\n return `<li>${children}</li>`\n case 'hardBreak':\n return '<br>'\n default:\n return children\n }\n}\n\nexport function normalizeUrl(url: string): string {\n return url.endsWith('/') ? url.slice(0, -1) : url\n}\n\nfunction escapeHtml(text: string): string {\n const div = document.createElement('div')\n div.textContent = text\n return div.innerHTML\n}\n\nexport function resolveStepTranslation(step: ProductTourStep, lang: string | null): ProductTourStep {\n if (!lang || !step.translations) {\n return step\n }\n\n const translations = step.translations\n\n // exact match (en-US === en-US), then base match (en-US falls back to en)\n const t = translations[lang] ?? translations[lang.split('-')[0]]\n\n if (!t) {\n logger.info(`No matching translation for \"${lang}\" in step ${step.id}, using default`)\n return step\n }\n\n const resolved = { ...step }\n\n if (!isUndefined(t.content)) {\n resolved.content = t.content\n }\n\n if (!isUndefined(t.contentHtml)) {\n resolved.contentHtml = t.contentHtml\n }\n\n if (t.buttons && resolved.buttons) {\n resolved.buttons = {\n primary: resolved.buttons.primary && { ...resolved.buttons.primary, ...t.buttons.primary },\n secondary: resolved.buttons.secondary && { ...resolved.buttons.secondary, ...t.buttons.secondary },\n }\n }\n\n if (t.survey && resolved.survey) {\n resolved.survey = { ...resolved.survey, ...t.survey }\n }\n\n return resolved\n}\n\nexport function getStepImageUrls(step: ProductTourStep): string[] {\n const urls: string[] = []\n function walk(node: JSONContent) {\n if (node.type === 'image' && node.attrs?.src) {\n urls.push(node.attrs.src)\n }\n node.content?.forEach(walk)\n }\n if (step.content) {\n walk(step.content)\n }\n return urls\n}\n\nexport function getStepHtml(step: ProductTourStep): string {\n if (step.contentHtml) {\n return DOMPurify.sanitize(step.contentHtml, {\n ADD_TAGS: ['iframe'],\n ADD_ATTR: ['allowfullscreen', 'frameborder', 'referrerpolicy'],\n })\n }\n\n // backwards compat, will be deprecated\n return renderTipTapContent(step.content)\n}\n"]}
@@ -14,6 +14,7 @@ export declare class ProductTourManager {
14
14
  private _preloadedImageUrls;
15
15
  constructor(instance: PostHog);
16
16
  private _preloadTourImages;
17
+ private _getCurrentStep;
17
18
  private _setStepIndex;
18
19
  private _saveSessionState;
19
20
  private _clearSessionState;
@@ -44,6 +45,8 @@ export declare class ProductTourManager {
44
45
  private _removeTriggerSelectorListener;
45
46
  private _removeAllTriggerListeners;
46
47
  private _captureEvent;
48
+ private _captureStepShown;
49
+ private _captureStepSelectorFailed;
47
50
  getActiveProductTours(callback: ProductTourCallback): void;
48
51
  resetTour(tourId: string): void;
49
52
  resetAllTours(): void;