convex-feedback-ui 0.1.5 → 0.1.7

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 (131) hide show
  1. package/README.md +143 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/native/expo/ExpoFeedbackBody.d.ts +1 -1
  4. package/dist/native/expo/ExpoFeedbackBody.d.ts.map +1 -1
  5. package/dist/native/expo/ExpoFeedbackBody.js +2 -2
  6. package/dist/native/expo/ExpoFeedbackBody.js.map +1 -1
  7. package/dist/native/expo/FeedbackCreateStackLayout.d.ts +3 -0
  8. package/dist/native/expo/FeedbackCreateStackLayout.d.ts.map +1 -0
  9. package/dist/native/expo/FeedbackCreateStackLayout.js +35 -0
  10. package/dist/native/expo/FeedbackCreateStackLayout.js.map +1 -0
  11. package/dist/native/expo/FeedbackRoutes.d.ts +4 -0
  12. package/dist/native/expo/FeedbackRoutes.d.ts.map +1 -0
  13. package/dist/native/expo/FeedbackRoutes.js +81 -0
  14. package/dist/native/expo/FeedbackRoutes.js.map +1 -0
  15. package/dist/native/expo/FeedbackScreen.d.ts +1 -1
  16. package/dist/native/expo/FeedbackScreen.d.ts.map +1 -1
  17. package/dist/native/expo/FeedbackScreen.js +2 -2
  18. package/dist/native/expo/FeedbackScreen.js.map +1 -1
  19. package/dist/native/expo/FeedbackStack.d.ts +1 -1
  20. package/dist/native/expo/FeedbackStack.d.ts.map +1 -1
  21. package/dist/native/expo/FeedbackStack.js +10 -5
  22. package/dist/native/expo/FeedbackStack.js.map +1 -1
  23. package/dist/native/expo/FeedbackStackLayout.d.ts +3 -0
  24. package/dist/native/expo/FeedbackStackLayout.d.ts.map +1 -0
  25. package/dist/native/expo/FeedbackStackLayout.js +54 -0
  26. package/dist/native/expo/FeedbackStackLayout.js.map +1 -0
  27. package/dist/native/expo/RoutedFeedbackContext.d.ts +4 -0
  28. package/dist/native/expo/RoutedFeedbackContext.d.ts.map +1 -0
  29. package/dist/native/expo/RoutedFeedbackContext.js +11 -0
  30. package/dist/native/expo/RoutedFeedbackContext.js.map +1 -0
  31. package/dist/native/expo/RoutedFeedbackModalContext.d.ts +7 -0
  32. package/dist/native/expo/RoutedFeedbackModalContext.d.ts.map +1 -0
  33. package/dist/native/expo/RoutedFeedbackModalContext.js +7 -0
  34. package/dist/native/expo/RoutedFeedbackModalContext.js.map +1 -0
  35. package/dist/native/expo/index.d.ts +4 -0
  36. package/dist/native/expo/index.d.ts.map +1 -1
  37. package/dist/native/expo/index.js +4 -0
  38. package/dist/native/expo/index.js.map +1 -1
  39. package/dist/native/expo/routes.d.ts +16 -0
  40. package/dist/native/expo/routes.d.ts.map +1 -0
  41. package/dist/native/expo/routes.js +23 -0
  42. package/dist/native/expo/routes.js.map +1 -0
  43. package/dist/native/expo/types.d.ts +53 -1
  44. package/dist/native/expo/types.d.ts.map +1 -1
  45. package/dist/native/native/FeedbackScreen.d.ts +1 -1
  46. package/dist/native/native/FeedbackScreen.d.ts.map +1 -1
  47. package/dist/native/native/FeedbackScreen.js +2 -2
  48. package/dist/native/native/FeedbackScreen.js.map +1 -1
  49. package/dist/native/shared/ui/BodyContent.d.ts +1 -1
  50. package/dist/native/shared/ui/BodyContent.d.ts.map +1 -1
  51. package/dist/native/shared/ui/BodyContent.js +2 -2
  52. package/dist/native/shared/ui/BodyContent.js.map +1 -1
  53. package/dist/native/shared/ui/Button.d.ts +2 -1
  54. package/dist/native/shared/ui/Button.d.ts.map +1 -1
  55. package/dist/native/shared/ui/Button.js +9 -4
  56. package/dist/native/shared/ui/Button.js.map +1 -1
  57. package/dist/native/shared/ui/FeedbackScreenHeader.d.ts.map +1 -1
  58. package/dist/native/shared/ui/FeedbackScreenHeader.js +8 -4
  59. package/dist/native/shared/ui/FeedbackScreenHeader.js.map +1 -1
  60. package/dist/native/shared/ui/FeedbackScreenList.d.ts +1 -1
  61. package/dist/native/shared/ui/FeedbackScreenList.d.ts.map +1 -1
  62. package/dist/native/shared/ui/FeedbackScreenList.js +18 -5
  63. package/dist/native/shared/ui/FeedbackScreenList.js.map +1 -1
  64. package/dist/native/shared/ui/NewEntry.d.ts +10 -0
  65. package/dist/native/shared/ui/NewEntry.d.ts.map +1 -1
  66. package/dist/native/shared/ui/NewEntry.js +7 -14
  67. package/dist/native/shared/ui/NewEntry.js.map +1 -1
  68. package/dist/native/shared/ui/primitives.d.ts +7 -1
  69. package/dist/native/shared/ui/primitives.d.ts.map +1 -1
  70. package/dist/native/shared/ui/primitives.js +38 -0
  71. package/dist/native/shared/ui/primitives.js.map +1 -1
  72. package/dist/react/primitives.d.ts +9 -1
  73. package/dist/react/primitives.d.ts.map +1 -1
  74. package/dist/react/primitives.js +12 -0
  75. package/dist/react/primitives.js.map +1 -1
  76. package/dist/react/screen.d.ts +1 -1
  77. package/dist/react/screen.d.ts.map +1 -1
  78. package/dist/react/screen.js +21 -10
  79. package/dist/react/screen.js.map +1 -1
  80. package/dist/react/styles.css +38 -1
  81. package/dist/shared/context/FeedbackBodyProvider.d.ts +1 -1
  82. package/dist/shared/context/FeedbackBodyProvider.d.ts.map +1 -1
  83. package/dist/shared/context/FeedbackBodyProvider.js +5 -1
  84. package/dist/shared/context/FeedbackBodyProvider.js.map +1 -1
  85. package/dist/shared/helpers.d.ts +5 -1
  86. package/dist/shared/helpers.d.ts.map +1 -1
  87. package/dist/shared/helpers.js +11 -0
  88. package/dist/shared/helpers.js.map +1 -1
  89. package/dist/shared/messages.d.ts.map +1 -1
  90. package/dist/shared/messages.js +1 -0
  91. package/dist/shared/messages.js.map +1 -1
  92. package/dist/shared/types/choice.d.ts +10 -0
  93. package/dist/shared/types/choice.d.ts.map +1 -0
  94. package/dist/shared/types/choice.js +2 -0
  95. package/dist/shared/types/choice.js.map +1 -0
  96. package/dist/shared/types/index.d.ts +1 -0
  97. package/dist/shared/types/index.d.ts.map +1 -1
  98. package/dist/shared/types/messages.d.ts +2 -0
  99. package/dist/shared/types/messages.d.ts.map +1 -1
  100. package/dist/shared/types/screen.d.ts +13 -2
  101. package/dist/shared/types/screen.d.ts.map +1 -1
  102. package/package.json +12 -8
  103. package/src/native/expo/ExpoFeedbackBody.tsx +6 -1
  104. package/src/native/expo/FeedbackCreateStackLayout.tsx +62 -0
  105. package/src/native/expo/FeedbackRoutes.tsx +238 -0
  106. package/src/native/expo/FeedbackScreen.tsx +2 -0
  107. package/src/native/expo/FeedbackStack.tsx +40 -5
  108. package/src/native/expo/FeedbackStackLayout.tsx +118 -0
  109. package/src/native/expo/README.md +24 -0
  110. package/src/native/expo/RoutedFeedbackContext.tsx +20 -0
  111. package/src/native/expo/RoutedFeedbackModalContext.tsx +14 -0
  112. package/src/native/expo/index.ts +4 -0
  113. package/src/native/expo/routes.ts +41 -0
  114. package/src/native/expo/types.ts +65 -1
  115. package/src/native/native/FeedbackScreen.tsx +2 -0
  116. package/src/native/shared/ui/BodyContent.tsx +2 -0
  117. package/src/native/shared/ui/Button.tsx +12 -3
  118. package/src/native/shared/ui/FeedbackScreenHeader.tsx +25 -4
  119. package/src/native/shared/ui/FeedbackScreenList.tsx +48 -8
  120. package/src/native/shared/ui/NewEntry.tsx +12 -30
  121. package/src/native/shared/ui/primitives.tsx +90 -0
  122. package/src/react/primitives.tsx +55 -0
  123. package/src/react/screen.tsx +67 -33
  124. package/src/react/styles.css +38 -1
  125. package/src/shared/context/FeedbackBodyProvider.tsx +6 -0
  126. package/src/shared/helpers.ts +21 -1
  127. package/src/shared/messages.ts +1 -0
  128. package/src/shared/types/choice.ts +10 -0
  129. package/src/shared/types/index.ts +1 -0
  130. package/src/shared/types/messages.ts +3 -0
  131. package/src/shared/types/screen.ts +15 -1
