@ankhorage/templates 1.3.4 → 1.5.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 (26) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +7 -0
  3. package/dist/templates/shared/route.d.ts +1 -0
  4. package/dist/templates/shared/route.d.ts.map +1 -1
  5. package/dist/templates/shared/route.js +1 -0
  6. package/dist/templates/shared/route.js.map +1 -1
  7. package/dist/templates/starter/categories/food-drink/content.nutrition-catalog-scan.d.ts +171 -0
  8. package/dist/templates/starter/categories/food-drink/content.nutrition-catalog-scan.d.ts.map +1 -0
  9. package/dist/templates/starter/categories/food-drink/content.nutrition-catalog-scan.js +311 -0
  10. package/dist/templates/starter/categories/food-drink/content.nutrition-catalog-scan.js.map +1 -0
  11. package/dist/templates/starter/categories/food-drink/index.d.ts.map +1 -1
  12. package/dist/templates/starter/categories/food-drink/index.js +7 -0
  13. package/dist/templates/starter/categories/food-drink/index.js.map +1 -1
  14. package/dist/templates/starter/categories/food-drink/nutrition-catalog-scan.template.d.ts +4 -0
  15. package/dist/templates/starter/categories/food-drink/nutrition-catalog-scan.template.d.ts.map +1 -0
  16. package/dist/templates/starter/categories/food-drink/nutrition-catalog-scan.template.js +62 -0
  17. package/dist/templates/starter/categories/food-drink/nutrition-catalog-scan.template.js.map +1 -0
  18. package/dist/templates/starter/categories/food-drink/routes.nutrition-catalog-scan.d.ts +18 -0
  19. package/dist/templates/starter/categories/food-drink/routes.nutrition-catalog-scan.d.ts.map +1 -0
  20. package/dist/templates/starter/categories/food-drink/routes.nutrition-catalog-scan.js +77 -0
  21. package/dist/templates/starter/categories/food-drink/routes.nutrition-catalog-scan.js.map +1 -0
  22. package/dist/templates/starter/categories/food-drink/screens.nutrition-catalog-scan.d.ts +5 -0
  23. package/dist/templates/starter/categories/food-drink/screens.nutrition-catalog-scan.d.ts.map +1 -0
  24. package/dist/templates/starter/categories/food-drink/screens.nutrition-catalog-scan.js +234 -0
  25. package/dist/templates/starter/categories/food-drink/screens.nutrition-catalog-scan.js.map +1 -0
  26. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @ankhorage/templates
2
2
 
3
+ ## 1.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - d70345c: Update the nutrition catalog scan starter to model a restricted scanner challenge with global auth, Supabase profile metadata, challenge routes, and leaderboard/profile screens.
8
+
9
+ ## 1.4.0
10
+
11
+ ### Minor Changes
12
+
13
+ - aea3450: Add a `food_drink/nutrition-catalog-scan` starter manifest for Swiss nutrition product catalog apps with ZORA-first product browsing, scan-to-add capture flow, and API Gateway integration guidance.
14
+
3
15
  ## 1.3.4
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -101,6 +101,13 @@ Additional variants:
101
101
  - `games/chess`: Home · Settings. The Home screen renders a `ChessBoard` node with a static
102
102
  initial FEN and requires generated apps to provide `@ankhorage/zora-chess` through their
103
103
  extension registry.
104
+ - `food_drink/nutrition-catalog-scan`: Challenge · Products · Scan · Ranking · Profile. This
105
+ restricted Swiss scanner challenge starter uses `infra.auth.scope = "global"`, Supabase auth,
106
+ native RBAC, and an app-facing `profiles` table. The generated app should keep identity in
107
+ Supabase Auth, store leaderboard display fields in `profiles`, and send product, scan, capture,
108
+ challenge, and leaderboard data through the API Gateway. Native barcode scanning can use an app
109
+ camera adapter such as `expo-camera`, while visible scanner and permission UI should use ZORA
110
+ scanner primitives.
104
111
  - `social_community/creator`: Studio · Posts · Audience · Insights · Settings
105
112
 
106
113
  Only categories that exist in `AppCategory` are registered. New category literals should be added
@@ -5,6 +5,7 @@ export declare function createRoute(args: {
5
5
  screenId: string;
6
6
  label: string;
7
7
  icon?: IconSpec;
8
+ hideInTabBar?: boolean;
8
9
  }): ManifestRoute;
9
10
  export {};
10
11
  //# sourceMappingURL=route.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/templates/shared/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtE,KAAK,aAAa,GAAG,eAAe,CAAC;AAErC,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB,GAAG,aAAa,CAOhB"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/templates/shared/route.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEtE,KAAK,aAAa,GAAG,eAAe,CAAC;AAErC,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,GAAG,aAAa,CAQhB"}
@@ -4,6 +4,7 @@ export function createRoute(args) {
4
4
  screenId: args.screenId,
5
5
  label: args.label,
6
6
  ...(args.icon ? { icon: args.icon } : {}),
7
+ ...(args.hideInTabBar ? { hideInTabBar: args.hideInTabBar } : {}),
7
8
  };
8
9
  }
9
10
  //# sourceMappingURL=route.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/templates/shared/route.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,WAAW,CAAC,IAK3B;IACC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"route.js","sourceRoot":"","sources":["../../../src/templates/shared/route.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,WAAW,CAAC,IAM3B;IACC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,171 @@
