@wix/himalaya-cli 0.1035.0 → 0.1036.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 (234) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/builder.d.ts +7 -1
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/events/src/display.d.ts +13 -1
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-events.mjs +28 -6
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-stores-collections.mjs +1 -1
  5. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-stores.mjs +7 -1
  6. package/dist/cli.mjs +23 -21
  7. package/dist/preview-assets.generated.bin +0 -0
  8. package/guides/sdk-reference.json +16 -4
  9. package/package.json +2 -2
  10. package/templates/beauty-salon/dev/index.ts +72 -175
  11. package/templates/beauty-salon/tier5-src/_shared/collection-contract.ts +16 -9
  12. package/templates/beauty-salon/tier5-src/_shared/collection-service.ts +19 -5
  13. package/templates/beauty-salon/tier5-src/_shared/engine-intl.ts +51 -0
  14. package/templates/beauty-salon/tier5-src/_shared/himi-restaurants.ts +4 -4
  15. package/templates/beauty-salon/tier5-src/_shared/owner-load-error.ts +49 -0
  16. package/templates/beauty-salon/tier5-src/_shared/wix-service-price.ts +1 -1
  17. package/templates/beauty-salon/tier5-src/himi-branded-lite-info/index.ts +5 -2
  18. package/templates/beauty-salon/tier5-src/himi-branded-lite-plans/index.ts +1 -1
  19. package/templates/beauty-salon/tier5-src/wix-spaces-collections/index.ts +1 -1
  20. package/templates/beauty-salon/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  21. package/templates/beauty-salon-owner/dev/index.ts +84 -599
  22. package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +22 -6
  23. package/templates/beauty-salon-owner/tier5-src/_shared/collection-contract.ts +16 -9
  24. package/templates/beauty-salon-owner/tier5-src/_shared/collection-service.ts +19 -5
  25. package/templates/beauty-salon-owner/tier5-src/_shared/engine-intl.ts +51 -0
  26. package/templates/beauty-salon-owner/tier5-src/_shared/owner-load-error.ts +49 -0
  27. package/templates/branded-lite/dev/index.ts +178 -264
  28. package/templates/branded-lite/tier5-src/_shared/collection-contract.ts +16 -9
  29. package/templates/branded-lite/tier5-src/_shared/collection-service.ts +19 -5
  30. package/templates/branded-lite/tier5-src/_shared/engine-intl.ts +51 -0
  31. package/templates/branded-lite/tier5-src/_shared/himi-restaurants.ts +4 -4
  32. package/templates/branded-lite/tier5-src/_shared/owner-load-error.ts +49 -0
  33. package/templates/branded-lite/tier5-src/_shared/wix-service-price.ts +1 -1
  34. package/templates/branded-lite/tier5-src/himi-branded-lite-cms/index.ts +5 -5
  35. package/templates/branded-lite/tier5-src/himi-branded-lite-coupons/index.ts +33 -7
  36. package/templates/branded-lite/tier5-src/himi-branded-lite-donations/index.ts +3 -3
  37. package/templates/branded-lite/tier5-src/himi-branded-lite-forms/index.ts +11 -10
  38. package/templates/branded-lite/tier5-src/himi-branded-lite-giftcards/index.ts +3 -3
  39. package/templates/branded-lite/tier5-src/himi-branded-lite-info/index.ts +5 -2
  40. package/templates/branded-lite/tier5-src/himi-branded-lite-invoices/index.ts +3 -3
  41. package/templates/branded-lite/tier5-src/himi-branded-lite-loyalty/index.ts +1 -1
  42. package/templates/branded-lite/tier5-src/himi-branded-lite-plans/index.ts +1 -1
  43. package/templates/branded-lite/tier5-src/himi-branded-lite-program/index.ts +1 -1
  44. package/templates/branded-lite/tier5-src/himi-branded-lite-reserve/index.ts +5 -3
  45. package/templates/branded-lite/tier5-src/himi-events-detail/index.ts +1 -1
  46. package/templates/branded-lite/tier5-src/himi-events-list/index.ts +20 -4
  47. package/templates/branded-lite/tier5-src/himi-events-my-events/index.ts +2 -2
  48. package/templates/branded-lite/tier5-src/wix-spaces-collections/index.ts +1 -1
  49. package/templates/branded-lite/tier5-src/wix-spaces-forum/index.ts +7 -1
  50. package/templates/branded-lite/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  51. package/templates/community-club/dev/index.ts +62 -81
  52. package/templates/community-club/tier5-src/_shared/collection-contract.ts +16 -9
  53. package/templates/community-club/tier5-src/_shared/collection-service.ts +19 -5
  54. package/templates/community-club/tier5-src/_shared/engine-intl.ts +51 -0
  55. package/templates/community-club/tier5-src/_shared/himi-restaurants.ts +4 -4
  56. package/templates/community-club/tier5-src/_shared/owner-load-error.ts +49 -0
  57. package/templates/community-club/tier5-src/_shared/wix-service-price.ts +1 -1
  58. package/templates/community-club/tier5-src/himi-branded-lite-cms/index.ts +5 -5
  59. package/templates/community-club/tier5-src/himi-branded-lite-info/index.ts +5 -2
  60. package/templates/community-club/tier5-src/himi-events-detail/index.ts +1 -1
  61. package/templates/community-club/tier5-src/himi-events-list/index.ts +20 -4
  62. package/templates/community-club/tier5-src/himi-events-my-events/index.ts +2 -2
  63. package/templates/community-club/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  64. package/templates/community-club-owner/dev/index.ts +84 -599
  65. package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +22 -6
  66. package/templates/community-club-owner/tier5-src/_shared/collection-contract.ts +16 -9
  67. package/templates/community-club-owner/tier5-src/_shared/collection-service.ts +19 -5
  68. package/templates/community-club-owner/tier5-src/_shared/engine-intl.ts +51 -0
  69. package/templates/community-club-owner/tier5-src/_shared/owner-load-error.ts +49 -0
  70. package/templates/community-club-owner/tier5-src/himi-owner-lite-events/index.ts +1 -0
  71. package/templates/events-meetups/dev/index.ts +60 -79
  72. package/templates/events-meetups/tier5-src/_shared/collection-contract.ts +16 -9
  73. package/templates/events-meetups/tier5-src/_shared/collection-service.ts +19 -5
  74. package/templates/events-meetups/tier5-src/_shared/engine-intl.ts +51 -0
  75. package/templates/events-meetups/tier5-src/_shared/himi-restaurants.ts +4 -4
  76. package/templates/events-meetups/tier5-src/_shared/owner-load-error.ts +49 -0
  77. package/templates/events-meetups/tier5-src/_shared/wix-service-price.ts +1 -1
  78. package/templates/events-meetups/tier5-src/himi-branded-lite-info/index.ts +5 -2
  79. package/templates/events-meetups/tier5-src/himi-events-detail/index.ts +1 -1
  80. package/templates/events-meetups/tier5-src/himi-events-list/index.ts +20 -4
  81. package/templates/events-meetups/tier5-src/himi-events-my-events/index.ts +2 -2
  82. package/templates/events-meetups/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  83. package/templates/events-meetups-owner/dev/index.ts +84 -543
  84. package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +22 -6
  85. package/templates/events-meetups-owner/tier5-src/_shared/collection-contract.ts +16 -9
  86. package/templates/events-meetups-owner/tier5-src/_shared/collection-service.ts +19 -5
  87. package/templates/events-meetups-owner/tier5-src/_shared/engine-intl.ts +51 -0
  88. package/templates/events-meetups-owner/tier5-src/_shared/owner-load-error.ts +49 -0
  89. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-events/index.ts +1 -0
  90. package/templates/gym-fitness/dev/index.ts +73 -204
  91. package/templates/gym-fitness/tier5-src/_shared/collection-contract.ts +16 -9
  92. package/templates/gym-fitness/tier5-src/_shared/collection-service.ts +19 -5
  93. package/templates/gym-fitness/tier5-src/_shared/engine-intl.ts +51 -0
  94. package/templates/gym-fitness/tier5-src/_shared/himi-restaurants.ts +4 -4
  95. package/templates/gym-fitness/tier5-src/_shared/owner-load-error.ts +49 -0
  96. package/templates/gym-fitness/tier5-src/_shared/wix-service-price.ts +1 -1
  97. package/templates/gym-fitness/tier5-src/himi-branded-lite-info/index.ts +5 -2
  98. package/templates/gym-fitness/tier5-src/himi-branded-lite-plans/index.ts +1 -1
  99. package/templates/gym-fitness/tier5-src/himi-events-detail/index.ts +1 -1
  100. package/templates/gym-fitness/tier5-src/himi-events-list/index.ts +20 -4
  101. package/templates/gym-fitness/tier5-src/himi-events-my-events/index.ts +2 -2
  102. package/templates/gym-fitness/tier5-src/wix-spaces-collections/index.ts +1 -1
  103. package/templates/gym-fitness/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  104. package/templates/gym-fitness-owner/dev/index.ts +84 -627
  105. package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +22 -6
  106. package/templates/gym-fitness-owner/tier5-src/_shared/collection-contract.ts +16 -9
  107. package/templates/gym-fitness-owner/tier5-src/_shared/collection-service.ts +19 -5
  108. package/templates/gym-fitness-owner/tier5-src/_shared/engine-intl.ts +51 -0
  109. package/templates/gym-fitness-owner/tier5-src/_shared/owner-load-error.ts +49 -0
  110. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-events/index.ts +1 -0
  111. package/templates/himi-chat/tier5-src/_shared/owner-load-error.ts +49 -0
  112. package/templates/nonprofit-cause/dev/index.ts +71 -90
  113. package/templates/nonprofit-cause/tier5-src/_shared/collection-contract.ts +16 -9
  114. package/templates/nonprofit-cause/tier5-src/_shared/collection-service.ts +19 -5
  115. package/templates/nonprofit-cause/tier5-src/_shared/engine-intl.ts +51 -0
  116. package/templates/nonprofit-cause/tier5-src/_shared/himi-restaurants.ts +4 -4
  117. package/templates/nonprofit-cause/tier5-src/_shared/owner-load-error.ts +49 -0
  118. package/templates/nonprofit-cause/tier5-src/_shared/wix-service-price.ts +1 -1
  119. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-info/index.ts +5 -2
  120. package/templates/nonprofit-cause/tier5-src/himi-branded-lite-plans/index.ts +1 -1
  121. package/templates/nonprofit-cause/tier5-src/himi-events-detail/index.ts +1 -1
  122. package/templates/nonprofit-cause/tier5-src/himi-events-list/index.ts +20 -4
  123. package/templates/nonprofit-cause/tier5-src/himi-events-my-events/index.ts +2 -2
  124. package/templates/nonprofit-cause/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  125. package/templates/nonprofit-cause-owner/dev/index.ts +84 -571
  126. package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +22 -6
  127. package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-contract.ts +16 -9
  128. package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-service.ts +19 -5
  129. package/templates/nonprofit-cause-owner/tier5-src/_shared/engine-intl.ts +51 -0
  130. package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-load-error.ts +49 -0
  131. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-events/index.ts +1 -0
  132. package/templates/owner-lite/dev/index.ts +84 -627
  133. package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +22 -6
  134. package/templates/owner-lite/tier5-src/_shared/collection-contract.ts +16 -9
  135. package/templates/owner-lite/tier5-src/_shared/collection-service.ts +19 -5
  136. package/templates/owner-lite/tier5-src/_shared/engine-intl.ts +51 -0
  137. package/templates/owner-lite/tier5-src/_shared/owner-load-error.ts +49 -0
  138. package/templates/owner-lite/tier5-src/himi-owner-lite-events/index.ts +1 -0
  139. package/templates/podcast-creator/dev/index.ts +71 -90
  140. package/templates/podcast-creator/tier5-src/_shared/collection-contract.ts +16 -9
  141. package/templates/podcast-creator/tier5-src/_shared/collection-service.ts +19 -5
  142. package/templates/podcast-creator/tier5-src/_shared/engine-intl.ts +51 -0
  143. package/templates/podcast-creator/tier5-src/_shared/himi-restaurants.ts +4 -4
  144. package/templates/podcast-creator/tier5-src/_shared/owner-load-error.ts +49 -0
  145. package/templates/podcast-creator/tier5-src/_shared/wix-service-price.ts +1 -1
  146. package/templates/podcast-creator/tier5-src/himi-branded-lite-info/index.ts +5 -2
  147. package/templates/podcast-creator/tier5-src/himi-branded-lite-plans/index.ts +1 -1
  148. package/templates/podcast-creator/tier5-src/himi-events-detail/index.ts +1 -1
  149. package/templates/podcast-creator/tier5-src/himi-events-list/index.ts +20 -4
  150. package/templates/podcast-creator/tier5-src/himi-events-my-events/index.ts +2 -2
  151. package/templates/podcast-creator/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  152. package/templates/podcast-creator-owner/dev/index.ts +84 -599
  153. package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +22 -6
  154. package/templates/podcast-creator-owner/tier5-src/_shared/collection-contract.ts +16 -9
  155. package/templates/podcast-creator-owner/tier5-src/_shared/collection-service.ts +19 -5
  156. package/templates/podcast-creator-owner/tier5-src/_shared/engine-intl.ts +51 -0
  157. package/templates/podcast-creator-owner/tier5-src/_shared/owner-load-error.ts +49 -0
  158. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-events/index.ts +1 -0
  159. package/templates/portfolio-creative/dev/index.ts +62 -137
  160. package/templates/portfolio-creative/tier5-src/_shared/collection-contract.ts +16 -9
  161. package/templates/portfolio-creative/tier5-src/_shared/collection-service.ts +19 -5
  162. package/templates/portfolio-creative/tier5-src/_shared/engine-intl.ts +51 -0
  163. package/templates/portfolio-creative/tier5-src/_shared/himi-restaurants.ts +4 -4
  164. package/templates/portfolio-creative/tier5-src/_shared/owner-load-error.ts +49 -0
  165. package/templates/portfolio-creative/tier5-src/_shared/wix-service-price.ts +1 -1
  166. package/templates/portfolio-creative/tier5-src/himi-branded-lite-info/index.ts +5 -2
  167. package/templates/portfolio-creative/tier5-src/himi-events-detail/index.ts +1 -1
  168. package/templates/portfolio-creative/tier5-src/himi-events-list/index.ts +20 -4
  169. package/templates/portfolio-creative/tier5-src/himi-events-my-events/index.ts +2 -2
  170. package/templates/portfolio-creative/tier5-src/wix-spaces-collections/index.ts +1 -1
  171. package/templates/portfolio-creative/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  172. package/templates/portfolio-creative-owner/dev/index.ts +84 -599
  173. package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +22 -6
  174. package/templates/portfolio-creative-owner/tier5-src/_shared/collection-contract.ts +16 -9
  175. package/templates/portfolio-creative-owner/tier5-src/_shared/collection-service.ts +19 -5
  176. package/templates/portfolio-creative-owner/tier5-src/_shared/engine-intl.ts +51 -0
  177. package/templates/portfolio-creative-owner/tier5-src/_shared/owner-load-error.ts +49 -0
  178. package/templates/restaurant/dev/index.ts +124 -101
  179. package/templates/restaurant/tier5-src/_shared/collection-contract.ts +16 -9
  180. package/templates/restaurant/tier5-src/_shared/collection-service.ts +19 -5
  181. package/templates/restaurant/tier5-src/_shared/engine-intl.ts +51 -0
  182. package/templates/restaurant/tier5-src/_shared/himi-restaurants.ts +4 -4
  183. package/templates/restaurant/tier5-src/_shared/owner-load-error.ts +49 -0
  184. package/templates/restaurant/tier5-src/_shared/wix-service-price.ts +1 -1
  185. package/templates/restaurant/tier5-src/himi-branded-lite-info/index.ts +5 -2
  186. package/templates/restaurant/tier5-src/himi-branded-lite-reserve/index.ts +5 -3
  187. package/templates/restaurant/tier5-src/himi-events-detail/index.ts +1 -1
  188. package/templates/restaurant/tier5-src/himi-events-list/index.ts +20 -4
  189. package/templates/restaurant/tier5-src/himi-events-my-events/index.ts +2 -2
  190. package/templates/restaurant/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  191. package/templates/restaurant-owner/dev/index.ts +84 -627
  192. package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +22 -6
  193. package/templates/restaurant-owner/tier5-src/_shared/collection-contract.ts +16 -9
  194. package/templates/restaurant-owner/tier5-src/_shared/collection-service.ts +19 -5
  195. package/templates/restaurant-owner/tier5-src/_shared/engine-intl.ts +51 -0
  196. package/templates/restaurant-owner/tier5-src/_shared/owner-load-error.ts +49 -0
  197. package/templates/restaurant-owner/tier5-src/himi-owner-lite-events/index.ts +1 -0
  198. package/templates/retail-store/dev/index.ts +59 -106
  199. package/templates/retail-store/tier5-src/_shared/collection-contract.ts +16 -9
  200. package/templates/retail-store/tier5-src/_shared/collection-service.ts +19 -5
  201. package/templates/retail-store/tier5-src/_shared/engine-intl.ts +51 -0
  202. package/templates/retail-store/tier5-src/_shared/himi-restaurants.ts +4 -4
  203. package/templates/retail-store/tier5-src/_shared/owner-load-error.ts +49 -0
  204. package/templates/retail-store/tier5-src/_shared/wix-service-price.ts +1 -1
  205. package/templates/retail-store/tier5-src/himi-branded-lite-info/index.ts +5 -2
  206. package/templates/retail-store/tier5-src/wix-spaces-collections/index.ts +1 -1
  207. package/templates/retail-store/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  208. package/templates/retail-store-owner/dev/index.ts +84 -571
  209. package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +22 -6
  210. package/templates/retail-store-owner/tier5-src/_shared/collection-contract.ts +16 -9
  211. package/templates/retail-store-owner/tier5-src/_shared/collection-service.ts +19 -5
  212. package/templates/retail-store-owner/tier5-src/_shared/engine-intl.ts +51 -0
  213. package/templates/retail-store-owner/tier5-src/_shared/owner-load-error.ts +49 -0
  214. package/templates/yoga-studio/dev/index.ts +73 -148
  215. package/templates/yoga-studio/tier5-src/_shared/collection-contract.ts +16 -9
  216. package/templates/yoga-studio/tier5-src/_shared/collection-service.ts +19 -5
  217. package/templates/yoga-studio/tier5-src/_shared/engine-intl.ts +51 -0
  218. package/templates/yoga-studio/tier5-src/_shared/himi-restaurants.ts +4 -4
  219. package/templates/yoga-studio/tier5-src/_shared/owner-load-error.ts +49 -0
  220. package/templates/yoga-studio/tier5-src/_shared/wix-service-price.ts +1 -1
  221. package/templates/yoga-studio/tier5-src/himi-branded-lite-info/index.ts +5 -2
  222. package/templates/yoga-studio/tier5-src/himi-branded-lite-plans/index.ts +1 -1
  223. package/templates/yoga-studio/tier5-src/himi-branded-lite-program/index.ts +1 -1
  224. package/templates/yoga-studio/tier5-src/himi-events-detail/index.ts +1 -1
  225. package/templates/yoga-studio/tier5-src/himi-events-list/index.ts +20 -4
  226. package/templates/yoga-studio/tier5-src/himi-events-my-events/index.ts +2 -2
  227. package/templates/yoga-studio/tier5-src/wix-spaces-whats-new/index.ts +4 -4
  228. package/templates/yoga-studio-owner/dev/index.ts +84 -571
  229. package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +22 -6
  230. package/templates/yoga-studio-owner/tier5-src/_shared/collection-contract.ts +16 -9
  231. package/templates/yoga-studio-owner/tier5-src/_shared/collection-service.ts +19 -5
  232. package/templates/yoga-studio-owner/tier5-src/_shared/engine-intl.ts +51 -0
  233. package/templates/yoga-studio-owner/tier5-src/_shared/owner-load-error.ts +49 -0
  234. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-events/index.ts +1 -0
