@harkenapp/sdk-react-native 0.0.1-alpha.1

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 (235) hide show
  1. package/README.md +67 -0
  2. package/app.plugin.cjs +135 -0
  3. package/app.plugin.js +1 -0
  4. package/dist/api/client.d.ts +67 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +163 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/errors.d.ts +46 -0
  9. package/dist/api/errors.d.ts.map +1 -0
  10. package/dist/api/errors.js +72 -0
  11. package/dist/api/errors.js.map +1 -0
  12. package/dist/api/index.d.ts +7 -0
  13. package/dist/api/index.d.ts.map +1 -0
  14. package/dist/api/index.js +20 -0
  15. package/dist/api/index.js.map +1 -0
  16. package/dist/api/retry.d.ts +29 -0
  17. package/dist/api/retry.d.ts.map +1 -0
  18. package/dist/api/retry.js +74 -0
  19. package/dist/api/retry.js.map +1 -0
  20. package/dist/attachments/FeedbackSheet.d.ts +88 -0
  21. package/dist/attachments/FeedbackSheet.d.ts.map +1 -0
  22. package/dist/attachments/FeedbackSheet.js +250 -0
  23. package/dist/attachments/FeedbackSheet.js.map +1 -0
  24. package/dist/attachments/index.d.ts +20 -0
  25. package/dist/attachments/index.d.ts.map +1 -0
  26. package/dist/attachments/index.js +40 -0
  27. package/dist/attachments/index.js.map +1 -0
  28. package/dist/components/AttachmentGrid.d.ts +94 -0
  29. package/dist/components/AttachmentGrid.d.ts.map +1 -0
  30. package/dist/components/AttachmentGrid.js +132 -0
  31. package/dist/components/AttachmentGrid.js.map +1 -0
  32. package/dist/components/AttachmentPicker.d.ts +98 -0
  33. package/dist/components/AttachmentPicker.d.ts.map +1 -0
  34. package/dist/components/AttachmentPicker.js +297 -0
  35. package/dist/components/AttachmentPicker.js.map +1 -0
  36. package/dist/components/AttachmentPreview.d.ts +78 -0
  37. package/dist/components/AttachmentPreview.d.ts.map +1 -0
  38. package/dist/components/AttachmentPreview.js +133 -0
  39. package/dist/components/AttachmentPreview.js.map +1 -0
  40. package/dist/components/CategorySelector.d.ts +77 -0
  41. package/dist/components/CategorySelector.d.ts.map +1 -0
  42. package/dist/components/CategorySelector.js +117 -0
  43. package/dist/components/CategorySelector.js.map +1 -0
  44. package/dist/components/FeedbackForm.d.ts +50 -0
  45. package/dist/components/FeedbackForm.d.ts.map +1 -0
  46. package/dist/components/FeedbackForm.js +141 -0
  47. package/dist/components/FeedbackForm.js.map +1 -0
  48. package/dist/components/FeedbackSheet.d.ts +75 -0
  49. package/dist/components/FeedbackSheet.d.ts.map +1 -0
  50. package/dist/components/FeedbackSheet.js +215 -0
  51. package/dist/components/FeedbackSheet.js.map +1 -0
  52. package/dist/components/ThemedButton.d.ts +23 -0
  53. package/dist/components/ThemedButton.d.ts.map +1 -0
  54. package/dist/components/ThemedButton.js +77 -0
  55. package/dist/components/ThemedButton.js.map +1 -0
  56. package/dist/components/ThemedText.d.ts +16 -0
  57. package/dist/components/ThemedText.d.ts.map +1 -0
  58. package/dist/components/ThemedText.js +44 -0
  59. package/dist/components/ThemedText.js.map +1 -0
  60. package/dist/components/ThemedTextInput.d.ts +13 -0
  61. package/dist/components/ThemedTextInput.d.ts.map +1 -0
  62. package/dist/components/ThemedTextInput.js +76 -0
  63. package/dist/components/ThemedTextInput.js.map +1 -0
  64. package/dist/components/UploadStatusOverlay.d.ts +82 -0
  65. package/dist/components/UploadStatusOverlay.d.ts.map +1 -0
  66. package/dist/components/UploadStatusOverlay.js +319 -0
  67. package/dist/components/UploadStatusOverlay.js.map +1 -0
  68. package/dist/components/index.d.ts +19 -0
  69. package/dist/components/index.d.ts.map +1 -0
  70. package/dist/components/index.js +28 -0
  71. package/dist/components/index.js.map +1 -0
  72. package/dist/context/HarkenContext.d.ts +62 -0
  73. package/dist/context/HarkenContext.d.ts.map +1 -0
  74. package/dist/context/HarkenContext.js +128 -0
  75. package/dist/context/HarkenContext.js.map +1 -0
  76. package/dist/context/index.d.ts +3 -0
  77. package/dist/context/index.d.ts.map +1 -0
  78. package/dist/context/index.js +7 -0
  79. package/dist/context/index.js.map +1 -0
  80. package/dist/domain/index.d.ts +3 -0
  81. package/dist/domain/index.d.ts.map +1 -0
  82. package/dist/domain/index.js +7 -0
  83. package/dist/domain/index.js.map +1 -0
  84. package/dist/domain/upload-queue.d.ts +116 -0
  85. package/dist/domain/upload-queue.d.ts.map +1 -0
  86. package/dist/domain/upload-queue.js +34 -0
  87. package/dist/domain/upload-queue.js.map +1 -0
  88. package/dist/hooks/index.d.ts +6 -0
  89. package/dist/hooks/index.d.ts.map +1 -0
  90. package/dist/hooks/index.js +16 -0
  91. package/dist/hooks/index.js.map +1 -0
  92. package/dist/hooks/useAnonymousId.d.ts +28 -0
  93. package/dist/hooks/useAnonymousId.d.ts.map +1 -0
  94. package/dist/hooks/useAnonymousId.js +59 -0
  95. package/dist/hooks/useAnonymousId.js.map +1 -0
  96. package/dist/hooks/useAttachmentPicker.d.ts +84 -0
  97. package/dist/hooks/useAttachmentPicker.d.ts.map +1 -0
  98. package/dist/hooks/useAttachmentPicker.js +181 -0
  99. package/dist/hooks/useAttachmentPicker.js.map +1 -0
  100. package/dist/hooks/useAttachmentStatus.d.ts +51 -0
  101. package/dist/hooks/useAttachmentStatus.d.ts.map +1 -0
  102. package/dist/hooks/useAttachmentStatus.js +69 -0
  103. package/dist/hooks/useAttachmentStatus.js.map +1 -0
  104. package/dist/hooks/useAttachmentUpload.d.ts +101 -0
  105. package/dist/hooks/useAttachmentUpload.d.ts.map +1 -0
  106. package/dist/hooks/useAttachmentUpload.js +293 -0
  107. package/dist/hooks/useAttachmentUpload.js.map +1 -0
  108. package/dist/hooks/useFeedback.d.ts +55 -0
  109. package/dist/hooks/useFeedback.d.ts.map +1 -0
  110. package/dist/hooks/useFeedback.js +96 -0
  111. package/dist/hooks/useFeedback.js.map +1 -0
  112. package/dist/hooks/useHarkenContext.d.ts +25 -0
  113. package/dist/hooks/useHarkenContext.d.ts.map +1 -0
  114. package/dist/hooks/useHarkenContext.js +35 -0
  115. package/dist/hooks/useHarkenContext.js.map +1 -0
  116. package/dist/hooks/useHarkenTheme.d.ts +26 -0
  117. package/dist/hooks/useHarkenTheme.d.ts.map +1 -0
  118. package/dist/hooks/useHarkenTheme.js +36 -0
  119. package/dist/hooks/useHarkenTheme.js.map +1 -0
  120. package/dist/index.d.ts +49 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +91 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/services/index.d.ts +4 -0
  125. package/dist/services/index.d.ts.map +1 -0
  126. package/dist/services/index.js +9 -0
  127. package/dist/services/index.js.map +1 -0
  128. package/dist/services/uploadQueueService.d.ts +193 -0
  129. package/dist/services/uploadQueueService.d.ts.map +1 -0
  130. package/dist/services/uploadQueueService.js +623 -0
  131. package/dist/services/uploadQueueService.js.map +1 -0
  132. package/dist/services/uploadQueueStorage.d.ts +30 -0
  133. package/dist/services/uploadQueueStorage.d.ts.map +1 -0
  134. package/dist/services/uploadQueueStorage.js +77 -0
  135. package/dist/services/uploadQueueStorage.js.map +1 -0
  136. package/dist/storage/IdentityStore.d.ts +38 -0
  137. package/dist/storage/IdentityStore.d.ts.map +1 -0
  138. package/dist/storage/IdentityStore.js +83 -0
  139. package/dist/storage/IdentityStore.js.map +1 -0
  140. package/dist/storage/SecureStoreAdapter.d.ts +28 -0
  141. package/dist/storage/SecureStoreAdapter.d.ts.map +1 -0
  142. package/dist/storage/SecureStoreAdapter.js +52 -0
  143. package/dist/storage/SecureStoreAdapter.js.map +1 -0
  144. package/dist/storage/defaultStorage.d.ts +20 -0
  145. package/dist/storage/defaultStorage.d.ts.map +1 -0
  146. package/dist/storage/defaultStorage.js +131 -0
  147. package/dist/storage/defaultStorage.js.map +1 -0
  148. package/dist/storage/index.d.ts +6 -0
  149. package/dist/storage/index.d.ts.map +1 -0
  150. package/dist/storage/index.js +13 -0
  151. package/dist/storage/index.js.map +1 -0
  152. package/dist/storage/types.d.ts +32 -0
  153. package/dist/storage/types.d.ts.map +1 -0
  154. package/dist/storage/types.js +11 -0
  155. package/dist/storage/types.js.map +1 -0
  156. package/dist/theme/defaults.d.ts +43 -0
  157. package/dist/theme/defaults.d.ts.map +1 -0
  158. package/dist/theme/defaults.js +128 -0
  159. package/dist/theme/defaults.js.map +1 -0
  160. package/dist/theme/index.d.ts +3 -0
  161. package/dist/theme/index.d.ts.map +1 -0
  162. package/dist/theme/index.js +14 -0
  163. package/dist/theme/index.js.map +1 -0
  164. package/dist/theme/types.d.ts +136 -0
  165. package/dist/theme/types.d.ts.map +1 -0
  166. package/dist/theme/types.js +3 -0
  167. package/dist/theme/types.js.map +1 -0
  168. package/dist/types/config.d.ts +100 -0
  169. package/dist/types/config.d.ts.map +1 -0
  170. package/dist/types/config.js +3 -0
  171. package/dist/types/config.js.map +1 -0
  172. package/dist/types/index.d.ts +3 -0
  173. package/dist/types/index.d.ts.map +1 -0
  174. package/dist/types/index.js +3 -0
  175. package/dist/types/index.js.map +1 -0
  176. package/dist/types/openapi.d.ts +601 -0
  177. package/dist/types/openapi.d.ts.map +1 -0
  178. package/dist/types/openapi.js +7 -0
  179. package/dist/types/openapi.js.map +1 -0
  180. package/dist/utils/index.d.ts +2 -0
  181. package/dist/utils/index.d.ts.map +1 -0
  182. package/dist/utils/index.js +6 -0
  183. package/dist/utils/index.js.map +1 -0
  184. package/dist/utils/uuid.d.ts +10 -0
  185. package/dist/utils/uuid.d.ts.map +1 -0
  186. package/dist/utils/uuid.js +60 -0
  187. package/dist/utils/uuid.js.map +1 -0
  188. package/package.json +124 -0
  189. package/src/@types/expo-file-system-legacy.d.ts +13 -0
  190. package/src/api/client.ts +250 -0
  191. package/src/api/errors.ts +84 -0
  192. package/src/api/index.ts +15 -0
  193. package/src/api/retry.ts +99 -0
  194. package/src/attachments/FeedbackSheet.tsx +400 -0
  195. package/src/attachments/index.ts +70 -0
  196. package/src/components/AttachmentGrid.tsx +247 -0
  197. package/src/components/AttachmentPicker.tsx +391 -0
  198. package/src/components/AttachmentPreview.tsx +210 -0
  199. package/src/components/CategorySelector.tsx +174 -0
  200. package/src/components/FeedbackForm.tsx +216 -0
  201. package/src/components/FeedbackSheet.tsx +321 -0
  202. package/src/components/ThemedButton.tsx +127 -0
  203. package/src/components/ThemedText.tsx +65 -0
  204. package/src/components/ThemedTextInput.tsx +65 -0
  205. package/src/components/UploadStatusOverlay.tsx +440 -0
  206. package/src/components/index.ts +39 -0
  207. package/src/context/HarkenContext.tsx +129 -0
  208. package/src/context/index.ts +2 -0
  209. package/src/domain/index.ts +12 -0
  210. package/src/domain/upload-queue.ts +131 -0
  211. package/src/hooks/index.ts +10 -0
  212. package/src/hooks/useAnonymousId.ts +68 -0
  213. package/src/hooks/useAttachmentPicker.ts +243 -0
  214. package/src/hooks/useAttachmentStatus.ts +86 -0
  215. package/src/hooks/useAttachmentUpload.ts +370 -0
  216. package/src/hooks/useFeedback.ts +139 -0
  217. package/src/hooks/useHarkenContext.ts +35 -0
  218. package/src/hooks/useHarkenTheme.ts +36 -0
  219. package/src/index.ts +168 -0
  220. package/src/services/index.ts +11 -0
  221. package/src/services/uploadQueueService.ts +727 -0
  222. package/src/services/uploadQueueStorage.ts +78 -0
  223. package/src/storage/IdentityStore.ts +89 -0
  224. package/src/storage/SecureStoreAdapter.ts +59 -0
  225. package/src/storage/defaultStorage.ts +109 -0
  226. package/src/storage/index.ts +5 -0
  227. package/src/storage/types.ts +34 -0
  228. package/src/theme/defaults.ts +151 -0
  229. package/src/theme/index.ts +23 -0
  230. package/src/theme/types.ts +157 -0
  231. package/src/types/config.ts +112 -0
  232. package/src/types/index.ts +10 -0
  233. package/src/types/openapi.ts +601 -0
  234. package/src/utils/index.ts +1 -0
  235. package/src/utils/uuid.ts +77 -0
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AttachmentPreview = AttachmentPreview;
7
+ const react_1 = __importDefault(require("react"));
8
+ const react_native_1 = require("react-native");
9
+ const hooks_1 = require("../hooks");
10
+ const ThemedText_1 = require("./ThemedText");
11
+ const UploadStatusOverlay_1 = require("./UploadStatusOverlay");
12
+ /**
13
+ * Preview component for a single attachment with upload status.
14
+ *
15
+ * Shows image thumbnail for images, file icon for other types.
16
+ * Includes upload status overlay with progress/retry/remove actions.
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * // Basic usage
21
+ * <AttachmentPreview
22
+ * uri={attachment.localUri}
23
+ * mimeType={attachment.mimeType}
24
+ * phase={attachment.phase}
25
+ * progress={attachment.progress}
26
+ * onRetry={() => retryAttachment(attachment.attachmentId)}
27
+ * onRemove={() => removeAttachment(attachment.attachmentId)}
28
+ * />
29
+ *
30
+ * // With custom file icon
31
+ * <AttachmentPreview
32
+ * uri={attachment.localUri}
33
+ * mimeType={attachment.mimeType}
34
+ * phase={attachment.phase}
35
+ * progress={attachment.progress}
36
+ * getFileIcon={(mime) => {
37
+ * if (mime === 'application/pdf') return <PdfIcon />;
38
+ * return '📄';
39
+ * }}
40
+ * />
41
+ *
42
+ * // With custom placeholder
43
+ * <AttachmentPreview
44
+ * uri={attachment.localUri}
45
+ * mimeType={attachment.mimeType}
46
+ * phase={attachment.phase}
47
+ * progress={attachment.progress}
48
+ * renderPlaceholder={(mime, name) => (
49
+ * <MyCustomPlaceholder mimeType={mime} fileName={name} />
50
+ * )}
51
+ * />
52
+ * ```
53
+ */
54
+ function AttachmentPreview({ uri, mimeType, fileName, phase, progress, error, onRetry, onRemove, size = 80, style, imageStyle, renderPlaceholder, getFileIcon: customGetFileIcon, statusLabels, }) {
55
+ const theme = (0, hooks_1.useHarkenTheme)();
56
+ const isImage = mimeType?.startsWith('image/') ?? true;
57
+ const renderFileContent = () => {
58
+ if (renderPlaceholder && mimeType) {
59
+ return renderPlaceholder(mimeType, fileName);
60
+ }
61
+ const icon = customGetFileIcon
62
+ ? customGetFileIcon(mimeType ?? '')
63
+ : getDefaultFileIcon(mimeType);
64
+ return (<react_native_1.View style={styles.filePreview}>
65
+ {typeof icon === 'string' ? (<ThemedText_1.ThemedText style={styles.fileIcon}>{icon}</ThemedText_1.ThemedText>) : (icon)}
66
+ {fileName && (<ThemedText_1.ThemedText variant="caption" secondary numberOfLines={2} style={styles.fileName}>
67
+ {fileName}
68
+ </ThemedText_1.ThemedText>)}
69
+ </react_native_1.View>);
70
+ };
71
+ return (<react_native_1.View style={[
72
+ styles.container,
73
+ {
74
+ width: size,
75
+ height: size,
76
+ borderRadius: theme.radii.md,
77
+ backgroundColor: theme.colors.backgroundSecondary,
78
+ borderWidth: 1,
79
+ borderColor: theme.colors.border,
80
+ overflow: 'hidden',
81
+ },
82
+ style,
83
+ ]}>
84
+ {isImage ? (<react_native_1.Image source={{ uri }} style={[styles.image, { width: size, height: size }, imageStyle]} resizeMode="cover"/>) : (renderFileContent())}
85
+
86
+ <UploadStatusOverlay_1.UploadStatusOverlay phase={phase} progress={progress} error={error} onRetry={onRetry} onRemove={onRemove} labels={statusLabels}/>
87
+ </react_native_1.View>);
88
+ }
89
+ /**
90
+ * Get default file icon emoji based on MIME type.
91
+ */
92
+ function getDefaultFileIcon(mimeType) {
93
+ if (!mimeType)
94
+ return '📄';
95
+ if (mimeType.startsWith('image/'))
96
+ return '🖼️';
97
+ if (mimeType.startsWith('video/'))
98
+ return '🎬';
99
+ if (mimeType === 'application/pdf')
100
+ return '📕';
101
+ if (mimeType.includes('spreadsheet') || mimeType.includes('excel'))
102
+ return '📊';
103
+ if (mimeType.includes('document') || mimeType.includes('word'))
104
+ return '📝';
105
+ if (mimeType.includes('presentation') || mimeType.includes('powerpoint'))
106
+ return '📽️';
107
+ if (mimeType.includes('zip') || mimeType.includes('archive'))
108
+ return '📦';
109
+ return '📄';
110
+ }
111
+ const styles = react_native_1.StyleSheet.create({
112
+ container: {
113
+ position: 'relative',
114
+ },
115
+ image: {
116
+ backgroundColor: '#f0f0f0',
117
+ },
118
+ filePreview: {
119
+ flex: 1,
120
+ alignItems: 'center',
121
+ justifyContent: 'center',
122
+ padding: 8,
123
+ },
124
+ fileIcon: {
125
+ fontSize: 28,
126
+ },
127
+ fileName: {
128
+ marginTop: 4,
129
+ textAlign: 'center',
130
+ fontSize: 10,
131
+ },
132
+ });
133
+ //# sourceMappingURL=AttachmentPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentPreview.js","sourceRoot":"","sources":["../../src/components/AttachmentPreview.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import React from 'react';
2
+ import type { ViewStyle, StyleProp } from 'react-native';
3
+ import type { FeedbackCategory } from '../types';
4
+ export interface CategoryOption {
5
+ value: FeedbackCategory;
6
+ label: string;
7
+ emoji?: string;
8
+ /** Custom icon element (replaces emoji) */
9
+ icon?: React.ReactNode;
10
+ }
11
+ export declare const DEFAULT_CATEGORIES: CategoryOption[];
12
+ export interface CategorySelectorProps {
13
+ /** Currently selected category */
14
+ value: FeedbackCategory | null;
15
+ /** Callback when category is selected */
16
+ onChange: (category: FeedbackCategory) => void;
17
+ /** Custom categories (defaults to bug, idea, ux, other) */
18
+ categories?: CategoryOption[];
19
+ /** Disable interaction */
20
+ disabled?: boolean;
21
+ /** Custom renderer for category chips */
22
+ renderCategory?: (option: CategoryOption, isSelected: boolean, onSelect: () => void) => React.ReactNode;
23
+ /** Style for the container */
24
+ style?: StyleProp<ViewStyle>;
25
+ /** Style for unselected chips */
26
+ chipStyle?: StyleProp<ViewStyle>;
27
+ /** Style for selected chips */
28
+ selectedChipStyle?: StyleProp<ViewStyle>;
29
+ }
30
+ /**
31
+ * Category selector for feedback type.
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * // Basic usage
36
+ * <CategorySelector
37
+ * value={category}
38
+ * onChange={setCategory}
39
+ * />
40
+ *
41
+ * // Custom categories without emojis
42
+ * <CategorySelector
43
+ * value={category}
44
+ * onChange={setCategory}
45
+ * categories={[
46
+ * { value: 'bug', label: 'Report Bug' },
47
+ * { value: 'idea', label: 'Feature Request' },
48
+ * ]}
49
+ * />
50
+ *
51
+ * // With custom icons
52
+ * <CategorySelector
53
+ * value={category}
54
+ * onChange={setCategory}
55
+ * categories={[
56
+ * { value: 'bug', label: 'Bug', icon: <BugIcon /> },
57
+ * { value: 'idea', label: 'Idea', icon: <LightbulbIcon /> },
58
+ * ]}
59
+ * />
60
+ *
61
+ * // Fully custom rendering
62
+ * <CategorySelector
63
+ * value={category}
64
+ * onChange={setCategory}
65
+ * renderCategory={(option, isSelected, onSelect) => (
66
+ * <MyCustomChip
67
+ * key={option.value}
68
+ * selected={isSelected}
69
+ * onPress={onSelect}
70
+ * label={option.label}
71
+ * />
72
+ * )}
73
+ * />
74
+ * ```
75
+ */
76
+ export declare function CategorySelector({ value, onChange, categories, disabled, renderCategory, style, chipStyle, selectedChipStyle, }: CategorySelectorProps): React.JSX.Element;
77
+ //# sourceMappingURL=CategorySelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategorySelector.d.ts","sourceRoot":"","sources":["../../src/components/CategorySelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,gBAAgB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED,eAAO,MAAM,kBAAkB,EAAE,cAAc,EAK9C,CAAC;AAEF,MAAM,WAAW,qBAAqB;IACpC,kCAAkC;IAClC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,yCAAyC;IACzC,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/C,2DAA2D;IAC3D,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,cAAc,CAAC,EAAE,CACf,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,MAAM,IAAI,KACjB,KAAK,CAAC,SAAS,CAAC;IACrB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,iCAAiC;IACjC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACjC,+BAA+B;IAC/B,iBAAiB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,UAA+B,EAC/B,QAAgB,EAChB,cAAc,EACd,KAAK,EACL,SAAS,EACT,iBAAiB,GAClB,EAAE,qBAAqB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAyE3C"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_CATEGORIES = void 0;
7
+ exports.CategorySelector = CategorySelector;
8
+ const react_1 = __importDefault(require("react"));
9
+ const react_native_1 = require("react-native");
10
+ const hooks_1 = require("../hooks");
11
+ const ThemedText_1 = require("./ThemedText");
12
+ exports.DEFAULT_CATEGORIES = [
13
+ { value: 'bug', label: 'Bug', emoji: '🐛' },
14
+ { value: 'idea', label: 'Idea', emoji: '💡' },
15
+ { value: 'ux', label: 'UX', emoji: '✨' },
16
+ { value: 'other', label: 'Other', emoji: '💬' },
17
+ ];
18
+ /**
19
+ * Category selector for feedback type.
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * // Basic usage
24
+ * <CategorySelector
25
+ * value={category}
26
+ * onChange={setCategory}
27
+ * />
28
+ *
29
+ * // Custom categories without emojis
30
+ * <CategorySelector
31
+ * value={category}
32
+ * onChange={setCategory}
33
+ * categories={[
34
+ * { value: 'bug', label: 'Report Bug' },
35
+ * { value: 'idea', label: 'Feature Request' },
36
+ * ]}
37
+ * />
38
+ *
39
+ * // With custom icons
40
+ * <CategorySelector
41
+ * value={category}
42
+ * onChange={setCategory}
43
+ * categories={[
44
+ * { value: 'bug', label: 'Bug', icon: <BugIcon /> },
45
+ * { value: 'idea', label: 'Idea', icon: <LightbulbIcon /> },
46
+ * ]}
47
+ * />
48
+ *
49
+ * // Fully custom rendering
50
+ * <CategorySelector
51
+ * value={category}
52
+ * onChange={setCategory}
53
+ * renderCategory={(option, isSelected, onSelect) => (
54
+ * <MyCustomChip
55
+ * key={option.value}
56
+ * selected={isSelected}
57
+ * onPress={onSelect}
58
+ * label={option.label}
59
+ * />
60
+ * )}
61
+ * />
62
+ * ```
63
+ */
64
+ function CategorySelector({ value, onChange, categories = exports.DEFAULT_CATEGORIES, disabled = false, renderCategory, style, chipStyle, selectedChipStyle, }) {
65
+ const theme = (0, hooks_1.useHarkenTheme)();
66
+ const containerStyle = {
67
+ flexDirection: 'row',
68
+ flexWrap: 'wrap',
69
+ gap: theme.spacing.sm,
70
+ };
71
+ return (<react_native_1.View style={[containerStyle, style]}>
72
+ {categories.map((category) => {
73
+ const isSelected = value === category.value;
74
+ const onSelect = () => onChange(category.value);
75
+ // Use custom renderer if provided
76
+ if (renderCategory) {
77
+ return (<react_1.default.Fragment key={category.value}>
78
+ {renderCategory(category, isSelected, onSelect)}
79
+ </react_1.default.Fragment>);
80
+ }
81
+ const baseChipStyle = {
82
+ flexDirection: 'row',
83
+ alignItems: 'center',
84
+ paddingVertical: theme.spacing.sm,
85
+ paddingHorizontal: theme.spacing.md,
86
+ borderRadius: theme.radii.full,
87
+ borderWidth: 1,
88
+ borderColor: isSelected ? theme.colors.primary : theme.colors.border,
89
+ backgroundColor: isSelected
90
+ ? theme.colors.primary
91
+ : theme.colors.backgroundSecondary,
92
+ opacity: disabled ? 0.6 : 1,
93
+ };
94
+ const textColor = isSelected
95
+ ? theme.colors.textOnPrimary
96
+ : theme.colors.text;
97
+ return (<react_native_1.Pressable key={category.value} onPress={onSelect} disabled={disabled} style={({ pressed }) => [
98
+ baseChipStyle,
99
+ chipStyle,
100
+ isSelected && selectedChipStyle,
101
+ pressed && !disabled && {
102
+ opacity: 0.8,
103
+ },
104
+ ]}>
105
+ {category.icon ? (<react_native_1.View style={{ marginRight: theme.spacing.xs }}>
106
+ {category.icon}
107
+ </react_native_1.View>) : category.emoji ? (<ThemedText_1.ThemedText style={{ marginRight: theme.spacing.xs }}>
108
+ {category.emoji}
109
+ </ThemedText_1.ThemedText>) : null}
110
+ <ThemedText_1.ThemedText variant="label" color={textColor}>
111
+ {category.label}
112
+ </ThemedText_1.ThemedText>
113
+ </react_native_1.Pressable>);
114
+ })}
115
+ </react_native_1.View>);
116
+ }
117
+ //# sourceMappingURL=CategorySelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategorySelector.js","sourceRoot":"","sources":["../../src/components/CategorySelector.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import type { CategoryOption } from './CategorySelector';
3
+ import type { FeedbackCategory } from '../types';
4
+ export interface FeedbackFormData {
5
+ message: string;
6
+ category: FeedbackCategory | null;
7
+ }
8
+ export interface FeedbackFormProps {
9
+ /** Called when form is submitted */
10
+ onSubmit: (data: FeedbackFormData) => void | Promise<void>;
11
+ /** Called when form is cancelled/dismissed */
12
+ onCancel?: () => void;
13
+ /** Title text */
14
+ title?: string;
15
+ /** Placeholder text for message input */
16
+ placeholder?: string;
17
+ /** Submit button text */
18
+ submitLabel?: string;
19
+ /** Cancel button text */
20
+ cancelLabel?: string;
21
+ /** Custom categories */
22
+ categories?: CategoryOption[];
23
+ /** Whether category selection is required */
24
+ requireCategory?: boolean;
25
+ /** Minimum message length */
26
+ minMessageLength?: number;
27
+ /** Maximum message length */
28
+ maxMessageLength?: number;
29
+ /** Loading state (disables form) */
30
+ loading?: boolean;
31
+ /** Initial form values */
32
+ initialValues?: Partial<FeedbackFormData>;
33
+ }
34
+ /**
35
+ * Feedback composer form component.
36
+ *
37
+ * A minimal, themed form for collecting user feedback.
38
+ *
39
+ * @example
40
+ * ```tsx
41
+ * <FeedbackForm
42
+ * onSubmit={async (data) => {
43
+ * await submitFeedback(data);
44
+ * }}
45
+ * onCancel={() => setVisible(false)}
46
+ * />
47
+ * ```
48
+ */
49
+ export declare function FeedbackForm({ onSubmit, onCancel, title, placeholder, submitLabel, cancelLabel, categories, requireCategory, minMessageLength, maxMessageLength, loading, initialValues, }: FeedbackFormProps): React.JSX.Element;
50
+ //# sourceMappingURL=FeedbackForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeedbackForm.d.ts","sourceRoot":"","sources":["../../src/components/FeedbackForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAQrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,QAAQ,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB;IACxB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,6BAA6B;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,QAAQ,EACR,KAAuB,EACvB,WAA6C,EAC7C,WAAsB,EACtB,WAAsB,EACtB,UAAU,EACV,eAAuB,EACvB,gBAAoB,EACpB,gBAAuB,EACvB,OAAe,EACf,aAAa,GACd,EAAE,iBAAiB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAgJvC"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.FeedbackForm = FeedbackForm;
37
+ const react_1 = __importStar(require("react"));
38
+ const react_native_1 = require("react-native");
39
+ const hooks_1 = require("../hooks");
40
+ const ThemedText_1 = require("./ThemedText");
41
+ const ThemedTextInput_1 = require("./ThemedTextInput");
42
+ const ThemedButton_1 = require("./ThemedButton");
43
+ const CategorySelector_1 = require("./CategorySelector");
44
+ /**
45
+ * Feedback composer form component.
46
+ *
47
+ * A minimal, themed form for collecting user feedback.
48
+ *
49
+ * @example
50
+ * ```tsx
51
+ * <FeedbackForm
52
+ * onSubmit={async (data) => {
53
+ * await submitFeedback(data);
54
+ * }}
55
+ * onCancel={() => setVisible(false)}
56
+ * />
57
+ * ```
58
+ */
59
+ function FeedbackForm({ onSubmit, onCancel, title = 'Send Feedback', placeholder = 'What would you like to share?', submitLabel = 'Submit', cancelLabel = 'Cancel', categories, requireCategory = false, minMessageLength = 1, maxMessageLength = 5000, loading = false, initialValues, }) {
60
+ const theme = (0, hooks_1.useHarkenTheme)();
61
+ const [message, setMessage] = (0, react_1.useState)(initialValues?.message ?? '');
62
+ const [category, setCategory] = (0, react_1.useState)(initialValues?.category ?? null);
63
+ const [isSubmitting, setIsSubmitting] = (0, react_1.useState)(false);
64
+ const trimmedMessage = message.trim();
65
+ const isMessageValid = trimmedMessage.length >= minMessageLength &&
66
+ trimmedMessage.length <= maxMessageLength;
67
+ const isCategoryValid = !requireCategory || category !== null;
68
+ const canSubmit = isMessageValid && isCategoryValid && !loading && !isSubmitting;
69
+ const handleSubmit = (0, react_1.useCallback)(async () => {
70
+ if (!canSubmit)
71
+ return;
72
+ setIsSubmitting(true);
73
+ try {
74
+ await onSubmit({
75
+ message: trimmedMessage,
76
+ category,
77
+ });
78
+ }
79
+ finally {
80
+ setIsSubmitting(false);
81
+ }
82
+ }, [canSubmit, onSubmit, trimmedMessage, category]);
83
+ const containerStyle = {
84
+ backgroundColor: theme.colors.background,
85
+ padding: theme.spacing.lg,
86
+ borderRadius: theme.radii.lg,
87
+ };
88
+ const sectionStyle = {
89
+ marginBottom: theme.spacing.lg,
90
+ };
91
+ const buttonRowStyle = {
92
+ flexDirection: 'row',
93
+ gap: theme.spacing.sm,
94
+ marginTop: theme.spacing.md,
95
+ };
96
+ const characterCount = trimmedMessage.length;
97
+ const showCharacterWarning = characterCount > maxMessageLength * 0.9;
98
+ return (<react_native_1.KeyboardAvoidingView behavior={react_native_1.Platform.OS === 'ios' ? 'padding' : 'height'} style={{ flex: 1 }}>
99
+ <react_native_1.ScrollView contentContainerStyle={{ flexGrow: 1 }} keyboardShouldPersistTaps="handled">
100
+ <react_native_1.View style={containerStyle}>
101
+ {/* Title */}
102
+ <react_native_1.View style={sectionStyle}>
103
+ <ThemedText_1.ThemedText variant="title">{title}</ThemedText_1.ThemedText>
104
+ </react_native_1.View>
105
+
106
+ {/* Category selector */}
107
+ <react_native_1.View style={sectionStyle}>
108
+ <ThemedText_1.ThemedText variant="label" secondary style={{ marginBottom: theme.spacing.sm }}>
109
+ Category{requireCategory ? '' : ' (optional)'}
110
+ </ThemedText_1.ThemedText>
111
+ <CategorySelector_1.CategorySelector value={category} onChange={setCategory} categories={categories} disabled={loading || isSubmitting}/>
112
+ </react_native_1.View>
113
+
114
+ {/* Message input */}
115
+ <react_native_1.View style={sectionStyle}>
116
+ <ThemedText_1.ThemedText variant="label" secondary style={{ marginBottom: theme.spacing.sm }}>
117
+ Message
118
+ </ThemedText_1.ThemedText>
119
+ <ThemedTextInput_1.ThemedTextInput value={message} onChangeText={setMessage} placeholder={placeholder} multiline numberOfLines={4} textAlignVertical="top" editable={!loading && !isSubmitting} style={{ minHeight: 120 }} maxLength={maxMessageLength + 100} // Allow slight overflow to show warning
120
+ />
121
+ {showCharacterWarning && (<ThemedText_1.ThemedText variant="caption" color={characterCount > maxMessageLength
122
+ ? theme.colors.error
123
+ : theme.colors.textSecondary} style={{ marginTop: theme.spacing.xs, textAlign: 'right' }}>
124
+ {characterCount}/{maxMessageLength}
125
+ </ThemedText_1.ThemedText>)}
126
+ </react_native_1.View>
127
+
128
+ {/* Buttons */}
129
+ <react_native_1.View style={buttonRowStyle}>
130
+ {onCancel && (<react_native_1.View style={{ flex: 1 }}>
131
+ <ThemedButton_1.ThemedButton title={cancelLabel} variant="secondary" onPress={onCancel} disabled={isSubmitting} fullWidth/>
132
+ </react_native_1.View>)}
133
+ <react_native_1.View style={{ flex: onCancel ? 1 : undefined }}>
134
+ <ThemedButton_1.ThemedButton title={submitLabel} variant="primary" onPress={handleSubmit} disabled={!canSubmit} loading={isSubmitting || loading} fullWidth={!!onCancel}/>
135
+ </react_native_1.View>
136
+ </react_native_1.View>
137
+ </react_native_1.View>
138
+ </react_native_1.ScrollView>
139
+ </react_native_1.KeyboardAvoidingView>);
140
+ }
141
+ //# sourceMappingURL=FeedbackForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeedbackForm.js","sourceRoot":"","sources":["../../src/components/FeedbackForm.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import React from 'react';
2
+ import type { ViewStyle } from 'react-native';
3
+ import type { components } from '../types/index.js';
4
+ import type { CategoryOption } from './CategorySelector';
5
+ type FeedbackSubmissionResponse = components['schemas']['FeedbackSubmissionResponse'];
6
+ export interface FeedbackSheetProps {
7
+ /** Called when feedback is successfully submitted */
8
+ onSuccess?: (result: FeedbackSubmissionResponse) => void;
9
+ /** Called when submission fails */
10
+ onError?: (error: Error) => void;
11
+ /** Called when user cancels/dismisses the form */
12
+ onCancel?: () => void;
13
+ /** Title text */
14
+ title?: string;
15
+ /** Placeholder text for message input */
16
+ placeholder?: string;
17
+ /** Submit button text */
18
+ submitLabel?: string;
19
+ /** Cancel button text */
20
+ cancelLabel?: string;
21
+ /** Custom categories */
22
+ categories?: CategoryOption[];
23
+ /** Whether category selection is required */
24
+ requireCategory?: boolean;
25
+ /** Minimum message length */
26
+ minMessageLength?: number;
27
+ /** Maximum message length */
28
+ maxMessageLength?: number;
29
+ /** Message shown in success alert. Set to null to disable alert. */
30
+ successMessage?: string | null;
31
+ /** Whether to show success alert. @default true */
32
+ showSuccessAlert?: boolean;
33
+ /** Whether to clear form on success. @default true */
34
+ clearOnSuccess?: boolean;
35
+ /** Container style override */
36
+ containerStyle?: ViewStyle;
37
+ /** Form content style override */
38
+ formStyle?: ViewStyle;
39
+ }
40
+ /**
41
+ * A batteries-included feedback form component.
42
+ *
43
+ * Unlike `FeedbackForm` which is a "dumb" UI component requiring manual
44
+ * wiring, `FeedbackSheet` handles everything internally:
45
+ * - API submission via `useFeedback` hook
46
+ * - Success/error alerts
47
+ * - Form state management
48
+ * - Keyboard handling
49
+ *
50
+ * For attachment support, import from '@harkenapp/sdk-react-native/attachments'.
51
+ *
52
+ * @example
53
+ * ```tsx
54
+ * // Minimal usage
55
+ * <FeedbackSheet onSuccess={() => navigation.goBack()} />
56
+ *
57
+ * // With customization
58
+ * <FeedbackSheet
59
+ * title="Report a Bug"
60
+ * requireCategory
61
+ * categories={[
62
+ * { value: 'crash', label: 'App Crash', icon: '💥' },
63
+ * { value: 'visual', label: 'Visual Bug', icon: '👁️' },
64
+ * ]}
65
+ * onSuccess={(result) => {
66
+ * analytics.track('feedback_submitted');
67
+ * navigation.goBack();
68
+ * }}
69
+ * onCancel={() => navigation.goBack()}
70
+ * />
71
+ * ```
72
+ */
73
+ export declare function FeedbackSheet({ onSuccess, onError, onCancel, title, placeholder, submitLabel, cancelLabel, categories, requireCategory, minMessageLength, maxMessageLength, successMessage, showSuccessAlert, clearOnSuccess, containerStyle, formStyle, }: FeedbackSheetProps): React.JSX.Element;
74
+ export {};
75
+ //# sourceMappingURL=FeedbackSheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FeedbackSheet.d.ts","sourceRoot":"","sources":["../../src/components/FeedbackSheet.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAQrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,KAAK,0BAA0B,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,4BAA4B,CAAC,CAAC;AAEtF,MAAM,WAAW,kBAAkB;IACjC,qDAAqD;IACrD,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,0BAA0B,KAAK,IAAI,CAAC;IACzD,mCAAmC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAEtB,iBAAiB;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,wBAAwB;IACxB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAC9B,6CAA6C;IAC7C,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,6BAA6B;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,6BAA6B;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sDAAsD;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,+BAA+B;IAC/B,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,kCAAkC;IAClC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,OAAO,EACP,QAAQ,EACR,KAAuB,EACvB,WAA6C,EAC7C,WAAsB,EACtB,WAAsB,EACtB,UAA+B,EAC/B,eAAuB,EACvB,gBAAoB,EACpB,gBAAuB,EACvB,cAA+C,EAC/C,gBAAuB,EACvB,cAAqB,EACrB,cAAc,EACd,SAAS,GACV,EAAE,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAkNxC"}