@perspective-ai/sdk 1.1.0 → 1.1.3
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 +105 -6
- 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 +105 -6
- 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 +6 -3
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +4 -2
- package/dist/constants.d.ts +4 -2
- package/dist/constants.js +6 -3
- package/dist/constants.js.map +1 -1
- package/dist/index.cjs +81 -3
- 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 +77 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/browser.test.ts +44 -1
- package/src/browser.ts +48 -3
- package/src/constants.ts +6 -2
- package/src/iframe.ts +8 -0
- 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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":";;;AAYO,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 — replaced at build time by tsup define */\ndeclare const PKG_VERSION: string;\nexport const SDK_VERSION = PKG_VERSION;\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
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
* This file is SSR-safe - no DOM access at import time
|
|
4
4
|
* Used by both SDK bundle and the main Perspective app
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
declare const SDK_VERSION = "1.1.0";
|
|
6
|
+
declare const SDK_VERSION: string;
|
|
8
7
|
/** Feature flags as bitset for version negotiation */
|
|
9
8
|
declare const FEATURES: {
|
|
10
9
|
readonly RESIZE: number;
|
|
@@ -44,6 +43,8 @@ declare const DATA_ATTRS: {
|
|
|
44
43
|
readonly brandDark: "data-perspective-brand-dark";
|
|
45
44
|
readonly theme: "data-perspective-theme";
|
|
46
45
|
readonly noStyle: "data-perspective-no-style";
|
|
46
|
+
readonly autoOpen: "data-perspective-auto-open";
|
|
47
|
+
readonly showOnce: "data-perspective-show-once";
|
|
47
48
|
};
|
|
48
49
|
type DataAttr = (typeof DATA_ATTRS)[keyof typeof DATA_ATTRS];
|
|
49
50
|
declare const MESSAGE_TYPES: {
|
|
@@ -85,6 +86,7 @@ declare const MODE_VALUES: {
|
|
|
85
86
|
type ModeValue = (typeof MODE_VALUES)[keyof typeof MODE_VALUES];
|
|
86
87
|
declare const STORAGE_KEYS: {
|
|
87
88
|
readonly anonId: "perspective-anon-id";
|
|
89
|
+
readonly triggerShown: "perspective-trigger-shown";
|
|
88
90
|
};
|
|
89
91
|
|
|
90
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 };
|
package/dist/constants.d.ts
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
* This file is SSR-safe - no DOM access at import time
|
|
4
4
|
* Used by both SDK bundle and the main Perspective app
|
|
5
5
|
*/
|
|
6
|
-
|
|
7
|
-
declare const SDK_VERSION = "1.1.0";
|
|
6
|
+
declare const SDK_VERSION: string;
|
|
8
7
|
/** Feature flags as bitset for version negotiation */
|
|
9
8
|
declare const FEATURES: {
|
|
10
9
|
readonly RESIZE: number;
|
|
@@ -44,6 +43,8 @@ declare const DATA_ATTRS: {
|
|
|
44
43
|
readonly brandDark: "data-perspective-brand-dark";
|
|
45
44
|
readonly theme: "data-perspective-theme";
|
|
46
45
|
readonly noStyle: "data-perspective-no-style";
|
|
46
|
+
readonly autoOpen: "data-perspective-auto-open";
|
|
47
|
+
readonly showOnce: "data-perspective-show-once";
|
|
47
48
|
};
|
|
48
49
|
type DataAttr = (typeof DATA_ATTRS)[keyof typeof DATA_ATTRS];
|
|
49
50
|
declare const MESSAGE_TYPES: {
|
|
@@ -85,6 +86,7 @@ declare const MODE_VALUES: {
|
|
|
85
86
|
type ModeValue = (typeof MODE_VALUES)[keyof typeof MODE_VALUES];
|
|
86
87
|
declare const STORAGE_KEYS: {
|
|
87
88
|
readonly anonId: "perspective-anon-id";
|
|
89
|
+
readonly triggerShown: "perspective-trigger-shown";
|
|
88
90
|
};
|
|
89
91
|
|
|
90
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 };
|
package/dist/constants.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/constants.ts
|
|
2
|
-
var SDK_VERSION = "1.1.
|
|
2
|
+
var SDK_VERSION = "1.1.3";
|
|
3
3
|
var FEATURES = {
|
|
4
4
|
RESIZE: 1 << 0,
|
|
5
5
|
// 0b0001
|
|
@@ -45,7 +45,9 @@ var DATA_ATTRS = {
|
|
|
45
45
|
brand: "data-perspective-brand",
|
|
46
46
|
brandDark: "data-perspective-brand-dark",
|
|
47
47
|
theme: "data-perspective-theme",
|
|
48
|
-
noStyle: "data-perspective-no-style"
|
|
48
|
+
noStyle: "data-perspective-no-style",
|
|
49
|
+
autoOpen: "data-perspective-auto-open",
|
|
50
|
+
showOnce: "data-perspective-show-once"
|
|
49
51
|
};
|
|
50
52
|
var MESSAGE_TYPES = {
|
|
51
53
|
// SDK -> Iframe (initialization)
|
|
@@ -85,7 +87,8 @@ var MODE_VALUES = {
|
|
|
85
87
|
simulated: "simulated"
|
|
86
88
|
};
|
|
87
89
|
var STORAGE_KEYS = {
|
|
88
|
-
anonId: "perspective-anon-id"
|
|
90
|
+
anonId: "perspective-anon-id",
|
|
91
|
+
triggerShown: "perspective-trigger-shown"
|
|
89
92
|
};
|
|
90
93
|
|
|
91
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 };
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts"],"names":[],"mappings":";AAYO,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 — replaced at build time by tsup define */\ndeclare const PKG_VERSION: string;\nexport const SDK_VERSION = PKG_VERSION;\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.1.
|
|
61
|
+
var SDK_VERSION = "1.1.3";
|
|
62
62
|
var FEATURES = {
|
|
63
63
|
RESIZE: 1 << 0,
|
|
64
64
|
// 0b0001
|
|
@@ -104,7 +104,9 @@ var DATA_ATTRS = {
|
|
|
104
104
|
brand: "data-perspective-brand",
|
|
105
105
|
brandDark: "data-perspective-brand-dark",
|
|
106
106
|
theme: "data-perspective-theme",
|
|
107
|
-
noStyle: "data-perspective-no-style"
|
|
107
|
+
noStyle: "data-perspective-no-style",
|
|
108
|
+
autoOpen: "data-perspective-auto-open",
|
|
109
|
+
showOnce: "data-perspective-show-once"
|
|
108
110
|
};
|
|
109
111
|
var MESSAGE_TYPES = {
|
|
110
112
|
// SDK -> Iframe (initialization)
|
|
@@ -133,7 +135,8 @@ var THEME_VALUES = {
|
|
|
133
135
|
system: "system"
|
|
134
136
|
};
|
|
135
137
|
var STORAGE_KEYS = {
|
|
136
|
-
anonId: "perspective-anon-id"
|
|
138
|
+
anonId: "perspective-anon-id",
|
|
139
|
+
triggerShown: "perspective-trigger-shown"
|
|
137
140
|
};
|
|
138
141
|
|
|
139
142
|
// src/utils.ts
|
|
@@ -178,6 +181,8 @@ function hexToRgba(hex, alpha) {
|
|
|
178
181
|
// src/iframe.ts
|
|
179
182
|
function isAllowedRedirectUrl(url) {
|
|
180
183
|
if (!url || typeof url !== "string") return false;
|
|
184
|
+
if (url.startsWith("/") && !url.startsWith("//") || url.startsWith("?") || url.startsWith("#"))
|
|
185
|
+
return true;
|
|
181
186
|
try {
|
|
182
187
|
const parsed = new URL(url, window.location.origin);
|
|
183
188
|
const protocol = parsed.protocol.toLowerCase();
|
|
@@ -1554,6 +1559,74 @@ function createFullpage(config) {
|
|
|
1554
1559
|
};
|
|
1555
1560
|
}
|
|
1556
1561
|
|
|
1562
|
+
// src/triggers.ts
|
|
1563
|
+
function parseTriggerAttr(value) {
|
|
1564
|
+
const trimmed = value.trim();
|
|
1565
|
+
if (trimmed.startsWith("timeout:")) {
|
|
1566
|
+
const delay = parseInt(trimmed.slice("timeout:".length), 10);
|
|
1567
|
+
if (isNaN(delay) || delay < 0) {
|
|
1568
|
+
throw new Error(`Invalid timeout delay: "${value}"`);
|
|
1569
|
+
}
|
|
1570
|
+
return { type: "timeout", delay };
|
|
1571
|
+
}
|
|
1572
|
+
if (trimmed === "timeout") {
|
|
1573
|
+
return { type: "timeout", delay: 5e3 };
|
|
1574
|
+
}
|
|
1575
|
+
if (trimmed === "exit-intent") {
|
|
1576
|
+
return { type: "exit-intent" };
|
|
1577
|
+
}
|
|
1578
|
+
throw new Error(
|
|
1579
|
+
`Unknown trigger type: "${value}". Expected "timeout:<ms>" or "exit-intent".`
|
|
1580
|
+
);
|
|
1581
|
+
}
|
|
1582
|
+
function setupTrigger(config, callback) {
|
|
1583
|
+
if (config.type === "timeout") {
|
|
1584
|
+
const timer = setTimeout(callback, config.delay);
|
|
1585
|
+
return () => clearTimeout(timer);
|
|
1586
|
+
}
|
|
1587
|
+
if (config.type === "exit-intent") {
|
|
1588
|
+
const handler = (e) => {
|
|
1589
|
+
if (e.clientY <= 0) {
|
|
1590
|
+
callback();
|
|
1591
|
+
document.removeEventListener("mouseleave", handler);
|
|
1592
|
+
}
|
|
1593
|
+
};
|
|
1594
|
+
document.addEventListener("mouseleave", handler);
|
|
1595
|
+
return () => document.removeEventListener("mouseleave", handler);
|
|
1596
|
+
}
|
|
1597
|
+
const _exhaustive = config;
|
|
1598
|
+
throw new Error(
|
|
1599
|
+
`Unknown trigger type: ${_exhaustive.type}`
|
|
1600
|
+
);
|
|
1601
|
+
}
|
|
1602
|
+
function storageKey(researchId) {
|
|
1603
|
+
return `${STORAGE_KEYS.triggerShown}:${researchId}`;
|
|
1604
|
+
}
|
|
1605
|
+
function parseShowOnceAttr(value) {
|
|
1606
|
+
if (!value) return "session";
|
|
1607
|
+
const trimmed = value.trim();
|
|
1608
|
+
if (trimmed === "visitor") return "visitor";
|
|
1609
|
+
if (trimmed === "false") return false;
|
|
1610
|
+
return "session";
|
|
1611
|
+
}
|
|
1612
|
+
function shouldShow(researchId, showOnce) {
|
|
1613
|
+
if (showOnce === false) return true;
|
|
1614
|
+
try {
|
|
1615
|
+
const storage = showOnce === "visitor" ? localStorage : sessionStorage;
|
|
1616
|
+
return storage.getItem(storageKey(researchId)) === null;
|
|
1617
|
+
} catch {
|
|
1618
|
+
return true;
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
function markShown(researchId, showOnce) {
|
|
1622
|
+
if (showOnce === false) return;
|
|
1623
|
+
try {
|
|
1624
|
+
const storage = showOnce === "visitor" ? localStorage : sessionStorage;
|
|
1625
|
+
storage.setItem(storageKey(researchId), "1");
|
|
1626
|
+
} catch {
|
|
1627
|
+
}
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1557
1630
|
exports.BRAND_KEYS = BRAND_KEYS;
|
|
1558
1631
|
exports.CURRENT_FEATURES = CURRENT_FEATURES;
|
|
1559
1632
|
exports.DATA_ATTRS = DATA_ATTRS;
|
|
@@ -1568,7 +1641,12 @@ exports.createFloatBubble = createFloatBubble;
|
|
|
1568
1641
|
exports.createFullpage = createFullpage;
|
|
1569
1642
|
exports.createWidget = createWidget;
|
|
1570
1643
|
exports.getConfig = getConfig;
|
|
1644
|
+
exports.markShown = markShown;
|
|
1571
1645
|
exports.openPopup = openPopup;
|
|
1572
1646
|
exports.openSlider = openSlider;
|
|
1647
|
+
exports.parseShowOnceAttr = parseShowOnceAttr;
|
|
1648
|
+
exports.parseTriggerAttr = parseTriggerAttr;
|
|
1649
|
+
exports.setupTrigger = setupTrigger;
|
|
1650
|
+
exports.shouldShow = shouldShow;
|
|
1573
1651
|
//# sourceMappingURL=index.cjs.map
|
|
1574
1652
|
//# sourceMappingURL=index.cjs.map
|