@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
@@ -4130,17 +4130,6 @@ const SCREENS = runtimeSetting({
4130
4130
  }
4131
4131
  }
4132
4132
  },
4133
- {
4134
- "id": "",
4135
- "body": {
4136
- "package": "himalaya",
4137
- "type": "Text",
4138
- "props": {
4139
- "text": "__HIMI_APP_NAME__",
4140
- "style": "bodyEmphasis"
4141
- }
4142
- }
4143
- },
4144
4133
  {
4145
4134
  "id": "",
4146
4135
  "body": {
@@ -5774,16 +5763,64 @@ const SCREENS = runtimeSetting({
5774
5763
  }
5775
5764
  },
5776
5765
  {
5777
- "id": "",
5766
+ "id": "himi_whats_new.empty",
5778
5767
  "body": {
5779
5768
  "package": "himalaya",
5780
- "type": "Text",
5769
+ "type": "VStack",
5781
5770
  "props": {
5782
- "text": "$service:spacesWhatsNew.emptyText",
5783
- "style": "body",
5784
- "color": "textSecondary",
5785
- "collapseWhenEmpty": true
5771
+ "spacing": 8,
5772
+ "alignment": "leading",
5773
+ "children": [
5774
+ {
5775
+ "id": "",
5776
+ "body": {
5777
+ "package": "himalaya",
5778
+ "type": "Icon",
5779
+ "props": {
5780
+ "name": "newspaper",
5781
+ "size": 28,
5782
+ "tint": "textTertiary"
5783
+ }
5784
+ },
5785
+ "modifiers": {
5786
+ "accessibilityRole": "decorative"
5787
+ }
5788
+ },
5789
+ {
5790
+ "id": "",
5791
+ "body": {
5792
+ "package": "himalaya",
5793
+ "type": "Text",
5794
+ "props": {
5795
+ "text": "$service:spacesWhatsNew.emptyText",
5796
+ "style": "body",
5797
+ "color": "textSecondary",
5798
+ "collapseWhenEmpty": true
5799
+ }
5800
+ }
5801
+ }
5802
+ ]
5786
5803
  }
5804
+ },
5805
+ "modifiers": {
5806
+ "background": {
5807
+ "token": "surfaceElevated"
5808
+ },
5809
+ "border": {
5810
+ "width": 1,
5811
+ "color": {
5812
+ "token": "border"
5813
+ }
5814
+ },
5815
+ "cornerRadius": 16,
5816
+ "padding": {
5817
+ "leading": 16,
5818
+ "trailing": 16,
5819
+ "top": 16,
5820
+ "bottom": 16
5821
+ },
5822
+ "fillMaxWidth": true,
5823
+ "hiddenPath": "$service:spacesWhatsNew.noEmpty"
5787
5824
  }
5788
5825
  }
5789
5826
  ]
@@ -7095,20 +7132,6 @@ const SCREENS = runtimeSetting({
7095
7132
  }
7096
7133
  }
7097
7134
  },
