@perspective-ai/sdk 1.0.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  // src/constants.ts
4
- var SDK_VERSION = "1.0.0";
4
+ var SDK_VERSION = "1.1.2";
5
5
  var FEATURES = {
6
6
  RESIZE: 1 << 0,
7
7
  // 0b0001
@@ -30,26 +30,9 @@ var BRAND_KEYS = {
30
30
  darkBg: "brand.dark.bg",
31
31
  darkText: "brand.dark.text"
32
32
  };
33
- var UTM_PARAMS = [
34
- "utm_source",
35
- "utm_medium",
36
- "utm_campaign",
37
- "utm_term",
38
- "utm_content"
39
- ];
40
33
  var RESERVED_PARAMS = /* @__PURE__ */ new Set([
41
- PARAM_KEYS.embed,
42
- PARAM_KEYS.embedType,
43
- PARAM_KEYS.theme,
44
- BRAND_KEYS.primary,
45
- BRAND_KEYS.secondary,
46
- BRAND_KEYS.bg,
47
- BRAND_KEYS.text,
48
- BRAND_KEYS.darkPrimary,
49
- BRAND_KEYS.darkSecondary,
50
- BRAND_KEYS.darkBg,
51
- BRAND_KEYS.darkText,
52
- ...UTM_PARAMS
34
+ ...Object.values(PARAM_KEYS),
35
+ ...Object.values(BRAND_KEYS)
53
36
  ]);
54
37
  var DATA_ATTRS = {
55
38
  widget: "data-perspective-widget",
@@ -64,7 +47,9 @@ var DATA_ATTRS = {
64
47
  brand: "data-perspective-brand",
65
48
  brandDark: "data-perspective-brand-dark",
66
49
  theme: "data-perspective-theme",
67
- noStyle: "data-perspective-no-style"
50
+ noStyle: "data-perspective-no-style",
51
+ autoOpen: "data-perspective-auto-open",
52
+ showOnce: "data-perspective-show-once"
68
53
  };
69
54
  var MESSAGE_TYPES = {
70
55
  // SDK -> Iframe (initialization)
@@ -104,7 +89,8 @@ var MODE_VALUES = {
104
89
  simulated: "simulated"
105
90
  };
106
91
  var STORAGE_KEYS = {
107
- anonId: "perspective-anon-id"
92
+ anonId: "perspective-anon-id",
93
+ triggerShown: "perspective-trigger-shown"
108
94
  };
109
95
 
110
96
  exports.BRAND_KEYS = BRAND_KEYS;
@@ -120,6 +106,5 @@ exports.RESERVED_PARAMS = RESERVED_PARAMS;
120
106
  exports.SDK_VERSION = SDK_VERSION;
121
107
  exports.STORAGE_KEYS = STORAGE_KEYS;
122
108
  exports.THEME_VALUES = THEME_VALUES;
123
- exports.UTM_PARAMS = UTM_PARAMS;
124
109
  //# sourceMappingURL=constants.cjs.map
125
110
  //# sourceMappingURL=constants.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":"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","file":"constants.cjs","sourcesContent":["/**\n * Shared constants for Perspective Embed SDK\n * This file is SSR-safe - no DOM access at import time\n * Used by both SDK bundle and the main Perspective app\n */\n\n// ============================================================================\n// SDK Version & Features\n// ============================================================================\n\n/** SDK version for handshake protocol */\nexport const SDK_VERSION = \"1.0.0\";\n\n/** Feature flags as bitset for version negotiation */\nexport const FEATURES = {\n RESIZE: 1 << 0, // 0b0001\n THEME_SYNC: 1 << 1, // 0b0010\n ANON_ID: 1 << 2, // 0b0100\n SCROLLBAR_STYLES: 1 << 3, // 0b1000\n} as const;\n\n/** Current SDK feature set */\nexport const CURRENT_FEATURES =\n FEATURES.RESIZE |\n FEATURES.THEME_SYNC |\n FEATURES.ANON_ID |\n FEATURES.SCROLLBAR_STYLES;\n\n// ============================================================================\n// URL Parameter Keys\n// ============================================================================\n\n// Embed parameters\nexport const PARAM_KEYS = {\n embed: \"embed\",\n embedType: \"embed_type\",\n theme: \"theme\",\n} as const;\n\nexport type ParamKey = (typeof PARAM_KEYS)[keyof typeof PARAM_KEYS];\n\n// ============================================================================\n// Brand Color Keys\n// ============================================================================\n\nexport const BRAND_KEYS = {\n // Light mode\n primary: \"brand.primary\",\n secondary: \"brand.secondary\",\n bg: \"brand.bg\",\n text: \"brand.text\",\n\n // Dark mode\n darkPrimary: \"brand.dark.primary\",\n darkSecondary: \"brand.dark.secondary\",\n darkBg: \"brand.dark.bg\",\n darkText: \"brand.dark.text\",\n} as const;\n\nexport type BrandKey = (typeof BRAND_KEYS)[keyof typeof BRAND_KEYS];\n\n// ============================================================================\n// UTM Parameters (auto-forwarded from parent URL)\n// ============================================================================\n\nexport const UTM_PARAMS = [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n] as const;\n\nexport type UtmParam = (typeof UTM_PARAMS)[number];\n\n// ============================================================================\n// Reserved Parameters (cannot be overridden via custom params)\n// ============================================================================\n\nexport const RESERVED_PARAMS: Set<string> = new Set([\n PARAM_KEYS.embed,\n PARAM_KEYS.embedType,\n PARAM_KEYS.theme,\n BRAND_KEYS.primary,\n BRAND_KEYS.secondary,\n BRAND_KEYS.bg,\n BRAND_KEYS.text,\n BRAND_KEYS.darkPrimary,\n BRAND_KEYS.darkSecondary,\n BRAND_KEYS.darkBg,\n BRAND_KEYS.darkText,\n ...UTM_PARAMS,\n]);\n\n// ============================================================================\n// Data Attributes (HTML declarative initialization)\n// ============================================================================\n\nexport const DATA_ATTRS = {\n widget: \"data-perspective-widget\",\n popup: \"data-perspective-popup\",\n slider: \"data-perspective-slider\",\n float: \"data-perspective-float\", // Primary name\n chat: \"data-perspective-chat\", // Legacy alias\n fullpage: \"data-perspective-fullpage\",\n params: \"data-perspective-params\",\n brand: \"data-perspective-brand\",\n brandDark: \"data-perspective-brand-dark\",\n theme: \"data-perspective-theme\",\n noStyle: \"data-perspective-no-style\",\n} as const;\n\nexport type DataAttr = (typeof DATA_ATTRS)[keyof typeof DATA_ATTRS];\n\n// ============================================================================\n// PostMessage Event Types\n// ============================================================================\n\nexport const MESSAGE_TYPES = {\n // SDK -> Iframe (initialization)\n init: \"perspective:init\",\n\n // Iframe -> SDK\n ready: \"perspective:ready\",\n resize: \"perspective:resize\",\n submit: \"perspective:submit\",\n close: \"perspective:close\",\n error: \"perspective:error\",\n redirect: \"perspective:redirect\",\n\n // SDK -> Iframe (internal)\n anonId: \"perspective:anon-id\",\n injectStyles: \"perspective:inject-styles\",\n themeChange: \"perspective:theme-change\",\n\n // Iframe -> SDK (internal)\n requestScrollbarStyles: \"perspective:request-scrollbar-styles\",\n} as const;\n\nexport type MessageType = (typeof MESSAGE_TYPES)[keyof typeof MESSAGE_TYPES];\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\nexport const ERROR_CODES = {\n SDK_OUTDATED: \"SDK_OUTDATED\",\n INVALID_RESEARCH: \"INVALID_RESEARCH\",\n UNKNOWN: \"UNKNOWN\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n// ============================================================================\n// Param Values (for boolean-like string params)\n// ============================================================================\n\nexport const PARAM_VALUES = {\n true: \"true\",\n false: \"false\",\n} as const;\n\n// ============================================================================\n// Theme Values\n// ============================================================================\n\nexport const THEME_VALUES = {\n dark: \"dark\",\n light: \"light\",\n system: \"system\",\n} as const;\n\nexport type ThemeValue = (typeof THEME_VALUES)[keyof typeof THEME_VALUES];\n\n// ============================================================================\n// Interview Mode Values (for mode param)\n// ============================================================================\n\nexport const MODE_VALUES = {\n preview: \"preview\",\n restart: \"restart\",\n normal: \"normal\",\n simulated: \"simulated\",\n} as const;\n\nexport type ModeValue = (typeof MODE_VALUES)[keyof typeof MODE_VALUES];\n\n// ============================================================================\n// localStorage Keys\n// ============================================================================\n\nexport const STORAGE_KEYS = {\n anonId: \"perspective-anon-id\",\n} as const;\n"]}
1
+ {"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":";;;AAWO,IAAM,WAAA,GAAc;AAGpB,IAAM,QAAA,GAAW;AAAA,EACtB,QAAQ,CAAA,IAAK,CAAA;AAAA;AAAA,EACb,YAAY,CAAA,IAAK,CAAA;AAAA;AAAA,EACjB,SAAS,CAAA,IAAK,CAAA;AAAA;AAAA,EACd,kBAAkB,CAAA,IAAK;AAAA;AACzB;AAGO,IAAM,mBACX,QAAA,CAAS,MAAA,GACT,SAAS,UAAA,GACT,QAAA,CAAS,UACT,QAAA,CAAS;AAOJ,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO;AACT;AAQO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,OAAA,EAAS,eAAA;AAAA,EACT,SAAA,EAAW,iBAAA;AAAA,EACX,EAAA,EAAI,UAAA;AAAA,EACJ,IAAA,EAAM,YAAA;AAAA;AAAA,EAGN,WAAA,EAAa,oBAAA;AAAA,EACb,aAAA,EAAe,sBAAA;AAAA,EACf,MAAA,EAAQ,eAAA;AAAA,EACR,QAAA,EAAU;AACZ;AAQO,IAAM,eAAA,uBAAmC,GAAA,CAAI;AAAA,EAClD,GAAG,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAAA,EAC3B,GAAG,MAAA,CAAO,MAAA,CAAO,UAAU;AAC7B,CAAC;AAMM,IAAM,UAAA,GAAa;AAAA,EACxB,MAAA,EAAQ,yBAAA;AAAA,EACR,KAAA,EAAO,wBAAA;AAAA,EACP,MAAA,EAAQ,yBAAA;AAAA,EACR,KAAA,EAAO,wBAAA;AAAA;AAAA,EACP,IAAA,EAAM,uBAAA;AAAA;AAAA,EACN,QAAA,EAAU,2BAAA;AAAA,EACV,MAAA,EAAQ,yBAAA;AAAA,EACR,KAAA,EAAO,wBAAA;AAAA,EACP,SAAA,EAAW,6BAAA;AAAA,EACX,KAAA,EAAO,wBAAA;AAAA,EACP,OAAA,EAAS,2BAAA;AAAA,EACT,QAAA,EAAU,4BAAA;AAAA,EACV,QAAA,EAAU;AACZ;AAQO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,IAAA,EAAM,kBAAA;AAAA;AAAA,EAGN,KAAA,EAAO,mBAAA;AAAA,EACP,MAAA,EAAQ,oBAAA;AAAA,EACR,MAAA,EAAQ,oBAAA;AAAA,EACR,KAAA,EAAO,mBAAA;AAAA,EACP,KAAA,EAAO,mBAAA;AAAA,EACP,QAAA,EAAU,sBAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,qBAAA;AAAA,EACR,YAAA,EAAc,2BAAA;AAAA,EACd,WAAA,EAAa,0BAAA;AAAA;AAAA,EAGb,sBAAA,EAAwB;AAC1B;AAQO,IAAM,WAAA,GAAc;AAAA,EACzB,YAAA,EAAc,cAAA;AAAA,EACd,gBAAA,EAAkB,kBAAA;AAAA,EAClB,OAAA,EAAS;AACX;AAQO,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT;AAMO,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV;AAQO,IAAM,WAAA,GAAc;AAAA,EACzB,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW;AACb;AAQO,IAAM,YAAA,GAAe;AAAA,EAC1B,MAAA,EAAQ,qBAAA;AAAA,EACR,YAAA,EAAc;AAChB","file":"constants.cjs","sourcesContent":["/**\n * Shared constants for Perspective Embed SDK\n * This file is SSR-safe - no DOM access at import time\n * Used by both SDK bundle and the main Perspective app\n */\n\n// ============================================================================\n// SDK Version & Features\n// ============================================================================\n\n/** SDK version for handshake protocol */\nexport const SDK_VERSION = \"1.1.2\";\n\n/** Feature flags as bitset for version negotiation */\nexport const FEATURES = {\n RESIZE: 1 << 0, // 0b0001\n THEME_SYNC: 1 << 1, // 0b0010\n ANON_ID: 1 << 2, // 0b0100\n SCROLLBAR_STYLES: 1 << 3, // 0b1000\n} as const;\n\n/** Current SDK feature set */\nexport const CURRENT_FEATURES =\n FEATURES.RESIZE |\n FEATURES.THEME_SYNC |\n FEATURES.ANON_ID |\n FEATURES.SCROLLBAR_STYLES;\n\n// ============================================================================\n// URL Parameter Keys\n// ============================================================================\n\n// Embed parameters\nexport const PARAM_KEYS = {\n embed: \"embed\",\n embedType: \"embed_type\",\n theme: \"theme\",\n} as const;\n\nexport type ParamKey = (typeof PARAM_KEYS)[keyof typeof PARAM_KEYS];\n\n// ============================================================================\n// Brand Color Keys\n// ============================================================================\n\nexport const BRAND_KEYS = {\n // Light mode\n primary: \"brand.primary\",\n secondary: \"brand.secondary\",\n bg: \"brand.bg\",\n text: \"brand.text\",\n\n // Dark mode\n darkPrimary: \"brand.dark.primary\",\n darkSecondary: \"brand.dark.secondary\",\n darkBg: \"brand.dark.bg\",\n darkText: \"brand.dark.text\",\n} as const;\n\nexport type BrandKey = (typeof BRAND_KEYS)[keyof typeof BRAND_KEYS];\n\n// ============================================================================\n// Reserved Parameters (cannot be overridden via custom params or parent URL)\n// ============================================================================\n\nexport const RESERVED_PARAMS: Set<string> = new Set([\n ...Object.values(PARAM_KEYS),\n ...Object.values(BRAND_KEYS),\n]);\n\n// ============================================================================\n// Data Attributes (HTML declarative initialization)\n// ============================================================================\n\nexport const DATA_ATTRS = {\n widget: \"data-perspective-widget\",\n popup: \"data-perspective-popup\",\n slider: \"data-perspective-slider\",\n float: \"data-perspective-float\", // Primary name\n chat: \"data-perspective-chat\", // Legacy alias\n fullpage: \"data-perspective-fullpage\",\n params: \"data-perspective-params\",\n brand: \"data-perspective-brand\",\n brandDark: \"data-perspective-brand-dark\",\n theme: \"data-perspective-theme\",\n noStyle: \"data-perspective-no-style\",\n autoOpen: \"data-perspective-auto-open\",\n showOnce: \"data-perspective-show-once\",\n} as const;\n\nexport type DataAttr = (typeof DATA_ATTRS)[keyof typeof DATA_ATTRS];\n\n// ============================================================================\n// PostMessage Event Types\n// ============================================================================\n\nexport const MESSAGE_TYPES = {\n // SDK -> Iframe (initialization)\n init: \"perspective:init\",\n\n // Iframe -> SDK\n ready: \"perspective:ready\",\n resize: \"perspective:resize\",\n submit: \"perspective:submit\",\n close: \"perspective:close\",\n error: \"perspective:error\",\n redirect: \"perspective:redirect\",\n\n // SDK -> Iframe (internal)\n anonId: \"perspective:anon-id\",\n injectStyles: \"perspective:inject-styles\",\n themeChange: \"perspective:theme-change\",\n\n // Iframe -> SDK (internal)\n requestScrollbarStyles: \"perspective:request-scrollbar-styles\",\n} as const;\n\nexport type MessageType = (typeof MESSAGE_TYPES)[keyof typeof MESSAGE_TYPES];\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\nexport const ERROR_CODES = {\n SDK_OUTDATED: \"SDK_OUTDATED\",\n INVALID_RESEARCH: \"INVALID_RESEARCH\",\n UNKNOWN: \"UNKNOWN\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n// ============================================================================\n// Param Values (for boolean-like string params)\n// ============================================================================\n\nexport const PARAM_VALUES = {\n true: \"true\",\n false: \"false\",\n} as const;\n\n// ============================================================================\n// Theme Values\n// ============================================================================\n\nexport const THEME_VALUES = {\n dark: \"dark\",\n light: \"light\",\n system: \"system\",\n} as const;\n\nexport type ThemeValue = (typeof THEME_VALUES)[keyof typeof THEME_VALUES];\n\n// ============================================================================\n// Interview Mode Values (for mode param)\n// ============================================================================\n\nexport const MODE_VALUES = {\n preview: \"preview\",\n restart: \"restart\",\n normal: \"normal\",\n simulated: \"simulated\",\n} as const;\n\nexport type ModeValue = (typeof MODE_VALUES)[keyof typeof MODE_VALUES];\n\n// ============================================================================\n// localStorage Keys\n// ============================================================================\n\nexport const STORAGE_KEYS = {\n anonId: \"perspective-anon-id\",\n triggerShown: \"perspective-trigger-shown\",\n} as const;\n"]}
@@ -4,7 +4,7 @@
4
4
  * Used by both SDK bundle and the main Perspective app
5
5
  */
6
6
  /** SDK version for handshake protocol */
7
- declare const SDK_VERSION = "1.0.0";
7
+ declare const SDK_VERSION = "1.1.2";
8
8
  /** Feature flags as bitset for version negotiation */
9
9
  declare const FEATURES: {
10
10
  readonly RESIZE: number;
@@ -31,8 +31,6 @@ declare const BRAND_KEYS: {
31
31
  readonly darkText: "brand.dark.text";
32
32
  };
33
33
  type BrandKey = (typeof BRAND_KEYS)[keyof typeof BRAND_KEYS];
34
- declare const UTM_PARAMS: readonly ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
35
- type UtmParam = (typeof UTM_PARAMS)[number];
36
34
  declare const RESERVED_PARAMS: Set<string>;
37
35
  declare const DATA_ATTRS: {
38
36
  readonly widget: "data-perspective-widget";
@@ -46,6 +44,8 @@ declare const DATA_ATTRS: {
46
44
  readonly brandDark: "data-perspective-brand-dark";
47
45
  readonly theme: "data-perspective-theme";
48
46
  readonly noStyle: "data-perspective-no-style";
47
+ readonly autoOpen: "data-perspective-auto-open";
48
+ readonly showOnce: "data-perspective-show-once";
49
49
  };
50
50
  type DataAttr = (typeof DATA_ATTRS)[keyof typeof DATA_ATTRS];
51
51
  declare const MESSAGE_TYPES: {
@@ -87,6 +87,7 @@ declare const MODE_VALUES: {
87
87
  type ModeValue = (typeof MODE_VALUES)[keyof typeof MODE_VALUES];
88
88
  declare const STORAGE_KEYS: {
89
89
  readonly anonId: "perspective-anon-id";
90
+ readonly triggerShown: "perspective-trigger-shown";
90
91
  };
91
92
 
92
- export { BRAND_KEYS, type BrandKey, CURRENT_FEATURES, DATA_ATTRS, type DataAttr, ERROR_CODES, type ErrorCode, FEATURES, MESSAGE_TYPES, MODE_VALUES, type MessageType, type ModeValue, PARAM_KEYS, PARAM_VALUES, type ParamKey, RESERVED_PARAMS, SDK_VERSION, STORAGE_KEYS, THEME_VALUES, type ThemeValue, UTM_PARAMS, type UtmParam };
93
+ export { BRAND_KEYS, type BrandKey, CURRENT_FEATURES, DATA_ATTRS, type DataAttr, ERROR_CODES, type ErrorCode, FEATURES, MESSAGE_TYPES, MODE_VALUES, type MessageType, type ModeValue, PARAM_KEYS, PARAM_VALUES, type ParamKey, RESERVED_PARAMS, SDK_VERSION, STORAGE_KEYS, THEME_VALUES, type ThemeValue };
@@ -4,7 +4,7 @@
4
4
  * Used by both SDK bundle and the main Perspective app
5
5
  */
6
6
  /** SDK version for handshake protocol */
7
- declare const SDK_VERSION = "1.0.0";
7
+ declare const SDK_VERSION = "1.1.2";
8
8
  /** Feature flags as bitset for version negotiation */
9
9
  declare const FEATURES: {
10
10
  readonly RESIZE: number;
@@ -31,8 +31,6 @@ declare const BRAND_KEYS: {
31
31
  readonly darkText: "brand.dark.text";
32
32
  };
33
33
  type BrandKey = (typeof BRAND_KEYS)[keyof typeof BRAND_KEYS];
34
- declare const UTM_PARAMS: readonly ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
35
- type UtmParam = (typeof UTM_PARAMS)[number];
36
34
  declare const RESERVED_PARAMS: Set<string>;
37
35
  declare const DATA_ATTRS: {
38
36
  readonly widget: "data-perspective-widget";
@@ -46,6 +44,8 @@ declare const DATA_ATTRS: {
46
44
  readonly brandDark: "data-perspective-brand-dark";
47
45
  readonly theme: "data-perspective-theme";
48
46
  readonly noStyle: "data-perspective-no-style";
47
+ readonly autoOpen: "data-perspective-auto-open";
48
+ readonly showOnce: "data-perspective-show-once";
49
49
  };
50
50
  type DataAttr = (typeof DATA_ATTRS)[keyof typeof DATA_ATTRS];
51
51
  declare const MESSAGE_TYPES: {
@@ -87,6 +87,7 @@ declare const MODE_VALUES: {
87
87
  type ModeValue = (typeof MODE_VALUES)[keyof typeof MODE_VALUES];
88
88
  declare const STORAGE_KEYS: {
89
89
  readonly anonId: "perspective-anon-id";
90
+ readonly triggerShown: "perspective-trigger-shown";
90
91
  };
91
92
 
92
- export { BRAND_KEYS, type BrandKey, CURRENT_FEATURES, DATA_ATTRS, type DataAttr, ERROR_CODES, type ErrorCode, FEATURES, MESSAGE_TYPES, MODE_VALUES, type MessageType, type ModeValue, PARAM_KEYS, PARAM_VALUES, type ParamKey, RESERVED_PARAMS, SDK_VERSION, STORAGE_KEYS, THEME_VALUES, type ThemeValue, UTM_PARAMS, type UtmParam };
93
+ export { BRAND_KEYS, type BrandKey, CURRENT_FEATURES, DATA_ATTRS, type DataAttr, ERROR_CODES, type ErrorCode, FEATURES, MESSAGE_TYPES, MODE_VALUES, type MessageType, type ModeValue, PARAM_KEYS, PARAM_VALUES, type ParamKey, RESERVED_PARAMS, SDK_VERSION, STORAGE_KEYS, THEME_VALUES, type ThemeValue };
package/dist/constants.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/constants.ts
2
- var SDK_VERSION = "1.0.0";
2
+ var SDK_VERSION = "1.1.2";
3
3
  var FEATURES = {
4
4
  RESIZE: 1 << 0,
5
5
  // 0b0001
@@ -28,26 +28,9 @@ var BRAND_KEYS = {
28
28
  darkBg: "brand.dark.bg",
29
29
  darkText: "brand.dark.text"
30
30
  };
31
- var UTM_PARAMS = [
32
- "utm_source",
33
- "utm_medium",
34
- "utm_campaign",
35
- "utm_term",
36
- "utm_content"
37
- ];
38
31
  var RESERVED_PARAMS = /* @__PURE__ */ new Set([
39
- PARAM_KEYS.embed,
40
- PARAM_KEYS.embedType,
41
- PARAM_KEYS.theme,
42
- BRAND_KEYS.primary,
43
- BRAND_KEYS.secondary,
44
- BRAND_KEYS.bg,
45
- BRAND_KEYS.text,
46
- BRAND_KEYS.darkPrimary,
47
- BRAND_KEYS.darkSecondary,
48
- BRAND_KEYS.darkBg,
49
- BRAND_KEYS.darkText,
50
- ...UTM_PARAMS
32
+ ...Object.values(PARAM_KEYS),
33
+ ...Object.values(BRAND_KEYS)
51
34
  ]);
52
35
  var DATA_ATTRS = {
53
36
  widget: "data-perspective-widget",
@@ -62,7 +45,9 @@ var DATA_ATTRS = {
62
45
  brand: "data-perspective-brand",
63
46
  brandDark: "data-perspective-brand-dark",
64
47
  theme: "data-perspective-theme",
65
- noStyle: "data-perspective-no-style"
48
+ noStyle: "data-perspective-no-style",
49
+ autoOpen: "data-perspective-auto-open",
50
+ showOnce: "data-perspective-show-once"
66
51
  };
67
52
  var MESSAGE_TYPES = {
68
53
  // SDK -> Iframe (initialization)
@@ -102,9 +87,10 @@ var MODE_VALUES = {
102
87
  simulated: "simulated"
103
88
  };
104
89
  var STORAGE_KEYS = {
105
- anonId: "perspective-anon-id"
90
+ anonId: "perspective-anon-id",
91
+ triggerShown: "perspective-trigger-shown"
106
92
  };
107
93
 
108
- export { BRAND_KEYS, CURRENT_FEATURES, DATA_ATTRS, ERROR_CODES, FEATURES, MESSAGE_TYPES, MODE_VALUES, PARAM_KEYS, PARAM_VALUES, RESERVED_PARAMS, SDK_VERSION, STORAGE_KEYS, THEME_VALUES, UTM_PARAMS };
94
+ export { BRAND_KEYS, CURRENT_FEATURES, DATA_ATTRS, ERROR_CODES, FEATURES, MESSAGE_TYPES, MODE_VALUES, PARAM_KEYS, PARAM_VALUES, RESERVED_PARAMS, SDK_VERSION, STORAGE_KEYS, THEME_VALUES };
109
95
  //# sourceMappingURL=constants.js.map
110
96
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":"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","file":"constants.js","sourcesContent":["/**\n * Shared constants for Perspective Embed SDK\n * This file is SSR-safe - no DOM access at import time\n * Used by both SDK bundle and the main Perspective app\n */\n\n// ============================================================================\n// SDK Version & Features\n// ============================================================================\n\n/** SDK version for handshake protocol */\nexport const SDK_VERSION = \"1.0.0\";\n\n/** Feature flags as bitset for version negotiation */\nexport const FEATURES = {\n RESIZE: 1 << 0, // 0b0001\n THEME_SYNC: 1 << 1, // 0b0010\n ANON_ID: 1 << 2, // 0b0100\n SCROLLBAR_STYLES: 1 << 3, // 0b1000\n} as const;\n\n/** Current SDK feature set */\nexport const CURRENT_FEATURES =\n FEATURES.RESIZE |\n FEATURES.THEME_SYNC |\n FEATURES.ANON_ID |\n FEATURES.SCROLLBAR_STYLES;\n\n// ============================================================================\n// URL Parameter Keys\n// ============================================================================\n\n// Embed parameters\nexport const PARAM_KEYS = {\n embed: \"embed\",\n embedType: \"embed_type\",\n theme: \"theme\",\n} as const;\n\nexport type ParamKey = (typeof PARAM_KEYS)[keyof typeof PARAM_KEYS];\n\n// ============================================================================\n// Brand Color Keys\n// ============================================================================\n\nexport const BRAND_KEYS = {\n // Light mode\n primary: \"brand.primary\",\n secondary: \"brand.secondary\",\n bg: \"brand.bg\",\n text: \"brand.text\",\n\n // Dark mode\n darkPrimary: \"brand.dark.primary\",\n darkSecondary: \"brand.dark.secondary\",\n darkBg: \"brand.dark.bg\",\n darkText: \"brand.dark.text\",\n} as const;\n\nexport type BrandKey = (typeof BRAND_KEYS)[keyof typeof BRAND_KEYS];\n\n// ============================================================================\n// UTM Parameters (auto-forwarded from parent URL)\n// ============================================================================\n\nexport const UTM_PARAMS = [\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n] as const;\n\nexport type UtmParam = (typeof UTM_PARAMS)[number];\n\n// ============================================================================\n// Reserved Parameters (cannot be overridden via custom params)\n// ============================================================================\n\nexport const RESERVED_PARAMS: Set<string> = new Set([\n PARAM_KEYS.embed,\n PARAM_KEYS.embedType,\n PARAM_KEYS.theme,\n BRAND_KEYS.primary,\n BRAND_KEYS.secondary,\n BRAND_KEYS.bg,\n BRAND_KEYS.text,\n BRAND_KEYS.darkPrimary,\n BRAND_KEYS.darkSecondary,\n BRAND_KEYS.darkBg,\n BRAND_KEYS.darkText,\n ...UTM_PARAMS,\n]);\n\n// ============================================================================\n// Data Attributes (HTML declarative initialization)\n// ============================================================================\n\nexport const DATA_ATTRS = {\n widget: \"data-perspective-widget\",\n popup: \"data-perspective-popup\",\n slider: \"data-perspective-slider\",\n float: \"data-perspective-float\", // Primary name\n chat: \"data-perspective-chat\", // Legacy alias\n fullpage: \"data-perspective-fullpage\",\n params: \"data-perspective-params\",\n brand: \"data-perspective-brand\",\n brandDark: \"data-perspective-brand-dark\",\n theme: \"data-perspective-theme\",\n noStyle: \"data-perspective-no-style\",\n} as const;\n\nexport type DataAttr = (typeof DATA_ATTRS)[keyof typeof DATA_ATTRS];\n\n// ============================================================================\n// PostMessage Event Types\n// ============================================================================\n\nexport const MESSAGE_TYPES = {\n // SDK -> Iframe (initialization)\n init: \"perspective:init\",\n\n // Iframe -> SDK\n ready: \"perspective:ready\",\n resize: \"perspective:resize\",\n submit: \"perspective:submit\",\n close: \"perspective:close\",\n error: \"perspective:error\",\n redirect: \"perspective:redirect\",\n\n // SDK -> Iframe (internal)\n anonId: \"perspective:anon-id\",\n injectStyles: \"perspective:inject-styles\",\n themeChange: \"perspective:theme-change\",\n\n // Iframe -> SDK (internal)\n requestScrollbarStyles: \"perspective:request-scrollbar-styles\",\n} as const;\n\nexport type MessageType = (typeof MESSAGE_TYPES)[keyof typeof MESSAGE_TYPES];\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\nexport const ERROR_CODES = {\n SDK_OUTDATED: \"SDK_OUTDATED\",\n INVALID_RESEARCH: \"INVALID_RESEARCH\",\n UNKNOWN: \"UNKNOWN\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n// ============================================================================\n// Param Values (for boolean-like string params)\n// ============================================================================\n\nexport const PARAM_VALUES = {\n true: \"true\",\n false: \"false\",\n} as const;\n\n// ============================================================================\n// Theme Values\n// ============================================================================\n\nexport const THEME_VALUES = {\n dark: \"dark\",\n light: \"light\",\n system: \"system\",\n} as const;\n\nexport type ThemeValue = (typeof THEME_VALUES)[keyof typeof THEME_VALUES];\n\n// ============================================================================\n// Interview Mode Values (for mode param)\n// ============================================================================\n\nexport const MODE_VALUES = {\n preview: \"preview\",\n restart: \"restart\",\n normal: \"normal\",\n simulated: \"simulated\",\n} as const;\n\nexport type ModeValue = (typeof MODE_VALUES)[keyof typeof MODE_VALUES];\n\n// ============================================================================\n// localStorage Keys\n// ============================================================================\n\nexport const STORAGE_KEYS = {\n anonId: \"perspective-anon-id\",\n} as const;\n"]}
1
+ {"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":";AAWO,IAAM,WAAA,GAAc;AAGpB,IAAM,QAAA,GAAW;AAAA,EACtB,QAAQ,CAAA,IAAK,CAAA;AAAA;AAAA,EACb,YAAY,CAAA,IAAK,CAAA;AAAA;AAAA,EACjB,SAAS,CAAA,IAAK,CAAA;AAAA;AAAA,EACd,kBAAkB,CAAA,IAAK;AAAA;AACzB;AAGO,IAAM,mBACX,QAAA,CAAS,MAAA,GACT,SAAS,UAAA,GACT,QAAA,CAAS,UACT,QAAA,CAAS;AAOJ,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO;AACT;AAQO,IAAM,UAAA,GAAa;AAAA;AAAA,EAExB,OAAA,EAAS,eAAA;AAAA,EACT,SAAA,EAAW,iBAAA;AAAA,EACX,EAAA,EAAI,UAAA;AAAA,EACJ,IAAA,EAAM,YAAA;AAAA;AAAA,EAGN,WAAA,EAAa,oBAAA;AAAA,EACb,aAAA,EAAe,sBAAA;AAAA,EACf,MAAA,EAAQ,eAAA;AAAA,EACR,QAAA,EAAU;AACZ;AAQO,IAAM,eAAA,uBAAmC,GAAA,CAAI;AAAA,EAClD,GAAG,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAAA,EAC3B,GAAG,MAAA,CAAO,MAAA,CAAO,UAAU;AAC7B,CAAC;AAMM,IAAM,UAAA,GAAa;AAAA,EACxB,MAAA,EAAQ,yBAAA;AAAA,EACR,KAAA,EAAO,wBAAA;AAAA,EACP,MAAA,EAAQ,yBAAA;AAAA,EACR,KAAA,EAAO,wBAAA;AAAA;AAAA,EACP,IAAA,EAAM,uBAAA;AAAA;AAAA,EACN,QAAA,EAAU,2BAAA;AAAA,EACV,MAAA,EAAQ,yBAAA;AAAA,EACR,KAAA,EAAO,wBAAA;AAAA,EACP,SAAA,EAAW,6BAAA;AAAA,EACX,KAAA,EAAO,wBAAA;AAAA,EACP,OAAA,EAAS,2BAAA;AAAA,EACT,QAAA,EAAU,4BAAA;AAAA,EACV,QAAA,EAAU;AACZ;AAQO,IAAM,aAAA,GAAgB;AAAA;AAAA,EAE3B,IAAA,EAAM,kBAAA;AAAA;AAAA,EAGN,KAAA,EAAO,mBAAA;AAAA,EACP,MAAA,EAAQ,oBAAA;AAAA,EACR,MAAA,EAAQ,oBAAA;AAAA,EACR,KAAA,EAAO,mBAAA;AAAA,EACP,KAAA,EAAO,mBAAA;AAAA,EACP,QAAA,EAAU,sBAAA;AAAA;AAAA,EAGV,MAAA,EAAQ,qBAAA;AAAA,EACR,YAAA,EAAc,2BAAA;AAAA,EACd,WAAA,EAAa,0BAAA;AAAA;AAAA,EAGb,sBAAA,EAAwB;AAC1B;AAQO,IAAM,WAAA,GAAc;AAAA,EACzB,YAAA,EAAc,cAAA;AAAA,EACd,gBAAA,EAAkB,kBAAA;AAAA,EAClB,OAAA,EAAS;AACX;AAQO,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT;AAMO,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV;AAQO,IAAM,WAAA,GAAc;AAAA,EACzB,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW;AACb;AAQO,IAAM,YAAA,GAAe;AAAA,EAC1B,MAAA,EAAQ,qBAAA;AAAA,EACR,YAAA,EAAc;AAChB","file":"constants.js","sourcesContent":["/**\n * Shared constants for Perspective Embed SDK\n * This file is SSR-safe - no DOM access at import time\n * Used by both SDK bundle and the main Perspective app\n */\n\n// ============================================================================\n// SDK Version & Features\n// ============================================================================\n\n/** SDK version for handshake protocol */\nexport const SDK_VERSION = \"1.1.2\";\n\n/** Feature flags as bitset for version negotiation */\nexport const FEATURES = {\n RESIZE: 1 << 0, // 0b0001\n THEME_SYNC: 1 << 1, // 0b0010\n ANON_ID: 1 << 2, // 0b0100\n SCROLLBAR_STYLES: 1 << 3, // 0b1000\n} as const;\n\n/** Current SDK feature set */\nexport const CURRENT_FEATURES =\n FEATURES.RESIZE |\n FEATURES.THEME_SYNC |\n FEATURES.ANON_ID |\n FEATURES.SCROLLBAR_STYLES;\n\n// ============================================================================\n// URL Parameter Keys\n// ============================================================================\n\n// Embed parameters\nexport const PARAM_KEYS = {\n embed: \"embed\",\n embedType: \"embed_type\",\n theme: \"theme\",\n} as const;\n\nexport type ParamKey = (typeof PARAM_KEYS)[keyof typeof PARAM_KEYS];\n\n// ============================================================================\n// Brand Color Keys\n// ============================================================================\n\nexport const BRAND_KEYS = {\n // Light mode\n primary: \"brand.primary\",\n secondary: \"brand.secondary\",\n bg: \"brand.bg\",\n text: \"brand.text\",\n\n // Dark mode\n darkPrimary: \"brand.dark.primary\",\n darkSecondary: \"brand.dark.secondary\",\n darkBg: \"brand.dark.bg\",\n darkText: \"brand.dark.text\",\n} as const;\n\nexport type BrandKey = (typeof BRAND_KEYS)[keyof typeof BRAND_KEYS];\n\n// ============================================================================\n// Reserved Parameters (cannot be overridden via custom params or parent URL)\n// ============================================================================\n\nexport const RESERVED_PARAMS: Set<string> = new Set([\n ...Object.values(PARAM_KEYS),\n ...Object.values(BRAND_KEYS),\n]);\n\n// ============================================================================\n// Data Attributes (HTML declarative initialization)\n// ============================================================================\n\nexport const DATA_ATTRS = {\n widget: \"data-perspective-widget\",\n popup: \"data-perspective-popup\",\n slider: \"data-perspective-slider\",\n float: \"data-perspective-float\", // Primary name\n chat: \"data-perspective-chat\", // Legacy alias\n fullpage: \"data-perspective-fullpage\",\n params: \"data-perspective-params\",\n brand: \"data-perspective-brand\",\n brandDark: \"data-perspective-brand-dark\",\n theme: \"data-perspective-theme\",\n noStyle: \"data-perspective-no-style\",\n autoOpen: \"data-perspective-auto-open\",\n showOnce: \"data-perspective-show-once\",\n} as const;\n\nexport type DataAttr = (typeof DATA_ATTRS)[keyof typeof DATA_ATTRS];\n\n// ============================================================================\n// PostMessage Event Types\n// ============================================================================\n\nexport const MESSAGE_TYPES = {\n // SDK -> Iframe (initialization)\n init: \"perspective:init\",\n\n // Iframe -> SDK\n ready: \"perspective:ready\",\n resize: \"perspective:resize\",\n submit: \"perspective:submit\",\n close: \"perspective:close\",\n error: \"perspective:error\",\n redirect: \"perspective:redirect\",\n\n // SDK -> Iframe (internal)\n anonId: \"perspective:anon-id\",\n injectStyles: \"perspective:inject-styles\",\n themeChange: \"perspective:theme-change\",\n\n // Iframe -> SDK (internal)\n requestScrollbarStyles: \"perspective:request-scrollbar-styles\",\n} as const;\n\nexport type MessageType = (typeof MESSAGE_TYPES)[keyof typeof MESSAGE_TYPES];\n\n// ============================================================================\n// Error Codes\n// ============================================================================\n\nexport const ERROR_CODES = {\n SDK_OUTDATED: \"SDK_OUTDATED\",\n INVALID_RESEARCH: \"INVALID_RESEARCH\",\n UNKNOWN: \"UNKNOWN\",\n} as const;\n\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\n// ============================================================================\n// Param Values (for boolean-like string params)\n// ============================================================================\n\nexport const PARAM_VALUES = {\n true: \"true\",\n false: \"false\",\n} as const;\n\n// ============================================================================\n// Theme Values\n// ============================================================================\n\nexport const THEME_VALUES = {\n dark: \"dark\",\n light: \"light\",\n system: \"system\",\n} as const;\n\nexport type ThemeValue = (typeof THEME_VALUES)[keyof typeof THEME_VALUES];\n\n// ============================================================================\n// Interview Mode Values (for mode param)\n// ============================================================================\n\nexport const MODE_VALUES = {\n preview: \"preview\",\n restart: \"restart\",\n normal: \"normal\",\n simulated: \"simulated\",\n} as const;\n\nexport type ModeValue = (typeof MODE_VALUES)[keyof typeof MODE_VALUES];\n\n// ============================================================================\n// localStorage Keys\n// ============================================================================\n\nexport const STORAGE_KEYS = {\n anonId: \"perspective-anon-id\",\n triggerShown: \"perspective-trigger-shown\",\n} as const;\n"]}
package/dist/index.cjs CHANGED
@@ -58,7 +58,7 @@ if (hasDom()) {
58
58
  }
59
59
 
60
60
  // src/constants.ts
61
- var SDK_VERSION = "1.0.0";
61
+ var SDK_VERSION = "1.1.2";
62
62
  var FEATURES = {
63
63
  RESIZE: 1 << 0,
64
64
  // 0b0001
@@ -87,26 +87,9 @@ var BRAND_KEYS = {
87
87
  darkBg: "brand.dark.bg",
88
88
  darkText: "brand.dark.text"
89
89
  };
90
- var UTM_PARAMS = [
91
- "utm_source",
92
- "utm_medium",
93
- "utm_campaign",
94
- "utm_term",
95
- "utm_content"
96
- ];
97
90
  var RESERVED_PARAMS = /* @__PURE__ */ new Set([
98
- PARAM_KEYS.embed,
99
- PARAM_KEYS.embedType,
100
- PARAM_KEYS.theme,
101
- BRAND_KEYS.primary,
102
- BRAND_KEYS.secondary,
103
- BRAND_KEYS.bg,
104
- BRAND_KEYS.text,
105
- BRAND_KEYS.darkPrimary,
106
- BRAND_KEYS.darkSecondary,
107
- BRAND_KEYS.darkBg,
108
- BRAND_KEYS.darkText,
109
- ...UTM_PARAMS
91
+ ...Object.values(PARAM_KEYS),
92
+ ...Object.values(BRAND_KEYS)
110
93
  ]);
111
94
  var DATA_ATTRS = {
112
95
  widget: "data-perspective-widget",
@@ -121,7 +104,9 @@ var DATA_ATTRS = {
121
104
  brand: "data-perspective-brand",
122
105
  brandDark: "data-perspective-brand-dark",
123
106
  theme: "data-perspective-theme",
124
- noStyle: "data-perspective-no-style"
107
+ noStyle: "data-perspective-no-style",
108
+ autoOpen: "data-perspective-auto-open",
109
+ showOnce: "data-perspective-show-once"
125
110
  };
126
111
  var MESSAGE_TYPES = {
127
112
  // SDK -> Iframe (initialization)
@@ -150,7 +135,8 @@ var THEME_VALUES = {
150
135
  system: "system"
151
136
  };
152
137
  var STORAGE_KEYS = {
153
- anonId: "perspective-anon-id"
138
+ anonId: "perspective-anon-id",
139
+ triggerShown: "perspective-trigger-shown"
154
140
  };
155
141
 
156
142
  // src/utils.ts
@@ -220,13 +206,12 @@ function getOrCreateAnonId() {
220
206
  return crypto.randomUUID();
221
207
  }
222
208
  }
223
- function getUtmParams() {
209
+ function getParentSearchParams() {
224
210
  if (!hasDom()) return {};
225
211
  const params = {};
226
212
  const searchParams = new URLSearchParams(window.location.search);
227
- for (const key of UTM_PARAMS) {
228
- const value = searchParams.get(key);
229
- if (value) {
213
+ for (const [key, value] of searchParams.entries()) {
214
+ if (!RESERVED_PARAMS.has(key)) {
230
215
  params[key] = value;
231
216
  }
232
217
  }
@@ -249,8 +234,8 @@ function buildIframeUrl(researchId, type, host, customParams, brand, themeOverri
249
234
  } else {
250
235
  url.searchParams.set(PARAM_KEYS.theme, themeOverride || THEME_VALUES.light);
251
236
  }
252
- const utmParams = getUtmParams();
253
- for (const [key, value] of Object.entries(utmParams)) {
237
+ const parentParams = getParentSearchParams();
238
+ for (const [key, value] of Object.entries(parentParams)) {
254
239
  url.searchParams.set(key, value);
255
240
  }
256
241
  const setColor = (key, color) => {
@@ -1572,6 +1557,74 @@ function createFullpage(config) {
1572
1557
  };
1573
1558
  }
1574
1559
 
1560
+ // src/triggers.ts
1561
+ function parseTriggerAttr(value) {
1562
+ const trimmed = value.trim();
1563
+ if (trimmed.startsWith("timeout:")) {
1564
+ const delay = parseInt(trimmed.slice("timeout:".length), 10);
1565
+ if (isNaN(delay) || delay < 0) {
1566
+ throw new Error(`Invalid timeout delay: "${value}"`);
1567
+ }
1568
+ return { type: "timeout", delay };
1569
+ }
1570
+ if (trimmed === "timeout") {
1571
+ return { type: "timeout", delay: 5e3 };
1572
+ }
1573
+ if (trimmed === "exit-intent") {
1574
+ return { type: "exit-intent" };
1575
+ }
1576
+ throw new Error(
1577
+ `Unknown trigger type: "${value}". Expected "timeout:<ms>" or "exit-intent".`
1578
+ );
1579
+ }
1580
+ function setupTrigger(config, callback) {
1581
+ if (config.type === "timeout") {
1582
+ const timer = setTimeout(callback, config.delay);
1583
+ return () => clearTimeout(timer);
1584
+ }
1585
+ if (config.type === "exit-intent") {
1586
+ const handler = (e) => {
1587
+ if (e.clientY <= 0) {
1588
+ callback();
1589
+ document.removeEventListener("mouseleave", handler);
1590
+ }
1591
+ };
1592
+ document.addEventListener("mouseleave", handler);
1593
+ return () => document.removeEventListener("mouseleave", handler);
1594
+ }
1595
+ const _exhaustive = config;
1596
+ throw new Error(
1597
+ `Unknown trigger type: ${_exhaustive.type}`
1598
+ );
1599
+ }
1600
+ function storageKey(researchId) {
1601
+ return `${STORAGE_KEYS.triggerShown}:${researchId}`;
1602
+ }
1603
+ function parseShowOnceAttr(value) {
1604
+ if (!value) return "session";
1605
+ const trimmed = value.trim();
1606
+ if (trimmed === "visitor") return "visitor";
1607
+ if (trimmed === "false") return false;
1608
+ return "session";
1609
+ }
1610
+ function shouldShow(researchId, showOnce) {
1611
+ if (showOnce === false) return true;
1612
+ try {
1613
+ const storage = showOnce === "visitor" ? localStorage : sessionStorage;
1614
+ return storage.getItem(storageKey(researchId)) === null;
1615
+ } catch {
1616
+ return true;
1617
+ }
1618
+ }
1619
+ function markShown(researchId, showOnce) {
1620
+ if (showOnce === false) return;
1621
+ try {
1622
+ const storage = showOnce === "visitor" ? localStorage : sessionStorage;
1623
+ storage.setItem(storageKey(researchId), "1");
1624
+ } catch {
1625
+ }
1626
+ }
1627
+
1575
1628
  exports.BRAND_KEYS = BRAND_KEYS;
1576
1629
  exports.CURRENT_FEATURES = CURRENT_FEATURES;
1577
1630
  exports.DATA_ATTRS = DATA_ATTRS;
@@ -1586,7 +1639,12 @@ exports.createFloatBubble = createFloatBubble;
1586
1639
  exports.createFullpage = createFullpage;
1587
1640
  exports.createWidget = createWidget;
1588
1641
  exports.getConfig = getConfig;
1642
+ exports.markShown = markShown;
1589
1643
  exports.openPopup = openPopup;
1590
1644
  exports.openSlider = openSlider;
1645
+ exports.parseShowOnceAttr = parseShowOnceAttr;
1646
+ exports.parseTriggerAttr = parseTriggerAttr;
1647
+ exports.setupTrigger = setupTrigger;
1648
+ exports.shouldShow = shouldShow;
1591
1649
  //# sourceMappingURL=index.cjs.map
1592
1650
  //# sourceMappingURL=index.cjs.map