@wix/himalaya-cli 0.1544.0 → 0.1546.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 (227) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/agent/src/index.d.ts +5 -2
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/state/src/index.d.ts +14 -0
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/state/src/read.d.ts +60 -0
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/activity-counters-v1/src/index.d.ts +19 -0
  5. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/ai-site-chat/src/index.d.ts +19 -0
  6. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/analytics/src/index.d.ts +42 -2
  7. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/async-jobs/src/index.d.ts +19 -0
  8. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/automations-v1/src/index.d.ts +19 -0
  9. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/badges-v2/src/index.d.ts +19 -0
  10. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/billing-tax-v1/src/index.d.ts +19 -0
  11. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/blog-v3/src/extensions.d.ts +5 -4
  12. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/blog-v3/src/index.d.ts +19 -0
  13. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/bookings-v2/src/extensions.d.ts +4 -4
  14. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/bookings-v2/src/index.d.ts +19 -0
  15. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/business-feed/src/index.d.ts +11 -0
  16. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/business-tools-v1/src/index.d.ts +19 -0
  17. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/chat-web/src/index.d.ts +22 -1
  18. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/comments-v1/src/index.d.ts +19 -0
  19. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/contacts/src/index.d.ts +19 -0
  20. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/coupons/src/index.d.ts +24 -2
  21. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/crm-tasks/src/index.d.ts +11 -0
  22. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/dashboard-setup/src/index.d.ts +11 -0
  23. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/data-collections-v1/src/index.d.ts +19 -0
  24. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/donations/src/index.d.ts +19 -0
  25. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/ecom/src/extensions.d.ts +6 -5
  26. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/ecom/src/index.d.ts +19 -0
  27. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/email-marketing-v1/src/index.d.ts +19 -0
  28. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/events/src/index.d.ts +24 -2
  29. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/faq-v2/src/index.d.ts +19 -0
  30. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/forms/src/index.d.ts +19 -0
  31. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/forum/src/index.d.ts +19 -0
  32. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/genie-chat/src/index.d.ts +11 -0
  33. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/gift-cards/src/index.d.ts +19 -0
  34. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/groups/src/index.d.ts +19 -0
  35. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/inbox/src/extensions.d.ts +2 -1
  36. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/inbox/src/index.d.ts +19 -0
  37. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/invoices/src/index.d.ts +24 -2
  38. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/loyalty/src/index.d.ts +28 -4
  39. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/marketing-v1/src/index.d.ts +19 -0
  40. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/members-feed-viewer/src/index.d.ts +23 -1
  41. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/members-v1/src/index.d.ts +25 -3
  42. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/new-releases/src/index.d.ts +23 -1
  43. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/notification-preferences/src/index.d.ts +23 -2
  44. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/notifications-v3/src/index.d.ts +19 -0
  45. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/online-programs/src/index.d.ts +25 -3
  46. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/portfolio/src/index.d.ts +25 -3
  47. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/pricing-plans/src/index.d.ts +28 -6
  48. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/redirects-v1/src/index.d.ts +19 -0
  49. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/restaurants/src/extensions.d.ts +2 -2
  50. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/restaurants/src/index.d.ts +19 -0
  51. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/reviews/src/index.d.ts +24 -2
  52. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/seo-v1/src/index.d.ts +19 -0
  53. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/site-list/src/index.d.ts +19 -0
  54. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/site-media/src/index.d.ts +11 -0
  55. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/social-feed/src/index.d.ts +23 -1
  56. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/stores-collections/src/display.d.ts +3 -2
  57. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/stores-collections/src/index.d.ts +27 -3
  58. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/stores-v1/src/catalog.d.ts +7 -7
  59. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/stores-v1/src/display.d.ts +4 -3
  60. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/stores-v1/src/extensions.d.ts +2 -1
  61. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/stores-v1/src/index.d.ts +19 -0
  62. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/table-reservations/src/index.d.ts +25 -3
  63. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/users/src/index.d.ts +23 -1
  64. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/video/src/index.d.ts +19 -0
  65. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/wix-data/src/index.d.ts +27 -3
  66. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/workflows-v1/src/index.d.ts +19 -0
  67. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk-auto/_shared/runtime.generated.d.ts +8 -0
  68. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/checkout.mjs +12 -4
  69. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/screens.mjs +36 -11
  70. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/state.mjs +206 -12
  71. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-activity-counters.mjs +19 -5
  72. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-ai-site-chat.mjs +19 -5
  73. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-analytics.mjs +21 -7
  74. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-async-jobs.mjs +19 -5
  75. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-automations.mjs +19 -5
  76. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-badges.mjs +19 -5
  77. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-billing-tax.mjs +19 -5
  78. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-blog.mjs +31 -14
  79. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-bookings.mjs +26 -12
  80. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-business-tools.mjs +20 -6
  81. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-chat-web.mjs +29 -7
  82. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-comments.mjs +28 -5
  83. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-contacts.mjs +19 -5
  84. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-coupons.mjs +14 -6
  85. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-data-collections.mjs +19 -5
  86. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-data.mjs +15 -5
  87. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-donations.mjs +19 -5
  88. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-ecom.mjs +33 -16
  89. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-email-marketing.mjs +19 -5
  90. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-events.mjs +14 -6
  91. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-faq.mjs +20 -6
  92. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-forms.mjs +19 -5
  93. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-forum.mjs +19 -5
  94. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-gift-cards.mjs +19 -5
  95. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-groups.mjs +19 -5
  96. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-inbox.mjs +21 -7
  97. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-invoices.mjs +14 -6
  98. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-loyalty.mjs +16 -8
  99. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-marketing.mjs +19 -5
  100. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-members-feed-viewer.mjs +21 -10
  101. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-members.mjs +17 -8
  102. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-new-releases.mjs +17 -5
  103. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-notification-preferences.mjs +20 -6
  104. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-notifications.mjs +19 -5
  105. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-online-programs.mjs +16 -8
  106. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-portfolio.mjs +16 -8
  107. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-pricing-plans.mjs +22 -14
  108. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-redirects.mjs +19 -5
  109. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-restaurants.mjs +22 -7
  110. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-reviews.mjs +14 -6
  111. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-rich-content-editor.mjs +3 -0
  112. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-seo.mjs +19 -5
  113. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-site-list.mjs +19 -5
  114. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-social-feed.mjs +15 -5
  115. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-stores-collections.mjs +20 -10
  116. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-stores.mjs +116 -83
  117. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-table-reservations.mjs +16 -8
  118. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-users.mjs +15 -5
  119. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-video.mjs +9 -1
  120. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-workflows.mjs +19 -5
  121. package/dist/cli.mjs +1002 -806
  122. package/dist/preview-assets.generated.bin +0 -0
  123. package/fixtures/wix-canned.json +8 -8
  124. package/guides/dynamic-list.service.ts +38 -29
  125. package/guides/form-submit.service.ts +2 -1
  126. package/guides/himi-json-output.md +29 -0
  127. package/guides/iap-products.md +49 -4
  128. package/guides/index.json +6 -0
  129. package/guides/offline-reading.md +63 -0
  130. package/guides/recipe-dynamic-list.md +2 -0
  131. package/guides/recipe-four-state.md +1 -0
  132. package/guides/sdk-reference.json +225 -99
  133. package/guides/testing-himi-apps.md +2 -0
  134. package/guides/tier-5-add-a-screen.md +2 -0
  135. package/package.json +2 -2
  136. package/templates/beauty-salon/dev/index.ts +4 -3
  137. package/templates/beauty-salon/tier5-src/_shared/collection-service.ts +6 -9
  138. package/templates/beauty-salon/tier5-src/_shared/iap-presentation.ts +7 -3
  139. package/templates/beauty-salon/tier5-src/himi-branded-lite-home/index.ts +1 -1
  140. package/templates/beauty-salon/tier5-src/himi-branded-lite-orders/index.ts +3 -0
  141. package/templates/beauty-salon-owner/dev/index.ts +19 -19
  142. package/templates/beauty-salon-owner/tier5-src/_shared/collection-service.ts +6 -9
  143. package/templates/beauty-salon-owner/tier5-src/_shared/owner-module-data.ts +1 -1
  144. package/templates/branded-lite/dev/index.ts +38 -20
  145. package/templates/branded-lite/tier5-src/_shared/collection-query-legacy.ts +194 -0
  146. package/templates/branded-lite/tier5-src/_shared/collection-query.ts +158 -99
  147. package/templates/branded-lite/tier5-src/_shared/collection-service.ts +31 -11
  148. package/templates/branded-lite/tier5-src/_shared/iap-presentation.ts +7 -3
  149. package/templates/branded-lite/tier5-src/_shared/read-service.ts +255 -0
  150. package/templates/branded-lite/tier5-src/himi-branded-lite-home/index.ts +1 -1
  151. package/templates/branded-lite/tier5-src/himi-branded-lite-orders/index.ts +3 -0
  152. package/templates/branded-lite/tier5-src/himi-branded-lite-shop/index.ts +202 -159
  153. package/templates/branded-lite/tier5-src/himi-store-product/index.ts +130 -201
  154. package/templates/community-club/dev/index.ts +4 -4
  155. package/templates/community-club/tier5-src/_shared/collection-service.ts +6 -9
  156. package/templates/community-club/tier5-src/_shared/iap-presentation.ts +7 -3
  157. package/templates/community-club/tier5-src/himi-branded-lite-home/index.ts +1 -1
  158. package/templates/community-club-owner/dev/index.ts +19 -19
  159. package/templates/community-club-owner/tier5-src/_shared/collection-service.ts +6 -9
  160. package/templates/community-club-owner/tier5-src/_shared/owner-module-data.ts +1 -1
  161. package/templates/events-meetups/dev/index.ts +3 -3
  162. package/templates/events-meetups/tier5-src/_shared/collection-service.ts +6 -9
  163. package/templates/events-meetups/tier5-src/_shared/iap-presentation.ts +7 -3
  164. package/templates/events-meetups/tier5-src/himi-branded-lite-home/index.ts +1 -1
  165. package/templates/events-meetups-owner/dev/index.ts +17 -17
  166. package/templates/events-meetups-owner/tier5-src/_shared/collection-service.ts +6 -9
  167. package/templates/events-meetups-owner/tier5-src/_shared/owner-module-data.ts +1 -1
  168. package/templates/gym-fitness/dev/index.ts +5 -4
  169. package/templates/gym-fitness/tier5-src/_shared/collection-service.ts +6 -9
  170. package/templates/gym-fitness/tier5-src/_shared/iap-presentation.ts +7 -3
  171. package/templates/gym-fitness/tier5-src/himi-branded-lite-home/index.ts +1 -1
  172. package/templates/gym-fitness/tier5-src/himi-branded-lite-orders/index.ts +3 -0
  173. package/templates/gym-fitness-owner/dev/index.ts +20 -20
  174. package/templates/gym-fitness-owner/tier5-src/_shared/collection-service.ts +6 -9
  175. package/templates/gym-fitness-owner/tier5-src/_shared/owner-module-data.ts +1 -1
  176. package/templates/nonprofit-cause/dev/index.ts +4 -4
  177. package/templates/nonprofit-cause/tier5-src/_shared/collection-service.ts +6 -9
  178. package/templates/nonprofit-cause/tier5-src/_shared/iap-presentation.ts +7 -3
  179. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-home/index.ts +1 -1
  180. package/templates/nonprofit-cause-owner/dev/index.ts +18 -18
  181. package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-service.ts +6 -9
  182. package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-module-data.ts +1 -1
  183. package/templates/owner-lite/dev/index.ts +20 -20
  184. package/templates/owner-lite/tier5-src/_shared/collection-service.ts +6 -9
  185. package/templates/owner-lite/tier5-src/_shared/owner-module-data.ts +1 -1
  186. package/templates/podcast-creator/dev/index.ts +4 -4
  187. package/templates/podcast-creator/tier5-src/_shared/collection-service.ts +6 -9
  188. package/templates/podcast-creator/tier5-src/_shared/iap-presentation.ts +7 -3
  189. package/templates/podcast-creator/tier5-src/himi-branded-lite-home/index.ts +1 -1
  190. package/templates/podcast-creator-owner/dev/index.ts +19 -19
  191. package/templates/podcast-creator-owner/tier5-src/_shared/collection-service.ts +6 -9
  192. package/templates/podcast-creator-owner/tier5-src/_shared/owner-module-data.ts +1 -1
  193. package/templates/portfolio-creative/dev/index.ts +5 -4
  194. package/templates/portfolio-creative/tier5-src/_shared/collection-service.ts +6 -9
  195. package/templates/portfolio-creative/tier5-src/_shared/iap-presentation.ts +7 -3
  196. package/templates/portfolio-creative/tier5-src/himi-branded-lite-home/index.ts +1 -1
  197. package/templates/portfolio-creative/tier5-src/himi-branded-lite-orders/index.ts +3 -0
  198. package/templates/portfolio-creative-owner/dev/index.ts +19 -19
  199. package/templates/portfolio-creative-owner/tier5-src/_shared/collection-service.ts +6 -9
  200. package/templates/portfolio-creative-owner/tier5-src/_shared/owner-module-data.ts +1 -1
  201. package/templates/restaurant/dev/index.ts +3 -3
  202. package/templates/restaurant/tier5-src/_shared/collection-service.ts +6 -9
  203. package/templates/restaurant/tier5-src/_shared/iap-presentation.ts +7 -3
  204. package/templates/restaurant/tier5-src/himi-branded-lite-home/index.ts +1 -1
  205. package/templates/restaurant-owner/dev/index.ts +20 -20
  206. package/templates/restaurant-owner/tier5-src/_shared/collection-service.ts +6 -9
  207. package/templates/restaurant-owner/tier5-src/_shared/owner-module-data.ts +1 -1
  208. package/templates/retail-store/dev/index.ts +19 -1
  209. package/templates/retail-store/tier5-src/_shared/collection-query-legacy.ts +194 -0
  210. package/templates/retail-store/tier5-src/_shared/collection-query.ts +158 -99
  211. package/templates/retail-store/tier5-src/_shared/collection-service.ts +31 -11
  212. package/templates/retail-store/tier5-src/_shared/iap-presentation.ts +7 -3
  213. package/templates/retail-store/tier5-src/_shared/read-service.ts +255 -0
  214. package/templates/retail-store/tier5-src/himi-branded-lite-home/index.ts +1 -1
  215. package/templates/retail-store/tier5-src/himi-branded-lite-orders/index.ts +3 -0
  216. package/templates/retail-store/tier5-src/himi-branded-lite-shop/index.ts +202 -159
  217. package/templates/retail-store/tier5-src/himi-store-product/index.ts +130 -201
  218. package/templates/retail-store-owner/dev/index.ts +18 -18
  219. package/templates/retail-store-owner/tier5-src/_shared/collection-service.ts +6 -9
  220. package/templates/retail-store-owner/tier5-src/_shared/owner-module-data.ts +1 -1
  221. package/templates/yoga-studio/dev/index.ts +4 -4
  222. package/templates/yoga-studio/tier5-src/_shared/collection-service.ts +6 -9
  223. package/templates/yoga-studio/tier5-src/_shared/iap-presentation.ts +7 -3
  224. package/templates/yoga-studio/tier5-src/himi-branded-lite-home/index.ts +1 -1
  225. package/templates/yoga-studio-owner/dev/index.ts +18 -18
  226. package/templates/yoga-studio-owner/tier5-src/_shared/collection-service.ts +6 -9
  227. package/templates/yoga-studio-owner/tier5-src/_shared/owner-module-data.ts +1 -1