7098
- {
7099
- "id": "btn_tier5_himistoreshop_load",
7100
- "body": {
7101
- "package": "himalaya",
7102
- "type": "Button",
7103
- "props": {
7104
- "title": "Refresh",
7105
- "style": "plain",
7106
- "action": {
7107
- "actionId": "tier5.himiStoreShop.load"
7108
- }
7109
- }
7110
- }
7111
- },
7112
7135
  {
7113
7136
  "id": "himi_shop.list.collection.more",
7114
7137
  "body": {
@@ -7746,20 +7769,6 @@ const SCREENS = runtimeSetting({
7746
7769
  }
7747
7770
  }
7748
7771
  },
7749
- {
7750
- "id": "btn_tier5_himistoreshop_load",
7751
- "body": {
7752
- "package": "himalaya",
7753
- "type": "Button",
7754
- "props": {
7755
- "title": "Refresh",
7756
- "style": "plain",
7757
- "action": {
7758
- "actionId": "tier5.himiStoreShop.load"
7759
- }
7760
- }
7761
- }
7762
- },
7763
7772
  {
7764
7773
  "id": "himi_shop.list.collection.compact-more",
7765
7774
  "body": {
@@ -9473,7 +9482,7 @@ const SCREENS = runtimeSetting({
9473
9482
  "package": "himalaya",
9474
9483
  "type": "Text",
9475
9484
  "props": {
9476
- "text": "Review your items, then Checkout opens secure hosted checkout in the browser.",
9485
+ "text": "Review your items before you check out.",
9477
9486
  "style": "body",
9478
9487
  "color": "textSecondary"
9479
9488
  }
@@ -10218,7 +10227,7 @@ const SCREENS = runtimeSetting({
10218
10227
  "package": "himalaya",
10219
10228
  "type": "SearchField",
10220
10229
  "props": {
10221
- "placeholder": "Exact order number",
10230
+ "placeholder": "Search by order number",
10222
10231
  "value": "$service:himiBrandedOrders.collection.query",
10223
10232
  "debounceMs": 200,
10224
10233
  "onChange": {
@@ -11091,20 +11100,6 @@ const SCREENS = runtimeSetting({
11091
11100
  }
11092
11101
  }
11093
11102
  },
11094
- {
11095
- "id": "btn_tier5_himibrandedorders_refresh",
11096
- "body": {
11097
- "package": "himalaya",
11098
- "type": "Button",
11099
- "props": {
11100
- "title": "Refresh",
11101
- "style": "plain",
11102
- "action": {
11103
- "actionId": "tier5.himiBrandedOrders.refresh"
11104
- }
11105
- }
11106
- }
11107
- },
11108
11103
  {
11109
11104
  "id": "himi_orders.list.collection.more",
11110
11105
  "body": {
@@ -11675,20 +11670,6 @@ const SCREENS = runtimeSetting({
11675
11670
  }
11676
11671
  }
11677
11672
  },
11678
- {
11679
- "id": "btn_tier5_himibrandedorders_refresh",
11680
- "body": {
11681
- "package": "himalaya",
11682
- "type": "Button",
11683
- "props": {
11684
- "title": "Refresh",
11685
- "style": "plain",
11686
- "action": {
11687
- "actionId": "tier5.himiBrandedOrders.refresh"
11688
- }
11689
- }
11690
- }
11691
- },
11692
11673
  {
11693
11674
  "id": "himi_orders.list.collection.compact-more",
11694
11675
  "body": {
@@ -12570,7 +12551,7 @@ const SCREENS = runtimeSetting({
12570
12551
  "package": "himalaya",
12571
12552
  "type": "SearchField",
12572
12553
  "props": {
12573
- "placeholder": "Service name starts with…",
12554
+ "placeholder": "Search services",
12574
12555
  "debounceMs": 200,
12575
12556
  "onChange": {
12576
12557
  "actionId": "tier5.himiBookingServices.collectionSearch"
@@ -13762,20 +13743,6 @@ const SCREENS = runtimeSetting({
13762
13743
  }
13763
13744
  }
13764
13745
  },
13765
- {
13766
- "id": "btn_tier5_himibookingservices_refresh",
13767
- "body": {
13768
- "package": "himalaya",
13769
- "type": "Button",
13770
- "props": {
13771
- "title": "Refresh",
13772
- "style": "plain",
13773
- "action": {
13774
- "actionId": "tier5.himiBookingServices.refresh"
13775
- }
13776
- }
13777
- }
13778
- },
13779
13746
  {
13780
13747
  "id": "himi_services.list.collection.more",
13781
13748
  "body": {
@@ -14451,20 +14418,6 @@ const SCREENS = runtimeSetting({
14451
14418
  }
14452
14419
  }
14453
14420
  },
14454
- {
14455
- "id": "btn_tier5_himibookingservices_refresh",
14456
- "body": {
14457
- "package": "himalaya",
14458
- "type": "Button",
14459
- "props": {
14460
- "title": "Refresh",
14461
- "style": "plain",
14462
- "action": {
14463
- "actionId": "tier5.himiBookingServices.refresh"
14464
- }
14465
- }
14466
- }
14467
- },
14468
14421
  {
14469
14422
  "id": "himi_services.list.collection.compact-more",
14470
14423
  "body": {
@@ -15749,7 +15702,7 @@ const SCREENS = runtimeSetting({
15749
15702
  "package": "himalaya",
15750
15703
  "type": "SearchField",
15751
15704
  "props": {
15752
- "placeholder": "Exact booking ID",
15705
+ "placeholder": "Search by booking ID",
15753
15706
  "value": "$service:himiBookingBookings.collection.query",
15754
15707
  "debounceMs": 200,
15755
15708
  "onChange": {
@@ -16664,20 +16617,6 @@ const SCREENS = runtimeSetting({
16664
16617
  }
16665
16618
  }
16666
16619
  },
16667
- {
16668
- "id": "btn_tier5_himibookingbookings_refresh",
16669
- "body": {
16670
- "package": "himalaya",
16671
- "type": "Button",
16672
- "props": {
16673
- "title": "Refresh",
16674
- "style": "plain",
16675
- "action": {
16676
- "actionId": "tier5.himiBookingBookings.refresh"
16677
- }
16678
- }
16679
- }
16680
- },
16681
16620
  {
16682
16621
  "id": "himi_bookings.list.collection.more",
16683
16622
  "body": {
@@ -17290,20 +17229,6 @@ const SCREENS = runtimeSetting({
17290
17229
  }
17291
17230
  }
17292
17231
  },
17293
- {
17294
- "id": "btn_tier5_himibookingbookings_refresh",
17295
- "body": {
17296
- "package": "himalaya",
17297
- "type": "Button",
17298
- "props": {
17299
- "title": "Refresh",
17300
- "style": "plain",
17301
- "action": {
17302
- "actionId": "tier5.himiBookingBookings.refresh"
17303
- }
17304
- }
17305
- }
17306
- },
17307
17232
  {
17308
17233
  "id": "himi_bookings.list.collection.compact-more",
17309
17234
  "body": {
@@ -18612,7 +18537,7 @@ const SCREENS = runtimeSetting({
18612
18537
  "package": "himalaya",
18613
18538
  "type": "SearchField",
18614
18539
  "props": {
18615
- "placeholder": "Search loaded items",
18540
+ "placeholder": "Search",
18616
18541
  "value": "$service:himiBrandedPlans.collection.query",
18617
18542
  "debounceMs": 200,
18618
18543
  "onChange": {
@@ -19002,7 +18927,7 @@ const SCREENS = runtimeSetting({
19002
18927
  "text": "$item.collectionMeta",
19003
18928
  "style": "caption",
19004
18929
  "color": "textSecondary",
19005
- "maxLines": 2,
18930
+ "maxLines": 8,
19006
18931
  "collapseWhenEmpty": true
19007
18932
  }
19008
18933
  }
@@ -19250,9 +19175,9 @@ const SCREENS = runtimeSetting({
19250
19175
  "package": "himalaya",
19251
19176
  "type": "Grid",
19252
19177
  "props": {
19253
- "columns": 2,
19254
- "columnsMedium": 3,
19255
- "columnsExpanded": 4,
19178
+ "columns": 1,
19179
+ "columnsMedium": 2,
19180
+ "columnsExpanded": 3,
19256
19181
  "spacing": 12,
19257
19182
  "itemsPath": "$service:himiBrandedPlans.collection.items",
19258
19183
  "items": [
@@ -19309,7 +19234,7 @@ const SCREENS = runtimeSetting({
19309
19234
  "text": "$item.collectionMeta",
19310
19235
  "style": "caption",
19311
19236
  "color": "textSecondary",
19312
- "maxLines": 2,
19237
+ "maxLines": 8,
19313
19238
  "collapseWhenEmpty": true
19314
19239
  }
19315
19240
  }
@@ -19878,9 +19803,9 @@ const SCREENS = runtimeSetting({
19878
19803
  "package": "himalaya",
19879
19804
  "type": "Grid",
19880
19805
  "props": {
19881
- "columns": 2,
19882
- "columnsMedium": 3,
19883
- "columnsExpanded": 4,
19806
+ "columns": 1,
19807
+ "columnsMedium": 2,
19808
+ "columnsExpanded": 3,
19884
19809
  "spacing": 8,
19885
19810
  "itemsPath": "$service:himiBrandedPlans.collection.items",
19886
19811
  "items": [
@@ -20254,7 +20179,7 @@ const SCREENS = runtimeSetting({
20254
20179
  "package": "himalaya",
20255
20180
  "type": "Text",
20256
20181
  "props": {
20257
- "text": "Sort loaded items",
20182
+ "text": "Sort",
20258
20183
  "style": "bodyEmphasis"
20259
20184
  }
20260
20185
  }
@@ -20536,7 +20461,7 @@ const SCREENS = runtimeSetting({
20536
20461
  "text": "$item.collectionMeta",
20537
20462
  "style": "caption",
20538
20463
  "color": "textSecondary",
20539
- "maxLines": 2,
20464
+ "maxLines": 8,
20540
20465
  "collapseWhenEmpty": true
20541
20466
  }
20542
20467
  }
@@ -21867,7 +21792,7 @@ const SCREENS = runtimeSetting({
21867
21792
  "package": "himalaya",
21868
21793
  "type": "SearchField",
21869
21794
  "props": {
21870
- "placeholder": "Exact event title",
21795
+ "placeholder": "Search events",
21871
21796
  "debounceMs": 200,
21872
21797
  "onChange": {
21873
21798
  "actionId": "tier5.himiEvents.collectionSearch"
@@ -23060,20 +22985,6 @@ const SCREENS = runtimeSetting({
23060
22985
  }
23061
22986
  }
23062
22987
  },
23063
- {
23064
- "id": "btn_tier5_himievents_refresh",
23065
- "body": {
23066
- "package": "himalaya",
23067
- "type": "Button",
23068
- "props": {
23069
- "title": "Refresh",
23070
- "style": "plain",
23071
- "action": {
23072
- "actionId": "tier5.himiEvents.refresh"
23073
- }
23074
- }
23075
- }
23076
- },
23077
22988
  {
23078
22989
  "id": "himi_events.list.collection.more",
23079
22990
  "body": {
@@ -23749,20 +23660,6 @@ const SCREENS = runtimeSetting({
23749
23660
  }
23750
23661
  }
23751
23662
  },
23752
- {
23753
- "id": "btn_tier5_himievents_refresh",
23754
- "body": {
23755
- "package": "himalaya",
23756
- "type": "Button",
23757
- "props": {
23758
- "title": "Refresh",
23759
- "style": "plain",
23760
- "action": {
23761
- "actionId": "tier5.himiEvents.refresh"
23762
- }
23763
- }
23764
- }
23765
- },
23766
23663
  {
23767
23664
  "id": "himi_events.list.collection.compact-more",
23768
23665
  "body": {
@@ -25235,7 +25132,7 @@ const SCREENS = runtimeSetting({
25235
25132
  "package": "himalaya",
25236
25133
  "type": "SearchField",
25237
25134
  "props": {
25238
- "placeholder": "Search loaded items",
25135
+ "placeholder": "Search",
25239
25136
  "debounceMs": 200,
25240
25137
  "onChange": {
25241
25138
  "actionId": "tier5.himiBlogFeed.collectionSearch"
@@ -26347,20 +26244,6 @@ const SCREENS = runtimeSetting({
26347
26244
  }
26348
26245
  }
26349
26246
  },
26350
- {
26351
- "id": "btn_tier5_himiblogfeed_retry",
26352
- "body": {
26353
- "package": "himalaya",
26354
- "type": "Button",
26355
- "props": {
26356
- "title": "Refresh",
26357
- "style": "plain",
26358
- "action": {
26359
- "actionId": "tier5.himiBlogFeed.retry"
26360
- }
26361
- }
26362
- }
26363
- },
26364
26247
  {
26365
26248
  "id": "himi_blog.list.collection.more",
26366
26249
  "body": {
@@ -26998,20 +26881,6 @@ const SCREENS = runtimeSetting({
26998
26881
  }
26999
26882
  }
27000
26883
  },
27001
- {
27002
- "id": "btn_tier5_himiblogfeed_retry",
27003
- "body": {
27004
- "package": "himalaya",
27005
- "type": "Button",
27006
- "props": {
27007
- "title": "Refresh",
27008
- "style": "plain",
27009
- "action": {
27010
- "actionId": "tier5.himiBlogFeed.retry"
27011
- }
27012
- }
27013
- }
27014
- },
27015
26884
  {
27016
26885
  "id": "himi_blog.list.collection.compact-more",
27017
26886
  "body": {
@@ -27138,7 +27007,7 @@ const SCREENS = runtimeSetting({
27138
27007
  "package": "himalaya",
27139
27008
  "type": "Text",
27140
27009
  "props": {
27141
- "text": "Sort loaded items",
27010
+ "text": "Sort",
27142
27011
  "style": "bodyEmphasis"
27143
27012
  }
27144
27013
  }
@@ -27842,7 +27711,7 @@ const SCREENS = runtimeSetting({
27842
27711
  "package": "himalaya",
27843
27712
  "type": "Text",
27844
27713
  "props": {
27845
- "text": "Posts saved on this member device.",
27714
+ "text": "Posts you have saved to read later.",
27846
27715
  "style": "body",
27847
27716
  "color": "textSecondary"
27848
27717
  }
@@ -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
+ }