1
+ export declare const nutritionCatalogScanContent: {
2
+ catalog: {
3
+ eyebrow: string;
4
+ title: string;
5
+ description: string;
6
+ sections: {
7
+ title: string;
8
+ description: string;
9
+ cards: {
10
+ eyebrow: string;
11
+ title: string;
12
+ description: string;
13
+ }[];
14
+ }[];
15
+ };
16
+ detail: {
17
+ eyebrow: string;
18
+ title: string;
19
+ description: string;
20
+ sections: {
21
+ title: string;
22
+ description: string;
23
+ cards: {
24
+ eyebrow: string;
25
+ title: string;
26
+ description: string;
27
+ }[];
28
+ }[];
29
+ };
30
+ scan: {
31
+ eyebrow: string;
32
+ title: string;
33
+ description: string;
34
+ sections: {
35
+ title: string;
36
+ description: string;
37
+ cards: {
38
+ eyebrow: string;
39
+ title: string;
40
+ description: string;
41
+ }[];
42
+ }[];
43
+ };
44
+ capture: {
45
+ eyebrow: string;
46
+ title: string;
47
+ description: string;
48
+ sections: {
49
+ title: string;
50
+ description: string;
51
+ cards: {
52
+ eyebrow: string;
53
+ title: string;
54
+ description: string;
55
+ }[];
56
+ }[];
57
+ };
58
+ challenge: {
59
+ eyebrow: string;
60
+ title: string;
61
+ description: string;
62
+ sections: {
63
+ title: string;
64
+ description: string;
65
+ cards: {
66
+ eyebrow: string;
67
+ title: string;
68
+ description: string;
69
+ }[];
70
+ }[];
71
+ };
72
+ leaderboard: {
73
+ eyebrow: string;
74
+ title: string;
75
+ description: string;
76
+ sections: {
77
+ title: string;
78
+ description: string;
79
+ cards: {
80
+ eyebrow: string;
81
+ title: string;
82
+ description: string;
83
+ }[];
84
+ }[];
85
+ };
86
+ profile: {
87
+ eyebrow: string;
88
+ title: string;
89
+ description: string;
90
+ sections: {
91
+ title: string;
92
+ description: string;
93
+ cards: {
94
+ eyebrow: string;
95
+ title: string;
96
+ description: string;
97
+ }[];
98
+ }[];
99
+ };
100
+ success: {
101
+ eyebrow: string;
102
+ title: string;
103
+ description: string;
104
+ sections: {
105
+ title: string;
106
+ description: string;
107
+ cards: {
108
+ eyebrow: string;
109
+ title: string;
110
+ description: string;
111
+ }[];
112
+ }[];
113
+ };
114
+ queue: {
115
+ eyebrow: string;
116
+ title: string;
117
+ description: string;
118
+ sections: {
119
+ title: string;
120
+ description: string;
121
+ cards: {
122
+ eyebrow: string;
123
+ title: string;
124
+ description: string;
125
+ }[];
126
+ }[];
127
+ };
128
+ signIn: {
129
+ eyebrow: string;
130
+ title: string;
131
+ description: string;
132
+ sections: {
133
+ title: string;
134
+ description: string;
135
+ cards: {
136
+ eyebrow: string;
137
+ title: string;
138
+ description: string;
139
+ }[];
140
+ }[];
141
+ };
142
+ signUp: {
143
+ eyebrow: string;
144
+ title: string;
145
+ description: string;
146
+ sections: {
147
+ title: string;
148
+ description: string;
149
+ cards: {
150
+ eyebrow: string;
151
+ title: string;
152
+ description: string;
153
+ }[];
154
+ }[];
155
+ };
156
+ settings: {
157
+ eyebrow: string;
158
+ title: string;
159
+ description: string;
160
+ sections: {
161
+ title: string;
162
+ description: string;
163
+ cards: {
164
+ eyebrow: string;
165
+ title: string;
166
+ description: string;
167
+ }[];
168
+ }[];
169
+ };
170
+ };
171
+ //# sourceMappingURL=content.nutrition-catalog-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.nutrition-catalog-scan.d.ts","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/content.nutrition-catalog-scan.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8UiB,CAAC"}
@@ -0,0 +1,311 @@
1
+ export const nutritionCatalogScanContent = {
2
+ catalog: {
3
+ eyebrow: 'Friends-only scanner challenge',
4
+ title: 'Challenge products',
5
+ description: 'Signed-in scanners browse the shared Swiss product catalog, scan new products, and collect points for the active challenge.',
6
+ sections: [
7
+ {
8
+ title: 'Restricted catalog',
9
+ description: 'The whole app is protected by global auth. Product browsing happens after sign-in inside the challenge app.',
10
+ cards: [
11
+ {
12
+ eyebrow: 'Known product',
13
+ title: 'Bio Greek Yogurt 250 g',
14
+ description: 'Example product card with brand, quantity, barcode, and confidence metadata.',
15
+ },
16
+ {
17
+ eyebrow: 'Known product',
18
+ title: 'Haferdrink Barista 1 l',
19
+ description: 'Products are read through the API Gateway, not directly from Supabase.',
20
+ },
21
+ {
22
+ eyebrow: 'Contribution target',
23
+ title: 'Missing supermarket products',
24
+ description: 'Scanners earn more points when a missing barcode becomes a queued capture submission.',
25
+ },
26
+ ],
27
+ },
28
+ {
29
+ title: 'Challenge loop',
30
+ description: 'Friends sign in, scan products, submit missing products, and climb the leaderboard.',
31
+ cards: [
32
+ {
33
+ eyebrow: 'Action',
34
+ title: 'Scan barcode',
35
+ description: 'Open the scanner, normalize barcode digits, then record a scan event for the signed-in user.',
36
+ },
37
+ {
38
+ eyebrow: 'Ranking',
39
+ title: 'Points and leaderboard',
40
+ description: 'Known product scans, missing product captures, and accepted captures can use different point values.',
41
+ },
42
+ ],
43
+ },
44
+ ],
45
+ },
46
+ detail: {
47
+ eyebrow: 'Published product',
48
+ title: 'Product detail',
49
+ description: 'Show barcode, brand, quantity, confidence, store observations, and nutrition facts from the API Gateway.',
50
+ sections: [
51
+ {
52
+ title: 'Product summary',
53
+ description: 'A product detail screen for data returned by the API Gateway.',
54
+ cards: [
55
+ {
56
+ eyebrow: 'Primary barcode',
57
+ title: '7612345678901 · EAN-13',
58
+ description: 'Barcode values are normalized by removing non-digits before lookup.',
59
+ },
60
+ {
61
+ eyebrow: 'Challenge value',
62
+ title: 'Known scan: 1 point',
63
+ description: 'The backend should avoid duplicate point farming with per-user barcode limits.',
64
+ },
65
+ ],
66
+ },
67
+ ],
68
+ },
69
+ scan: {
70
+ eyebrow: 'Authenticated scan',
71
+ title: 'Scan barcode',
72
+ description: 'Use the ZORA BarcodeScannerView with an app-level camera adapter. Successful scans create signed-in scan events.',
73
+ sections: [
74
+ {
75
+ title: 'Scanner adapter',
76
+ description: 'Native camera dependencies such as expo-camera stay in the generated app adapter; ZORA owns visible scanner UI.',
77
+ cards: [
78
+ {
79
+ eyebrow: 'Camera shell',
80
+ title: 'BarcodeScannerView',
81
+ description: 'Use ZORA scanner, permission, and overlay primitives for the visible scanner surface.',
82
+ },
83
+ {
84
+ eyebrow: 'Fallback',
85
+ title: 'Manual barcode entry',
86
+ description: 'Useful on web, simulator, denied camera permission, or damaged retail labels.',
87
+ },
88
+ ],
89
+ },
90
+ {
91
+ title: 'Lookup branch',
92
+ description: 'After scanning, call GET /v1/nutrition/products/by-barcode/{barcode}.',
93
+ cards: [
94
+ {
95
+ eyebrow: 'Found',
96
+ title: 'Record known scan',
97
+ description: 'A known barcode creates a scan event and can open the product detail screen.',
98
+ },
99
+ {
100
+ eyebrow: 'Unknown',
101
+ title: 'Create capture',
102
+ description: 'A missing barcode opens the capture form and can earn more challenge points.',
103
+ },
104
+ ],
105
+ },
106
+ ],
107
+ },
108
+ capture: {
109
+ eyebrow: 'Challenge contribution',
110
+ title: 'Capture missing product',
111
+ description: 'Collect the minimal data needed to create a queued capture submission for the signed-in scanner.',
112
+ sections: [
113
+ {
114
+ title: 'Required fields',
115
+ description: 'Keep in-store entry fast and reward useful missing-product captures.',
116
+ cards: [
117
+ {
118
+ eyebrow: 'Product identity',
119
+ title: 'Name, brand, quantity',
120
+ description: 'The barcode is prefilled from the scanner or manual input.',
121
+ },
122
+ {
123
+ eyebrow: 'Store observation',
124
+ title: 'Store chain and location label',
125
+ description: 'Country defaults to CH with de-CH client locale for the Swiss MVP.',
126
+ },
127
+ {
128
+ eyebrow: 'Photos placeholder',
129
+ title: 'Front, nutrition, ingredients, barcode',
130
+ description: 'Real image upload can be added after the first challenge flow works.',
131
+ },
132
+ ],
133
+ },
134
+ ],
135
+ },
136
+ challenge: {
137
+ eyebrow: 'Active challenge',
138
+ title: 'Scanner challenge',
139
+ description: 'Show challenge rules, dates, invite status, scoring, and the signed-in scanner progress.',
140
+ sections: [
141
+ {
142
+ title: 'Scoring rules',
143
+ description: 'Point rules should reward useful scans and discourage duplicate barcode farming.',
144
+ cards: [
145
+ {
146
+ eyebrow: 'Known scan',
147
+ title: '1 point',
148
+ description: 'Awarded for a valid known product scan within the duplicate limits.',
149
+ },
150
+ {
151
+ eyebrow: 'Missing product',
152
+ title: '5 points',
153
+ description: 'Awarded when a signed-in scanner submits a new missing product capture.',
154
+ },
155
+ {
156
+ eyebrow: 'Accepted capture',
157
+ title: '20 points',
158
+ description: 'Awarded later when review tooling publishes or accepts the captured product.',
159
+ },
160
+ ],
161
+ },
162
+ ],
163
+ },
164
+ leaderboard: {
165
+ eyebrow: 'Friends ranking',
166
+ title: 'Leaderboard',
167
+ description: 'Rank signed-in scanners by challenge points, then scan count as a tie breaker.',
168
+ sections: [
169
+ {
170
+ title: 'Top scanners',
171
+ description: 'The API Gateway should expose leaderboard rows for the active challenge.',
172
+ cards: [
173
+ {
174
+ eyebrow: '#1',
175
+ title: 'Scanner with most points',
176
+ description: 'Show display name, points, scan count, accepted captures, and current rank.',
177
+ },
178
+ {
179
+ eyebrow: 'Anti-spam',
180
+ title: 'Backend ranking rules',
181
+ description: 'Duplicate and rejected captures should not increase score.',
182
+ },
183
+ ],
184
+ },
185
+ ],
186
+ },
187
+ profile: {
188
+ eyebrow: 'Scanner profile',
189
+ title: 'Profile',
190
+ description: 'Show signed-in scanner profile, stats, invite status, and sign-out action.',
191
+ sections: [
192
+ {
193
+ title: 'Profile data',
194
+ description: 'Profile data comes from the app-facing profiles table linked to Supabase Auth.',
195
+ cards: [
196
+ {
197
+ eyebrow: 'Identity',
198
+ title: 'Display name and avatar',
199
+ description: 'Stored in public.profiles; auth.users remains provider-owned identity data.',
200
+ },
201
+ {
202
+ eyebrow: 'Stats',
203
+ title: 'Scans, captures, points',
204
+ description: 'Aggregate challenge stats from scan events and capture submissions.',
205
+ },
206
+ ],
207
+ },
208
+ ],
209
+ },
210
+ success: {
211
+ eyebrow: 'Submission queued',
212
+ title: 'Thanks — product queued',
213
+ description: 'The API returns a submission id and queued status. Points can be updated immediately or after review.',
214
+ sections: [
215
+ {
216
+ title: 'Next actions',
217
+ description: 'Keep contributors in the scan loop.',
218
+ cards: [
219
+ {
220
+ eyebrow: 'Continue',
221
+ title: 'Scan another product',
222
+ description: 'Return to the scan screen for fast in-store collection.',
223
+ },
224
+ {
225
+ eyebrow: 'Ranking',
226
+ title: 'Open leaderboard',
227
+ description: 'Show the scanner how the capture affected their challenge ranking.',
228
+ },
229
+ ],
230
+ },
231
+ ],
232
+ },
233
+ queue: {
234
+ eyebrow: 'Offline-ready shell',
235
+ title: 'Capture queue',
236
+ description: 'A simple local queue abstraction prepares the signed-in app for offline retry without losing field data.',
237
+ sections: [
238
+ {
239
+ title: 'Queue states',
240
+ description: 'Use ZORA cards and notices for pending, failed, and submitted items.',
241
+ cards: [
242
+ {
243
+ eyebrow: 'Pending',
244
+ title: 'Waiting for connection',
245
+ description: 'Submissions can be stored locally with user id and clientCapturedAt.',
246
+ },
247
+ {
248
+ eyebrow: 'Failed',
249
+ title: 'Retry required',
250
+ description: 'Keep failures visible instead of silently dropping scanner data.',
251
+ },
252
+ ],
253
+ },
254
+ ],
255
+ },
256
+ signIn: {
257
+ eyebrow: 'Restricted access',
258
+ title: 'Sign in',
259
+ description: 'Friends sign in before entering the scanner challenge app.',
260
+ sections: [
261
+ {
262
+ title: 'Challenge access',
263
+ description: 'This template uses global auth, so app entry is protected.',
264
+ cards: [
265
+ {
266
+ eyebrow: 'Auth provider',
267
+ title: 'Supabase Auth',
268
+ description: 'Email sign-in is the default identity flow for generated challenge apps.',
269
+ },
270
+ ],
271
+ },
272
+ ],
273
+ },
274
+ signUp: {
275
+ eyebrow: 'Join challenge',
276
+ title: 'Create scanner account',
277
+ description: 'Create an account with display name and optional invite code before scanning.',
278
+ sections: [
279
+ {
280
+ title: 'Profile creation',
281
+ description: 'Generated infra should create a profiles row linked to the auth user.',
282
+ cards: [
283
+ {
284
+ eyebrow: 'Required fields',
285
+ title: 'Email, password, display name',
286
+ description: 'The profile table stores display name and avatar for leaderboard rows.',
287
+ },
288
+ ],
289
+ },
290
+ ],
291
+ },
292
+ settings: {
293
+ eyebrow: 'Challenge app settings',
294
+ title: 'Settings',
295
+ description: 'Configuration for API Gateway base URL, locale, profile table, and challenge auth.',
296
+ sections: [
297
+ {
298
+ title: 'Runtime configuration',
299
+ description: 'Settings screen sections are assembled by the screen factory.',
300
+ cards: [
301
+ {
302
+ eyebrow: 'Auth',
303
+ title: 'Global Supabase auth',
304
+ description: 'Friends sign in before entering the scanner challenge app.',
305
+ },
306
+ ],
307
+ },
308
+ ],
309
+ },
310
+ };
311
+ //# sourceMappingURL=content.nutrition-catalog-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.nutrition-catalog-scan.js","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/content.nutrition-catalog-scan.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEpE,eAAO,MAAM,yBAAyB;;;;;GAOkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAGpE,eAAO,MAAM,yBAAyB;;;;;GAckB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { createFoodDrinkStarterTemplate } from './default.template';
2
+ import { createNutritionCatalogScanStarterTemplate } from './nutrition-catalog-scan.template';
2
3
  export const foodDrinkStarterTemplates = [
3
4
  {
4
5
  id: 'default',
@@ -6,5 +7,11 @@ export const foodDrinkStarterTemplates = [
6
7
  description: 'A discover, menu, reservations, orders, and profile starter for food apps.',
7
8
  create: createFoodDrinkStarterTemplate,
8
9
  },
10
+ {
11
+ id: 'nutrition-catalog-scan',
12
+ label: 'Nutrition catalog scan',
13
+ description: 'A Swiss product catalog starter with ZORA-first product browsing and scan-to-add capture flow.',
14
+ create: createNutritionCatalogScanStarterTemplate,
15
+ },
9
16
  ];
10
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEpE,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,4EAA4E;QACzF,MAAM,EAAE,8BAA8B;KACvC;CACqD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,yCAAyC,EAAE,MAAM,mCAAmC,CAAC;AAE9F,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,4EAA4E;QACzF,MAAM,EAAE,8BAA8B;KACvC;IACD;QACE,EAAE,EAAE,wBAAwB;QAC5B,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,gGAAgG;QAClG,MAAM,EAAE,yCAAyC;KAClD;CACqD,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { AppManifest } from '@ankhorage/contracts';
2
+ import type { TemplateSeed } from '../../starter.types';
3
+ export declare function createNutritionCatalogScanStarterTemplate(seed: TemplateSeed): AppManifest;
4
+ //# sourceMappingURL=nutrition-catalog-scan.template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nutrition-catalog-scan.template.d.ts","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/nutrition-catalog-scan.template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOxD,wBAAgB,yCAAyC,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CAyDzF"}
@@ -0,0 +1,62 @@
1
+ import { DEFAULT_TEMPLATE_VERSION } from '../../../../internal/defaults';
2
+ import { createManifestShell, createTheme } from '../../../shared';
3
+ import { createNutritionCatalogScanNavigator, createNutritionCatalogScanScreenIds, } from './routes.nutrition-catalog-scan';
4
+ import { createNutritionCatalogScanScreens } from './screens.nutrition-catalog-scan';
5
+ export function createNutritionCatalogScanStarterTemplate(seed) {
6
+ const idPrefix = `${seed.category}-nutrition-catalog-scan`;
7
+ const theme = createTheme(seed);
8
+ const screenIds = createNutritionCatalogScanScreenIds(idPrefix);
9
+ const manifest = createManifestShell({
10
+ seed,
11
+ theme,
12
+ version: seed.version ?? DEFAULT_TEMPLATE_VERSION,
13
+ navigator: createNutritionCatalogScanNavigator(screenIds),
14
+ screens: createNutritionCatalogScanScreens(seed, idPrefix, screenIds),
15
+ });
16
+ return {
17
+ ...manifest,
18
+ infra: {
19
+ ...manifest.infra,
20
+ auth: {
21
+ scope: 'global',
22
+ provider: 'supabase',
23
+ authorization: {
24
+ kind: 'RBAC',
25
+ engine: 'native',
26
+ },
27
+ flow: {
28
+ signInRoute: 'sign-in',
29
+ signUpRoute: 'sign-up',
30
+ signOutRoute: 'sign-out',
31
+ postSignInRoute: 'challenge',
32
+ unauthorizedRoute: 'sign-in',
33
+ },
34
+ signIn: {
35
+ identifiers: ['email'],
36
+ },
37
+ signUp: {
38
+ requiredFields: ['email', 'password', 'displayName'],
39
+ signUpPolicy: 'requireVerification',
40
+ },
41
+ profile: {
42
+ fields: ['email', 'displayName', 'avatarUrl'],
43
+ table: 'profiles',
44
+ primaryKey: 'authUserId',
45
+ createStrategy: 'trigger',
46
+ updateStrategy: 'api',
47
+ },
48
+ },
49
+ },
50
+ settings: {
51
+ ...manifest.settings,
52
+ authFlow: {
53
+ signInRoute: 'sign-in',
54
+ signUpRoute: 'sign-up',
55
+ signOutRoute: 'sign-out',
56
+ postSignInRoute: 'challenge',
57
+ unauthorizedRoute: 'sign-in',
58
+ },
59
+ },
60
+ };
61
+ }
62
+ //# sourceMappingURL=nutrition-catalog-scan.template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nutrition-catalog-scan.template.js","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/nutrition-catalog-scan.template.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EACL,mCAAmC,EACnC,mCAAmC,GACpC,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AAErF,MAAM,UAAU,yCAAyC,CAAC,IAAkB;IAC1E,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,QAAQ,yBAAyB,CAAC;IAC3D,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,SAAS,GAAG,mCAAmC,CAAC,QAAQ,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,mBAAmB,CAAC;QACnC,IAAI;QACJ,KAAK;QACL,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,wBAAwB;QACjD,SAAS,EAAE,mCAAmC,CAAC,SAAS,CAAC;QACzD,OAAO,EAAE,iCAAiC,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC;KACtE,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,QAAQ;QACX,KAAK,EAAE;YACL,GAAG,QAAQ,CAAC,KAAK;YACjB,IAAI,EAAE;gBACJ,KAAK,EAAE,QAAQ;gBACf,QAAQ,EAAE,UAAU;gBACpB,aAAa,EAAE;oBACb,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,QAAQ;iBACjB;gBACD,IAAI,EAAE;oBACJ,WAAW,EAAE,SAAS;oBACtB,WAAW,EAAE,SAAS;oBACtB,YAAY,EAAE,UAAU;oBACxB,eAAe,EAAE,WAAW;oBAC5B,iBAAiB,EAAE,SAAS;iBAC7B;gBACD,MAAM,EAAE;oBACN,WAAW,EAAE,CAAC,OAAO,CAAC;iBACvB;gBACD,MAAM,EAAE;oBACN,cAAc,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,CAAC;oBACpD,YAAY,EAAE,qBAAqB;iBACpC;gBACD,OAAO,EAAE;oBACP,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC;oBAC7C,KAAK,EAAE,UAAU;oBACjB,UAAU,EAAE,YAAY;oBACxB,cAAc,EAAE,SAAS;oBACzB,cAAc,EAAE,KAAK;iBACtB;aACF;SACF;QACD,QAAQ,EAAE;YACR,GAAG,QAAQ,CAAC,QAAQ;YACpB,QAAQ,EAAE;gBACR,WAAW,EAAE,SAAS;gBACtB,WAAW,EAAE,SAAS;gBACtB,YAAY,EAAE,UAAU;gBACxB,eAAe,EAAE,WAAW;gBAC5B,iBAAiB,EAAE,SAAS;aAC7B;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { AppManifest } from '@ankhorage/contracts';
2
+ export interface NutritionCatalogScanScreenIds {
3
+ readonly catalog: string;
4
+ readonly detail: string;
5
+ readonly scan: string;
6
+ readonly capture: string;
7
+ readonly success: string;
8
+ readonly queue: string;
9
+ readonly challenge: string;
10
+ readonly leaderboard: string;
11
+ readonly profile: string;
12
+ readonly signIn: string;
13
+ readonly signUp: string;
14
+ readonly settings: string;
15
+ }
16
+ export declare function createNutritionCatalogScanScreenIds(idPrefix: string): NutritionCatalogScanScreenIds;
17
+ export declare function createNutritionCatalogScanNavigator(screenIds: NutritionCatalogScanScreenIds): AppManifest['navigator'];
18
+ //# sourceMappingURL=routes.nutrition-catalog-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.nutrition-catalog-scan.d.ts","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/routes.nutrition-catalog-scan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,MAAM,GACf,6BAA6B,CAe/B;AAED,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,6BAA6B,GACvC,WAAW,CAAC,WAAW,CAAC,CA0D1B"}
@@ -0,0 +1,77 @@
1
+ import { createRoute } from '../../../shared';
2
+ export function createNutritionCatalogScanScreenIds(idPrefix) {
3
+ return {
4
+ catalog: `${idPrefix}-catalog`,
5
+ detail: `${idPrefix}-detail`,
6
+ scan: `${idPrefix}-scan`,
7
+ capture: `${idPrefix}-capture`,
8
+ success: `${idPrefix}-success`,
9
+ queue: `${idPrefix}-queue`,
10
+ challenge: `${idPrefix}-challenge`,
11
+ leaderboard: `${idPrefix}-leaderboard`,
12
+ profile: `${idPrefix}-profile`,
13
+ signIn: `${idPrefix}-sign-in`,
14
+ signUp: `${idPrefix}-sign-up`,
15
+ settings: `${idPrefix}-settings`,
16
+ };
17
+ }
18
+ export function createNutritionCatalogScanNavigator(screenIds) {
19
+ return {
20
+ type: 'tabs',
21
+ initialRouteName: 'challenge',
22
+ routes: [
23
+ createRoute({
24
+ name: 'challenge',
25
+ screenId: screenIds.challenge,
26
+ label: 'Challenge',
27
+ icon: { provider: 'material-community', name: 'trophy-outline' },
28
+ }),
29
+ createRoute({
30
+ name: 'index',
31
+ screenId: screenIds.catalog,
32
+ label: 'Products',
33
+ icon: { provider: 'material-community', name: 'barcode-scan' },
34
+ }),
35
+ createRoute({
36
+ name: 'scan',
37
+ screenId: screenIds.scan,
38
+ label: 'Scan',
39
+ icon: { provider: 'material-community', name: 'camera-outline' },
40
+ }),
41
+ createRoute({
42
+ name: 'leaderboard',
43
+ screenId: screenIds.leaderboard,
44
+ label: 'Ranking',
45
+ icon: { provider: 'material-community', name: 'podium-gold' },
46
+ }),
47
+ createRoute({
48
+ name: 'profile',
49
+ screenId: screenIds.profile,
50
+ label: 'Profile',
51
+ icon: { provider: 'material-community', name: 'account-circle-outline' },
52
+ }),
53
+ createRoute({
54
+ name: 'capture',
55
+ screenId: screenIds.capture,
56
+ label: 'Capture',
57
+ icon: { provider: 'material-community', name: 'package-variant-plus' },
58
+ hideInTabBar: true,
59
+ }),
60
+ createRoute({
61
+ name: 'queue',
62
+ screenId: screenIds.queue,
63
+ label: 'Queue',
64
+ icon: { provider: 'material-community', name: 'tray-full' },
65
+ hideInTabBar: true,
66
+ }),
67
+ createRoute({
68
+ name: 'settings',
69
+ screenId: screenIds.settings,
70
+ label: 'Settings',
71
+ icon: { provider: 'material-community', name: 'cog-outline' },
72
+ hideInTabBar: true,
73
+ }),
74
+ ],
75
+ };
76
+ }
77
+ //# sourceMappingURL=routes.nutrition-catalog-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.nutrition-catalog-scan.js","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/routes.nutrition-catalog-scan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAiB9C,MAAM,UAAU,mCAAmC,CACjD,QAAgB;IAEhB,OAAO;QACL,OAAO,EAAE,GAAG,QAAQ,UAAU;QAC9B,MAAM,EAAE,GAAG,QAAQ,SAAS;QAC5B,IAAI,EAAE,GAAG,QAAQ,OAAO;QACxB,OAAO,EAAE,GAAG,QAAQ,UAAU;QAC9B,OAAO,EAAE,GAAG,QAAQ,UAAU;QAC9B,KAAK,EAAE,GAAG,QAAQ,QAAQ;QAC1B,SAAS,EAAE,GAAG,QAAQ,YAAY;QAClC,WAAW,EAAE,GAAG,QAAQ,cAAc;QACtC,OAAO,EAAE,GAAG,QAAQ,UAAU;QAC9B,MAAM,EAAE,GAAG,QAAQ,UAAU;QAC7B,MAAM,EAAE,GAAG,QAAQ,UAAU;QAC7B,QAAQ,EAAE,GAAG,QAAQ,WAAW;KACjC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,SAAwC;IAExC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,gBAAgB,EAAE,WAAW;QAC7B,MAAM,EAAE;YACN,WAAW,CAAC;gBACV,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,SAAS,CAAC,SAAS;gBAC7B,KAAK,EAAE,WAAW;gBAClB,IAAI,EAAE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,gBAAgB,EAAE;aACjE,CAAC;YACF,WAAW,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,SAAS,CAAC,OAAO;gBAC3B,KAAK,EAAE,UAAU;gBACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,cAAc,EAAE;aAC/D,CAAC;YACF,WAAW,CAAC;gBACV,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,SAAS,CAAC,IAAI;gBACxB,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,gBAAgB,EAAE;aACjE,CAAC;YACF,WAAW,CAAC;gBACV,IAAI,EAAE,aAAa;gBACnB,QAAQ,EAAE,SAAS,CAAC,WAAW;gBAC/B,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,aAAa,EAAE;aAC9D,CAAC;YACF,WAAW,CAAC;gBACV,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,SAAS,CAAC,OAAO;gBAC3B,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,wBAAwB,EAAE;aACzE,CAAC;YACF,WAAW,CAAC;gBACV,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,SAAS,CAAC,OAAO;gBAC3B,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,sBAAsB,EAAE;gBACtE,YAAY,EAAE,IAAI;aACnB,CAAC;YACF,WAAW,CAAC;gBACV,IAAI,EAAE,OAAO;gBACb,QAAQ,EAAE,SAAS,CAAC,KAAK;gBACzB,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE;gBAC3D,YAAY,EAAE,IAAI;aACnB,CAAC;YACF,WAAW,CAAC;gBACV,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,SAAS,CAAC,QAAQ;gBAC5B,KAAK,EAAE,UAAU;gBACjB,IAAI,EAAE,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,aAAa,EAAE;gBAC7D,YAAY,EAAE,IAAI;aACnB,CAAC;SACH;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { AppManifest } from '@ankhorage/contracts';
2
+ import type { TemplateSeed } from '../../starter.types';
3
+ import type { NutritionCatalogScanScreenIds } from './routes.nutrition-catalog-scan';
4
+ export declare function createNutritionCatalogScanScreens(seed: TemplateSeed, idPrefix: string, screenIds: NutritionCatalogScanScreenIds): AppManifest['screens'];
5
+ //# sourceMappingURL=screens.nutrition-catalog-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screens.nutrition-catalog-scan.d.ts","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/screens.nutrition-catalog-scan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AA4IrF,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,6BAA6B,GACvC,WAAW,CAAC,SAAS,CAAC,CAiKxB"}
@@ -0,0 +1,234 @@
1
+ import { createScreen, createScreenRoot, createSection, createSettingsSection, createZoraNode, } from '../../../shared';
2
+ import { nutritionCatalogScanContent } from './content.nutrition-catalog-scan';
3
+ function createContentScreen(args) {
4
+ const idSegment = args.name.toLowerCase().replaceAll(' ', '-');
5
+ const sectionNodes = args.content.sections.map((section, sectionIndex) => createSection(`${args.idPrefix}-${idSegment}-section-${sectionIndex + 1}`, { title: section.title, description: section.description }, [
6
+ createZoraNode(`${args.idPrefix}-${idSegment}-panel-${sectionIndex + 1}`, 'Panel', { title: section.title, description: section.description, tone: 'subtle' }, section.cards.map((card, cardIndex) => createZoraNode(`${args.idPrefix}-${idSegment}-card-${sectionIndex + 1}-${cardIndex + 1}`, 'Card', {
7
+ eyebrow: card.eyebrow,
8
+ title: card.title,
9
+ description: card.description,
10
+ tone: 'outline',
11
+ }))),
12
+ ]));
13
+ return createScreen({
14
+ id: args.screenId,
15
+ name: args.name,
16
+ title: args.content.title,
17
+ description: args.content.description,
18
+ root: createScreenRoot(`${args.idPrefix}-${idSegment}-screen`, { width: 'wide' }, [
19
+ createZoraNode(`${args.idPrefix}-${idSegment}-header`, 'SectionHeader', {
20
+ eyebrow: args.content.eyebrow,
21
+ title: args.content.title,
22
+ description: args.content.description,
23
+ }),
24
+ ...(args.headerActions ?? []),
25
+ ...sectionNodes,
26
+ ]),
27
+ });
28
+ }
29
+ function createCatalogActions(idPrefix) {
30
+ return [
31
+ createZoraNode(`${idPrefix}-catalog-search-field`, 'FormField', {
32
+ label: 'Search challenge products',
33
+ description: 'Search by product name, brand, barcode, or store chain.',
34
+ }),
35
+ createZoraNode(`${idPrefix}-catalog-search-input`, 'Input', {
36
+ placeholder: 'Search Migros, Coop, barcode...',
37
+ autoCapitalize: 'none',
38
+ size: 'm',
39
+ }),
40
+ createZoraNode(`${idPrefix}-catalog-scan-button`, 'Button', {
41
+ children: 'Scan barcode',
42
+ color: 'primary',
43
+ size: 'm',
44
+ fullWidth: true,
45
+ }),
46
+ ];
47
+ }
48
+ function createScannerNotice(idPrefix) {
49
+ return createZoraNode(`${idPrefix}-scan-zora-notice`, 'Notice', {
50
+ title: 'Scanner implementation note',
51
+ description: 'Use ZORA scanner components with an app camera adapter. Native camera dependencies stay outside templates.',
52
+ color: 'primary',
53
+ });
54
+ }
55
+ function createCaptureFormPreview(idPrefix) {
56
+ return createZoraNode(`${idPrefix}-capture-form-panel`, 'Panel', {
57
+ title: 'Minimal capture form',
58
+ description: 'Prioritize fast in-store entry and useful challenge contributions.',
59
+ tone: 'subtle',
60
+ }, [
61
+ createZoraNode(`${idPrefix}-capture-barcode-field`, 'FormField', {
62
+ label: 'Barcode',
63
+ description: 'Prefilled from scan or manual entry; normalized before API calls.',
64
+ required: true,
65
+ }),
66
+ createZoraNode(`${idPrefix}-capture-barcode-input`, 'Input', {
67
+ placeholder: '7612345678901',
68
+ keyboardType: 'number-pad',
69
+ size: 'm',
70
+ }),
71
+ createZoraNode(`${idPrefix}-capture-name-field`, 'FormField', {
72
+ label: 'Product name',
73
+ description: 'Required by the minimal request.',
74
+ required: true,
75
+ }),
76
+ createZoraNode(`${idPrefix}-capture-name-input`, 'Input', {
77
+ placeholder: 'Product name',
78
+ size: 'm',
79
+ }),
80
+ createZoraNode(`${idPrefix}-capture-submit-button`, 'Button', {
81
+ children: 'Submit and earn points',
82
+ color: 'primary',
83
+ size: 'm',
84
+ fullWidth: true,
85
+ }),
86
+ ]);
87
+ }
88
+ export function createNutritionCatalogScanScreens(seed, idPrefix, screenIds) {
89
+ return {
90
+ [screenIds.challenge]: createContentScreen({
91
+ idPrefix,
92
+ screenId: screenIds.challenge,
93
+ name: 'Challenge',
94
+ content: nutritionCatalogScanContent.challenge,
95
+ }),
96
+ [screenIds.catalog]: createContentScreen({
97
+ idPrefix,
98
+ screenId: screenIds.catalog,
99
+ name: 'Products',
100
+ content: nutritionCatalogScanContent.catalog,
101
+ headerActions: createCatalogActions(idPrefix),
102
+ }),
103
+ [screenIds.detail]: createContentScreen({
104
+ idPrefix,
105
+ screenId: screenIds.detail,
106
+ name: 'Product Detail',
107
+ content: nutritionCatalogScanContent.detail,
108
+ }),
109
+ [screenIds.scan]: createContentScreen({
110
+ idPrefix,
111
+ screenId: screenIds.scan,
112
+ name: 'Scan',
113
+ content: nutritionCatalogScanContent.scan,
114
+ headerActions: [createScannerNotice(idPrefix)],
115
+ }),
116
+ [screenIds.capture]: createContentScreen({
117
+ idPrefix,
118
+ screenId: screenIds.capture,
119
+ name: 'Capture',
120
+ content: nutritionCatalogScanContent.capture,
121
+ headerActions: [createCaptureFormPreview(idPrefix)],
122
+ }),
123
+ [screenIds.leaderboard]: createContentScreen({
124
+ idPrefix,
125
+ screenId: screenIds.leaderboard,
126
+ name: 'Leaderboard',
127
+ content: nutritionCatalogScanContent.leaderboard,
128
+ }),
129
+ [screenIds.profile]: createContentScreen({
130
+ idPrefix,
131
+ screenId: screenIds.profile,
132
+ name: 'Profile',
133
+ content: nutritionCatalogScanContent.profile,
134
+ }),
135
+ [screenIds.success]: createContentScreen({
136
+ idPrefix,
137
+ screenId: screenIds.success,
138
+ name: 'Capture Success',
139
+ content: nutritionCatalogScanContent.success,
140
+ }),
141
+ [screenIds.queue]: createContentScreen({
142
+ idPrefix,
143
+ screenId: screenIds.queue,
144
+ name: 'Queue',
145
+ content: nutritionCatalogScanContent.queue,
146
+ }),
147
+ [screenIds.signIn]: createContentScreen({
148
+ idPrefix,
149
+ screenId: screenIds.signIn,
150
+ name: 'Sign In',
151
+ content: nutritionCatalogScanContent.signIn,
152
+ }),
153
+ [screenIds.signUp]: createContentScreen({
154
+ idPrefix,
155
+ screenId: screenIds.signUp,
156
+ name: 'Sign Up',
157
+ content: nutritionCatalogScanContent.signUp,
158
+ }),
159
+ [screenIds.settings]: createScreen({
160
+ id: screenIds.settings,
161
+ name: 'Settings',
162
+ title: nutritionCatalogScanContent.settings.title,
163
+ description: nutritionCatalogScanContent.settings.description,
164
+ root: createScreenRoot(`${idPrefix}-settings-screen`, { width: 'default' }, [
165
+ createZoraNode(`${idPrefix}-settings-header`, 'SectionHeader', {
166
+ eyebrow: nutritionCatalogScanContent.settings.eyebrow,
167
+ title: nutritionCatalogScanContent.settings.title,
168
+ description: nutritionCatalogScanContent.settings.description,
169
+ }),
170
+ createSettingsSection(`${idPrefix}-settings-auth`, 'Restricted challenge auth', 'The whole app is protected with global Supabase auth and native RBAC.', [
171
+ {
172
+ id: 'auth-scope-row',
173
+ title: 'Auth scope',
174
+ description: 'Global auth means friends sign in before entering the app.',
175
+ meta: 'global',
176
+ },
177
+ {
178
+ id: 'profile-table-row',
179
+ title: 'Profile table',
180
+ description: 'Use an app-facing profiles table linked to Supabase Auth users.',
181
+ meta: 'profiles',
182
+ },
183
+ {
184
+ id: 'challenge-row',
185
+ title: 'Challenge participation',
186
+ description: 'Scan events, captures, and leaderboard rows belong to signed-in scanners.',
187
+ meta: 'scanner',
188
+ },
189
+ ]),
190
+ createSettingsSection(`${idPrefix}-settings-api`, 'API Gateway', 'Runtime product, scan, capture, challenge, and leaderboard data should go through the API Gateway.', [
191
+ {
192
+ id: 'base-url-row',
193
+ title: 'API base URL',
194
+ description: 'Defaults to https://api-gateway.fabio-gartenmann.workers.dev.',
195
+ meta: 'runtime',
196
+ },
197
+ {
198
+ id: 'scan-events-row',
199
+ title: 'Scan events endpoint',
200
+ description: 'POST /v1/nutrition/scan-events records scanner progress.',
201
+ meta: 'auth',
202
+ },
203
+ {
204
+ id: 'leaderboard-row',
205
+ title: 'Leaderboard endpoint',
206
+ description: 'GET /v1/nutrition/challenges/current/leaderboard ranks scanners.',
207
+ meta: 'ranking',
208
+ },
209
+ ]),
210
+ createSettingsSection(`${idPrefix}-settings-client`, 'Client defaults', `${seed.appName} should send appVersion, platform, locale, user id, and clientCapturedAt with challenge actions.`, [
211
+ {
212
+ id: 'locale-row',
213
+ title: 'Default locale',
214
+ description: 'de-CH for the Swiss retail MVP.',
215
+ meta: 'de-CH',
216
+ },
217
+ {
218
+ id: 'country-row',
219
+ title: 'Default country',
220
+ description: 'Store observations default to CH.',
221
+ meta: 'CH',
222
+ },
223
+ {
224
+ id: 'camera-row',
225
+ title: 'Camera dependency',
226
+ description: 'Use ZORA scanner UI with an app camera adapter such as expo-camera.',
227
+ meta: 'ZORA-first',
228
+ },
229
+ ]),
230
+ ]),
231
+ }),
232
+ };
233
+ }
234
+ //# sourceMappingURL=screens.nutrition-catalog-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screens.nutrition-catalog-scan.js","sourceRoot":"","sources":["../../../../../src/templates/starter/categories/food-drink/screens.nutrition-catalog-scan.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ankhorage/templates",
3
- "version": "1.3.4",
3
+ "version": "1.5.0",
4
4
  "description": "Reusable Ankhorage app templates, presets, and manifest generators.",
5
5
  "homepage": "https://github.com/ankhorage/templates#readme",
6
6
  "bugs": {
@@ -51,7 +51,7 @@
51
51
  "version-packages": "changeset version"
52
52
  },
53
53
  "dependencies": {
54
- "@ankhorage/contracts": "^1.16.0",
54
+ "@ankhorage/contracts": "^1.17.0",
55
55
  "@ankhorage/zora": "^2.6.1"
56
56
  },
57
57
  "devDependencies": {