@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.
Files changed (253) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +131 -0
  3. package/babel.js +101 -0
  4. package/instrumented/Pressable.d.ts +2 -0
  5. package/instrumented/Pressable.js +2 -0
  6. package/instrumented/ScrollView.d.ts +2 -0
  7. package/instrumented/ScrollView.js +2 -0
  8. package/instrumented/TextInput.d.ts +2 -0
  9. package/instrumented/TextInput.js +2 -0
  10. package/instrumented/TouchableOpacity.d.ts +2 -0
  11. package/instrumented/TouchableOpacity.js +2 -0
  12. package/lib/CXPinsight.d.ts +113 -0
  13. package/lib/CXPinsight.d.ts.map +1 -0
  14. package/lib/CXPinsight.js +831 -0
  15. package/lib/CXPinsight.js.map +1 -0
  16. package/lib/CXPinsightProvider.d.ts +19 -0
  17. package/lib/CXPinsightProvider.d.ts.map +1 -0
  18. package/lib/CXPinsightProvider.js +382 -0
  19. package/lib/CXPinsightProvider.js.map +1 -0
  20. package/lib/core/autoScreenTracker.d.ts +20 -0
  21. package/lib/core/autoScreenTracker.d.ts.map +1 -0
  22. package/lib/core/autoScreenTracker.js +66 -0
  23. package/lib/core/autoScreenTracker.js.map +1 -0
  24. package/lib/core/deepLinkTracker.d.ts +17 -0
  25. package/lib/core/deepLinkTracker.d.ts.map +1 -0
  26. package/lib/core/deepLinkTracker.js +81 -0
  27. package/lib/core/deepLinkTracker.js.map +1 -0
  28. package/lib/core/deviceInfo.d.ts +14 -0
  29. package/lib/core/deviceInfo.d.ts.map +1 -0
  30. package/lib/core/deviceInfo.js +166 -0
  31. package/lib/core/deviceInfo.js.map +1 -0
  32. package/lib/core/eventQueue.d.ts +23 -0
  33. package/lib/core/eventQueue.d.ts.map +1 -0
  34. package/lib/core/eventQueue.js +240 -0
  35. package/lib/core/eventQueue.js.map +1 -0
  36. package/lib/core/lifecycle.d.ts +18 -0
  37. package/lib/core/lifecycle.d.ts.map +1 -0
  38. package/lib/core/lifecycle.js +127 -0
  39. package/lib/core/lifecycle.js.map +1 -0
  40. package/lib/core/mobileRecorder.d.ts +15 -0
  41. package/lib/core/mobileRecorder.d.ts.map +1 -0
  42. package/lib/core/mobileRecorder.js +231 -0
  43. package/lib/core/mobileRecorder.js.map +1 -0
  44. package/lib/core/network.d.ts +10 -0
  45. package/lib/core/network.d.ts.map +1 -0
  46. package/lib/core/network.js +74 -0
  47. package/lib/core/network.js.map +1 -0
  48. package/lib/core/networkCapture.d.ts +22 -0
  49. package/lib/core/networkCapture.d.ts.map +1 -0
  50. package/lib/core/networkCapture.js +100 -0
  51. package/lib/core/networkCapture.js.map +1 -0
  52. package/lib/core/scrollCapture.d.ts +48 -0
  53. package/lib/core/scrollCapture.d.ts.map +1 -0
  54. package/lib/core/scrollCapture.js +221 -0
  55. package/lib/core/scrollCapture.js.map +1 -0
  56. package/lib/core/session.d.ts +15 -0
  57. package/lib/core/session.d.ts.map +1 -0
  58. package/lib/core/session.js +157 -0
  59. package/lib/core/session.js.map +1 -0
  60. package/lib/core/storage.d.ts +11 -0
  61. package/lib/core/storage.d.ts.map +1 -0
  62. package/lib/core/storage.js +59 -0
  63. package/lib/core/storage.js.map +1 -0
  64. package/lib/core/triggerEngine.d.ts +56 -0
  65. package/lib/core/triggerEngine.d.ts.map +1 -0
  66. package/lib/core/triggerEngine.js +432 -0
  67. package/lib/core/triggerEngine.js.map +1 -0
  68. package/lib/index.d.ts +7 -0
  69. package/lib/index.d.ts.map +1 -0
  70. package/lib/index.js +11 -0
  71. package/lib/index.js.map +1 -0
  72. package/lib/instrumented/Pressable.d.ts +9 -0
  73. package/lib/instrumented/Pressable.d.ts.map +1 -0
  74. package/lib/instrumented/Pressable.js +96 -0
  75. package/lib/instrumented/Pressable.js.map +1 -0
  76. package/lib/instrumented/ScrollView.d.ts +6 -0
  77. package/lib/instrumented/ScrollView.d.ts.map +1 -0
  78. package/lib/instrumented/ScrollView.js +101 -0
  79. package/lib/instrumented/ScrollView.js.map +1 -0
  80. package/lib/instrumented/TextInput.d.ts +9 -0
  81. package/lib/instrumented/TextInput.d.ts.map +1 -0
  82. package/lib/instrumented/TextInput.js +75 -0
  83. package/lib/instrumented/TextInput.js.map +1 -0
  84. package/lib/instrumented/TouchableOpacity.d.ts +11 -0
  85. package/lib/instrumented/TouchableOpacity.d.ts.map +1 -0
  86. package/lib/instrumented/TouchableOpacity.js +96 -0
  87. package/lib/instrumented/TouchableOpacity.js.map +1 -0
  88. package/lib/instrumented/index.d.ts +19 -0
  89. package/lib/instrumented/index.d.ts.map +1 -0
  90. package/lib/instrumented/index.js +28 -0
  91. package/lib/instrumented/index.js.map +1 -0
  92. package/lib/instrumented/interactionObserver.d.ts +29 -0
  93. package/lib/instrumented/interactionObserver.d.ts.map +1 -0
  94. package/lib/instrumented/interactionObserver.js +38 -0
  95. package/lib/instrumented/interactionObserver.js.map +1 -0
  96. package/lib/setup/AccessibilityScanner.d.ts +32 -0
  97. package/lib/setup/AccessibilityScanner.d.ts.map +1 -0
  98. package/lib/setup/AccessibilityScanner.js +127 -0
  99. package/lib/setup/AccessibilityScanner.js.map +1 -0
  100. package/lib/setup/ElementIdentifier.d.ts +65 -0
  101. package/lib/setup/ElementIdentifier.d.ts.map +1 -0
  102. package/lib/setup/ElementIdentifier.js +114 -0
  103. package/lib/setup/ElementIdentifier.js.map +1 -0
  104. package/lib/setup/ElementRegistry.d.ts +22 -0
  105. package/lib/setup/ElementRegistry.d.ts.map +1 -0
  106. package/lib/setup/ElementRegistry.js +47 -0
  107. package/lib/setup/ElementRegistry.js.map +1 -0
  108. package/lib/setup/SetupCodeEntry.d.ts +15 -0
  109. package/lib/setup/SetupCodeEntry.d.ts.map +1 -0
  110. package/lib/setup/SetupCodeEntry.js +198 -0
  111. package/lib/setup/SetupCodeEntry.js.map +1 -0
  112. package/lib/setup/SetupController.d.ts +29 -0
  113. package/lib/setup/SetupController.d.ts.map +1 -0
  114. package/lib/setup/SetupController.js +189 -0
  115. package/lib/setup/SetupController.js.map +1 -0
  116. package/lib/setup/SetupOverlay.d.ts +10 -0
  117. package/lib/setup/SetupOverlay.d.ts.map +1 -0
  118. package/lib/setup/SetupOverlay.js +408 -0
  119. package/lib/setup/SetupOverlay.js.map +1 -0
  120. package/lib/setup/TapInterceptor.d.ts +19 -0
  121. package/lib/setup/TapInterceptor.d.ts.map +1 -0
  122. package/lib/setup/TapInterceptor.js +98 -0
  123. package/lib/setup/TapInterceptor.js.map +1 -0
  124. package/lib/setup/TouchObserver.d.ts +25 -0
  125. package/lib/setup/TouchObserver.d.ts.map +1 -0
  126. package/lib/setup/TouchObserver.js +88 -0
  127. package/lib/setup/TouchObserver.js.map +1 -0
  128. package/lib/setup/TouchPatcher.d.ts +27 -0
  129. package/lib/setup/TouchPatcher.d.ts.map +1 -0
  130. package/lib/setup/TouchPatcher.js +182 -0
  131. package/lib/setup/TouchPatcher.js.map +1 -0
  132. package/lib/setup/index.d.ts +13 -0
  133. package/lib/setup/index.d.ts.map +1 -0
  134. package/lib/setup/index.js +45 -0
  135. package/lib/setup/index.js.map +1 -0
  136. package/lib/setup/useCXPElement.d.ts +25 -0
  137. package/lib/setup/useCXPElement.d.ts.map +1 -0
  138. package/lib/setup/useCXPElement.js +33 -0
  139. package/lib/setup/useCXPElement.js.map +1 -0
  140. package/lib/survey/SurveyModal.d.ts +10 -0
  141. package/lib/survey/SurveyModal.d.ts.map +1 -0
  142. package/lib/survey/SurveyModal.js +1650 -0
  143. package/lib/survey/SurveyModal.js.map +1 -0
  144. package/lib/survey/expressionEval.d.ts +10 -0
  145. package/lib/survey/expressionEval.d.ts.map +1 -0
  146. package/lib/survey/expressionEval.js +287 -0
  147. package/lib/survey/expressionEval.js.map +1 -0
  148. package/lib/survey/frequencyCap.d.ts +15 -0
  149. package/lib/survey/frequencyCap.d.ts.map +1 -0
  150. package/lib/survey/frequencyCap.js +116 -0
  151. package/lib/survey/frequencyCap.js.map +1 -0
  152. package/lib/survey/handsFreeVoice.d.ts +30 -0
  153. package/lib/survey/handsFreeVoice.d.ts.map +1 -0
  154. package/lib/survey/handsFreeVoice.js +312 -0
  155. package/lib/survey/handsFreeVoice.js.map +1 -0
  156. package/lib/survey/interpolate.d.ts +6 -0
  157. package/lib/survey/interpolate.d.ts.map +1 -0
  158. package/lib/survey/interpolate.js +61 -0
  159. package/lib/survey/interpolate.js.map +1 -0
  160. package/lib/survey/pagesFromV1.d.ts +6 -0
  161. package/lib/survey/pagesFromV1.d.ts.map +1 -0
  162. package/lib/survey/pagesFromV1.js +83 -0
  163. package/lib/survey/pagesFromV1.js.map +1 -0
  164. package/lib/survey/questions/CSATQuestion.d.ts +16 -0
  165. package/lib/survey/questions/CSATQuestion.d.ts.map +1 -0
  166. package/lib/survey/questions/CSATQuestion.js +37 -0
  167. package/lib/survey/questions/CSATQuestion.js.map +1 -0
  168. package/lib/survey/questions/DateQuestion.d.ts +20 -0
  169. package/lib/survey/questions/DateQuestion.d.ts.map +1 -0
  170. package/lib/survey/questions/DateQuestion.js +103 -0
  171. package/lib/survey/questions/DateQuestion.js.map +1 -0
  172. package/lib/survey/questions/ImagePickerQuestion.d.ts +33 -0
  173. package/lib/survey/questions/ImagePickerQuestion.d.ts.map +1 -0
  174. package/lib/survey/questions/ImagePickerQuestion.js +68 -0
  175. package/lib/survey/questions/ImagePickerQuestion.js.map +1 -0
  176. package/lib/survey/questions/ImageQuestion.d.ts +26 -0
  177. package/lib/survey/questions/ImageQuestion.d.ts.map +1 -0
  178. package/lib/survey/questions/ImageQuestion.js +24 -0
  179. package/lib/survey/questions/ImageQuestion.js.map +1 -0
  180. package/lib/survey/questions/MatrixCell.d.ts +45 -0
  181. package/lib/survey/questions/MatrixCell.d.ts.map +1 -0
  182. package/lib/survey/questions/MatrixCell.js +54 -0
  183. package/lib/survey/questions/MatrixCell.js.map +1 -0
  184. package/lib/survey/questions/MatrixDropdownQuestion.d.ts +29 -0
  185. package/lib/survey/questions/MatrixDropdownQuestion.d.ts.map +1 -0
  186. package/lib/survey/questions/MatrixDropdownQuestion.js +42 -0
  187. package/lib/survey/questions/MatrixDropdownQuestion.js.map +1 -0
  188. package/lib/survey/questions/MatrixDynamicQuestion.d.ts +26 -0
  189. package/lib/survey/questions/MatrixDynamicQuestion.d.ts.map +1 -0
  190. package/lib/survey/questions/MatrixDynamicQuestion.js +52 -0
  191. package/lib/survey/questions/MatrixDynamicQuestion.js.map +1 -0
  192. package/lib/survey/questions/MatrixQuestion.d.ts +38 -0
  193. package/lib/survey/questions/MatrixQuestion.d.ts.map +1 -0
  194. package/lib/survey/questions/MatrixQuestion.js +64 -0
  195. package/lib/survey/questions/MatrixQuestion.js.map +1 -0
  196. package/lib/survey/questions/MultiTextQuestion.d.ts +19 -0
  197. package/lib/survey/questions/MultiTextQuestion.d.ts.map +1 -0
  198. package/lib/survey/questions/MultiTextQuestion.js +64 -0
  199. package/lib/survey/questions/MultiTextQuestion.js.map +1 -0
  200. package/lib/survey/questions/MultipleChoiceQuestion.d.ts +25 -0
  201. package/lib/survey/questions/MultipleChoiceQuestion.d.ts.map +1 -0
  202. package/lib/survey/questions/MultipleChoiceQuestion.js +111 -0
  203. package/lib/survey/questions/MultipleChoiceQuestion.js.map +1 -0
  204. package/lib/survey/questions/NPSQuestion.d.ts +18 -0
  205. package/lib/survey/questions/NPSQuestion.d.ts.map +1 -0
  206. package/lib/survey/questions/NPSQuestion.js +62 -0
  207. package/lib/survey/questions/NPSQuestion.js.map +1 -0
  208. package/lib/survey/questions/PanelDynamicQuestion.d.ts +50 -0
  209. package/lib/survey/questions/PanelDynamicQuestion.d.ts.map +1 -0
  210. package/lib/survey/questions/PanelDynamicQuestion.js +62 -0
  211. package/lib/survey/questions/PanelDynamicQuestion.js.map +1 -0
  212. package/lib/survey/questions/RankingQuestion.d.ts +34 -0
  213. package/lib/survey/questions/RankingQuestion.d.ts.map +1 -0
  214. package/lib/survey/questions/RankingQuestion.js +85 -0
  215. package/lib/survey/questions/RankingQuestion.js.map +1 -0
  216. package/lib/survey/questions/RatingQuestion.d.ts +20 -0
  217. package/lib/survey/questions/RatingQuestion.d.ts.map +1 -0
  218. package/lib/survey/questions/RatingQuestion.js +53 -0
  219. package/lib/survey/questions/RatingQuestion.js.map +1 -0
  220. package/lib/survey/questions/TextQuestion.d.ts +17 -0
  221. package/lib/survey/questions/TextQuestion.d.ts.map +1 -0
  222. package/lib/survey/questions/TextQuestion.js +46 -0
  223. package/lib/survey/questions/TextQuestion.js.map +1 -0
  224. package/lib/survey/styleContract.d.ts +230 -0
  225. package/lib/survey/styleContract.d.ts.map +1 -0
  226. package/lib/survey/styleContract.js +365 -0
  227. package/lib/survey/styleContract.js.map +1 -0
  228. package/lib/survey/themePalette.d.ts +56 -0
  229. package/lib/survey/themePalette.d.ts.map +1 -0
  230. package/lib/survey/themePalette.js +63 -0
  231. package/lib/survey/themePalette.js.map +1 -0
  232. package/lib/survey/translationLookup.d.ts +4 -0
  233. package/lib/survey/translationLookup.d.ts.map +1 -0
  234. package/lib/survey/translationLookup.js +62 -0
  235. package/lib/survey/translationLookup.js.map +1 -0
  236. package/lib/survey/validate.d.ts +3 -0
  237. package/lib/survey/validate.d.ts.map +1 -0
  238. package/lib/survey/validate.js +159 -0
  239. package/lib/survey/validate.js.map +1 -0
  240. package/lib/survey/variablesResolver.d.ts +10 -0
  241. package/lib/survey/variablesResolver.d.ts.map +1 -0
  242. package/lib/survey/variablesResolver.js +107 -0
  243. package/lib/survey/variablesResolver.js.map +1 -0
  244. package/lib/survey/voiceParsers.d.ts +47 -0
  245. package/lib/survey/voiceParsers.d.ts.map +1 -0
  246. package/lib/survey/voiceParsers.js +310 -0
  247. package/lib/survey/voiceParsers.js.map +1 -0
  248. package/lib/types.d.ts +349 -0
  249. package/lib/types.d.ts.map +1 -0
  250. package/lib/types.js +20 -0
  251. package/lib/types.js.map +1 -0
  252. package/metro.js +55 -0
  253. package/package.json +78 -0
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isNativeDatePickerAvailable = isNativeDatePickerAvailable;
4
+ exports.DateQuestion = DateQuestion;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const react_native_1 = require("react-native");
8
+ const styleContract_1 = require("../styleContract");
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ let DateTimePicker = null;
11
+ try {
12
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
13
+ const mod = require('@react-native-community/datetimepicker');
14
+ DateTimePicker = (mod?.default ?? mod);
15
+ }
16
+ catch {
17
+ DateTimePicker = null;
18
+ }
19
+ function isNativeDatePickerAvailable() {
20
+ return DateTimePicker !== null;
21
+ }
22
+ // Format Date → YYYY-MM-DD (locale-independent). ISO-8601 date is what
23
+ // the response layer expects and what the web renderer emits.
24
+ function toIsoDate(d) {
25
+ const y = d.getFullYear();
26
+ const m = String(d.getMonth() + 1).padStart(2, '0');
27
+ const day = String(d.getDate()).padStart(2, '0');
28
+ return `${y}-${m}-${day}`;
29
+ }
30
+ // Parse YYYY-MM-DD → Date. Falls back to today when the string is
31
+ // blank/malformed so the picker opens on a sensible default.
32
+ function fromIsoDate(s) {
33
+ if (!s)
34
+ return new Date();
35
+ const m = /^(\d{4})-(\d{2})-(\d{2})/.exec(s);
36
+ if (!m)
37
+ return new Date();
38
+ return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));
39
+ }
40
+ function DateQuestion({ value, onChange, min, max, primaryColor, palette, contract, isRtl, placeholder, }) {
41
+ const [showing, setShowing] = (0, react_1.useState)(false);
42
+ const displayLabel = value || placeholder || 'Select a date';
43
+ // contract ▸ legacy palette/primaryColor ▸ dark defaults. DARK_CONTRACT's
44
+ // input values are the literals this file used to hardcode.
45
+ const c = contract ?? styleContract_1.DARK_CONTRACT;
46
+ const bg = palette?.input ?? c.input;
47
+ const border = palette?.inputBorder ?? c.inputBorder;
48
+ const filledText = palette?.textPrimary ?? c.inputText;
49
+ const emptyText = palette?.placeholder ?? c.placeholder;
50
+ const iconColor = primaryColor ?? c.accent;
51
+ if (!DateTimePicker) {
52
+ // Peer dep not installed — render a hint so the author knows
53
+ // why the date input is degraded. Caller (SurveyModal) can
54
+ // fallback to TextQuestion here; we render nothing so the
55
+ // caller's fallback shows instead. This branch is unreachable
56
+ // from the caller because SurveyModal checks
57
+ // isNativeDatePickerAvailable() before dispatching to us.
58
+ return null;
59
+ }
60
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.container, children: [(0, jsx_runtime_1.jsxs)(react_native_1.TouchableOpacity, { style: [
61
+ styles.trigger,
62
+ { backgroundColor: bg, borderColor: border, borderRadius: c.inputRadius },
63
+ isRtl && styles.rtlRow,
64
+ ], onPress: () => setShowing(true), activeOpacity: 0.7, accessibilityRole: "button", accessibilityLabel: value ? `Selected date: ${value}. Tap to change.` : 'Tap to pick a date.', children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [
65
+ styles.triggerText,
66
+ { color: value ? filledText : emptyText, fontSize: c.fontSizeInput, fontFamily: c.fontFamily },
67
+ isRtl && styles.rtlText,
68
+ ], children: displayLabel }), (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.icon, { color: iconColor }], children: "\uD83D\uDCC5" })] }), showing && ((0, jsx_runtime_1.jsx)(DateTimePicker, { value: fromIsoDate(value), mode: "date", display: react_native_1.Platform.OS === 'ios' ? 'spinner' : 'default', minimumDate: min ? fromIsoDate(min) : undefined, maximumDate: max ? fromIsoDate(max) : undefined, onChange: (_event, picked) => {
69
+ // Android auto-dismisses; iOS keeps the picker open. Match
70
+ // native affordance either way — close on any change, and
71
+ // only emit onChange when the user actually picked a value.
72
+ setShowing(false);
73
+ if (picked)
74
+ onChange(toIsoDate(picked));
75
+ } }))] }));
76
+ }
77
+ const styles = react_native_1.StyleSheet.create({
78
+ container: {
79
+ marginVertical: 8,
80
+ },
81
+ trigger: {
82
+ flexDirection: 'row',
83
+ alignItems: 'center',
84
+ justifyContent: 'space-between',
85
+ borderWidth: 1,
86
+ padding: 14,
87
+ minHeight: 48,
88
+ },
89
+ rtlRow: {
90
+ flexDirection: 'row-reverse',
91
+ },
92
+ triggerText: {
93
+ flex: 1,
94
+ },
95
+ rtlText: {
96
+ textAlign: 'right',
97
+ },
98
+ icon: {
99
+ fontSize: 18,
100
+ marginLeft: 8,
101
+ },
102
+ });
103
+ //# sourceMappingURL=DateQuestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateQuestion.js","sourceRoot":"","sources":["../../../src/survey/questions/DateQuestion.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { type SurveyStyleContract } from '../styleContract';
2
+ /**
3
+ * ImagePickerQuestion — mobile parity for the web ImagePickerRenderer.
4
+ *
5
+ * Answer shape is IDENTICAL to web (`richRenderers.tsx` ImagePickerRenderer):
6
+ * - multiSelect → `string[]` of picked values
7
+ * - single → the value, or `null` when the respondent taps it again
8
+ *
9
+ * That deselect-to-null on re-tap is easy to miss and is deliberate on web, so
10
+ * it is reproduced exactly — otherwise a respondent could not clear an optional
11
+ * single-select answer on mobile but could on web.
12
+ *
13
+ * Uses React Native's own Image + TouchableOpacity: no new peer dependency, and
14
+ * the install guide stays sufficient.
15
+ */
16
+ interface ImagePickerOption {
17
+ value: unknown;
18
+ label?: string;
19
+ imageUrl?: string;
20
+ alt?: string;
21
+ }
22
+ interface Props {
23
+ options: ImagePickerOption[];
24
+ multiSelect?: boolean;
25
+ /** string[] when multiSelect, else the single value (or null). */
26
+ value: unknown;
27
+ onChange: (value: string[] | string | null) => void;
28
+ contract?: SurveyStyleContract;
29
+ isRtl?: boolean;
30
+ }
31
+ export declare function ImagePickerQuestion({ options, multiSelect, value, onChange, contract, isRtl, }: Props): import("react/jsx-runtime").JSX.Element;
32
+ export default ImagePickerQuestion;
33
+ //# sourceMappingURL=ImagePickerQuestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImagePickerQuestion.d.ts","sourceRoot":"","sources":["../../../src/survey/questions/ImagePickerQuestion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE3E;;;;;;;;;;;;;GAaG;AAEH,UAAU,iBAAiB;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,UAAU,KAAK;IACb,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kEAAkE;IAClE,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,GACvD,EAAE,KAAK,2CA2EP;eAwBc,mBAAmB"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImagePickerQuestion = ImagePickerQuestion;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_1 = require("react-native");
6
+ const styleContract_1 = require("../styleContract");
7
+ function ImagePickerQuestion({ options, multiSelect, value, onChange, contract, isRtl, }) {
8
+ const c = contract ?? styleContract_1.DARK_CONTRACT;
9
+ const opts = Array.isArray(options) ? options : [];
10
+ const multi = multiSelect === true;
11
+ // Same normalisation web performs before comparing.
12
+ const picked = multi
13
+ ? (Array.isArray(value) ? value.map(String) : [])
14
+ : (value != null ? [String(value)] : []);
15
+ const toggle = (v) => {
16
+ if (multi) {
17
+ onChange(picked.includes(v) ? picked.filter((x) => x !== v) : [...picked, v]);
18
+ }
19
+ else {
20
+ // Re-tapping the current choice clears it — matches web.
21
+ onChange(picked[0] === v ? null : v);
22
+ }
23
+ };
24
+ return ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: [styles.grid, isRtl && styles.rtlGrid], children: opts.map((opt, i) => {
25
+ const val = opt.value != null ? String(opt.value) : '';
26
+ const selected = picked.includes(val);
27
+ const caption = opt.label || opt.alt || val;
28
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.TouchableOpacity, { onPress: () => toggle(val), activeOpacity: 0.8, accessibilityRole: multi ? 'checkbox' : 'radio', accessibilityState: { checked: selected }, accessibilityLabel: caption, style: [
29
+ styles.tile,
30
+ {
31
+ backgroundColor: selected ? c.optionSelectedBg : c.optionBg,
32
+ borderColor: selected ? c.optionSelectedBorder : c.optionBorder,
33
+ borderRadius: c.optionRadius,
34
+ },
35
+ ], children: [opt.imageUrl ? ((0, jsx_runtime_1.jsx)(react_native_1.Image, { source: { uri: opt.imageUrl }, accessibilityLabel: opt.alt || undefined, resizeMode: "cover", style: [styles.thumb, { borderRadius: Math.max(0, c.optionRadius - 4) }] })) : ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: [styles.thumb, styles.thumbEmpty, { backgroundColor: c.input }] })), (0, jsx_runtime_1.jsx)(react_native_1.Text, { numberOfLines: 2, style: [
36
+ styles.caption,
37
+ {
38
+ color: selected ? c.textPrimary : c.textSecondary,
39
+ fontSize: c.fontSizeSmall,
40
+ fontFamily: c.fontFamily,
41
+ },
42
+ isRtl && styles.rtlText,
43
+ ], children: caption })] }, i));
44
+ }) }));
45
+ }
46
+ /* Layout only — colours and radii come from the contract. */
47
+ const styles = react_native_1.StyleSheet.create({
48
+ grid: {
49
+ marginVertical: 8,
50
+ flexDirection: 'row',
51
+ flexWrap: 'wrap',
52
+ gap: 10,
53
+ },
54
+ rtlGrid: { flexDirection: 'row-reverse' },
55
+ tile: {
56
+ // Two per row with the 10px gap, on any phone width.
57
+ width: '47%',
58
+ borderWidth: 1,
59
+ padding: 8,
60
+ gap: 8,
61
+ },
62
+ thumb: { width: '100%', aspectRatio: 4 / 3 },
63
+ thumbEmpty: { opacity: 0.5 },
64
+ caption: { fontWeight: '500', textAlign: 'center' },
65
+ rtlText: { writingDirection: 'rtl' },
66
+ });
67
+ exports.default = ImagePickerQuestion;
68
+ //# sourceMappingURL=ImagePickerQuestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImagePickerQuestion.js","sourceRoot":"","sources":["../../../src/survey/questions/ImagePickerQuestion.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type SurveyStyleContract } from '../styleContract';
2
+ /**
3
+ * ImageQuestion — mobile parity for the web ImageRenderer.
4
+ *
5
+ * Display-only: it collects no answer, it shows an image inside the survey
6
+ * (a logo, a product shot, a diagram the next question asks about). Web has had
7
+ * it since Phase 3b; on mobile it fell through to "please complete on desktop",
8
+ * which was actively misleading — the respondent was told the survey was
9
+ * unusable because of a decorative image.
10
+ *
11
+ * Uses React Native's own Image, so no new peer dependency.
12
+ *
13
+ * Sizing mirrors web's `maxWidth: 100%; height: auto`: authored width/height are
14
+ * treated as an aspect ratio and the image scales to the container width, so a
15
+ * 1200px-wide asset doesn't overflow a phone.
16
+ */
17
+ interface Props {
18
+ imageUrl?: string;
19
+ alt?: string;
20
+ width?: number;
21
+ height?: number;
22
+ contract?: SurveyStyleContract;
23
+ }
24
+ export declare function ImageQuestion({ imageUrl, alt, width, height, contract }: Props): import("react/jsx-runtime").JSX.Element | null;
25
+ export default ImageQuestion;
26
+ //# sourceMappingURL=ImageQuestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageQuestion.d.ts","sourceRoot":"","sources":["../../../src/survey/questions/ImageQuestion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE3E;;;;;;;;;;;;;;GAcG;AAEH,UAAU,KAAK;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,kDAsB9E;eAQc,aAAa"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImageQuestion = ImageQuestion;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_1 = require("react-native");
6
+ const styleContract_1 = require("../styleContract");
7
+ function ImageQuestion({ imageUrl, alt, width, height, contract }) {
8
+ const c = contract ?? styleContract_1.DARK_CONTRACT;
9
+ // Web returns null when there's no src — match that rather than rendering an
10
+ // empty box.
11
+ if (!imageUrl)
12
+ return null;
13
+ // Authored dimensions become an aspect ratio; without them fall back to 16:9
14
+ // so the image still reserves sensible space while loading.
15
+ const aspectRatio = width && height ? width / height : 16 / 9;
16
+ return ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.container, children: (0, jsx_runtime_1.jsx)(react_native_1.Image, { source: { uri: imageUrl }, accessibilityLabel: alt || undefined, accessible: Boolean(alt), resizeMode: "contain", style: [styles.image, { aspectRatio, borderRadius: c.inputRadius }] }) }));
17
+ }
18
+ /* Layout only. */
19
+ const styles = react_native_1.StyleSheet.create({
20
+ container: { marginVertical: 8 },
21
+ image: { width: '100%', height: undefined },
22
+ });
23
+ exports.default = ImageQuestion;
24
+ //# sourceMappingURL=ImageQuestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageQuestion.js","sourceRoot":"","sources":["../../../src/survey/questions/ImageQuestion.tsx"],"names":[],"mappings":";;;;AACA,+CAAuD;AACvD,oDAA2E;AA0B3E,uBAA8B,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAS;IAC7E,MAAM,CAAC,GAAG,QAAQ,IAAI,6BAAa,CAAC;IAEpC,6EAA6E;IAC7E,aAAa;IACb,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,6EAA6E;IAC7E,4DAA4D;IAC5D,MAAM,WAAW,GAAG,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE9D,OAAO,CACL,uBAAC,mBAAI,IAAC,KAAK,EAAE,MAAM,CAAC,SAAS,YAC3B,uBAAC,oBAAK,IACJ,MAAM,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EACzB,kBAAkB,EAAE,GAAG,IAAI,SAAS,EACpC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,EACxB,UAAU,EAAC,SAAS,EACpB,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,GACnE,GACG,CACR,CAAC;AACJ,CAAC;AAED,kBAAkB;AAClB,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE;IAChC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE;CAC5C,CAAC,CAAC;kBAEY,aAAa"}
@@ -0,0 +1,45 @@
1
+ import { type SurveyStyleContract } from '../styleContract';
2
+ /**
3
+ * MatrixCell — renders one cell of a matrix/panel by its `cellType`.
4
+ *
5
+ * Web does exactly this: `registry[c.cellType || 'text']` looks the cell's
6
+ * renderer up in the same registry the top-level questions use. Mirroring that
7
+ * here means a `dropdown` cell behaves identically to a standalone `dropdown`
8
+ * question on both platforms, rather than being a second implementation that
9
+ * drifts.
10
+ *
11
+ * Shared by MatrixDropdown, MatrixDynamic and PanelDynamic — the three types
12
+ * differ only in how cells are grouped, not in how a cell renders.
13
+ */
14
+ export interface CellColumn {
15
+ id?: string;
16
+ name?: string;
17
+ title?: string;
18
+ text?: string;
19
+ cellType?: string;
20
+ options?: Array<{
21
+ value: unknown;
22
+ label?: string;
23
+ text?: string;
24
+ }>;
25
+ choices?: Array<{
26
+ value: unknown;
27
+ label?: string;
28
+ text?: string;
29
+ }>;
30
+ placeholder?: string;
31
+ defaultValue?: unknown;
32
+ }
33
+ /** Same derivation web uses, so answer keys match exactly. */
34
+ export declare const columnKey: (c: CellColumn, index: number) => string;
35
+ export declare const columnLabel: (c: CellColumn, index: number) => string;
36
+ interface Props {
37
+ column: CellColumn;
38
+ value: unknown;
39
+ onChange: (v: unknown) => void;
40
+ contract?: SurveyStyleContract;
41
+ isRtl?: boolean;
42
+ }
43
+ export declare function MatrixCell({ column, value, onChange, contract, isRtl }: Props): import("react/jsx-runtime").JSX.Element;
44
+ export default MatrixCell;
45
+ //# sourceMappingURL=MatrixCell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatrixCell.d.ts","sourceRoot":"","sources":["../../../src/survey/questions/MatrixCell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO3E;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,UAAU;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,8DAA8D;AAC9D,eAAO,MAAM,SAAS,MAAO,UAAU,SAAS,MAAM,KAAG,MACxB,CAAC;AAElC,eAAO,MAAM,WAAW,MAAO,UAAU,SAAS,MAAM,KAAG,MACG,CAAC;AAE/D,UAAU,KAAK;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,KAAK,2CAkG7E;eAMc,UAAU"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.columnLabel = exports.columnKey = void 0;
4
+ exports.MatrixCell = MatrixCell;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_native_1 = require("react-native");
7
+ const styleContract_1 = require("../styleContract");
8
+ const TextQuestion_1 = require("./TextQuestion");
9
+ const MultipleChoiceQuestion_1 = require("./MultipleChoiceQuestion");
10
+ const RatingQuestion_1 = require("./RatingQuestion");
11
+ const NPSQuestion_1 = require("./NPSQuestion");
12
+ const DateQuestion_1 = require("./DateQuestion");
13
+ /** Same derivation web uses, so answer keys match exactly. */
14
+ const columnKey = (c, index) => c.id || c.name || String(index);
15
+ exports.columnKey = columnKey;
16
+ const columnLabel = (c, index) => c.title || c.text || c.name || c.id || `Column ${index + 1}`;
17
+ exports.columnLabel = columnLabel;
18
+ function MatrixCell({ column, value, onChange, contract, isRtl }) {
19
+ const c = contract ?? styleContract_1.DARK_CONTRACT;
20
+ const type = column.cellType || 'text';
21
+ const opts = column.options || column.choices || [];
22
+ switch (type) {
23
+ case 'dropdown':
24
+ case 'radio':
25
+ case 'radiogroup':
26
+ return ((0, jsx_runtime_1.jsx)(MultipleChoiceQuestion_1.MultipleChoiceQuestion, { choices: opts.map((o) => ({ value: String(o.value), text: String(o.label ?? o.text ?? o.value) })), value: value ?? '', onChange: (v) => onChange(v), mode: "radiogroup", contract: c, isRtl: isRtl }));
27
+ case 'checkbox':
28
+ return ((0, jsx_runtime_1.jsx)(MultipleChoiceQuestion_1.MultipleChoiceQuestion, { choices: opts.map((o) => ({ value: String(o.value), text: String(o.label ?? o.text ?? o.value) })), value: value ?? [], onChange: (v) => onChange(v), mode: "checkbox", contract: c, isRtl: isRtl }));
29
+ case 'rating':
30
+ return ((0, jsx_runtime_1.jsx)(RatingQuestion_1.RatingQuestion, { value: value ?? null, onChange: (v) => onChange(v), contract: c }));
31
+ case 'nps':
32
+ return ((0, jsx_runtime_1.jsx)(NPSQuestion_1.NPSQuestion, { value: value ?? null, onChange: (v) => onChange(v), contract: c }));
33
+ case 'date':
34
+ // Falls back to a text input when the optional picker peer dep isn't
35
+ // installed — same as a standalone date question, and no new requirement
36
+ // on the host app.
37
+ return (0, DateQuestion_1.isNativeDatePickerAvailable)() ? ((0, jsx_runtime_1.jsx)(DateQuestion_1.DateQuestion, { value: value ?? '', onChange: (v) => onChange(v), contract: c, isRtl: isRtl, placeholder: column.placeholder })) : ((0, jsx_runtime_1.jsx)(TextQuestion_1.TextQuestion, { value: value ?? '', onChange: (v) => onChange(v), placeholder: column.placeholder || 'YYYY-MM-DD', multiline: false, contract: c, isRtl: isRtl }));
38
+ case 'text':
39
+ case 'comment':
40
+ case 'email':
41
+ case 'number':
42
+ return ((0, jsx_runtime_1.jsx)(TextQuestion_1.TextQuestion, { value: value ?? '', onChange: (v) => onChange(v), placeholder: column.placeholder, multiline: type === 'comment', contract: c, isRtl: isRtl }));
43
+ default:
44
+ // Web renders an em-dash for a cellType with no registry entry. Match
45
+ // that rather than silently substituting a text box, which would invite
46
+ // junk data into a cell the author never meant to be free-form.
47
+ return ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.unsupported, children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: { color: c.textMuted, fontSize: c.fontSizeSmall }, children: "\u2014" }) }));
48
+ }
49
+ }
50
+ const styles = react_native_1.StyleSheet.create({
51
+ unsupported: { paddingVertical: 8 },
52
+ });
53
+ exports.default = MatrixCell;
54
+ //# sourceMappingURL=MatrixCell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatrixCell.js","sourceRoot":"","sources":["../../../src/survey/questions/MatrixCell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type SurveyStyleContract } from '../styleContract';
2
+ import { type CellColumn } from './MatrixCell';
3
+ /**
4
+ * MatrixDropdownQuestion — mobile parity for the web MatrixDropdownRenderer.
5
+ *
6
+ * Answer shape is IDENTICAL to web (`matrixRenderers.tsx`):
7
+ * Record<rowId, Record<columnKey, cellValue>>
8
+ * with `columnKey` derived the same way (`c.id || c.name || String(index)`), so
9
+ * a mobile response is indistinguishable from a web one downstream.
10
+ *
11
+ * Web lays this out as a table with a 140px minimum per column. That genuinely
12
+ * doesn't fit a phone, so rows become stacked blocks and each cell is labelled
13
+ * with its column name. No horizontal scrolling.
14
+ */
15
+ interface MatrixRow {
16
+ id: string;
17
+ text?: string;
18
+ }
19
+ interface Props {
20
+ rows: MatrixRow[];
21
+ columns: CellColumn[];
22
+ value: Record<string, Record<string, unknown>> | null;
23
+ onChange: (value: Record<string, Record<string, unknown>>) => void;
24
+ contract?: SurveyStyleContract;
25
+ isRtl?: boolean;
26
+ }
27
+ export declare function MatrixDropdownQuestion({ rows, columns, value, onChange, contract, isRtl, }: Props): import("react/jsx-runtime").JSX.Element;
28
+ export default MatrixDropdownQuestion;
29
+ //# sourceMappingURL=MatrixDropdownQuestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatrixDropdownQuestion.d.ts","sourceRoot":"","sources":["../../../src/survey/questions/MatrixDropdownQuestion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnF;;;;;;;;;;;GAWG;AAEH,UAAU,SAAS;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAEjD,UAAU,KAAK;IACb,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC;IACtD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,CAAC;IACnE,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,GAChD,EAAE,KAAK,2CA4DP;eAWc,sBAAsB"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MatrixDropdownQuestion = MatrixDropdownQuestion;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_1 = require("react-native");
6
+ const styleContract_1 = require("../styleContract");
7
+ const MatrixCell_1 = require("./MatrixCell");
8
+ function MatrixDropdownQuestion({ rows, columns, value, onChange, contract, isRtl, }) {
9
+ const c = contract ?? styleContract_1.DARK_CONTRACT;
10
+ const safeRows = Array.isArray(rows) ? rows : [];
11
+ const safeCols = Array.isArray(columns) ? columns : [];
12
+ const answers = value && typeof value === 'object' && !Array.isArray(value) ? value : {};
13
+ const setCell = (rowId, colKey, cellValue) => {
14
+ const rowState = answers[rowId] || {};
15
+ onChange({ ...answers, [rowId]: { ...rowState, [colKey]: cellValue } });
16
+ };
17
+ return ((0, jsx_runtime_1.jsx)(react_native_1.View, { style: styles.container, children: safeRows.map((r) => ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [
18
+ styles.rowBlock,
19
+ { backgroundColor: c.optionBg, borderColor: c.optionBorder, borderRadius: c.optionRadius },
20
+ ], children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [
21
+ styles.rowLabel,
22
+ { color: c.textPrimary, fontSize: c.fontSizeLabel, fontFamily: c.fontFamily },
23
+ isRtl && styles.rtlText,
24
+ ], children: r.text || r.id }), safeCols.map((col, i) => {
25
+ const key = (0, MatrixCell_1.columnKey)(col, i);
26
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.cell, children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [
27
+ styles.cellLabel,
28
+ { color: c.textMuted, fontSize: c.fontSizeSmall, fontFamily: c.fontFamily },
29
+ isRtl && styles.rtlText,
30
+ ], children: (0, MatrixCell_1.columnLabel)(col, i) }), (0, jsx_runtime_1.jsx)(MatrixCell_1.MatrixCell, { column: col, value: answers[r.id]?.[key], onChange: (v) => setCell(r.id, key, v), contract: c, isRtl: isRtl })] }, key));
31
+ })] }, r.id))) }));
32
+ }
33
+ const styles = react_native_1.StyleSheet.create({
34
+ container: { marginVertical: 8, gap: 10 },
35
+ rowBlock: { padding: 12, borderWidth: 1, gap: 8 },
36
+ rowLabel: { fontWeight: '600', marginBottom: 2 },
37
+ cell: { gap: 2 },
38
+ cellLabel: { fontWeight: '500' },
39
+ rtlText: { textAlign: 'right', writingDirection: 'rtl' },
40
+ });
41
+ exports.default = MatrixDropdownQuestion;
42
+ //# sourceMappingURL=MatrixDropdownQuestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatrixDropdownQuestion.js","sourceRoot":"","sources":["../../../src/survey/questions/MatrixDropdownQuestion.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type SurveyStyleContract } from '../styleContract';
2
+ import { type CellColumn } from './MatrixCell';
3
+ /**
4
+ * MatrixDynamicQuestion — mobile parity for the web MatrixDynamicRenderer.
5
+ *
6
+ * Repeating rows the respondent adds and removes ("list every product you
7
+ * bought"), each row sharing the same column definitions.
8
+ *
9
+ * Answer shape is IDENTICAL to web (`matrixRenderers.tsx`): an ARRAY of row
10
+ * objects, `Record<columnKey, cellValue>[]`, seeded to `minRowCount` empty rows
11
+ * so a survey requiring two rows shows two to fill in from the start.
12
+ */
13
+ interface Props {
14
+ columns: CellColumn[];
15
+ value: Record<string, unknown>[] | null;
16
+ onChange: (value: Record<string, unknown>[]) => void;
17
+ minRowCount?: number;
18
+ maxRowCount?: number;
19
+ addRowLabel?: string;
20
+ removeRowLabel?: string;
21
+ contract?: SurveyStyleContract;
22
+ isRtl?: boolean;
23
+ }
24
+ export declare function MatrixDynamicQuestion({ columns, value, onChange, minRowCount, maxRowCount, addRowLabel, removeRowLabel, contract, isRtl, }: Props): import("react/jsx-runtime").JSX.Element;
25
+ export default MatrixDynamicQuestion;
26
+ //# sourceMappingURL=MatrixDynamicQuestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatrixDynamicQuestion.d.ts","sourceRoot":"","sources":["../../../src/survey/questions/MatrixDynamicQuestion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnF;;;;;;;;;GASG;AAEH,UAAU,KAAK;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,EAAE,KAAK,EAAE,QAAQ,EACxB,WAAe,EAAE,WAAW,EAAE,WAAuB,EAAE,cAAyB,EAChF,QAAQ,EAAE,KAAK,GAChB,EAAE,KAAK,2CA0FP;eAiBc,qBAAqB"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MatrixDynamicQuestion = MatrixDynamicQuestion;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_native_1 = require("react-native");
6
+ const styleContract_1 = require("../styleContract");
7
+ const MatrixCell_1 = require("./MatrixCell");
8
+ function MatrixDynamicQuestion({ columns, value, onChange, minRowCount = 0, maxRowCount, addRowLabel = 'Add row', removeRowLabel = 'Remove', contract, isRtl, }) {
9
+ const c = contract ?? styleContract_1.DARK_CONTRACT;
10
+ const safeCols = Array.isArray(columns) ? columns : [];
11
+ const stored = Array.isArray(value) ? value : [];
12
+ // Seed to the minimum for display without writing it back until the
13
+ // respondent actually types — same as web.
14
+ const rows = stored.length < minRowCount
15
+ ? [...stored, ...Array.from({ length: minRowCount - stored.length }, () => ({}))]
16
+ : stored;
17
+ const canAdd = maxRowCount === undefined || rows.length < maxRowCount;
18
+ const canRemove = rows.length > minRowCount;
19
+ const setCell = (rowIndex, colKey, cellValue) => {
20
+ const next = rows.map((r, i) => (i === rowIndex ? { ...r, [colKey]: cellValue } : r));
21
+ onChange(next);
22
+ };
23
+ const addRow = () => onChange([...rows, {}]);
24
+ const removeRow = (i) => onChange(rows.filter((_, j) => j !== i));
25
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.container, children: [rows.map((row, ri) => ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [
26
+ styles.rowBlock,
27
+ { backgroundColor: c.optionBg, borderColor: c.optionBorder, borderRadius: c.optionRadius },
28
+ ], children: [(0, jsx_runtime_1.jsxs)(react_native_1.View, { style: [styles.rowHead, isRtl && styles.rtlRow], children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.rowIndex, { color: c.textMuted, fontSize: c.fontSizeSmall }], children: ri + 1 }), canRemove && ((0, jsx_runtime_1.jsx)(react_native_1.TouchableOpacity, { onPress: () => removeRow(ri), accessibilityRole: "button", accessibilityLabel: `${removeRowLabel} ${ri + 1}`, style: [styles.removeBtn, { borderColor: c.inputErrorBorder }], children: (0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [styles.removeText, { color: c.errorText, fontSize: c.fontSizeSmall }], children: removeRowLabel }) }))] }), safeCols.map((col, i) => {
29
+ const key = (0, MatrixCell_1.columnKey)(col, i);
30
+ return ((0, jsx_runtime_1.jsxs)(react_native_1.View, { style: styles.cell, children: [(0, jsx_runtime_1.jsx)(react_native_1.Text, { style: [
31
+ styles.cellLabel,
32
+ { color: c.textMuted, fontSize: c.fontSizeSmall, fontFamily: c.fontFamily },
33
+ isRtl && styles.rtlText,
34
+ ], children: (0, MatrixCell_1.columnLabel)(col, i) }), (0, jsx_runtime_1.jsx)(MatrixCell_1.MatrixCell, { column: col, value: row[key], onChange: (v) => setCell(ri, key, v), contract: c, isRtl: isRtl })] }, key));
35
+ })] }, ri))), canAdd && ((0, jsx_runtime_1.jsx)(react_native_1.TouchableOpacity, { onPress: addRow, accessibilityRole: "button", accessibilityLabel: addRowLabel, style: [styles.addBtn, { borderColor: c.accent, borderRadius: c.buttonRadius }], children: (0, jsx_runtime_1.jsxs)(react_native_1.Text, { style: [styles.addText, { color: c.accent, fontSize: c.fontSizeLabel }], children: ["+ ", addRowLabel] }) }))] }));
36
+ }
37
+ const styles = react_native_1.StyleSheet.create({
38
+ container: { marginVertical: 8, gap: 10 },
39
+ rowBlock: { padding: 12, borderWidth: 1, gap: 8 },
40
+ rowHead: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' },
41
+ rtlRow: { flexDirection: 'row-reverse' },
42
+ rowIndex: { fontWeight: '700' },
43
+ removeBtn: { paddingVertical: 4, paddingHorizontal: 10, borderWidth: 1, borderRadius: 6 },
44
+ removeText: { fontWeight: '600' },
45
+ cell: { gap: 2 },
46
+ cellLabel: { fontWeight: '500' },
47
+ rtlText: { textAlign: 'right', writingDirection: 'rtl' },
48
+ addBtn: { paddingVertical: 10, borderWidth: 1, borderStyle: 'dashed', alignItems: 'center' },
49
+ addText: { fontWeight: '600' },
50
+ });
51
+ exports.default = MatrixDynamicQuestion;
52
+ //# sourceMappingURL=MatrixDynamicQuestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatrixDynamicQuestion.js","sourceRoot":"","sources":["../../../src/survey/questions/MatrixDynamicQuestion.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type SurveyStyleContract } from '../styleContract';
2
+ /**
3
+ * MatrixQuestion — mobile parity for the web MatrixRenderer.
4
+ *
5
+ * Previously fell through to "please complete on desktop". The stated reason was
6
+ * that a multi-column grid doesn't fit a phone — which is true of the GRID, not
7
+ * of the question. So this renders the same data as a stacked list: one block
8
+ * per row, its columns as choice chips underneath. No horizontal scrolling, no
9
+ * 40px touch targets.
10
+ *
11
+ * Answer shape is IDENTICAL to web (`matrixRenderers.tsx` MatrixRenderer):
12
+ * `Record<rowId, columnValue>`. A mobile response is therefore indistinguishable
13
+ * from a web one downstream — which is the whole point of closing this gap.
14
+ *
15
+ * Uses only React Native primitives, so no new peer dependency and the install
16
+ * guide stays sufficient.
17
+ */
18
+ interface MatrixRow {
19
+ id: string;
20
+ text?: string;
21
+ }
22
+ interface MatrixCol {
23
+ value: unknown;
24
+ label?: string;
25
+ text?: string;
26
+ }
27
+ interface Props {
28
+ rows: MatrixRow[];
29
+ columns: MatrixCol[];
30
+ /** Record<rowId, columnValue> — same as web. */
31
+ value: Record<string, unknown> | null;
32
+ onChange: (value: Record<string, unknown>) => void;
33
+ contract?: SurveyStyleContract;
34
+ isRtl?: boolean;
35
+ }
36
+ export declare function MatrixQuestion({ rows, columns, value, onChange, contract, isRtl }: Props): import("react/jsx-runtime").JSX.Element;
37
+ export default MatrixQuestion;
38
+ //# sourceMappingURL=MatrixQuestion.d.ts.map