@@ -68,6 +68,7 @@ import { isWebUrl, stripMarkdown } from "./aria-widget-model.js";
68
68
  import { NO_WIDGET, activeWidgetOf, asyncAdvanced, type SubtreeSlot, type WidgetOptionRow, type WidgetView }
69
69
  from "./aria-widget-view.js";
70
70
  import { substituteSelection } from "./aria-widget-model.js";
71
+ import { isTransportFailure, ownerTransportFailureText } from "./owner-load-error.js";
71
72
  import { LOCAL_ID_PREFIX, createRowMemo, mintLocalId, transcriptKeys, type RowMemo } from "./aria-hot-path.js";
72
73
 
73
74
  // ---------------------------------------------------------------------------
@@ -117,8 +118,18 @@ export interface AriaBubble {
117
118
  }
118
119
 
119
120
  /** An empty-state suggestion card: emoji + title + hint, and the text that is
120
- * actually submitted when it is tapped. */
121
- export interface AriaPromptChip { id: string; emoji: string; title: string; sub: string; text: string; }
121
+ * actually submitted when it is tapped.
122
+ *
123
+ * `label` is the card's ACCESSIBLE NAME, derived by the machine (`promptLabel`)
124
+ * — callers never supply it. The emoji is decoration: named by it, the card
125
+ * read as "writing hand" to VoiceOver instead of what it does. */
126
+ export interface AriaPromptChip { id: string; emoji: string; title: string; sub: string; text: string; label?: string; }
127
+
128
+ /** "Write a blog post, Draft a post about my business" — title then hint, never
129
+ * the emoji, and no dangling separator when a copy pack blanks the hint. */
130
+ export function promptLabel(p: Pick<AriaPromptChip, "title" | "sub">): string {
131
+ return [p.title, p.sub].map((s) => String(s ?? "").trim()).filter(Boolean).join(", ");
132
+ }
122
133
 
