@cxpinsight/react-native 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +131 -0
- package/babel.js +101 -0
- package/instrumented/Pressable.d.ts +2 -0
- package/instrumented/Pressable.js +2 -0
- package/instrumented/ScrollView.d.ts +2 -0
- package/instrumented/ScrollView.js +2 -0
- package/instrumented/TextInput.d.ts +2 -0
- package/instrumented/TextInput.js +2 -0
- package/instrumented/TouchableOpacity.d.ts +2 -0
- package/instrumented/TouchableOpacity.js +2 -0
- package/lib/CXPinsight.d.ts +113 -0
- package/lib/CXPinsight.d.ts.map +1 -0
- package/lib/CXPinsight.js +831 -0
- package/lib/CXPinsight.js.map +1 -0
- package/lib/CXPinsightProvider.d.ts +19 -0
- package/lib/CXPinsightProvider.d.ts.map +1 -0
- package/lib/CXPinsightProvider.js +382 -0
- package/lib/CXPinsightProvider.js.map +1 -0
- package/lib/core/autoScreenTracker.d.ts +20 -0
- package/lib/core/autoScreenTracker.d.ts.map +1 -0
- package/lib/core/autoScreenTracker.js +66 -0
- package/lib/core/autoScreenTracker.js.map +1 -0
- package/lib/core/deepLinkTracker.d.ts +17 -0
- package/lib/core/deepLinkTracker.d.ts.map +1 -0
- package/lib/core/deepLinkTracker.js +81 -0
- package/lib/core/deepLinkTracker.js.map +1 -0
- package/lib/core/deviceInfo.d.ts +14 -0
- package/lib/core/deviceInfo.d.ts.map +1 -0
- package/lib/core/deviceInfo.js +166 -0
- package/lib/core/deviceInfo.js.map +1 -0
- package/lib/core/eventQueue.d.ts +23 -0
- package/lib/core/eventQueue.d.ts.map +1 -0
- package/lib/core/eventQueue.js +240 -0
- package/lib/core/eventQueue.js.map +1 -0
- package/lib/core/lifecycle.d.ts +18 -0
- package/lib/core/lifecycle.d.ts.map +1 -0
- package/lib/core/lifecycle.js +127 -0
- package/lib/core/lifecycle.js.map +1 -0
- package/lib/core/mobileRecorder.d.ts +15 -0
- package/lib/core/mobileRecorder.d.ts.map +1 -0
- package/lib/core/mobileRecorder.js +231 -0
- package/lib/core/mobileRecorder.js.map +1 -0
- package/lib/core/network.d.ts +10 -0
- package/lib/core/network.d.ts.map +1 -0
- package/lib/core/network.js +74 -0
- package/lib/core/network.js.map +1 -0
- package/lib/core/networkCapture.d.ts +22 -0
- package/lib/core/networkCapture.d.ts.map +1 -0
- package/lib/core/networkCapture.js +100 -0
- package/lib/core/networkCapture.js.map +1 -0
- package/lib/core/scrollCapture.d.ts +48 -0
- package/lib/core/scrollCapture.d.ts.map +1 -0
- package/lib/core/scrollCapture.js +221 -0
- package/lib/core/scrollCapture.js.map +1 -0
- package/lib/core/session.d.ts +15 -0
- package/lib/core/session.d.ts.map +1 -0
- package/lib/core/session.js +157 -0
- package/lib/core/session.js.map +1 -0
- package/lib/core/storage.d.ts +11 -0
- package/lib/core/storage.d.ts.map +1 -0
- package/lib/core/storage.js +59 -0
- package/lib/core/storage.js.map +1 -0
- package/lib/core/triggerEngine.d.ts +56 -0
- package/lib/core/triggerEngine.d.ts.map +1 -0
- package/lib/core/triggerEngine.js +432 -0
- package/lib/core/triggerEngine.js.map +1 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/lib/instrumented/Pressable.d.ts +9 -0
- package/lib/instrumented/Pressable.d.ts.map +1 -0
- package/lib/instrumented/Pressable.js +96 -0
- package/lib/instrumented/Pressable.js.map +1 -0
- package/lib/instrumented/ScrollView.d.ts +6 -0
- package/lib/instrumented/ScrollView.d.ts.map +1 -0
- package/lib/instrumented/ScrollView.js +101 -0
- package/lib/instrumented/ScrollView.js.map +1 -0
- package/lib/instrumented/TextInput.d.ts +9 -0
- package/lib/instrumented/TextInput.d.ts.map +1 -0
- package/lib/instrumented/TextInput.js +75 -0
- package/lib/instrumented/TextInput.js.map +1 -0
- package/lib/instrumented/TouchableOpacity.d.ts +11 -0
- package/lib/instrumented/TouchableOpacity.d.ts.map +1 -0
- package/lib/instrumented/TouchableOpacity.js +96 -0
- package/lib/instrumented/TouchableOpacity.js.map +1 -0
- package/lib/instrumented/index.d.ts +19 -0
- package/lib/instrumented/index.d.ts.map +1 -0
- package/lib/instrumented/index.js +28 -0
- package/lib/instrumented/index.js.map +1 -0
- package/lib/instrumented/interactionObserver.d.ts +29 -0
- package/lib/instrumented/interactionObserver.d.ts.map +1 -0
- package/lib/instrumented/interactionObserver.js +38 -0
- package/lib/instrumented/interactionObserver.js.map +1 -0
- package/lib/setup/AccessibilityScanner.d.ts +32 -0
- package/lib/setup/AccessibilityScanner.d.ts.map +1 -0
- package/lib/setup/AccessibilityScanner.js +127 -0
- package/lib/setup/AccessibilityScanner.js.map +1 -0
- package/lib/setup/ElementIdentifier.d.ts +65 -0
- package/lib/setup/ElementIdentifier.d.ts.map +1 -0
- package/lib/setup/ElementIdentifier.js +114 -0
- package/lib/setup/ElementIdentifier.js.map +1 -0
- package/lib/setup/ElementRegistry.d.ts +22 -0
- package/lib/setup/ElementRegistry.d.ts.map +1 -0
- package/lib/setup/ElementRegistry.js +47 -0
- package/lib/setup/ElementRegistry.js.map +1 -0
- package/lib/setup/SetupCodeEntry.d.ts +15 -0
- package/lib/setup/SetupCodeEntry.d.ts.map +1 -0
- package/lib/setup/SetupCodeEntry.js +198 -0
- package/lib/setup/SetupCodeEntry.js.map +1 -0
- package/lib/setup/SetupController.d.ts +29 -0
- package/lib/setup/SetupController.d.ts.map +1 -0
- package/lib/setup/SetupController.js +189 -0
- package/lib/setup/SetupController.js.map +1 -0
- package/lib/setup/SetupOverlay.d.ts +10 -0
- package/lib/setup/SetupOverlay.d.ts.map +1 -0
- package/lib/setup/SetupOverlay.js +408 -0
- package/lib/setup/SetupOverlay.js.map +1 -0
- package/lib/setup/TapInterceptor.d.ts +19 -0
- package/lib/setup/TapInterceptor.d.ts.map +1 -0
- package/lib/setup/TapInterceptor.js +98 -0
- package/lib/setup/TapInterceptor.js.map +1 -0
- package/lib/setup/TouchObserver.d.ts +25 -0
- package/lib/setup/TouchObserver.d.ts.map +1 -0
- package/lib/setup/TouchObserver.js +88 -0
- package/lib/setup/TouchObserver.js.map +1 -0
- package/lib/setup/TouchPatcher.d.ts +27 -0
- package/lib/setup/TouchPatcher.d.ts.map +1 -0
- package/lib/setup/TouchPatcher.js +182 -0
- package/lib/setup/TouchPatcher.js.map +1 -0
- package/lib/setup/index.d.ts +13 -0
- package/lib/setup/index.d.ts.map +1 -0
- package/lib/setup/index.js +45 -0
- package/lib/setup/index.js.map +1 -0
- package/lib/setup/useCXPElement.d.ts +25 -0
- package/lib/setup/useCXPElement.d.ts.map +1 -0
- package/lib/setup/useCXPElement.js +33 -0
- package/lib/setup/useCXPElement.js.map +1 -0
- package/lib/survey/SurveyModal.d.ts +10 -0
- package/lib/survey/SurveyModal.d.ts.map +1 -0
- package/lib/survey/SurveyModal.js +1650 -0
- package/lib/survey/SurveyModal.js.map +1 -0
- package/lib/survey/expressionEval.d.ts +10 -0
- package/lib/survey/expressionEval.d.ts.map +1 -0
- package/lib/survey/expressionEval.js +287 -0
- package/lib/survey/expressionEval.js.map +1 -0
- package/lib/survey/frequencyCap.d.ts +15 -0
- package/lib/survey/frequencyCap.d.ts.map +1 -0
- package/lib/survey/frequencyCap.js +116 -0
- package/lib/survey/frequencyCap.js.map +1 -0
- package/lib/survey/handsFreeVoice.d.ts +30 -0
- package/lib/survey/handsFreeVoice.d.ts.map +1 -0
- package/lib/survey/handsFreeVoice.js +312 -0
- package/lib/survey/handsFreeVoice.js.map +1 -0
- package/lib/survey/interpolate.d.ts +6 -0
- package/lib/survey/interpolate.d.ts.map +1 -0
- package/lib/survey/interpolate.js +61 -0
- package/lib/survey/interpolate.js.map +1 -0
- package/lib/survey/pagesFromV1.d.ts +6 -0
- package/lib/survey/pagesFromV1.d.ts.map +1 -0
- package/lib/survey/pagesFromV1.js +83 -0
- package/lib/survey/pagesFromV1.js.map +1 -0
- package/lib/survey/questions/CSATQuestion.d.ts +16 -0
- package/lib/survey/questions/CSATQuestion.d.ts.map +1 -0
- package/lib/survey/questions/CSATQuestion.js +37 -0
- package/lib/survey/questions/CSATQuestion.js.map +1 -0
- package/lib/survey/questions/DateQuestion.d.ts +20 -0
- package/lib/survey/questions/DateQuestion.d.ts.map +1 -0
- package/lib/survey/questions/DateQuestion.js +103 -0
- package/lib/survey/questions/DateQuestion.js.map +1 -0
- package/lib/survey/questions/ImagePickerQuestion.d.ts +33 -0
- package/lib/survey/questions/ImagePickerQuestion.d.ts.map +1 -0
- package/lib/survey/questions/ImagePickerQuestion.js +68 -0
- package/lib/survey/questions/ImagePickerQuestion.js.map +1 -0
- package/lib/survey/questions/ImageQuestion.d.ts +26 -0
- package/lib/survey/questions/ImageQuestion.d.ts.map +1 -0
- package/lib/survey/questions/ImageQuestion.js +24 -0
- package/lib/survey/questions/ImageQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixCell.d.ts +45 -0
- package/lib/survey/questions/MatrixCell.d.ts.map +1 -0
- package/lib/survey/questions/MatrixCell.js +54 -0
- package/lib/survey/questions/MatrixCell.js.map +1 -0
- package/lib/survey/questions/MatrixDropdownQuestion.d.ts +29 -0
- package/lib/survey/questions/MatrixDropdownQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixDropdownQuestion.js +42 -0
- package/lib/survey/questions/MatrixDropdownQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixDynamicQuestion.d.ts +26 -0
- package/lib/survey/questions/MatrixDynamicQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixDynamicQuestion.js +52 -0
- package/lib/survey/questions/MatrixDynamicQuestion.js.map +1 -0
- package/lib/survey/questions/MatrixQuestion.d.ts +38 -0
- package/lib/survey/questions/MatrixQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MatrixQuestion.js +64 -0
- package/lib/survey/questions/MatrixQuestion.js.map +1 -0
- package/lib/survey/questions/MultiTextQuestion.d.ts +19 -0
- package/lib/survey/questions/MultiTextQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MultiTextQuestion.js +64 -0
- package/lib/survey/questions/MultiTextQuestion.js.map +1 -0
- package/lib/survey/questions/MultipleChoiceQuestion.d.ts +25 -0
- package/lib/survey/questions/MultipleChoiceQuestion.d.ts.map +1 -0
- package/lib/survey/questions/MultipleChoiceQuestion.js +111 -0
- package/lib/survey/questions/MultipleChoiceQuestion.js.map +1 -0
- package/lib/survey/questions/NPSQuestion.d.ts +18 -0
- package/lib/survey/questions/NPSQuestion.d.ts.map +1 -0
- package/lib/survey/questions/NPSQuestion.js +62 -0
- package/lib/survey/questions/NPSQuestion.js.map +1 -0
- package/lib/survey/questions/PanelDynamicQuestion.d.ts +50 -0
- package/lib/survey/questions/PanelDynamicQuestion.d.ts.map +1 -0
- package/lib/survey/questions/PanelDynamicQuestion.js +62 -0
- package/lib/survey/questions/PanelDynamicQuestion.js.map +1 -0
- package/lib/survey/questions/RankingQuestion.d.ts +34 -0
- package/lib/survey/questions/RankingQuestion.d.ts.map +1 -0
- package/lib/survey/questions/RankingQuestion.js +85 -0
- package/lib/survey/questions/RankingQuestion.js.map +1 -0
- package/lib/survey/questions/RatingQuestion.d.ts +20 -0
- package/lib/survey/questions/RatingQuestion.d.ts.map +1 -0
- package/lib/survey/questions/RatingQuestion.js +53 -0
- package/lib/survey/questions/RatingQuestion.js.map +1 -0
- package/lib/survey/questions/TextQuestion.d.ts +17 -0
- package/lib/survey/questions/TextQuestion.d.ts.map +1 -0
- package/lib/survey/questions/TextQuestion.js +46 -0
- package/lib/survey/questions/TextQuestion.js.map +1 -0
- package/lib/survey/styleContract.d.ts +230 -0
- package/lib/survey/styleContract.d.ts.map +1 -0
- package/lib/survey/styleContract.js +365 -0
- package/lib/survey/styleContract.js.map +1 -0
- package/lib/survey/themePalette.d.ts +56 -0
- package/lib/survey/themePalette.d.ts.map +1 -0
- package/lib/survey/themePalette.js +63 -0
- package/lib/survey/themePalette.js.map +1 -0
- package/lib/survey/translationLookup.d.ts +4 -0
- package/lib/survey/translationLookup.d.ts.map +1 -0
- package/lib/survey/translationLookup.js +62 -0
- package/lib/survey/translationLookup.js.map +1 -0
- package/lib/survey/validate.d.ts +3 -0
- package/lib/survey/validate.d.ts.map +1 -0
- package/lib/survey/validate.js +159 -0
- package/lib/survey/validate.js.map +1 -0
- package/lib/survey/variablesResolver.d.ts +10 -0
- package/lib/survey/variablesResolver.d.ts.map +1 -0
- package/lib/survey/variablesResolver.js +107 -0
- package/lib/survey/variablesResolver.js.map +1 -0
- package/lib/survey/voiceParsers.d.ts +47 -0
- package/lib/survey/voiceParsers.d.ts.map +1 -0
- package/lib/survey/voiceParsers.js +310 -0
- package/lib/survey/voiceParsers.js.map +1 -0
- package/lib/types.d.ts +349 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +20 -0
- package/lib/types.js.map +1 -0
- package/metro.js +55 -0
- package/package.json +78 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Survey style contract — the shared theming vocabulary.
|
|
4
|
+
*
|
|
5
|
+
* Why this exists
|
|
6
|
+
* ---------------
|
|
7
|
+
* `customCss` cannot work on React Native: RN has no CSS engine, so arbitrary
|
|
8
|
+
* CSS has nothing to act on. Rather than accept a permanent styling gap between
|
|
9
|
+
* web and mobile, theming moves to a *structured* contract that both platforms
|
|
10
|
+
* implement. A customer brands once; it applies everywhere.
|
|
11
|
+
*
|
|
12
|
+
* The trade, stated honestly: this is comprehensive, not arbitrary. Every
|
|
13
|
+
* surface the renderer draws is themeable. Author-invented selectors, cascade
|
|
14
|
+
* tricks and layout restructuring are not — those stay web-only via `customCss`.
|
|
15
|
+
*
|
|
16
|
+
* Relationship to `themePalette.ts`
|
|
17
|
+
* ---------------------------------
|
|
18
|
+
* `ThemePalette` (9 fields) is the shipped subset of this contract and stays
|
|
19
|
+
* working — `toLegacyPalette()` derives it, so existing callers and any host app
|
|
20
|
+
* passing `brandingPalette` are unaffected. This widens the vocabulary from 9
|
|
21
|
+
* fields to full coverage of the ~200 style properties the native renderer sets.
|
|
22
|
+
*
|
|
23
|
+
* Web mapping
|
|
24
|
+
* -----------
|
|
25
|
+
* The web renderer exposes the same concepts as `--vp-color-*` / `--vp-fs-*`
|
|
26
|
+
* custom properties. Field names here are the canonical vocabulary; the web side
|
|
27
|
+
* maps onto them. `CSS_VAR_MAP` at the bottom records that mapping so the two
|
|
28
|
+
* cannot drift silently.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
exports.CSS_VAR_MAP = exports.LIGHT_CONTRACT = exports.DARK_CONTRACT = void 0;
|
|
32
|
+
exports.resolveStyleContract = resolveStyleContract;
|
|
33
|
+
exports.toLegacyPalette = toLegacyPalette;
|
|
34
|
+
exports.fromAuthoredPalette = fromAuthoredPalette;
|
|
35
|
+
/* ------------------------------------------------------------------ defaults */
|
|
36
|
+
/**
|
|
37
|
+
* Numeric defaults are the values the native renderer SHIPS, audited from the
|
|
38
|
+
* StyleSheets at git HEAD — not idealised values. Changing any of them changes
|
|
39
|
+
* how every unstyled survey looks, so they are deliberately unlovely:
|
|
40
|
+
* `ratingRadius` is 12 while `npsRadius` is 8 because the two components
|
|
41
|
+
* genuinely differ today. Unifying them is a design decision for later, not
|
|
42
|
+
* something this migration should smuggle in.
|
|
43
|
+
*/
|
|
44
|
+
const SHARED = {
|
|
45
|
+
cardRadius: 20, // SurveyModal.card
|
|
46
|
+
cardPadding: 24, // SurveyModal.card
|
|
47
|
+
// Per-side padding. Unset means "use cardPadding", which is why these carry
|
|
48
|
+
// no numeric default — a default here would silently win over the shorthand.
|
|
49
|
+
cardPaddingTop: undefined,
|
|
50
|
+
cardPaddingRight: undefined,
|
|
51
|
+
cardPaddingBottom: undefined,
|
|
52
|
+
cardPaddingLeft: undefined,
|
|
53
|
+
inputRadius: 12, // TextQuestion / DateQuestion
|
|
54
|
+
optionRadius: 12, // MultipleChoiceQuestion row
|
|
55
|
+
ratingRadius: 12, // RatingQuestion button
|
|
56
|
+
npsRadius: 8, // NPSQuestion button — genuinely differs from rating
|
|
57
|
+
buttonRadius: 12, // SurveyModal back/next
|
|
58
|
+
buttonPaddingY: 14, // SurveyModal back/next — the prior literal
|
|
59
|
+
buttonFontSize: 15, // back/next label — the prior literal
|
|
60
|
+
fontSizeHeading: 20,
|
|
61
|
+
fontSizeLabel: 15,
|
|
62
|
+
fontSizeInput: 15,
|
|
63
|
+
fontSizeDescription: 13,
|
|
64
|
+
fontSizeSmall: 12,
|
|
65
|
+
fontWeightHeading: '600',
|
|
66
|
+
fontWeightLabel: '500',
|
|
67
|
+
lineHeightBody: 1.5,
|
|
68
|
+
fieldGap: 8, // RatingQuestion row gap
|
|
69
|
+
sectionGap: 20,
|
|
70
|
+
topRuleHeight: 0,
|
|
71
|
+
};
|
|
72
|
+
exports.DARK_CONTRACT = {
|
|
73
|
+
...SHARED,
|
|
74
|
+
accent: '#D6F551',
|
|
75
|
+
accentHover: '#C3E144',
|
|
76
|
+
accentText: '#030712',
|
|
77
|
+
ground: 'rgba(0,0,0,0.6)',
|
|
78
|
+
card: 'rgba(17,24,39,0.95)',
|
|
79
|
+
cardBorder: 'rgba(255,255,255,0.1)',
|
|
80
|
+
input: 'rgba(255,255,255,0.06)',
|
|
81
|
+
inputBorder: 'rgba(255,255,255,0.12)',
|
|
82
|
+
inputText: '#ffffff',
|
|
83
|
+
placeholder: 'rgba(255,255,255,0.3)',
|
|
84
|
+
inputFocusBorder: '#D6F551',
|
|
85
|
+
inputErrorBorder: '#f87171',
|
|
86
|
+
// #f87171 (Tailwind red-400) is a deliberate SDK choice, tuned to read on the
|
|
87
|
+
// dark card — not the web renderer's danger red. See SurveyModal:1254.
|
|
88
|
+
errorText: '#f87171',
|
|
89
|
+
headingColor: '#ffffff',
|
|
90
|
+
textPrimary: '#ffffff',
|
|
91
|
+
textSecondary: 'rgba(255,255,255,0.8)',
|
|
92
|
+
textMuted: 'rgba(255,255,255,0.5)',
|
|
93
|
+
optionBg: 'rgba(255,255,255,0.06)',
|
|
94
|
+
optionBorder: 'rgba(255,255,255,0.12)',
|
|
95
|
+
optionSelectedBg: '#D6F5511A', // accent + 1A — matches the shipped `${primaryColor}1A`
|
|
96
|
+
optionSelectedBorder: '#D6F551',
|
|
97
|
+
indicatorBorder: 'rgba(255,255,255,0.3)',
|
|
98
|
+
indicatorChecked: '#D6F551',
|
|
99
|
+
// Audited from RatingQuestion/NPSQuestion StyleSheets — these are 0.08/0.15,
|
|
100
|
+
// deliberately NOT the palette's 0.06/0.12. In dark theme SurveyModal passes
|
|
101
|
+
// `palette={isLight ? palette : undefined}`, so the StyleSheet values are what
|
|
102
|
+
// actually render. Matching the palette here would change dark appearance.
|
|
103
|
+
ratingBg: 'rgba(255,255,255,0.08)',
|
|
104
|
+
ratingBorder: 'rgba(255,255,255,0.15)',
|
|
105
|
+
ratingText: 'rgba(255,255,255,0.8)',
|
|
106
|
+
ratingEmpty: 'rgba(255,255,255,0.3)',
|
|
107
|
+
ratingFilledBg: '#D6F551',
|
|
108
|
+
ratingFilledBorder: '#D6F551',
|
|
109
|
+
ratingFilledText: '#030712',
|
|
110
|
+
primaryBg: '#D6F551',
|
|
111
|
+
primaryText: '#030712',
|
|
112
|
+
primaryBorder: '#D6F551',
|
|
113
|
+
// Audited from SurveyModal.backButton — not 'transparent'/0.2 as first drafted.
|
|
114
|
+
secondaryBg: 'rgba(255,255,255,0.08)',
|
|
115
|
+
secondaryText: 'rgba(255,255,255,0.8)',
|
|
116
|
+
secondaryBorder: 'rgba(255,255,255,0.12)',
|
|
117
|
+
closeBg: 'rgba(255,255,255,0.1)',
|
|
118
|
+
closeText: 'rgba(255,255,255,0.6)',
|
|
119
|
+
brandNameColor: 'rgba(255,255,255,0.7)',
|
|
120
|
+
descriptionColor: 'rgba(255,255,255,0.6)',
|
|
121
|
+
progressText: 'rgba(255,255,255,0.4)',
|
|
122
|
+
progressTrack: 'rgba(255,255,255,0.08)',
|
|
123
|
+
requiredMark: '#ef4444',
|
|
124
|
+
chipBg: 'rgba(255,255,255,0.04)',
|
|
125
|
+
chipBorder: 'rgba(255,255,255,0.12)',
|
|
126
|
+
chipText: 'rgba(255,255,255,0.7)',
|
|
127
|
+
hintBg: 'rgba(255,255,255,0.04)',
|
|
128
|
+
hintBorder: 'rgba(255,255,255,0.08)',
|
|
129
|
+
hintText: 'rgba(255,255,255,0.55)',
|
|
130
|
+
topRuleColor: '#D6F551',
|
|
131
|
+
};
|
|
132
|
+
/** Not a naive inversion — values are re-chosen to hold contrast on a pale ground. */
|
|
133
|
+
exports.LIGHT_CONTRACT = {
|
|
134
|
+
...SHARED,
|
|
135
|
+
accent: '#65a30d',
|
|
136
|
+
accentHover: '#4d7c0f',
|
|
137
|
+
accentText: '#ffffff',
|
|
138
|
+
ground: 'rgba(0,0,0,0.4)',
|
|
139
|
+
card: '#ffffff',
|
|
140
|
+
cardBorder: 'rgba(0,0,0,0.08)',
|
|
141
|
+
input: 'rgba(0,0,0,0.03)',
|
|
142
|
+
inputBorder: 'rgba(0,0,0,0.08)',
|
|
143
|
+
inputText: '#111827',
|
|
144
|
+
placeholder: 'rgba(0,0,0,0.4)',
|
|
145
|
+
inputFocusBorder: '#65a30d',
|
|
146
|
+
inputErrorBorder: '#C22F38',
|
|
147
|
+
errorText: '#C22F38',
|
|
148
|
+
headingColor: '#0f172a',
|
|
149
|
+
textPrimary: '#111827',
|
|
150
|
+
textSecondary: 'rgba(0,0,0,0.75)',
|
|
151
|
+
textMuted: 'rgba(0,0,0,0.5)',
|
|
152
|
+
// Mirrors LIGHT's palette.input — light-theme option rows used palette.input,
|
|
153
|
+
// not white. Verified by the equivalence test.
|
|
154
|
+
optionBg: 'rgba(0,0,0,0.03)',
|
|
155
|
+
optionBorder: 'rgba(0,0,0,0.08)',
|
|
156
|
+
optionSelectedBg: '#65a30d1A', // accent + 1A
|
|
157
|
+
optionSelectedBorder: '#65a30d',
|
|
158
|
+
indicatorBorder: 'rgba(0,0,0,0.25)',
|
|
159
|
+
indicatorChecked: '#65a30d',
|
|
160
|
+
// Light theme receives the palette, so these mirror LIGHT's input/border/
|
|
161
|
+
// textSecondary rather than the dark StyleSheet values.
|
|
162
|
+
ratingBg: 'rgba(0,0,0,0.03)',
|
|
163
|
+
ratingBorder: 'rgba(0,0,0,0.08)',
|
|
164
|
+
ratingText: 'rgba(0,0,0,0.75)',
|
|
165
|
+
ratingEmpty: 'rgba(0,0,0,0.3)',
|
|
166
|
+
ratingFilledBg: '#65a30d',
|
|
167
|
+
ratingFilledBorder: '#65a30d',
|
|
168
|
+
ratingFilledText: '#ffffff',
|
|
169
|
+
primaryBg: '#65a30d',
|
|
170
|
+
primaryText: '#ffffff',
|
|
171
|
+
primaryBorder: '#65a30d',
|
|
172
|
+
secondaryBg: 'rgba(0,0,0,0.06)',
|
|
173
|
+
secondaryText: 'rgba(0,0,0,0.75)',
|
|
174
|
+
secondaryBorder: 'rgba(0,0,0,0.12)',
|
|
175
|
+
closeBg: 'rgba(0,0,0,0.06)',
|
|
176
|
+
closeText: 'rgba(0,0,0,0.6)',
|
|
177
|
+
brandNameColor: 'rgba(0,0,0,0.7)',
|
|
178
|
+
descriptionColor: 'rgba(0,0,0,0.6)',
|
|
179
|
+
progressText: 'rgba(0,0,0,0.4)',
|
|
180
|
+
progressTrack: 'rgba(0,0,0,0.08)',
|
|
181
|
+
requiredMark: '#C22F38',
|
|
182
|
+
chipBg: 'rgba(0,0,0,0.04)',
|
|
183
|
+
chipBorder: 'rgba(0,0,0,0.12)',
|
|
184
|
+
chipText: 'rgba(0,0,0,0.7)',
|
|
185
|
+
hintBg: 'rgba(0,0,0,0.04)',
|
|
186
|
+
hintBorder: 'rgba(0,0,0,0.08)',
|
|
187
|
+
hintText: 'rgba(0,0,0,0.55)',
|
|
188
|
+
topRuleColor: '#65a30d',
|
|
189
|
+
};
|
|
190
|
+
/* ------------------------------------------------------------------ resolve */
|
|
191
|
+
/**
|
|
192
|
+
* Resolve the contract for a render.
|
|
193
|
+
*
|
|
194
|
+
* Precedence, HIGHEST first — deliberately identical to the shipped
|
|
195
|
+
* `themePalette()` so ownership rules do not change:
|
|
196
|
+
* 1. `initOverride` — the host app, via CXPinsight.init({ brandingPalette })
|
|
197
|
+
* 2. `surveyOverride` — survey.branding.palette
|
|
198
|
+
* 3. `primaryColor` — convenience, fans out to every accent-derived field
|
|
199
|
+
* 4. theme defaults (light | dark)
|
|
200
|
+
*
|
|
201
|
+
* The host app wins because it owns the surface the survey appears on: an app in
|
|
202
|
+
* a dark skin must be able to stop a survey rendering light inside it. This
|
|
203
|
+
* matches themePalette()'s documented layering — do not invert it.
|
|
204
|
+
*
|
|
205
|
+
* Also mirrors themePalette()'s *truthy* override test: a field present but
|
|
206
|
+
* empty/undefined falls through rather than blanking the value, which a plain
|
|
207
|
+
* object spread would not do.
|
|
208
|
+
*/
|
|
209
|
+
function resolveStyleContract(args) {
|
|
210
|
+
const base = args.theme === 'light' ? exports.LIGHT_CONTRACT : exports.DARK_CONTRACT;
|
|
211
|
+
// A single primaryColor should be enough for most brands, so fan it out to
|
|
212
|
+
// every field an accent legitimately drives.
|
|
213
|
+
const fromPrimary = args.primaryColor
|
|
214
|
+
? {
|
|
215
|
+
accent: args.primaryColor,
|
|
216
|
+
accentHover: args.primaryColor,
|
|
217
|
+
primaryBg: args.primaryColor,
|
|
218
|
+
primaryBorder: args.primaryColor,
|
|
219
|
+
inputFocusBorder: args.primaryColor,
|
|
220
|
+
indicatorChecked: args.primaryColor,
|
|
221
|
+
// Shipped behaviour: the selected option tint is the accent at 1A alpha.
|
|
222
|
+
optionSelectedBg: `${args.primaryColor}1A`,
|
|
223
|
+
optionSelectedBorder: args.primaryColor,
|
|
224
|
+
ratingFilledBg: args.primaryColor,
|
|
225
|
+
ratingFilledBorder: args.primaryColor,
|
|
226
|
+
topRuleColor: args.primaryColor,
|
|
227
|
+
}
|
|
228
|
+
: {};
|
|
229
|
+
const out = { ...base, ...fromPrimary };
|
|
230
|
+
const so = args.surveyOverride || {};
|
|
231
|
+
const io = args.initOverride || {};
|
|
232
|
+
// Iterate the UNION of base keys and override keys, not just the base:
|
|
233
|
+
// optional fields (fontFamily, fontFamilyHeading) have no default, so they are
|
|
234
|
+
// absent from `base` and iterating it alone made them impossible to set.
|
|
235
|
+
const keys = new Set([
|
|
236
|
+
...Object.keys(base),
|
|
237
|
+
...Object.keys(so),
|
|
238
|
+
...Object.keys(io),
|
|
239
|
+
]);
|
|
240
|
+
// Presence, not truthiness. A truthy test silently discarded every ZERO an
|
|
241
|
+
// author set — padding 0, radius 0, a square corner — because 0 is falsy. It
|
|
242
|
+
// was invisible while the contract held only colours and non-zero sizes; per-
|
|
243
|
+
// side padding makes 0 an ordinary value, so the test has to mean what it says.
|
|
244
|
+
const isSet = (v) => v !== undefined && v !== null && v !== '';
|
|
245
|
+
keys.forEach((k) => {
|
|
246
|
+
if (isSet(io[k]))
|
|
247
|
+
out[k] = io[k];
|
|
248
|
+
else if (isSet(so[k]))
|
|
249
|
+
out[k] = so[k];
|
|
250
|
+
});
|
|
251
|
+
return out;
|
|
252
|
+
}
|
|
253
|
+
/** Existing callers of themePalette() keep the exact same shape. */
|
|
254
|
+
function toLegacyPalette(c) {
|
|
255
|
+
return {
|
|
256
|
+
card: c.card,
|
|
257
|
+
cardBorder: c.cardBorder,
|
|
258
|
+
input: c.input,
|
|
259
|
+
inputBorder: c.inputBorder,
|
|
260
|
+
textPrimary: c.textPrimary,
|
|
261
|
+
textSecondary: c.textSecondary,
|
|
262
|
+
textMuted: c.textMuted,
|
|
263
|
+
placeholder: c.placeholder,
|
|
264
|
+
indicatorBorder: c.indicatorBorder,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/* ------------------------------------------------------------- web alignment */
|
|
268
|
+
/**
|
|
269
|
+
* Which web custom property carries each contract field.
|
|
270
|
+
*
|
|
271
|
+
* `null` means the web renderer has no dedicated property yet — those are the
|
|
272
|
+
* additive gaps to fill so both platforms cover the same surface. Recording
|
|
273
|
+
* them here (rather than in prose) means a golden test can assert the two
|
|
274
|
+
* implementations haven't drifted.
|
|
275
|
+
*/
|
|
276
|
+
exports.CSS_VAR_MAP = {
|
|
277
|
+
accent: '--vp-color-accent',
|
|
278
|
+
accentHover: '--vp-color-accent-dark',
|
|
279
|
+
accentText: null,
|
|
280
|
+
card: null,
|
|
281
|
+
cardBorder: null,
|
|
282
|
+
input: '--vp-color-input-bg',
|
|
283
|
+
inputBorder: '--vp-color-input-border',
|
|
284
|
+
inputText: '--vp-color-text',
|
|
285
|
+
placeholder: null,
|
|
286
|
+
textPrimary: '--vp-color-text',
|
|
287
|
+
textSecondary: '--vp-color-text-muted',
|
|
288
|
+
textMuted: '--vp-color-text-faint',
|
|
289
|
+
indicatorBorder: null,
|
|
290
|
+
fontFamily: '--vp-font-family',
|
|
291
|
+
fontSizeLabel: '--vp-fs-label',
|
|
292
|
+
fontSizeInput: '--vp-fs-input',
|
|
293
|
+
fontSizeDescription: '--vp-fs-desc',
|
|
294
|
+
fontSizeSmall: '--vp-fs-error',
|
|
295
|
+
cardRadius: '--vp-radius',
|
|
296
|
+
};
|
|
297
|
+
/**
|
|
298
|
+
* Translate an authored palette into a contract override.
|
|
299
|
+
*
|
|
300
|
+
* One author field legitimately fans out to several contract fields: `border`
|
|
301
|
+
* covers input, option and rating outlines, because the web renderer's single
|
|
302
|
+
* `--vp-color-input-border` reaches all three.
|
|
303
|
+
*
|
|
304
|
+
* ⚠ The text tiers are OFF BY ONE between the two vocabularies:
|
|
305
|
+
* authored `text` → contract `textPrimary`
|
|
306
|
+
* authored `textMuted` → contract `textSecondary` (not `textMuted`!)
|
|
307
|
+
* authored `textFaint` → contract `textMuted` + `placeholder`
|
|
308
|
+
* This mirrors the web token names exactly. Do not "simplify" it.
|
|
309
|
+
*
|
|
310
|
+
* Keys that are already contract field names pass through untouched, so a
|
|
311
|
+
* palette written against the SDK vocabulary still works.
|
|
312
|
+
*/
|
|
313
|
+
function fromAuthoredPalette(authored) {
|
|
314
|
+
if (!authored)
|
|
315
|
+
return {};
|
|
316
|
+
const a = authored;
|
|
317
|
+
const out = {};
|
|
318
|
+
const set = (k, v) => {
|
|
319
|
+
if (v)
|
|
320
|
+
out[k] = v;
|
|
321
|
+
};
|
|
322
|
+
// Surface
|
|
323
|
+
set('ground', a.bg);
|
|
324
|
+
// Text tiers — note the deliberate off-by-one against the authored names.
|
|
325
|
+
set('textPrimary', a.text);
|
|
326
|
+
set('inputText', a.text);
|
|
327
|
+
set('headingColor', a.text);
|
|
328
|
+
set('textSecondary', a.textMuted);
|
|
329
|
+
set('ratingText', a.textMuted);
|
|
330
|
+
set('textMuted', a.textFaint);
|
|
331
|
+
set('placeholder', a.textFaint);
|
|
332
|
+
// Borders — one authored field, three surfaces.
|
|
333
|
+
set('cardBorder', a.border);
|
|
334
|
+
set('inputBorder', a.border);
|
|
335
|
+
set('optionBorder', a.border);
|
|
336
|
+
set('ratingBorder', a.border);
|
|
337
|
+
// Card-ish surfaces
|
|
338
|
+
set('card', a.cardBg);
|
|
339
|
+
set('optionBg', a.cardBg);
|
|
340
|
+
// Input-ish surfaces
|
|
341
|
+
set('input', a.inputBg);
|
|
342
|
+
set('ratingBg', a.inputBg);
|
|
343
|
+
// Touch has no hover; the nearest meaningful analogue is the selected row.
|
|
344
|
+
set('optionSelectedBg', a.hoverBg);
|
|
345
|
+
// Pass through anything already named as a contract field, so a palette
|
|
346
|
+
// authored against the SDK vocabulary (or a future widened editor) still works.
|
|
347
|
+
//
|
|
348
|
+
// AUTHORED_KEYS is excluded because `textMuted` exists in BOTH vocabularies
|
|
349
|
+
// with DIFFERENT meanings: authored `textMuted` is the SECONDARY tier, while
|
|
350
|
+
// contract `textMuted` is the FAINT tier. Without this exclusion the loop
|
|
351
|
+
// clobbers the correctly-mapped value with the wrong tier.
|
|
352
|
+
const AUTHORED_KEYS = new Set([
|
|
353
|
+
'bg', 'text', 'textMuted', 'textFaint', 'border', 'cardBg', 'inputBg', 'hoverBg',
|
|
354
|
+
]);
|
|
355
|
+
const contractKeys = Object.keys(exports.DARK_CONTRACT);
|
|
356
|
+
for (const k of contractKeys) {
|
|
357
|
+
if (AUTHORED_KEYS.has(k))
|
|
358
|
+
continue;
|
|
359
|
+
const v = a[k];
|
|
360
|
+
if (v)
|
|
361
|
+
out[k] = v;
|
|
362
|
+
}
|
|
363
|
+
return out;
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=styleContract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styleContract.js","sourceRoot":"","sources":["../../src/survey/styleContract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type ThemeName = 'light' | 'dark';
|
|
2
|
+
export interface ThemePalette {
|
|
3
|
+
card: string;
|
|
4
|
+
cardBorder: string;
|
|
5
|
+
input: string;
|
|
6
|
+
inputBorder: string;
|
|
7
|
+
textPrimary: string;
|
|
8
|
+
textSecondary: string;
|
|
9
|
+
textMuted: string;
|
|
10
|
+
placeholder: string;
|
|
11
|
+
indicatorBorder: string;
|
|
12
|
+
}
|
|
13
|
+
/** Overrides shape accepted from either the survey's own branding or the
|
|
14
|
+
* host app's CXPinsight.init({ brandingPalette }). Every field optional
|
|
15
|
+
* so a caller can partial-override just what they care about. */
|
|
16
|
+
export interface PaletteOverride {
|
|
17
|
+
card?: string;
|
|
18
|
+
cardBorder?: string;
|
|
19
|
+
input?: string;
|
|
20
|
+
inputBorder?: string;
|
|
21
|
+
textPrimary?: string;
|
|
22
|
+
textSecondary?: string;
|
|
23
|
+
textMuted?: string;
|
|
24
|
+
placeholder?: string;
|
|
25
|
+
indicatorBorder?: string;
|
|
26
|
+
}
|
|
27
|
+
/** A platform/SDK named theme. `palette` carries per-mode overrides so a named
|
|
28
|
+
* theme resolves straight into themePalette()'s initOverride layer. */
|
|
29
|
+
export interface NamedTheme {
|
|
30
|
+
name: string;
|
|
31
|
+
label?: string;
|
|
32
|
+
theme?: ThemeName;
|
|
33
|
+
primaryColor?: string;
|
|
34
|
+
palette?: {
|
|
35
|
+
light?: PaletteOverride;
|
|
36
|
+
dark?: PaletteOverride;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Resolve init({ theme }) against the platform's named-theme library.
|
|
40
|
+
* Ownership (decided with the user): a platform theme of the same name
|
|
41
|
+
* OVERRIDES an SDK-supplied inline theme; else the SDK inline theme is used;
|
|
42
|
+
* else null (fall through to the survey/app default). `initTheme` is either a
|
|
43
|
+
* name string or an inline NamedTheme object. Pure — safe to unit-test. */
|
|
44
|
+
export declare function resolveNamedTheme(initTheme: string | NamedTheme | undefined | null, applicationThemes?: NamedTheme[] | null): NamedTheme | null;
|
|
45
|
+
/** Extract the PaletteOverride for the active mode from a resolved named theme,
|
|
46
|
+
* ready to pass as themePalette()'s initOverride. */
|
|
47
|
+
export declare function namedThemePaletteOverride(resolved: NamedTheme | null, mode: ThemeName): PaletteOverride | undefined;
|
|
48
|
+
/** Palette resolver with layered overrides (parity with the web widget's
|
|
49
|
+
* themePalette). Precedence highest → lowest:
|
|
50
|
+
* 1. `initOverride` — app passed to CXPinsight.init({ brandingPalette })
|
|
51
|
+
* 2. `surveyOverride` — survey.branding.palette on the survey definition
|
|
52
|
+
* 3. built-in DARK / LIGHT defaults
|
|
53
|
+
* Missing fields at each layer fall through — an author can override just
|
|
54
|
+
* `card` and leave everything else default. */
|
|
55
|
+
export declare function themePalette(theme: ThemeName | undefined, surveyOverride?: PaletteOverride, initOverride?: PaletteOverride): ThemePalette;
|
|
56
|
+
//# sourceMappingURL=themePalette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"themePalette.d.ts","sourceRoot":"","sources":["../../src/survey/themePalette.ts"],"names":[],"mappings":"AAoBA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAEzC,MAAM,WAAW,YAAY;IAE3B,IAAI,EAAS,MAAM,CAAC;IACpB,UAAU,EAAG,MAAM,CAAC;IACpB,KAAK,EAAQ,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IAEpB,WAAW,EAAI,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAM,MAAM,CAAC;IACtB,WAAW,EAAI,MAAM,CAAC;IAEtB,eAAe,EAAE,MAAM,CAAC;CACzB;AASD;;kEAEkE;AAClE,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;wEACwE;AACxE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,eAAe,CAAC;QAAC,IAAI,CAAC,EAAE,eAAe,CAAA;KAAE,CAAC;CAC/D;AAED;;;;4EAI4E;AAC5E,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI,EACjD,iBAAiB,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,GACtC,UAAU,GAAG,IAAI,CAQnB;AAED;sDACsD;AACtD,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,UAAU,GAAG,IAAI,EAC3B,IAAI,EAAE,SAAS,GACd,eAAe,GAAG,SAAS,CAG7B;AAED;;;;;;gDAMgD;AAChD,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,cAAc,CAAC,EAAE,eAAe,EAChC,YAAY,CAAC,EAAE,eAAe,GAC7B,YAAY,CAMd"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Theme palette (spec §24 branding.theme). Every surface color the
|
|
3
|
+
// mobile modal + question components render — bg, border, text
|
|
4
|
+
// variants, input backgrounds — routed through this single helper so
|
|
5
|
+
// the light-theme override lands in ONE place instead of duplicating
|
|
6
|
+
// the palette lookup at every StyleSheet site.
|
|
7
|
+
//
|
|
8
|
+
// Design decisions:
|
|
9
|
+
// - Dark is the SDK default. When the caller omits `theme` or
|
|
10
|
+
// passes anything but 'light', the palette returns the same
|
|
11
|
+
// values the base StyleSheets already hardcode; question
|
|
12
|
+
// components use `theme?.textPrimary` with a fallback so a
|
|
13
|
+
// missing palette silently keeps LTR/dark behavior.
|
|
14
|
+
// - Light-theme values match the web renderer's design tokens
|
|
15
|
+
// (near-black on white card, subtle grey borders, low-opacity
|
|
16
|
+
// muted secondary text).
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.resolveNamedTheme = resolveNamedTheme;
|
|
19
|
+
exports.namedThemePaletteOverride = namedThemePaletteOverride;
|
|
20
|
+
exports.themePalette = themePalette;
|
|
21
|
+
const styleContract_1 = require("./styleContract");
|
|
22
|
+
// Derived, not restated. styleContract.ts is the single source of truth for
|
|
23
|
+
// every value; these two exist so the shipped 9-field shape keeps working.
|
|
24
|
+
// A golden test asserts these stay byte-identical to what shipped.
|
|
25
|
+
const DARK = (0, styleContract_1.toLegacyPalette)(styleContract_1.DARK_CONTRACT);
|
|
26
|
+
const LIGHT = (0, styleContract_1.toLegacyPalette)(styleContract_1.LIGHT_CONTRACT);
|
|
27
|
+
/** Resolve init({ theme }) against the platform's named-theme library.
|
|
28
|
+
* Ownership (decided with the user): a platform theme of the same name
|
|
29
|
+
* OVERRIDES an SDK-supplied inline theme; else the SDK inline theme is used;
|
|
30
|
+
* else null (fall through to the survey/app default). `initTheme` is either a
|
|
31
|
+
* name string or an inline NamedTheme object. Pure — safe to unit-test. */
|
|
32
|
+
function resolveNamedTheme(initTheme, applicationThemes) {
|
|
33
|
+
if (!initTheme)
|
|
34
|
+
return null;
|
|
35
|
+
const name = typeof initTheme === 'string' ? initTheme : initTheme.name;
|
|
36
|
+
const lib = Array.isArray(applicationThemes) ? applicationThemes : [];
|
|
37
|
+
const platformMatch = name ? lib.find((t) => t && t.name === name) : undefined;
|
|
38
|
+
if (platformMatch)
|
|
39
|
+
return platformMatch; // platform overrides SDK
|
|
40
|
+
if (typeof initTheme === 'object')
|
|
41
|
+
return initTheme; // SDK inline theme
|
|
42
|
+
return null; // name-only, no library match
|
|
43
|
+
}
|
|
44
|
+
/** Extract the PaletteOverride for the active mode from a resolved named theme,
|
|
45
|
+
* ready to pass as themePalette()'s initOverride. */
|
|
46
|
+
function namedThemePaletteOverride(resolved, mode) {
|
|
47
|
+
if (!resolved || !resolved.palette)
|
|
48
|
+
return undefined;
|
|
49
|
+
return resolved.palette[mode];
|
|
50
|
+
}
|
|
51
|
+
/** Palette resolver with layered overrides (parity with the web widget's
|
|
52
|
+
* themePalette). Precedence highest → lowest:
|
|
53
|
+
* 1. `initOverride` — app passed to CXPinsight.init({ brandingPalette })
|
|
54
|
+
* 2. `surveyOverride` — survey.branding.palette on the survey definition
|
|
55
|
+
* 3. built-in DARK / LIGHT defaults
|
|
56
|
+
* Missing fields at each layer fall through — an author can override just
|
|
57
|
+
* `card` and leave everything else default. */
|
|
58
|
+
function themePalette(theme, surveyOverride, initOverride) {
|
|
59
|
+
// Delegates to the contract resolver so precedence lives in exactly one
|
|
60
|
+
// place. Behaviour is unchanged — see the golden test.
|
|
61
|
+
return (0, styleContract_1.toLegacyPalette)((0, styleContract_1.resolveStyleContract)({ theme, surveyOverride, initOverride }));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=themePalette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"themePalette.js","sourceRoot":"","sources":["../../src/survey/themePalette.ts"],"names":[],"mappings":";AAAA,mEAAmE;AACnE,+DAA+D;AAC/D,qEAAqE;AACrE,qEAAqE;AACrE,+CAA+C;AAC/C,EAAE;AACF,oBAAoB;AACpB,gEAAgE;AAChE,gEAAgE;AAChE,6DAA6D;AAC7D,+DAA+D;AAC/D,wDAAwD;AACxD,gEAAgE;AAChE,kEAAkE;AAClE,6BAA6B;;;;;AAE7B,mDAEyB;AAmBzB,4EAA4E;AAC5E,2EAA2E;AAC3E,mEAAmE;AACnE,MAAM,IAAI,GAAiB,IAAA,+BAAe,EAAC,6BAAa,CAAC,CAAC;AAE1D,MAAM,KAAK,GAAiB,IAAA,+BAAe,EAAC,8BAAc,CAAC,CAAC;AA2B5D;;;;4EAI4E;AAC5E,2BACE,SAAiD,EACjD,iBAAuC;IAEvC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,IAAI,GAAG,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;IACxE,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC,CAAc,yBAAyB;IAC/E,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC,CAAE,mBAAmB;IACzE,OAAO,IAAI,CAAC,CAA0C,8BAA8B;AACtF,CAAC;AAED;sDACsD;AACtD,mCACE,QAA2B,EAC3B,IAAe;IAEf,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IACrD,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;;;gDAMgD;AAChD,sBACE,KAA4B,EAC5B,cAAgC,EAChC,YAA8B;IAE9B,wEAAwE;IACxE,uDAAuD;IACvD,OAAO,IAAA,+BAAe,EACpB,IAAA,oCAAoB,EAAC,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAC9D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { SurveyDefinition } from '../types';
|
|
2
|
+
export declare function surveyText(survey: SurveyDefinition, lang: string | undefined, field: 'title' | 'description' | 'thankYouMessage', fallback: string | undefined): string | undefined;
|
|
3
|
+
export declare function questionText(survey: SurveyDefinition, lang: string | undefined, qId: string, field: 'text' | 'description', fallback: string | undefined): string | undefined;
|
|
4
|
+
//# sourceMappingURL=translationLookup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translationLookup.d.ts","sourceRoot":"","sources":["../../src/survey/translationLookup.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAmBjD,wBAAgB,UAAU,CACxB,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,OAAO,GAAG,aAAa,GAAG,iBAAiB,EAClD,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,GAAG,SAAS,CAKpB;AAKD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,aAAa,EAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,GAAG,SAAS,CASpB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Translation text lookup — spec §26.1 shape:
|
|
3
|
+
//
|
|
4
|
+
// translations[langCode] = {
|
|
5
|
+
// title?, description?, thankYouMessage?,
|
|
6
|
+
// questions?: { [qId]: { text?, description?, ... } },
|
|
7
|
+
// sections?: { [sId]: { title?, description? } },
|
|
8
|
+
// }
|
|
9
|
+
//
|
|
10
|
+
// Callers pass the survey definition, the currently-selected
|
|
11
|
+
// language code, and the field path they want localized. The lookup
|
|
12
|
+
// walks translations[lang] and returns the override if present,
|
|
13
|
+
// otherwise the caller-supplied fallback (usually the authored text
|
|
14
|
+
// on the base question/survey object).
|
|
15
|
+
//
|
|
16
|
+
// Defensive lookup — the translations blob is stored as
|
|
17
|
+
// Record<string, unknown> at the type level, so every hop is
|
|
18
|
+
// null-safe. A malformed translations key (e.g. `questions` as an
|
|
19
|
+
// array instead of a map) silently falls through to the fallback,
|
|
20
|
+
// matching web renderer behavior.
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.surveyText = surveyText;
|
|
23
|
+
exports.questionText = questionText;
|
|
24
|
+
// Read `translations[lang]` cheaply and safely. Returns null when
|
|
25
|
+
// there's no entry for this language OR when the entry isn't an
|
|
26
|
+
// object (older servers occasionally send an empty string).
|
|
27
|
+
function translationsFor(survey, lang) {
|
|
28
|
+
if (!lang)
|
|
29
|
+
return null;
|
|
30
|
+
const t = survey.translations?.[lang];
|
|
31
|
+
if (!t || typeof t !== 'object' || Array.isArray(t))
|
|
32
|
+
return null;
|
|
33
|
+
return t;
|
|
34
|
+
}
|
|
35
|
+
// Survey-level string lookup: title, description, thankYouMessage.
|
|
36
|
+
// Falls back to `fallback` when the translations override is absent
|
|
37
|
+
// or empty (empty string is treated as "no translation" per web
|
|
38
|
+
// renderer — otherwise a blank `title` field silently blanks the UI).
|
|
39
|
+
function surveyText(survey, lang, field, fallback) {
|
|
40
|
+
const t = translationsFor(survey, lang);
|
|
41
|
+
const v = t?.[field];
|
|
42
|
+
if (typeof v === 'string' && v.length > 0)
|
|
43
|
+
return v;
|
|
44
|
+
return fallback;
|
|
45
|
+
}
|
|
46
|
+
// Question-level string lookup — `text` or `description`.
|
|
47
|
+
// translations[lang].questions[qId][field] takes precedence over the
|
|
48
|
+
// authored field on the question object.
|
|
49
|
+
function questionText(survey, lang, qId, field, fallback) {
|
|
50
|
+
const t = translationsFor(survey, lang);
|
|
51
|
+
const questions = t?.questions;
|
|
52
|
+
if (!questions || typeof questions !== 'object' || Array.isArray(questions))
|
|
53
|
+
return fallback;
|
|
54
|
+
const q = questions[qId];
|
|
55
|
+
if (!q || typeof q !== 'object' || Array.isArray(q))
|
|
56
|
+
return fallback;
|
|
57
|
+
const v = q[field];
|
|
58
|
+
if (typeof v === 'string' && v.length > 0)
|
|
59
|
+
return v;
|
|
60
|
+
return fallback;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=translationLookup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translationLookup.js","sourceRoot":"","sources":["../../src/survey/translationLookup.ts"],"names":[],"mappings":";AAAA,8CAA8C;AAC9C,EAAE;AACF,+BAA+B;AAC/B,8CAA8C;AAC9C,2DAA2D;AAC3D,uDAAuD;AACvD,MAAM;AACN,EAAE;AACF,6DAA6D;AAC7D,oEAAoE;AACpE,gEAAgE;AAChE,oEAAoE;AACpE,uCAAuC;AACvC,EAAE;AACF,wDAAwD;AACxD,6DAA6D;AAC7D,kEAAkE;AAClE,kEAAkE;AAClE,kCAAkC;;;;AAIlC,kEAAkE;AAClE,gEAAgE;AAChE,4DAA4D;AAC5D,SAAS,eAAe,CACtB,MAAwB,EACxB,IAAwB;IAExB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,mEAAmE;AACnE,oEAAoE;AACpE,gEAAgE;AAChE,sEAAsE;AACtE,oBACE,MAAwB,EACxB,IAAwB,EACxB,KAAkD,EAClD,QAA4B;IAE5B,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,0DAA0D;AAC1D,qEAAqE;AACrE,yCAAyC;AACzC,sBACE,MAAwB,EACxB,IAAwB,EACxB,GAAW,EACX,KAA6B,EAC7B,QAA4B;IAE5B,MAAM,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,CAAC,EAAE,SAAS,CAAC;IAC/B,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7F,MAAM,CAAC,GAAI,SAAqC,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrE,MAAM,CAAC,GAAI,CAA6B,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/survey/validate.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAK/C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWtF"}
|