package/README.md CHANGED
@@ -121,6 +121,20 @@ Stack options can be customized through `StackOptions`:
121
121
  />
122
122
  ```
123
123
 
124
+ iOS toolbar actions keep their package-provided SF Symbols. Android accepts
125
+ host-provided image sources; when an image is omitted, the action falls back to
126
+ its text label:
127
+
128
+ ```tsx
129
+ <FeedbackScreen
130
+ hooks={feedbackHooks}
131
+ androidToolbarIcons={{
132
+ create: require("./assets/add.png"),
133
+ back: require("./assets/back.png"),
134
+ }}
135
+ />
136
+ ```
137
+
124
138
  ### Using the Expo screen without stack integration
125
139
 
126
140
  Expo projects do not have to use the native stack integration.
@@ -135,6 +149,116 @@ When `useStack={false}`, the Expo convenience screen behaves like the regular Re
135
149
 
136
150
  `StackOptions` is only available when stack integration is enabled.
137
151
 
152
+ ### Routed Expo navigation
153
+
154
+ For real stacked routes, use the additive routed API. Expo Router discovers
155
+ routes from the application's `app` directory, so the host application supplies
156
+ small route files while the package supplies their layouts and screens:
157
+
158
+ ```text
159
+ app/feedback/
160
+ ├── _layout.tsx
161
+ ├── index.tsx
162
+ ├── [entryId].tsx
163
+ └── new/
164
+ ├── _layout.tsx
165
+ ├── index.tsx
166
+ └── [entryId].tsx
167
+ ```
168
+
169
+ The layout owns the feedback providers and keeps them mounted across the board,
170
+ entry-detail, and create-entry routes:
171
+
172
+ ```tsx
173
+ // app/feedback/_layout.tsx
174
+ import {
175
+ FeedbackStackLayout,
176
+ feedbackStackSettings,
177
+ } from "convex-feedback-ui/expo";
178
+ import { feedbackHooks } from "../../feedback";
179
+
180
+ export const unstable_settings = feedbackStackSettings;
181
+
182
+ export default function Layout() {
183
+ return (
184
+ <FeedbackStackLayout
185
+ hooks={feedbackHooks}
186
+ androidToolbarIcons={{
187
+ create: require("../../assets/add.png"),
188
+ back: require("../../assets/back.png"),
189
+ close: require("../../assets/close.png"),
190
+ }}
191
+ screenOptions={{ headerTintColor: "#5b5bd6" }}
192
+ boardOptions={{ headerLargeTitleEnabled: true }}
193
+ entryOptions={{ headerBackTitle: "Feedback" }}
194
+ createOptions={{ presentation: "formSheet" }}
195
+ />
196
+ );
197
+ }
198
+ ```
199
+
200
+ Each page file only needs to re-export its package screen:
201
+
202
+ ```tsx
203
+ // app/feedback/index.tsx
204
+ export { FeedbackBoardScreen as default } from "convex-feedback-ui/expo";
205
+
206
+ // app/feedback/[entryId].tsx
207
+ export { FeedbackEntryScreen as default } from "convex-feedback-ui/expo";
208
+
209
+ // app/feedback/new/_layout.tsx
210
+ import {
211
+ FeedbackCreateStackLayout,
212
+ feedbackCreateStackSettings,
213
+ } from "convex-feedback-ui/expo";
214
+
215
+ export const unstable_settings = feedbackCreateStackSettings;
216
+ export default FeedbackCreateStackLayout;
217
+
218
+ // app/feedback/new/index.tsx
219
+ export { CreateFeedbackScreen as default } from "convex-feedback-ui/expo";
220
+
221
+ // app/feedback/new/[entryId].tsx
222
+ export { FeedbackEntryScreen as default } from "convex-feedback-ui/expo";
223
+ ```
224
+
225
+ `FeedbackStackLayout` uses these route names by default:
226
+
227
+ ```ts
228
+ {
229
+ board: "index",
230
+ entry: "[entryId]",
231
+ create: "new",
232
+ }
233
+ ```
234
+
235
+ Names can be partially overridden when the files use a different structure.
236
+ The create name identifies its nested route directory, and the entry route must
237
+ exist both beside that directory and inside it while retaining the `[entryId]`
238
+ dynamic segment:
239
+
240
+ ```tsx
241
+ const routes = {
242
+ entry: "entry/[entryId]",
243
+ create: "create",
244
+ };
245
+
246
+ export const unstable_settings = createFeedbackStackSettings(routes);
247
+
248
+ export default function Layout() {
249
+ return <FeedbackStackLayout hooks={feedbackHooks} routes={routes} />;
250
+ }
251
+ ```
252
+
253
+ The board's search and loaded list remain mounted when another screen is
254
+ pushed, so returning restores the prior query and scroll position. The create
255
+ route is a modal navigator by default. Duplicate suggestions push the normal
256
+ detail screen inside that modal's stack, with back and close controls. After
257
+ creation, the complete modal is dismissed and the created entry replaces it on
258
+ the board stack.
259
+
260
+ See `packages/example-expo-routed` for a complete application.
261
+
138
262
  ## Diagnostic metadata
139
263
 
140
264
  Prebuilt screens can collect creation-time diagnostic metadata for feedback entries. Collection is disabled by default and never applies to comments.
@@ -209,6 +333,12 @@ Web and native expose the same conceptual compounds:
209
333
  - `FeedbackForm.*`
210
334
  - `Comment.*`
211
335
 
336
+ `FeedbackBoard.State` is the centered container used for loading and empty
337
+ states. The prebuilt screen accepts an optional `emptyState` node and renders
338
+ it above the default empty-state message. `ChoiceChips` is the shared
339
+ single-selection primitive used for entry kinds and the web/native board's
340
+ Open/Closed filter.
341
+
212
342
  Example:
213
343
 
214
344
  ```tsx