Binary file
@@ -195,8 +195,8 @@
195
195
  "title": "Pour-Over Masterclass",
196
196
  "slot": {
197
197
  "serviceId": "svc-0001",
198
- "startDate": "2026-08-08T10:00:00.000Z",
199
- "endDate": "2026-08-08T11:30:00.000Z"
198
+ "startDate": "2027-08-08T10:00:00.000Z",
199
+ "endDate": "2027-08-08T11:30:00.000Z"
200
200
  }
201
201
  }
202
202
  },
@@ -290,8 +290,8 @@
290
290
  "eventType": "RSVP",
291
291
  "scheduling": {
292
292
  "config": {
293
- "startDate": "2026-09-12T18:00:00.000Z",
294
- "endDate": "2026-09-12T20:00:00.000Z"
293
+ "startDate": "2027-09-12T18:00:00.000Z",
294
+ "endDate": "2027-09-12T20:00:00.000Z"
295
295
  },
296
296
  "formatted": {
297
297
  "dateAndTimeTbdMessage": ""
@@ -317,8 +317,8 @@
317
317
  "eventType": "TICKETS",
318
318
  "scheduling": {
319
319
  "config": {
320
- "startDate": "2026-10-03T19:00:00.000Z",
321
- "endDate": "2026-10-03T22:00:00.000Z"
320
+ "startDate": "2027-10-03T19:00:00.000Z",
321
+ "endDate": "2027-10-03T22:00:00.000Z"
322
322
  },
323
323
  "formatted": {
324
324
  "dateAndTimeTbdMessage": ""
@@ -1632,8 +1632,8 @@
1632
1632
  "eventType": "RSVP",
1633
1633
  "scheduling": {
1634
1634
  "config": {
1635
- "startDate": "2026-09-12T18:00:00.000Z",
1636
- "endDate": "2026-09-12T20:00:00.000Z"
1635
+ "startDate": "2027-09-12T18:00:00.000Z",
1636
+ "endDate": "2027-09-12T20:00:00.000Z"
1637
1637
  },
1638
1638
  "formatted": {
1639
1639
  "dateAndTimeTbdMessage": ""
@@ -12,8 +12,8 @@
12
12
  // Because this worker rides the Wix transport (globalThis.himalaya.wixApi), the
13
13
  // descriptor's logicBundle.declaredCapabilities MUST include "wix_api" (RFC 0043 D4).
14
14
 
15
- import { defineService } from "@wix/himalaya/state";
16
- import { productPrice, queryStoreProducts, type StoreProduct } from "@wix/himalaya/wix-stores";
15
+ import { defineService, createReadController, initialReadStatus, type ReadMetadata, type ReadStatus } from "@wix/himalaya/state";
16
+ import { productPrice, searchStoreProducts, type StoreProduct } from "@wix/himalaya/wix-stores";
17
17
 
18
18
  // FLAT strings only — the row template binds `$item.name`, never `$item.priceData.…`.
19
19
  // All shaping happens here in normalize(), not at the binding site.
@@ -30,6 +30,7 @@ type ErrorKind = "" | "offline" | "server" | "signIn" | "membership" | "permissi
30
30
  type ShownKind = Exclude<ErrorKind, "" | "signIn">;
31
31
 
32
32
  interface ProductsState {
33
+ readStatus: ReadStatus;
33
34
  status: "loading" | "ready" | "error";
34
35
  items: ProductRow[]; // ← itemsPath binds here; MUST initialize as an array
35
36
  errorKind: "" | ShownKind; // why the last load failed; "" unless status is "error"
@@ -64,10 +65,11 @@ function normalize(raw: StoreProduct): ProductRow {
64
65
  function shape(s: Partial<ProductsState>): ProductsState {
65
66
  const status = s.status ?? "ready";
66
67
  const items = s.items ?? [];
67
- const errorKind: "" | ShownKind = status === "error" ? (s.errorKind || "server") : "";
68
+ const errorKind: "" | ShownKind = s.errorKind ?? (status === "error" ? "server" : "");
68
69
  const blank = items.length === 0; // nothing on screen to keep
69
70
  return {
70
71
  status,
72
+ readStatus: s.readStatus ?? initialReadStatus(),
71
73
  items,
72
74
  errorKind,
73
75
  hideLoading: !(status === "loading" && blank),
@@ -81,8 +83,13 @@ function shape(s: Partial<ProductsState>): ProductsState {
81
83
  };
82
84
  }
83
85
 
84
- // The classifier below is `himi docs recipe-four-state`'s, VERBATIM — a test holds
85
- // the two byte-identical, so the rules an agent copies from here are the documented ones.
86
+ async function readProducts(cache: "only-if-cached" | "reload") {
87
+ let metadata: ReadMetadata | undefined;
88
+ const response = await searchStoreProducts({ limit: 50 }, { cache, onCacheResult: value => { metadata = value; } });
89
+ if (!metadata) throw new Error("Read provenance unavailable");
90
+ return { data: (response.products ?? []).filter(p => p?.id).map(normalize), metadata };
91
+ }
92
+
86
93
  // The HTTP status rides in the message: `HTTP 503: …` on a device, `Wix 503 for …`
87
94
  // under `himi test` / `himi render`.
88
95
  const STATUS = /\b(?:HTTP|Wix) (\d{3})\b/;
@@ -140,34 +147,36 @@ function shownKind(e: unknown): ShownKind {
140
147
  return kind === "signIn" ? "permission" : kind || "server";
141
148
  }
142
149
 
143
- async function loadList(s: Partial<ProductsState>): Promise<ProductsState> {
144
- try {
145
- const res = await queryStoreProducts(50);
146
- const items = (res.products ?? []).filter((p) => p?.id).map(normalize);
147
- return shape({ status: "ready", items, selectedId: s.selectedId });
148
- } catch (e) {
149
- const errorKind = shownKind(e);
150
- // Keep the rows on a refresh failure; clear them when access is gone.
151
- const lostAccess = errorKind === "membership" || errorKind === "permission";
152
- const items = lostAccess ? [] : s.items ?? [];
153
- return shape({ ...s, status: "error", items, errorKind });
154
- }
155
- }
150
+ // Keep the classified cause beside the controller's safe user message. Reclassifying
151
+ // that message would turn every transport failure into a generic server error.
152
+ let lastReadError: ShownKind = "server";
153
+ const reads = createReadController<ProductRow[]>({
154
+ cached: () => readProducts("only-if-cached"),
155
+ fetch: () => readProducts("reload"),
156
+ clearOnError: error => {
157
+ lastReadError = shownKind(error);
158
+ return lastReadError === "permission" || lastReadError === "membership";
159
+ },
160
+ publish(items, readStatus) { void svc.publishRead({ items, readStatus }); },
161
+ });
156
162
 
157
- const svc = defineService<ProductsState, {
158
- load: (s: ProductsState) => Promise<ProductsState>;
159
- retry: (s: ProductsState) => Promise<ProductsState>;
160
- open: (s: ProductsState, arg?: unknown) => ProductsState;
161
- }>("products", {
163
+ const svc = defineService("products", {
162
164
  state: shape({ status: "loading" }),
165
+ readLifecycle: { refreshAction: "refreshRead", statusPath: "readStatus" },
163
166
  actions: {
164
- load: async (s) => loadList(s),
165
- retry: async (s) => loadList(s),
166
- // Row tap — receives the template's params ({ id: "$item.id" }, substituted per row).
167
- // Stash the identity; wire real navigation per the tier-5 guide (detail screens).
168
- open: (s, arg) => ({ ...s, selectedId: String((arg as { id?: string })?.id ?? "") }),
167
+ load: async () => { await reads.load("products:first-50"); return undefined; },
168
+ refreshRead: async () => { await reads.refresh(); return undefined; },
169
+ retry: async () => { await reads.refresh(); return undefined; },
170
+ publishRead: (state: ProductsState, value: { items?: ProductRow[]; readStatus: ReadStatus }) => {
171
+ const read = value.readStatus;
172
+ const errorKind = read.error ? lastReadError : read.offline ? "offline" : "";
173
+ return shape({ ...state, items: value.items ?? (read.hasSnapshot ? state.items : []), readStatus: read, errorKind,
174
+ status: read.hasSnapshot ? "ready" : read.refreshing ? "loading" : "error",
175
+ });
176
+ },
177
+ open: (state: ProductsState, arg?: unknown) => ({ ...state, selectedId: String((arg as { id?: string })?.id ?? "") }),
169
178
  },
170
179
  });
171
180
 
172
- svc.load(); // kick the fetch at worker boot — the screen opens on the loading state
181
+ svc.load();
173
182
  export { svc };
@@ -12,7 +12,7 @@
12
12
  // The write rides the Wix transport → the descriptor's logicBundle MUST declare
13
13
  // "wix_api" (RFC 0043 D4).
14
14
 
15
- import { defineService } from "@wix/himalaya/state";
15
+ import { defineService, requireConnectivity } from "@wix/himalaya/state";
16
16
  import { createDraftPost, type WixDraftPostWrite, type WixRichContent } from "@wix/himalaya/wix-blog";
17
17
 
18
18
  interface PostFormState {
@@ -129,6 +129,7 @@ const svc = defineService<PostFormState, {
129
129
  const body = String(values?.body ?? "").trim();
130
130
  if (!title) return shape({ ...s, status: "error", error: "Title is required", savedMessage: "" });
131
131
  try {
132
+ requireConnectivity(); // Before optimistic state or a request; reconnect never submits.
132
133
  const r = await createDraftPost({
133
134
  title,
134
135
  richContent: toRichContent(body || title),
@@ -493,3 +493,32 @@ Apple provisioning commands (`draft`, `plan`, `apply`, `status`, `screenshots`)
493
493
  legacy `--profile` combined with Catalog registration/route selectors as `invalid_usage`,
494
494
  before reading inputs or credentials. `connect` retains its intentional legacy profile plus
495
495
  Catalog mapping route and registration check.
496
+
497
+ ## Apple-key onboarding (`himi store apple-keys`)
498
+
499
+ `setup` and `status` emit JSON with `ok`, `app`, `site`, `bundleId`, `asc`, `iap`,
500
+ `ready`, `purchasesAppId`, and `completed`. `asc` carries `present` and available
501
+ `keyId`/`issuerId`; `iap` carries `present`. A group omitted during setup has
502
+ `present: null`, `state: "not_checked"`. A failed status read has `present: null`,
503
+ `state: "unavailable"`; the other service is still read and reported, and the
504
+ command exits 1 with `apple_keys_failed`. Setup also attempts both selected uploads
505
+ independently and reports the successful writes if either service fails. No private
506
+ key is returned. A successful
507
+ read exits 0 even when `ready` is false. Dry runs add `dryRun: true` and `planned`.
508
+ `completed` names writes confirmed during this invocation (`asc`, `purchases_app`,
509
+ `iap`); it is not a transaction or a guarantee that a timed-out write did not land.
510
+
511
+ | Code | Meaning |
512
+ |---|---|
513
+ | `invalid_usage` | Invalid identity, incomplete key flags, invalid/unreadable key or a key inside the repository, or missing `--yes`. Exit 2; no key writes. |
514
+ | `owner_session_unavailable` | Himi/Wix owner credentials or target configuration could not be resolved. `error` retains the session diagnostic. |
515
+ | `apple_keys_failed` | A service call, authorization check or read-back failed. Exit 1; earlier writes listed in `completed` remain stored. Read status before retrying. |
516
+
517
+ The ASC endpoint (`GET`/`POST /v1/admin/store/asc-key`) also returns stable `code`
518
+ values on failures: `unauthorized`, `token_revoked`, `revocation_check_unavailable`,
519
+ `method_not_allowed`, `invalid_input`, `invalid_app_id`, `invalid_site_id`,
520
+ `forbidden_cross_tenant`, `forbidden_site`, `invalid_asc_key`,
521
+ `apple_keys_unconfigured`, `apple_keys_not_saved`, `build_secrets_busy`, or
522
+ `apple_keys_unavailable`. `build_secrets_busy` is HTTP 409: another ASC upload or
523
+ push setup holds the site; retry after it finishes. Responses have `Cache-Control:
524
+ no-store`; both methods require app authority and current Wix site ownership.
@@ -33,6 +33,51 @@ catalogs. Subscriptions are refused before anything reaches Apple.
33
33
 
34
34
  These key and profile prerequisites apply to direct Apple mode. There is **no ambient fallback**: direct mode requires `--profile`, and exported `ASC_*` variables never select the account. Managed mode below uses no local `.p8`.
35
35
 
36
+ ## Set up the owner's Apple keys
37
+
38
+ Use `himi store apple-keys setup` to upload either key independently of push setup
39
+ and local signing profiles. The **App Store Connect API key** is stored in Branded
40
+ BuildSecrets for Catalog. The separate **In-App Purchase key** is stored on the
41
+ purchases app using the purchases service's `SetAppleCredentials` operation.
42
+ Create the latter under App Store Connect → Users and Access → Integrations →
43
+ In-App Purchase; an ASC API key cannot replace it.
44
+
45
+ Sign into the owner's Wix account (`wix login`) and Himi (`himi login --browser
46
+ --target wix`), and use an app slug that account already owns. Keep both `.p8`
47
+ files outside the repository, including after resolving symlinks.
48
+
49
+ ```sh
50
+ himi store apple-keys setup --app <slug> --site <metaSiteId> --bundle-id <bundle> \
51
+ --asc-key-file /private/keys/asc.p8 --asc-key-id <id> --asc-issuer-id <issuer> \
52
+ --iap-key /private/keys/iap.p8 --iap-key-id <id> --iap-issuer-id <issuer> --yes
53
+ himi store apple-keys status --app <slug> --site <metaSiteId> --bundle-id <bundle> --json
54
+ ```
55
+
56
+ Each key's three flags must be supplied together; omit the other group to upload
57
+ only one key. Setup contacts only the services for the supplied key groups; an
58
+ unselected group reports `present: null`, `state: "not_checked"`. Each group supplies
59
+ its own issuer ID. `setup --dry-run` validates
60
+ local inputs and reads stored status without registering an app or uploading keys.
61
+ Without `--dry-run`, setup requires `--yes`; supplied keys replace the corresponding
62
+ stored key. An IAP upload registers the bundle's purchases app if it does not exist,
63
+ and reuses an existing registration. It does not connect the payment provider or
64
+ create product mappings: run `himi store iap connect` afterward.
65
+
66
+ Status returns presence for each key, ASC identifiers when available, and the
67
+ `purchasesAppId` to use with Catalog commands. `ready` means both keys are stored;
68
+ it does not prove Apple permissions, product readiness or payment-provider setup.
69
+ Private keys are never returned or saved locally. Both commands emit JSON; a
70
+ successful status read exits 0 even when a key is missing. Status reads both services
71
+ independently; if one fails, it exits 1 but retains the other result and marks the
72
+ failed group `present: null`, `state: "unavailable"`. Setup reports completed
73
+ writes if a later step fails. When both keys are selected, a failure in one service
74
+ does not prevent the other upload; read status before retrying. The ASC upload preserves
75
+ existing signing, Google Play and live Ping credentials, and refuses when it cannot
76
+ read the credentials needed for preservation. Concurrent ASC uploads and push setup
77
+ exclude each other through the same site lease; a busy site returns HTTP 409.
78
+ It never provisions certificates,
79
+ profiles, APNs or Firebase. Containers Builder is not used.
80
+
36
81
  ## Managed provisioning through Catalog
37
82
 
38
83
  Provisioning commands use managed mode when `--profile` is absent; `--managed`
@@ -139,10 +184,10 @@ with Catalog's current revision, preserving the SKU, item identity, and metadata
139
184
  Managed `connect` never opens an Apple key on the Mac. It reuses an In-App Purchase key
140
185
  already stored by purchases. If there is none, it reports `apple_key_missing`; an App Store
141
186
  Connect API key is a different credential and cannot replace it. The purchases contract
142
- supports encrypted key writes but not reading a key back, and Branded does not currently
143
- provide a dedicated In-App Purchase key bridge. Provisioning that missing server key remains
144
- a backend prerequisite. Explicit legacy `--profile` plus `--iap-key` remains available for
145
- owner-driven onboarding. Supplying local key flags in managed mode is refused.
187
+ supports encrypted key writes but not reading a key back. Upload the missing key with
188
+ `himi store apple-keys setup` and its IAP key flags, then rerun managed connect.
189
+ Explicit legacy `--profile` plus `--iap-key` also remains available. Supplying local
190
+ key flags directly to managed connect is refused.
146
191
 
147
192
  For a managed draft, pass the Catalog registration and route:
148
193
 
package/guides/index.json CHANGED
@@ -32,6 +32,12 @@
32
32
  "User-facing copy is CONFIGURATION, never hardcoded in a descriptor: route every string through a copy key with a stock fallback — `copyOf(key, fallback)` — and feed worker-emitted strings in as descriptor params, so any app/template consumer can retheme ALL copy without touching descriptors. Wire the seam yourself: declare a local `const COPY: Record<string,string> = {…}` in your content package plus `export const copyOf = (k, fallback) => COPY[k] ?? fallback;`, keyed `<screen>.<element>` so a later template publish is mechanical. Either way the rule is the same: no user-facing string baked into a descriptor literal."
33
33
  ],
34
34
  "guides": [
35
+ {
36
+ "id": "offline-reading",
37
+ "title": "Offline reading and recovery",
38
+ "category": "Tier-5 Screens",
39
+ "file": "offline-reading.md"
40
+ },
35
41
  {
36
42
  "id": "hhp",
37
43
  "title": "Responsive HTML to native Himi",
@@ -0,0 +1,63 @@
1
+ # Offline reading and recovery
2
+
3
+ Himalaya provides connectivity monitoring, an accessible shell bar, policy-controlled response caches, and a read lifecycle for generated screens. Offline support covers reading. Saving still requires connectivity and an explicit submission after reconnect.
4
+
5
+ ## User-facing states
6
+
7
+ | State | Behavior |
8
+ | --- | --- |
9
+ | Offline with an eligible snapshot | Keep the content, including a successfully loaded empty result. Show “You’re offline. Showing previously loaded content.” |
10
+ | Offline without an eligible snapshot | Show “This content isn’t available offline. Connect to load it.” Never infer an empty result from a failed request. |
11
+ | Reconnected | Keep the content while showing “Refreshing…”. Refresh the visible read participant in place. |
12
+ | Refresh failed | Keep the snapshot and show “Couldn’t refresh. Content may be outdated.” with Retry. Without a snapshot, show an unavailable state with Retry. |
13
+ | Refresh succeeded | Apply the server result and clear the stale/error indication. Connectivity alone never means content is current. |
14
+
15
+ The shared shell owns the bar and reserves layout space for it. Do not add app-owned banners, reload the application, reset navigation, or recreate workers on reconnect. Presented screens participate too. Recovery is deferred while a screen or application is inactive.
16
+
17
+ For steps to adopt this contract in another starter, see [Add offline reading to a starter template](offline-reading-template-adoption.md).
18
+
19
+ ## Register a safe read
20
+
21
+ Use `createReadController` from `@wix/himalaya/state` for a custom collection or detail screen. Register `readLifecycle: { refreshAction: "refreshRead", statusPath: "readStatus" }` on its service. Only the declared action participates in automatic recovery; it must perform reads only. Never register a submit, checkout, queue-draining, or generic action dispatcher as a refresh action.
22
+
23
+ The controller distinguishes `hasSnapshot` from the length of a list. Its status includes `refreshing`, `fromCache`, `stale`, `offline`, `lastSuccessAt`, and `error`. Publish status changes without clearing existing rows. Change its key when the route or server criteria change; never treat an unfiltered cached subset as a successful server search. Dispose the controller when its scope ends. Managed worker teardown and identity changes also notify controllers automatically.
24
+
25
+ The runnable dynamic-list example demonstrates keeping rows during a failed refresh. Shared starter collections additionally stage replacement pages using new cursors and commit the whole loaded depth together. A failed replacement leaves the previous pages, filters, and selection intact. Keep item IDs stable so renderers retain scroll anchors where those items still exist.
26
+
27
+ ## SDK reads and cache policy
28
+
29
+ Wix call options accept `cache: "only-if-cached"` and `cache: "reload"`, plus `onCacheResult(metadata)`. Business response payloads are unchanged. Existing calls without options retain their default behavior.
30
+
31
+ * `only-if-cached` never sends a network request. Ineligible, absent, expired, or insufficiently scoped entries reject with `OFFLINE_CACHE_MISS`.
32
+ * `reload` waits for the network. Use it for reconnect and Retry; another cache hit is not recovery.
33
+ * Metadata describes `source` (`cache` or `network`), `fetchedAt`, `expiresAt`, and `cacheable`. Cache-only snapshots need cache provenance, eligibility, and a future expiry. For a screen composed of multiple required reads, combine the earliest expiry and require eligibility for every response.
34
+
35
+ Initial loads can paint an eligible cache response before network revalidation. Keep the existing endpoint allowlist and retention limits. Optional enrichment can be omitted offline; a failed primary read must reject. Do not substitute sample data after errors. Explicitly selected sample previews remain separate from live data.
36
+
37
+ ## Identity and persistence
38
+
39
+ Use the host's response cache, scoped by app, site, principal, release, and request criteria. Do not persist network responses in unscoped local database rows or generic worker snapshots. Managed read services are excluded from worker persistence and hydration. Legacy worker snapshots are not hydrated by the new hosts. Unrelated local preferences and authored content remain local.
40
+
41
+ Clear private visible state on sign-out or access denial, and reject delayed results from a departed identity. Unknown identity is not permission to reuse the last signed-in user's cache. Ordinary transport/server failures retain content; access denial does not. Custom adapters should supply `clearOnError` for their typed authorization errors and invalidate their controller when their own scope changes.
42
+
43
+ ## Writes and runtime compatibility
44
+
45
+ Call `requireConnectivity()` before optimistic changes or queue insertion. Keep entered values on failure, explain that saving requires connectivity, and let the user submit again explicitly. Reconnect never submits a draft or drains a queue. Shared starter editor loads use the same read lifecycle while keeping an open draft and its concurrency revision together; recovery must not silently replace typed fields or rebase a draft onto a newer revision. A new unsaved form is explicitly local content, not a cached server response.
46
+
47
+ Services using the contract require `himalaya.readLifecycleVersion >= 1` and the Wix read bridge. The state SDK refuses unsupported runtimes with `READ_LIFECYCLE_UNSUPPORTED`; silently ignoring the contract would expose stale content. Ship the updated native runtime and web host before publishing starter bundles that use it. This does not make an unloaded browser application available offline.
48
+
49
+ ## Verification recipe
50
+
51
+ 1. Load a real list online, choose a filter, scroll, and load another page.
52
+ 2. Disconnect. Confirm the same content remains, with an accessible offline announcement and an unobstructed bar. A successful empty response must remain distinguishable from missing data.
53
+ 3. Open an uncached route or change server criteria. Confirm an honest unavailable state, with no demo rows or mismatched cached results.
54
+ 4. Change server data, reconnect, and confirm visible content updates without navigation, filter, selection, or page-depth reset. Repeat while backgrounded and with a presented detail screen.
55
+ 5. Reconnect to a failing backend. Confirm stale content and Retry remain until a successful network response. Rapid connectivity changes must coalesce reads and never replay writes.
56
+ 6. Relaunch native apps offline within cache retention. Check expiry, policy changes, app/site/account switches, sign-out during hydration or refresh, revoked access, and delayed responses.
57
+ 7. Submit a starter form offline. Confirm values remain, no optimistic record or success message appears, nothing is queued, and reconnect alone does not submit it.
58
+
59
+ Run controller, bridge/cache, identity, collection, starter-generation, and authoring tests. Drive iOS, Android, macOS, and web preview, and record native offline relaunch. Recovery telemetry uses the existing `offline_read_recovery` event with outcome only; never include response contents or user identifiers.
60
+
61
+ <!-- platform-lint-ok: This guide covers the native shared shells and loaded web preview requested by this change; React Native host adoption is outside this rollout. -->
62
+
63
+ Initial adoption is limited to product lists and product details in Branded Lite and Retail Store. Other screen adoption is deferred; see [the follow-up scope](offline-reading-follow-up.md).
@@ -1,5 +1,7 @@
1
1
  # Recipe: dynamic list from worker data
2
2
 
3
+ For cached reads, unavailable offline states, safe reconnect actions, and failed-refresh retention, follow [Offline reading and recovery](../offline-reading.md) (also available as himi docs offline-reading). A refresh failure must preserve useful content; an empty result requires a successful read.
4
+
3
5
  Render a **live array from your Tier-5 worker** as a scrolling list — the single most
4
6
  common Himi screen shape (products, bookings, events, posts, contacts…). This recipe
5
7
  stitches together three pieces that are each documented separately but easy to miss as
@@ -1,5 +1,6 @@
1
1
  # Recipe: four screen states (loading / empty / error / ready)
2
2
 
3
+ For cached reads, unavailable offline states, safe reconnect actions, and failed-refresh retention, follow [Offline reading and recovery](../offline-reading.md) (also available as himi docs offline-reading). A refresh failure must preserve useful content; an empty result requires a successful read.
3
4
  **The rule every recipe follows:** a screen that loads or writes data shows a
4
5
  **loading state**, a **classified error state**, and a **recovery action where the
5
6
  user can fix the failure** — retry for an offline or a server failure, and for a failed