123
134
  export interface AriaChatState {
124
135
  status: "loading" | "ready" | "sending" | "error";
@@ -558,9 +569,14 @@ export function isWixAccountUnreachable(e: unknown): boolean {
558
569
  * clears any stale status line, and the signed-out sentence clears any red text
559
570
  * left over from an earlier failure. */
560
571
  function failureSlots(e: unknown, unavailable: () => string): { error: string; statusText: string } {
561
- return isWixAccountUnreachable(e)
562
- ? { error: "", statusText: unavailable() }
563
- : { error: String((e as Error)?.message ?? e), statusText: "" };
572
+ if (isWixAccountUnreachable(e)) return { error: "", statusText: unavailable() };
573
+ // A request that never reached Wix is still a failure (red), but its wire text
574
+ // is a platform dump — iOS hands over the NSError description, domain, code and
575
+ // the local server's URL included. The owner gets one sentence instead.
576
+ // Everything else keeps its diagnostic: see the "UNKNOWN bridge error stays
577
+ // loud" test, which is why this is not a blanket `humanWireError`.
578
+ if (isTransportFailure(e)) return { error: ownerTransportFailureText(), statusText: "" };
579
+ return { error: String((e as Error)?.message ?? e), statusText: "" };
564
580
  }
565
581
 
566
582
  /** Is this url somewhere Wix itself serves?
@@ -1233,7 +1249,7 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
1233
1249
  return s.statusText && notices.includes(s.statusText) ? { ...s, statusText: "" } : s;
1234
1250
  };
1235
1251
  const toolFailedText = () => res(o.labels?.toolFailed ?? `${assistant()} couldn't finish that. Try again.`);
1236
- const promptList = () => res(o.prompts);
1252
+ const promptList = () => res(o.prompts).map((p) => ({ ...p, label: promptLabel(p) }));
1237
1253
  const siteOf = o.siteId ?? (() => "");
1238
1254
  const resumeOf = o.resumeConversationId ?? inputConversationId;
1239
1255
  const historyKeyFor = (site: string) => scopedKey(o.historyKey, site);
@@ -26,6 +26,13 @@ export interface CollectionConfig {
26
26
  reviewSelectedAction?: string;
27
27
  /** Optional comfortable grid media height for immersive visual catalogs. */
28
28
  gridImageHeight?: number;
29
+ /** What the count summary counts — ["dish", "dishes"] reads "12 dishes". Default "item(s)". */
30
+ countNoun?: [string, string];
31
+ /** Phone grid columns (default 2). A card carrying a paragraph of benefits and a CTA — a
32
+ * pricing plan — is unreadable at half width, so it opts into one. */
33
+ gridColumns?: number;
34
+ /** Lines of the meta caption a comfortable row may use (default 2). */
35
+ metaMaxLines?: number;
29
36
  /** The card's primary verb, shown as a visible button beside the overflow.
30
37
  * `screenId` opens that screen with the row id; without it the verb reuses the
31
38
  * row's own tap action (the detail screen that owns the verb). */
@@ -38,28 +45,28 @@ export interface CollectionConfig {
38
45
  * page, the list/grid toggle, Refine, chips, search and count are noise. */
39
46
  export const COLLECTION_CHROME_MIN_ITEMS = 4;
40
47
  export const COLLECTIONS: Record<string, CollectionConfig> = {
41
- himiStoreShop: { rows: 'results', title: 'name', subtitle: 'subtitle', image: 'image', view: 'grid', backendQuery: true },
42
- himiBookingServices: { rows: 'results', title: 'name', subtitle: 'subtitle', image: 'image', filter: 'category', view: 'grid', backendQuery: true, searchPlaceholder: 'Service name starts with…', primaryVerb: { label: 'Book', screenId: 'himi_time' } },
48
+ himiStoreShop: { rows: 'results', title: 'name', subtitle: 'subtitle', image: 'image', view: 'grid', backendQuery: true, countNoun: ['product', 'products'] },
49
+ himiBookingServices: { rows: 'results', title: 'name', subtitle: 'subtitle', image: 'image', filter: 'category', view: 'grid', backendQuery: true, searchPlaceholder: 'Search services', countNoun: ['service', 'services'], primaryVerb: { label: 'Book', screenId: 'himi_time' } },
43
50
  himiBookingBookings: { rows: 'rows', title: 'title', subtitle: 'subtitle', metadata: ['status'], view: 'list', backendQuery: true,
44
- defaultFilter: 'value:Upcoming', searchPlaceholder: 'Exact booking ID', filterValues: ['Upcoming', 'Past', 'Cancelled'],
51
+ defaultFilter: 'value:Upcoming', searchPlaceholder: 'Search by booking ID', countNoun: ['booking', 'bookings'], filterValues: ['Upcoming', 'Past', 'Cancelled'],
45
52
  sortLabels: { default: 'Soonest', az: 'Oldest', za: 'Latest' } },
46
- himiEvents: { rows: 'results', title: 'title', subtitle: 'dateLine', image: 'image', view: 'grid', backendQuery: true, searchPlaceholder: 'Exact event title', filterValues: ['Upcoming', 'Past'], sortLabels: { default: 'Date', az: 'Title A–Z', za: 'Title Z–A' }, primaryVerb: { label: 'Register' } },
53
+ himiEvents: { rows: 'results', title: 'title', subtitle: 'dateLine', image: 'image', view: 'grid', backendQuery: true, defaultFilter: 'value:Upcoming', searchPlaceholder: 'Search events', countNoun: ['event', 'events'], filterValues: ['Upcoming', 'Past'], sortLabels: { default: 'Date', az: 'Title A–Z', za: 'Title Z–A' }, primaryVerb: { label: 'Register' } },
47
54
  himiBlogFeed: { rows: 'posts', title: 'title', subtitle: 'excerpt', image: 'image', filter: 'category', filterValuesFrom: 'categories', view: 'grid', narrowedBy: 'selectedCategoryId' },
48
- himiOwnerLiteProducts: { rows: 'products', title: 'name', subtitle: 'price', image: 'image', view: 'grid', backendQuery: true },
55
+ himiOwnerLiteProducts: { rows: 'products', title: 'name', subtitle: 'price', image: 'image', view: 'grid', backendQuery: true, countNoun: ['product', 'products'] },
49
56
  himiOwnerModules: { instanceInput: 'module', rows: 'rows', title: 'title', subtitle: 'subtitle', image: 'image', filter: 'statusLabel', view: 'list', paged: true, reviewAction: 'prepareRecord', reviewSelectedAction: 'prepareSelected' },
50
57
  himiOwnerLiteServices: { rows: 'services', title: 'name', subtitle: 'subtitle', view: 'list', backendQuery: true, searchPlaceholder: 'Service name starts with…' },
51
58
  himiOwnerLiteEvents: { rows: 'events', title: 'title', subtitle: 'dateLine', view: 'grid', backendQuery: true, searchPlaceholder: 'Exact event title', filterValues: ['Upcoming'], sortLabels: { default: 'Date', az: 'Title A–Z', za: 'Title Z–A' } },
52
59
  himiOwnerLitePosts: { rows: 'posts', title: 'title', subtitle: 'excerpt', image: 'image', view: 'grid' },
53
- himiOwnerLiteOrders: { rows: 'orders', title: 'buyer', subtitle: 'meta', filter: 'statusLabel', view: 'list', backendQuery: true,
60
+ himiOwnerLiteOrders: { rows: 'orders', title: 'buyer', subtitle: 'meta', filter: 'statusLabel', view: 'list', backendQuery: true, countNoun: ['order', 'orders'],
54
61
  searchPlaceholder: 'Customer name, email or order #', sortLabels: { default: 'Newest', az: 'Customer A–Z', za: 'Customer Z–A' },
55
62
  filterValues: ['Recent 7 days', 'Paid', 'Unpaid', 'Partially paid', 'Pending', 'Refunded', 'Partly refunded'] },
56
63
  himiBrandedGroups: { rows: 'rows', title: 'name', subtitle: 'description', image: 'image', view: 'grid' },
57
64
  himiBrandedCms: { rows: 'rows', title: 'name', subtitle: 'subtitle', view: 'grid' },
58
65
  himiBrandedCmsCollection: { instanceInput: 'collection', rows: 'rows', title: 'title', subtitle: 'subtitle', view: 'list' },
59
66
  himiBrandedOrders: { rows: 'rows', title: 'title', subtitle: 'subtitle', view: 'list', backendQuery: true,
60
- searchPlaceholder: 'Exact order number', filterValues: ['Not fulfilled', 'Partially fulfilled', 'Fulfilled'],
67
+ searchPlaceholder: 'Search by order number', countNoun: ['order', 'orders'], filterValues: ['Not fulfilled', 'Partially fulfilled', 'Fulfilled'],
61
68
  sortLabels: { default: 'Newest', az: 'Oldest', za: 'Order # ↓' } },
62
- himiBrandedPlans: { rows: 'rows', title: 'name', subtitle: 'description', metadata: ['priceLine', 'periodLine', 'trialBadge', 'perk1', 'perk2', 'perk3'], view: 'grid' },
69
+ himiBrandedPlans: { rows: 'rows', title: 'name', subtitle: 'description', metadata: ['badge', 'priceLine', 'periodLine', 'trialBadge', 'perk1', 'perk2', 'perk3'], view: 'grid', gridColumns: 1, metaMaxLines: 8, countNoun: ['plan', 'plans'] },
63
70
  himiBrandedPrograms: { rows: 'rows', title: 'name', subtitle: 'description', image: 'image', view: 'grid' },
64
71
  himiBrandedCoupons: { rows: 'coupons', title: 'name', subtitle: 'subtitle', view: 'list', primaryVerb: { label: 'Get code' } },
65
72
  himiBrandedNotifications: { rows: 'items', title: 'name', subtitle: 'subtitle', image: 'photo', metadata: ['unreadDot'], view: 'list' },
@@ -75,7 +82,7 @@ export const COLLECTIONS: Record<string, CollectionConfig> = {
75
82
  himiBrandedForms: { rows: 'forms', title: 'name', subtitle: 'description', view: 'list' },
76
83
  himiBrandedGalleries: { rows: 'galleries', title: 'name', subtitle: 'description', image: 'image', view: 'grid' },
77
84
  himiBrandedInbox: { rows: 'conversations', title: 'title', subtitle: 'preview', view: 'list' },
78
- himiBrandedMenus: { rows: 'rows', title: 'name', subtitle: 'description', image: 'image', sectioned: true, filter: 'collectionCategory', metadata: ['collectionCategory', 'priceLine', 'label1', 'label2', 'label3'], view: 'grid' },
85
+ himiBrandedMenus: { rows: 'rows', title: 'name', subtitle: 'description', image: 'image', sectioned: true, filter: 'collectionCategory', metadata: ['collectionCategory', 'priceLine', 'label1', 'label2', 'label3'], view: 'grid', searchPlaceholder: 'Search the menu', countNoun: ['dish', 'dishes'] },
79
86
  };
80
87
  export interface CollectionPreferences {
81
88
  view: 'list' | 'grid';
@@ -18,6 +18,20 @@ type Reducer = (s: State, ...args: unknown[]) => State | undefined | Promise<Sta
18
18
  const object = (x: unknown): State => x && typeof x === 'object' && !Array.isArray(x) ? x as State : {};
19
19
  const str = (arg: unknown, key: string): string => typeof arg === 'string' ? arg : String(object(arg)[key] ?? '');
20
20
 
21
+ /** The toolbar count line — "12 dishes", or "3 of 12 dishes" while a filter narrows the list.
22
+ *
23
+ * It used to read "12 / 12 loaded" and "2 / 2 results" ([branded-lite-qa] #3002): the numbers
24
+ * described the implementation (a client-side filter over a fetched page) rather than what the
25
+ * customer is looking at, and the slash-and-suffix wrapped onto two lines on web. When the
26
+ * backend total is unknown the count shown is simply what is shown; the "Load more" button is
27
+ * what says there is more. */
28
+ export function collectionSummary(o: { shown: number; loaded: number; total?: number; backend?: boolean; noun?: [string, string] }): string {
29
+ const [one, many] = o.noun ?? [copyParam('collection.itemOne', 'item'), copyParam('collection.itemMany', 'items')];
30
+ const whole = o.backend ? (typeof o.total === 'number' ? o.total : o.shown) : o.loaded;
31
+ const noun = (whole === 1 ? one : many);
32
+ return o.shown < whole ? `${o.shown} ${copyParam('collection.of', 'of')} ${whole} ${noun}` : `${o.shown} ${o.shown === 1 ? one : many}`;
33
+ }
34
+
21
35
  /** Opt-in decorator. Domain reducers remain authoritative; collection preferences
22
36
  * survive reducers which replace their entire state, including async refreshes. */
23
37
  export function decorateCollection(name: string, def: { state: State; actions?: Record<string, Reducer> }, saving?: CollectionSaving, backend?: BackendCollection) {
@@ -179,11 +193,11 @@ export function decorateCollection(name: string, def: { state: State; actions?:
179
193
  filtersPresented, previewPresented: !!previewId, preview: projected.items.filter(row => row.collectionId === previewId),
180
194
  persistenceLabel: persisted.available ? copyParam('collection.onDevice', 'Saved on this device') : copyParam('collection.sessionOnly', 'Choices last for this session'),
181
195
  noEmpty: loading || errored || sourceEmpty || domainNarrowed || projected.items.length > 0,
182
- summary: backend && config.backendQuery
183
- ? (s.fromCache ? copyParam('collection.cached', 'Saved offline · may be outdated')
184
- : typeof s.total === 'number' ? `${projected.items.length} / ${s.total} ${copyParam('collection.results', 'results')}`
185
- : `${projected.items.length} ${s.complete ? copyParam('collection.results', 'results') : copyParam('collection.loaded', 'loaded')}`)
186
- : `${projected.items.length} / ${projected.loaded} ${copyParam('collection.loaded', 'loaded')}`,
196
+ summary: backend && config.backendQuery && s.fromCache
197
+ ? copyParam('collection.cached', 'Saved offline · may be outdated')
198
+ : collectionSummary({ shown: projected.items.length, loaded: projected.loaded, backend: !!(backend && config.backendQuery),
199
+ total: typeof s.total === 'number' ? s.total : undefined, noun: config.countNoun
200
+ ? [copyParam(`collection.${name}.countOne`, config.countNoun[0]), copyParam(`collection.${name}.countMany`, config.countNoun[1])] : undefined }),
187
201
  selectedSummary: `${prefs.selectedIds.length} ${copyParam('collection.selected', 'selected')}`,
188
202
  filterChoices,
189
203
  chips: config.filterValues ? filterChoices.filter(choice => ['all', 'saved', prefs.filter].includes(choice.id)) : filterChoices,
@@ -352,3 +352,54 @@ export function compareDateDesc(a: string, b: string): number {
352
352
  if (bBad) return -1;
353
353
  return tb - ta;
354
354
  }
355
+
356
+ // --- [branded-lite-qa] #3079: one pattern per fact ---------------------------------------
357
+ //
358
+ // Before these existed, four screens formatted the same money four ways — Shop "69.00 ₪" (Wix's
359
+ // pre-formatted string), Services "₪70" (0 decimals), Menu "₪32.00", Plans "$24" — and two
360
+ // screens formatted the same clock two ways (Events "9:00 PM-11:00 PM", Reserve "20:00").
361
+ // Customers read that as sloppiness, and a whole "₪70" beside "₪69.50" reads as a different
362
+ // kind of number. So: one money pattern, one clock, one range.
363
+
364
+ // Money uses `formatCurrency(amount, currency, "en")` — the currency's NATURAL decimals
365
+ // ("₪70.00", "¥500"). Passing 0 fraction digits for whole amounts is what made a list read
366
+ // "₪70 · ₪69.50".
367
+
368
+ const KNOWN_SYMBOLS = new Set(Object.values(CURRENCY_SYMBOL));
369
+
370
+ /** Wix hands some prices over PRE-formatted in the site's regional style — "69.00 ₪" with the
371
+ * symbol trailing, often wrapped in bidi marks. Reorder those to the house pattern ("₪69.00") so
372
+ * they match every price we format ourselves. Only an en-shaped number ("69.00", "1,234.50") with
373
+ * a known trailing symbol is reordered: a comma-decimal or space-grouped string ("69,00 €",
374
+ * "1 234,56 €") is kept as Wix wrote it, because half-converting it would be worse. Anything else
375
+ * ("Market price") is returned trimmed. The store SDK's product price applies the same rule. */
376
+ export function normalizeFormattedPrice(formatted: string): string {
377
+ const raw = (formatted || "").replace(/[‎‏]/g, "").trim();
378
+ const m = /^(-?)(\d{1,3}(?:,\d{3})*(?:\.\d+)?|\d+(?:\.\d+)?)[\s  ]*(\S+)$/.exec(raw);
379
+ if (!m || !KNOWN_SYMBOLS.has(m[3])) return raw;
380
+ return `${m[1]}${m[3]}${m[2]}`;
381
+ }
382
+
383
+ function clockParts(d: Date, locale: string): { time: string; meridiem: string } {
384
+ const full = hasIntl()
385
+ ? new Intl.DateTimeFormat(locale, { hour: "numeric", minute: "2-digit", hour12: true }).format(d)
386
+ : clock12(d);
387
+ // ICU puts a narrow no-break space before the meridiem; normalize so callers can split on it.
388
+ const clean = full.replace(/[  ]/g, " ");
389
+ const m = /^(.*?)\s*([AP]\.?M\.?)$/i.exec(clean);
390
+ return m ? { time: m[1], meridiem: m[2] } : { time: clean, meridiem: "" };
391
+ }
392
+
393
+ /** "8:00 PM" — the one clock every customer screen uses (12-hour, en-US shape). */
394
+ export function formatClock(date: Date, locale = "en-US"): string {
395
+ const { time, meridiem } = clockParts(date, locale);
396
+ return meridiem ? `${time} ${meridiem}` : time;
397
+ }
398
+
399
+ /** Is this ISO instant before `now`? A missing or unparseable value is NOT past — "no expiry"
400
+ * must never classify an offer as expired. */
401
+ export function isPastDate(iso: string | undefined | null, now: number = Date.now()): boolean {
402
+ if (!iso) return false;
403
+ const t = Date.parse(iso);
404
+ return !Number.isNaN(t) && t < now;
405
+ }
@@ -74,6 +74,54 @@ const SITE_CONTEXT_CODES = ["MISSING_METASITE_ID", "MISSING_REQUEST_SITE_CONTEXT
74
74
  * message and starts being a payload dump. */
75
75
  const MAX_RAW = 200;
76
76
 
77
+ /**
78
+ * A TRANSPORT failure: the request never got an HTTP answer at all.
79
+ *
80
+ * Each host describes one in its own platform's words, and every one of them is a
81
+ * diagnostic dump rather than a message. iOS's JSWorker hands a worker the Swift
82
+ * description of the `NSError` —
83
+ * `Error Domain=NSURLErrorDomain Code=-1004 "Could not connect to the server."
84
+ * UserInfo={… NSErrorFailingURLStringKey=http://127.0.0.1:8178/__dev/wix/proxy, …}`
85
+ * — which Aria painted verbatim: the domain, the code, and the local server's
86
+ * own URL. Android's bridge carries the `java.net` exception text, and a browser's
87
+ * fetch rejects with "Failed to fetch" / "Load failed" / "NetworkError …".
88
+ *
89
+ * Only a message with NO HTTP status qualifies: a status means Wix answered, and
90
+ * that case keeps its own reductions below.
91
+ */
92
+ const TRANSPORT = [
93
+ /\bError Domain=\w+/, // any Cocoa NSError description
94
+ /\bNSURLErrorDomain\b/,
95
+ /\bjava\.(?:net|io)\.\w+(?:Exception|Error)\b/,
96
+ /\b(?:UnknownHost|Connect|SocketTimeout|NoRouteToHost|SSLHandshake)Exception\b/,
97
+ // Android's WebViewJSWorker bridges `e.message ?: e.javaClass.simpleName`, so
98
+ // the class name is usually absent and only OkHttp's own message arrives.
99
+ /^Failed to connect to \S/,
100
+ /^Unable to resolve host\b/,
101
+ /\b(?:Connection refused|Network is unreachable|Software caused connection abort)\b/,
102
+ /^(?:timeout|Read timed out|connect timed out)$/i,
103
+ /\bFailed to fetch\b/,
104
+ /\bNetworkError when attempting to fetch\b/,
105
+ /^(?:TypeError: )?Load failed$/,
106
+ /\bnet::ERR_[A-Z_]+/,
107
+ ];
108
+
109
+ /** Did this failure happen below HTTP — no answer from Wix at all? */
110
+ export function isTransportFailure(e: unknown): boolean {
111
+ const msg = String((e as Error)?.message ?? e ?? "");
112
+ if (STATUS.test(msg)) return false;
113
+ return TRANSPORT.some((re) => re.test(msg));
114
+ }
115
+
116
+ /** The one sentence for a transport failure. Copy-as-configuration: the key is
117
+ * under `ownerCommon.`, which every owner screen (Aria included) forwards. */
118
+ export function ownerTransportFailureText(): string {
119
+ return copyParam(
120
+ "ownerCommon.networkUnreachable",
121
+ "Couldn’t reach Wix. Check your connection and try again.",
122
+ );
123
+ }
124
+
77
125
  /**
78
126
  * Reduce a wire failure to something a PERSON can read.
79
127
  *
@@ -85,6 +133,7 @@ const MAX_RAW = 200;
85
133
  * markup; a long non-HTML body is truncated for the same reason.
86
134
  */
87
135
  function humanWireError(msg: string): string {
136
+ if (isTransportFailure(msg)) return ownerTransportFailureText();
88
137
  const status = STATUS.exec(msg)?.[1];
89
138
  // A JSON ENVELOPE or a NAMED REASON CODE is the machine's word for it, and the
90
139
  // owner gets neither. Both reductions used to live in `ownerDisplayError` only,
@@ -95,6 +95,7 @@ function demoList(s: EventsState, upcoming = false): EventsState {
95
95
  dateLine: d.dateLine,
96
96
  location: d.location,
97
97
  status: d.statusLabel,
98
+ statusLabel: "",
98
99
  image: "",
99
100
  hasImage: false,
100
101
  noImage: true,
@@ -3459,17 +3459,6 @@ const SCREENS = runtimeSetting({
3459
3459
  }
3460
3460
  }
3461
3461
  },
3462
- {
3463
- "id": "",
3464
- "body": {
3465
- "package": "himalaya",
3466
- "type": "Text",
3467
- "props": {
3468
- "text": "__HIMI_APP_NAME__",
3469
- "style": "bodyEmphasis"
3470
- }
3471
- }
3472
- },
3473
3462
  {
3474
3463
  "id": "",
3475
3464
  "body": {
@@ -5103,16 +5092,64 @@ const SCREENS = runtimeSetting({
5103
5092
  }
5104
5093
  },
5105
5094
  {
5106
- "id": "",
5095
+ "id": "himi_whats_new.empty",
5107
5096
  "body": {
5108
5097
  "package": "himalaya",
5109
- "type": "Text",
5098
+ "type": "VStack",
5110
5099
  "props": {
5111
- "text": "$service:spacesWhatsNew.emptyText",
5112
- "style": "body",
5113
- "color": "textSecondary",
5114
- "collapseWhenEmpty": true
5100
+ "spacing": 8,
5101
+ "alignment": "leading",
5102
+ "children": [
5103
+ {
5104
+ "id": "",
5105
+ "body": {
5106
+ "package": "himalaya",
5107
+ "type": "Icon",
5108
+ "props": {
5109
+ "name": "newspaper",
5110
+ "size": 28,
5111
+ "tint": "textTertiary"
5112
+ }
5113
+ },
5114
+ "modifiers": {
5115
+ "accessibilityRole": "decorative"
5116
+ }
5117
+ },
5118
+ {
5119
+ "id": "",
5120
+ "body": {
5121
+ "package": "himalaya",
5122
+ "type": "Text",
5123
+ "props": {
5124
+ "text": "$service:spacesWhatsNew.emptyText",
5125
+ "style": "body",
5126
+ "color": "textSecondary",
5127
+ "collapseWhenEmpty": true
5128
+ }
5129
+ }
5130
+ }
5131
+ ]
5115
5132
  }
5133
+ },
5134
+ "modifiers": {
5135
+ "background": {
5136
+ "token": "surfaceElevated"
5137
+ },
5138
+ "border": {
5139
+ "width": 1,
5140
+ "color": {
5141
+ "token": "border"
5142
+ }
5143
+ },
5144
+ "cornerRadius": 16,
5145
+ "padding": {
5146
+ "leading": 16,
5147
+ "trailing": 16,
5148
+ "top": 16,
5149
+ "bottom": 16
5150
+ },
5151
+ "fillMaxWidth": true,
5152
+ "hiddenPath": "$service:spacesWhatsNew.noEmpty"
5116
5153
  }
5117
5154
  }
5118
5155
  ]
@@ -5349,7 +5386,7 @@ const SCREENS = runtimeSetting({
5349
5386
  "package": "himalaya",
5350
5387
  "type": "SearchField",
5351
5388
  "props": {
5352
- "placeholder": "Search loaded items",
5389
+ "placeholder": "Search",
5353
5390
  "value": "$service:himiBrandedPlans.collection.query",
5354
5391
  "debounceMs": 200,
5355
5392
  "onChange": {
@@ -5739,7 +5776,7 @@ const SCREENS = runtimeSetting({
5739
5776
  "text": "$item.collectionMeta",
5740
5777
  "style": "caption",
5741
5778
  "color": "textSecondary",
5742
- "maxLines": 2,
5779
+ "maxLines": 8,
5743
5780
  "collapseWhenEmpty": true
5744
5781
  }
5745
5782
  }
@@ -5987,9 +6024,9 @@ const SCREENS = runtimeSetting({
5987
6024
  "package": "himalaya",
5988
6025
  "type": "Grid",
5989
6026
  "props": {
5990
- "columns": 2,
5991
- "columnsMedium": 3,
5992
- "columnsExpanded": 4,
6027
+ "columns": 1,
6028
+ "columnsMedium": 2,
6029
+ "columnsExpanded": 3,
5993
6030
  "spacing": 12,
5994
6031
  "itemsPath": "$service:himiBrandedPlans.collection.items",
5995
6032
  "items": [
@@ -6046,7 +6083,7 @@ const SCREENS = runtimeSetting({
6046
6083
  "text": "$item.collectionMeta",
6047
6084
  "style": "caption",
6048
6085
  "color": "textSecondary",
6049
- "maxLines": 2,
6086
+ "maxLines": 8,
6050
6087
  "collapseWhenEmpty": true
6051
6088
  }
6052
6089
  }
@@ -6615,9 +6652,9 @@ const SCREENS = runtimeSetting({
6615
6652
  "package": "himalaya",
6616
6653
  "type": "Grid",
6617
6654
  "props": {
6618
- "columns": 2,
6619
- "columnsMedium": 3,
6620
- "columnsExpanded": 4,
6655
+ "columns": 1,
6656
+ "columnsMedium": 2,
6657
+ "columnsExpanded": 3,
6621
6658
  "spacing": 8,
6622
6659
  "itemsPath": "$service:himiBrandedPlans.collection.items",
6623
6660
  "items": [
@@ -6991,7 +7028,7 @@ const SCREENS = runtimeSetting({
6991
7028
  "package": "himalaya",
6992
7029
  "type": "Text",
6993
7030
  "props": {
6994
- "text": "Sort loaded items",
7031
+ "text": "Sort",
6995
7032
  "style": "bodyEmphasis"
6996
7033
  }
6997
7034
  }
@@ -7273,7 +7310,7 @@ const SCREENS = runtimeSetting({
7273
7310
  "text": "$item.collectionMeta",
7274
7311
  "style": "caption",
7275
7312
  "color": "textSecondary",
7276
- "maxLines": 2,
7313
+ "maxLines": 8,
7277
7314
  "collapseWhenEmpty": true
7278
7315
  }
7279
7316
  }
@@ -9307,7 +9344,7 @@ const SCREENS = runtimeSetting({
9307
9344
  "package": "himalaya",
9308
9345
  "type": "SearchField",
9309
9346
  "props": {
9310
- "placeholder": "Exact event title",
9347
+ "placeholder": "Search events",
9311
9348
  "debounceMs": 200,
9312
9349
  "onChange": {
9313
9350
  "actionId": "tier5.himiEvents.collectionSearch"
@@ -10500,20 +10537,6 @@ const SCREENS = runtimeSetting({
10500
10537
  }
10501
10538
  }
10502
10539
  },
10503
- {
10504
- "id": "btn_tier5_himievents_refresh",
10505
- "body": {
10506
- "package": "himalaya",
10507
- "type": "Button",
10508
- "props": {
10509
- "title": "Refresh",
10510
- "style": "plain",
10511
- "action": {
10512
- "actionId": "tier5.himiEvents.refresh"
10513
- }
10514
- }
10515
- }
10516
- },
10517
10540
  {
10518
10541
  "id": "himi_events.list.collection.more",
10519
10542
  "body": {
@@ -11189,20 +11212,6 @@ const SCREENS = runtimeSetting({
11189
11212
  }
11190
11213
  }
11191
11214
  },
11192
- {
11193
- "id": "btn_tier5_himievents_refresh",
11194
- "body": {
11195
- "package": "himalaya",
11196
- "type": "Button",
11197
- "props": {
11198
- "title": "Refresh",
11199
- "style": "plain",
11200
- "action": {
11201
- "actionId": "tier5.himiEvents.refresh"
11202
- }
11203
- }
11204
- }
11205
- },
11206
11215
  {
11207
11216
  "id": "himi_events.list.collection.compact-more",
11208
11217
  "body": {
@@ -12675,7 +12684,7 @@ const SCREENS = runtimeSetting({
12675
12684
  "package": "himalaya",
12676
12685
  "type": "SearchField",
12677
12686
  "props": {
12678
- "placeholder": "Search loaded items",
12687
+ "placeholder": "Search",
12679
12688
  "debounceMs": 200,
12680
12689
  "onChange": {
12681
12690
  "actionId": "tier5.himiBlogFeed.collectionSearch"
@@ -13787,20 +13796,6 @@ const SCREENS = runtimeSetting({
13787
13796
  }
13788
13797
  }
13789
13798
  },
13790
- {
13791
- "id": "btn_tier5_himiblogfeed_retry",
13792
- "body": {
13793
- "package": "himalaya",
13794
- "type": "Button",
13795
- "props": {
13796
- "title": "Refresh",
13797
- "style": "plain",
13798
- "action": {
13799
- "actionId": "tier5.himiBlogFeed.retry"
13800
- }
13801
- }
13802
- }
13803
- },
13804
13799
  {
13805
13800
  "id": "himi_blog.list.collection.more",
13806
13801
  "body": {
@@ -14438,20 +14433,6 @@ const SCREENS = runtimeSetting({
14438
14433
  }
14439
14434
  }
14440
14435
  },
14441
- {
14442
- "id": "btn_tier5_himiblogfeed_retry",
14443
- "body": {
14444
- "package": "himalaya",
14445
- "type": "Button",
14446
- "props": {
14447
- "title": "Refresh",
14448
- "style": "plain",
14449
- "action": {
14450
- "actionId": "tier5.himiBlogFeed.retry"
14451
- }
14452
- }
14453
- }
14454
- },
14455
14436
  {
14456
14437
  "id": "himi_blog.list.collection.compact-more",
14457
14438
  "body": {
@@ -14578,7 +14559,7 @@ const SCREENS = runtimeSetting({
14578
14559
  "package": "himalaya",
14579
14560
  "type": "Text",
14580
14561
  "props": {
14581
- "text": "Sort loaded items",
14562
+ "text": "Sort",
14582
14563
  "style": "bodyEmphasis"
14583
14564
  }
14584
14565
  }
@@ -15282,7 +15263,7 @@ const SCREENS = runtimeSetting({
15282
15263
  "package": "himalaya",
15283
15264
  "type": "Text",
15284
15265
  "props": {
15285
- "text": "Posts saved on this member device.",
15266
+ "text": "Posts you have saved to read later.",
15286
15267
  "style": "body",
15287
15268
  "color": "textSecondary"
15288
15269
  }
@@ -15847,7 +15828,7 @@ const SCREENS = runtimeSetting({
15847
15828
  "package": "himalaya",
15848
15829
  "type": "SearchField",
15849
15830
  "props": {
15850
- "placeholder": "Search loaded items",
15831
+ "placeholder": "Search",
15851
15832
  "value": "$service:himiBrandedPodcasts.collection.query",
15852
15833
  "debounceMs": 200,
15853
15834
  "onChange": {
@@ -17671,7 +17652,7 @@ const SCREENS = runtimeSetting({
17671
17652
  "package": "himalaya",
17672
17653
  "type": "Text",
17673
17654
  "props": {
17674
- "text": "Sort loaded items",
17655
+ "text": "Sort",
17675
17656
  "style": "bodyEmphasis"
17676
17657
  }
17677
17658
  }