@@ -232,6 +362,14 @@ Native primitives can also be composed directly:
232
362
  <FeedbackBoard.Root>
233
363
  <FeedbackBoard.Header>
234
364
  <FeedbackBoard.Title />
365
+ <ChoiceChips
366
+ options={[
367
+ { value: "open", label: "Open" },
368
+ { value: "closed", label: "Closed" },
369
+ ]}
370
+ value={status}
371
+ onValueChange={setStatus}
372
+ />
235
373
  </FeedbackBoard.Header>
236
374
 
237
375
  <FeedbackBoard.Search value={query} onValueChange={setQuery} />
@@ -277,6 +415,7 @@ Override only what you need:
277
415
  board: {
278
416
  title: "Produktfeedback",
279
417
  searchPlaceholder: "Feedback durchsuchen…",
418
+ statusFilter: "Status filtern",
280
419
  },
281
420
  comments: {
282
421
  viewReplies: (count) => `${count} Antworten anzeigen`,
@@ -287,6 +426,10 @@ Override only what you need:
287
426
 
288
427
  This is compatible with i18next, react-intl, Lingui, custom dictionaries, or plain static objects. Call your application's translation function when building the `messages` object.
289
428
 
429
+ The board status filter uses `messages.statuses.open` and
430
+ `messages.statuses.closed` for its two options, and
431
+ `messages.board.statusFilter` for its accessible label.
432
+
290
433
  Precedence for copy is:
291
434
 
292
435
  ```text