@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.
- package/dist/browser.cjs +107 -31
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.d.cts +13 -0
- package/dist/browser.d.ts +13 -0
- package/dist/browser.js +107 -31
- package/dist/browser.js.map +1 -1
- package/dist/cdn/perspective.global.js +17 -17
- package/dist/cdn/perspective.global.js.map +1 -1
- package/dist/constants.cjs +8 -23
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +5 -4
- package/dist/constants.d.ts +5 -4
- package/dist/constants.js +9 -23
- package/dist/constants.js.map +1 -1
- package/dist/index.cjs +86 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +60 -1
- package/dist/index.d.ts +60 -1
- package/dist/index.js +82 -29
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/browser.ts +42 -3
- package/src/constants.ts +7 -28
- package/src/iframe.test.ts +115 -0
- package/src/iframe.ts +8 -9
- package/src/index.ts +13 -0
- package/src/triggers.test.ts +272 -0
- package/src/triggers.ts +127 -0
- package/src/types.ts +19 -0
package/dist/constants.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
// src/constants.ts
|
|
4
|
-
var SDK_VERSION = "1.
|
|
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
|
|
42
|
-
|
|
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
|
package/dist/constants.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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"]}
|
package/dist/constants.d.cts
CHANGED
|
@@ -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.
|
|
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
|
|
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.d.ts
CHANGED
|
@@ -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.
|
|
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
|
|
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.
|
|
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
|
|
40
|
-
|
|
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
|
|
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
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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.
|
|
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
|
|
99
|
-
|
|
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
|
|
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
|
|
228
|
-
|
|
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
|
|
253
|
-
for (const [key, value] of Object.entries(
|
|
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
|