@wix/himalaya-cli 0.1209.0 → 0.1211.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 (180) hide show
  1. package/dist/cli.mjs +112 -18
  2. package/dist/preview-assets.generated.bin +0 -0
  3. package/package.json +2 -2
  4. package/templates/beauty-salon/tier5-src/_shared/engine-intl.ts +57 -16
  5. package/templates/beauty-salon-owner/dev/index.ts +80 -50
  6. package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +31 -16
  7. package/templates/beauty-salon-owner/tier5-src/_shared/engine-intl.ts +57 -16
  8. package/templates/beauty-salon-owner/tier5-src/_shared/himi-text.ts +24 -0
  9. package/templates/beauty-salon-owner/tier5-src/_shared/owner-account.ts +4 -0
  10. package/templates/beauty-salon-owner/tier5-src/_shared/owner-module-data.ts +105 -37
  11. package/templates/beauty-salon-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
  12. package/templates/beauty-salon-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
  13. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
  14. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  15. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  16. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
  17. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  18. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  19. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
  20. package/templates/branded-lite/tier5-src/_shared/engine-intl.ts +57 -16
  21. package/templates/community-club/tier5-src/_shared/engine-intl.ts +57 -16
  22. package/templates/community-club-owner/dev/index.ts +80 -50
  23. package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +31 -16
  24. package/templates/community-club-owner/tier5-src/_shared/engine-intl.ts +57 -16
  25. package/templates/community-club-owner/tier5-src/_shared/himi-text.ts +24 -0
  26. package/templates/community-club-owner/tier5-src/_shared/owner-account.ts +4 -0
  27. package/templates/community-club-owner/tier5-src/_shared/owner-module-data.ts +105 -37
  28. package/templates/community-club-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
  29. package/templates/community-club-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
  30. package/templates/community-club-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
  31. package/templates/community-club-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  32. package/templates/community-club-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  33. package/templates/community-club-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
  34. package/templates/community-club-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  35. package/templates/community-club-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  36. package/templates/community-club-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
  37. package/templates/events-meetups/tier5-src/_shared/engine-intl.ts +57 -16
  38. package/templates/events-meetups-owner/dev/index.ts +80 -50
  39. package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +31 -16
  40. package/templates/events-meetups-owner/tier5-src/_shared/engine-intl.ts +57 -16
  41. package/templates/events-meetups-owner/tier5-src/_shared/himi-text.ts +24 -0
  42. package/templates/events-meetups-owner/tier5-src/_shared/owner-account.ts +4 -0
  43. package/templates/events-meetups-owner/tier5-src/_shared/owner-module-data.ts +105 -37
  44. package/templates/events-meetups-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
  45. package/templates/events-meetups-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
  46. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
  47. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  48. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  49. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
  50. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  51. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  52. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
  53. package/templates/gym-fitness/tier5-src/_shared/engine-intl.ts +57 -16
  54. package/templates/gym-fitness-owner/dev/index.ts +80 -50
  55. package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +31 -16
  56. package/templates/gym-fitness-owner/tier5-src/_shared/engine-intl.ts +57 -16
  57. package/templates/gym-fitness-owner/tier5-src/_shared/himi-text.ts +24 -0
  58. package/templates/gym-fitness-owner/tier5-src/_shared/owner-account.ts +4 -0
  59. package/templates/gym-fitness-owner/tier5-src/_shared/owner-module-data.ts +105 -37
  60. package/templates/gym-fitness-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
  61. package/templates/gym-fitness-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
  62. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
  63. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  64. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  65. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
  66. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  67. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  68. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
  69. package/templates/nonprofit-cause/tier5-src/_shared/engine-intl.ts +57 -16
  70. package/templates/nonprofit-cause-owner/dev/index.ts +80 -50
  71. package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +31 -16
  72. package/templates/nonprofit-cause-owner/tier5-src/_shared/engine-intl.ts +57 -16
  73. package/templates/nonprofit-cause-owner/tier5-src/_shared/himi-text.ts +24 -0
  74. package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-account.ts +4 -0
  75. package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-module-data.ts +105 -37
  76. package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
  77. package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
  78. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
  79. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  80. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  81. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
  82. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  83. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  84. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
  85. package/templates/owner-lite/dev/index.ts +81 -51
  86. package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +31 -16
  87. package/templates/owner-lite/tier5-src/_shared/engine-intl.ts +57 -16
  88. package/templates/owner-lite/tier5-src/_shared/himi-text.ts +24 -0
  89. package/templates/owner-lite/tier5-src/_shared/owner-account.ts +4 -0
  90. package/templates/owner-lite/tier5-src/_shared/owner-module-data.ts +105 -37
  91. package/templates/owner-lite/tier5-src/_shared/owner-selected-site.ts +103 -0
  92. package/templates/owner-lite/tier5-src/_shared/owner-site-pick.ts +74 -0
  93. package/templates/owner-lite/tier5-src/himi-owner-lite-account/index.ts +12 -2
  94. package/templates/owner-lite/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  95. package/templates/owner-lite/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  96. package/templates/owner-lite/tier5-src/himi-owner-lite-faq/index.ts +8 -2
  97. package/templates/owner-lite/tier5-src/himi-owner-lite-home/index.ts +29 -1
  98. package/templates/owner-lite/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  99. package/templates/owner-lite/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  100. package/templates/owner-lite/tier5-src/himi-owner-lite-sites/index.ts +14 -31
  101. package/templates/podcast-creator/tier5-src/_shared/engine-intl.ts +57 -16
  102. package/templates/podcast-creator-owner/dev/index.ts +80 -50
  103. package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +31 -16
  104. package/templates/podcast-creator-owner/tier5-src/_shared/engine-intl.ts +57 -16
  105. package/templates/podcast-creator-owner/tier5-src/_shared/himi-text.ts +24 -0
  106. package/templates/podcast-creator-owner/tier5-src/_shared/owner-account.ts +4 -0
  107. package/templates/podcast-creator-owner/tier5-src/_shared/owner-module-data.ts +105 -37
  108. package/templates/podcast-creator-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
  109. package/templates/podcast-creator-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
  110. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
  111. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  112. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  113. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
  114. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  115. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  116. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
  117. package/templates/portfolio-creative/tier5-src/_shared/engine-intl.ts +57 -16
  118. package/templates/portfolio-creative-owner/dev/index.ts +80 -50
  119. package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +31 -16
  120. package/templates/portfolio-creative-owner/tier5-src/_shared/engine-intl.ts +57 -16
  121. package/templates/portfolio-creative-owner/tier5-src/_shared/himi-text.ts +24 -0
  122. package/templates/portfolio-creative-owner/tier5-src/_shared/owner-account.ts +4 -0
  123. package/templates/portfolio-creative-owner/tier5-src/_shared/owner-module-data.ts +105 -37
  124. package/templates/portfolio-creative-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
  125. package/templates/portfolio-creative-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
  126. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
  127. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  128. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  129. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
  130. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  131. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  132. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
  133. package/templates/restaurant/tier5-src/_shared/engine-intl.ts +57 -16
  134. package/templates/restaurant-owner/dev/index.ts +80 -50
  135. package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +31 -16
  136. package/templates/restaurant-owner/tier5-src/_shared/engine-intl.ts +57 -16
  137. package/templates/restaurant-owner/tier5-src/_shared/himi-text.ts +24 -0
  138. package/templates/restaurant-owner/tier5-src/_shared/owner-account.ts +4 -0
  139. package/templates/restaurant-owner/tier5-src/_shared/owner-module-data.ts +105 -37
  140. package/templates/restaurant-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
  141. package/templates/restaurant-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
  142. package/templates/restaurant-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
  143. package/templates/restaurant-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  144. package/templates/restaurant-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  145. package/templates/restaurant-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
  146. package/templates/restaurant-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  147. package/templates/restaurant-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  148. package/templates/restaurant-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
  149. package/templates/retail-store/tier5-src/_shared/engine-intl.ts +57 -16
  150. package/templates/retail-store-owner/dev/index.ts +80 -50
  151. package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +31 -16
  152. package/templates/retail-store-owner/tier5-src/_shared/engine-intl.ts +57 -16
  153. package/templates/retail-store-owner/tier5-src/_shared/himi-text.ts +24 -0
  154. package/templates/retail-store-owner/tier5-src/_shared/owner-account.ts +4 -0
  155. package/templates/retail-store-owner/tier5-src/_shared/owner-module-data.ts +105 -37
  156. package/templates/retail-store-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
  157. package/templates/retail-store-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
  158. package/templates/retail-store-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
  159. package/templates/retail-store-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  160. package/templates/retail-store-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  161. package/templates/retail-store-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
  162. package/templates/retail-store-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  163. package/templates/retail-store-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  164. package/templates/retail-store-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
  165. package/templates/yoga-studio/tier5-src/_shared/engine-intl.ts +57 -16
  166. package/templates/yoga-studio-owner/dev/index.ts +80 -50
  167. package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +31 -16
  168. package/templates/yoga-studio-owner/tier5-src/_shared/engine-intl.ts +57 -16
  169. package/templates/yoga-studio-owner/tier5-src/_shared/himi-text.ts +24 -0
  170. package/templates/yoga-studio-owner/tier5-src/_shared/owner-account.ts +4 -0
  171. package/templates/yoga-studio-owner/tier5-src/_shared/owner-module-data.ts +105 -37
  172. package/templates/yoga-studio-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
  173. package/templates/yoga-studio-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
  174. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
  175. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
  176. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
  177. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
  178. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
  179. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
  180. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
@@ -48568,7 +48568,7 @@ const SCREENS = runtimeSetting({
48568
48568
  "package": "himalaya",
48569
48569
  "type": "Text",
48570
48570
  "props": {
48571
- "text": "__HIMI_APP_NAME__",
48571
+ "text": "$service:himiOwnerLiteHome.businessName",
48572
48572
  "style": "footnote",
48573
48573
  "color": "textSecondary",
48574
48574
  "collapseWhenEmpty": true
@@ -48953,7 +48953,7 @@ const SCREENS = runtimeSetting({
48953
48953
  }
48954
48954
  },
48955
48955
  "modifiers": {
48956
- "hiddenPath": "$service:himiOwnerLiteHome.hideContent"
48956
+ "hiddenPath": "$service:himiOwnerLiteHome.hideSourceFailures"
48957
48957
  }
48958
48958
  },
48959
48959
  {
@@ -50777,7 +50777,8 @@ const SCREENS = runtimeSetting({
50777
50777
  "params": {
50778
50778
  "copy": "{\"ownerHome.acrossBusiness\":\"Across the gym\",\"ownerHome.briefCta\":\"Show me the floor\",\"ownerHome.briefSubtitle\":\"Which classes are filling, which are empty, what the pro shop owes, and who’s signed up for the next challenge.\",\"ownerHome.briefTitle\":\"The floor today\",\"ownerHome.errorLabel\":\"Couldn’t load the floor\",\"ownerHome.headerSubtitle\":\"Gym owner · the floor today\",\"ownerHome.openManage\":\"Open the gym\",\"ownerHome.ordersDaily\":\"Pro shop sales · daily\",\"ownerHome.statAppointments\":\"Members booked in\",\"ownerHome.statEvents\":\"Challenges ahead\",\"ownerHome.statOrders\":\"Pro shop orders\",\"ownerHome.statPosts\":\"Coach notes\",\"ownerHome.statProducts\":\"Pro shop items\",\"ownerHome.statRevenue\":\"Revenue\",\"ownerHome.statSites\":\"Gyms\",\"ownerHome.switchBusiness\":\"Switch gym\"}",
50779
50779
  "homeModules": "[{\"id\":\"attention\",\"label\":\"Needs attention\",\"dataSource\":\"owner-today\",\"emptyWhen\":[\"hideContent\"]},{\"id\":\"schedule\",\"label\":\"Up next\",\"dataSource\":\"owner-schedule\",\"emptyWhen\":[\"hideContent\"]},{\"id\":\"shortcuts\",\"label\":\"Quick actions\",\"dataSource\":\"owner-actions\"},{\"id\":\"metrics\",\"label\":\"Business overview\",\"dataSource\":\"dashboard\",\"emptyWhen\":[\"hideContent\"]},{\"id\":\"brief\",\"label\":\"Daily brief\",\"dataSource\":\"brief\"}]",
50780
- "enabledSources": "[\"products\",\"posts\",\"sites\",\"orders\",\"bookings\",\"events\",\"members\",\"reviews\",\"reservations\"]"
50780
+ "enabledSources": "[\"products\",\"posts\",\"sites\",\"orders\",\"bookings\",\"events\",\"members\",\"reviews\",\"reservations\"]",
50781
+ "businessName": "__HIMI_APP_NAME__"
50781
50782
  }
50782
50783
  }
50783
50784
  }
@@ -50846,7 +50847,7 @@ const SCREENS = runtimeSetting({
50846
50847
  "package": "himalaya",
50847
50848
  "type": "Text",
50848
50849
  "props": {
50849
- "text": "__HIMI_APP_NAME__",
50850
+ "text": "$service:himiOwnerLiteManage.businessName",
50850
50851
  "style": "footnote",
50851
50852
  "color": "textSecondary",
50852
50853
  "collapseWhenEmpty": true
@@ -51039,7 +51040,8 @@ const SCREENS = runtimeSetting({
51039
51040
  "props": {
51040
51041
  "text": "$service:himiOwnerLiteManage.summary",
51041
51042
  "style": "caption",
51042
- "color": "textSecondary"
51043
+ "color": "textSecondary",
51044
+ "collapseWhenEmpty": true
51043
51045
  }
51044
51046
  }
51045
51047
  },
@@ -51634,6 +51636,9 @@ const SCREENS = runtimeSetting({
51634
51636
  }
51635
51637
  ]
51636
51638
  }
51639
+ },
51640
+ "modifiers": {
51641
+ "hiddenPath": "$service:himiOwnerLiteManage.noSections"
51637
51642
  }
51638
51643
  },
51639
51644
  {
@@ -52017,7 +52022,8 @@ const SCREENS = runtimeSetting({
52017
52022
  "actionId": "tier5.himiOwnerLiteManage.load",
52018
52023
  "params": {
52019
52024
  "areas": "[{\"id\":\"store\",\"title\":\"Pro shop\",\"subtitle\":\"Products, inventory and sales\",\"groupId\":\"commerce\",\"group\":\"Commerce\",\"screenId\":\"himi_owner_lite_products\",\"icon\":\"bag\",\"metricKey\":\"products\",\"countLabel\":\"products\",\"createScreenId\":\"himi_owner_lite_product_new\",\"createLabel\":\"Create product\"},{\"id\":\"himi_owner_lite_orders\",\"title\":\"Pro shop orders\",\"subtitle\":\"Review and complete customer orders\",\"groupId\":\"commerce\",\"group\":\"Commerce\",\"screenId\":\"himi_owner_lite_orders\",\"icon\":\"cart\",\"metricKey\":\"orders\",\"countLabel\":\"orders\"},{\"id\":\"bookings\",\"title\":\"Classes\",\"subtitle\":\"Services and your schedule\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_services\",\"icon\":\"calendar\",\"metricKey\":\"services\",\"countLabel\":\"services\"},{\"id\":\"himi_owner_lite_appointments\",\"title\":\"Members booked in\",\"subtitle\":\"Your upcoming appointments\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_appointments\",\"icon\":\"clock\",\"metricKey\":\"appointments\",\"countLabel\":\"appointments\"},{\"id\":\"events\",\"title\":\"Challenges\",\"subtitle\":\"Events and attendance\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_events\",\"icon\":\"calendar\",\"metricKey\":\"events\",\"countLabel\":\"events\"},{\"id\":\"blog\",\"title\":\"Coach notes\",\"subtitle\":\"Stories and publishing\",\"groupId\":\"content\",\"group\":\"Content\",\"screenId\":\"himi_owner_lite_posts\",\"icon\":\"newspaper\",\"metricKey\":\"posts\",\"countLabel\":\"posts\",\"createScreenId\":\"himi_owner_lite_post_new\",\"createLabel\":\"Write post\"},{\"id\":\"coupons\",\"title\":\"Coupons\",\"subtitle\":\"Offers, codes and usage\",\"groupId\":\"commerce\",\"group\":\"Commerce\",\"screenId\":\"himi_owner_lite_module_coupons\",\"icon\":\"tag\",\"metricKey\":\"module:coupons\",\"countLabel\":\"coupons\"},{\"id\":\"invoices\",\"title\":\"Invoices\",\"subtitle\":\"Customers, balances and payment status\",\"groupId\":\"commerce\",\"group\":\"Commerce\",\"screenId\":\"himi_owner_lite_module_invoices\",\"icon\":\"document\",\"metricKey\":\"module:invoices\",\"countLabel\":\"invoices\"},{\"id\":\"giftCards\",\"title\":\"Gift cards\",\"subtitle\":\"Balances, recipients and expiration\",\"groupId\":\"commerce\",\"group\":\"Commerce\",\"screenId\":\"himi_owner_lite_module_giftCards\",\"icon\":\"ticket\",\"metricKey\":\"module:giftCards\",\"countLabel\":\"gift cards\"},{\"id\":\"contacts\",\"title\":\"Contacts\",\"subtitle\":\"Your customer relationships\",\"groupId\":\"people-and-community\",\"group\":\"People and community\",\"screenId\":\"himi_owner_lite_module_contacts\",\"icon\":\"person\",\"metricKey\":\"module:contacts\",\"countLabel\":\"contacts\"},{\"id\":\"members\",\"title\":\"Members\",\"subtitle\":\"Membership access and profiles\",\"groupId\":\"people-and-community\",\"group\":\"People and community\",\"screenId\":\"himi_owner_lite_module_members\",\"icon\":\"person\",\"metricKey\":\"module:members\",\"countLabel\":\"members\"},{\"id\":\"groups\",\"title\":\"Groups\",\"subtitle\":\"Communities and conversations\",\"groupId\":\"people-and-community\",\"group\":\"People and community\",\"screenId\":\"himi_owner_lite_module_groups\",\"icon\":\"person\",\"metricKey\":\"module:groups\",\"countLabel\":\"groups\"},{\"id\":\"reviews\",\"title\":\"Reviews\",\"subtitle\":\"Published and pending customer feedback\",\"groupId\":\"people-and-community\",\"group\":\"People and community\",\"screenId\":\"himi_owner_lite_module_reviews\",\"icon\":\"star\",\"metricKey\":\"module:reviews\",\"countLabel\":\"reviews\"},{\"id\":\"plans\",\"title\":\"Plans\",\"subtitle\":\"Pricing, benefits and visibility\",\"groupId\":\"membership-and-learning\",\"group\":\"Membership and learning\",\"screenId\":\"himi_owner_lite_module_plans\",\"icon\":\"bookmark\",\"metricKey\":\"module:plans\",\"countLabel\":\"plans\"},{\"id\":\"subscriptions\",\"title\":\"Subscriptions\",\"subtitle\":\"Member plans and subscription status\",\"groupId\":\"membership-and-learning\",\"group\":\"Membership and learning\",\"screenId\":\"himi_owner_lite_module_subscriptions\",\"icon\":\"bookmark\",\"metricKey\":\"module:subscriptions\",\"countLabel\":\"subscriptions\"},{\"id\":\"programs\",\"title\":\"Programs\",\"subtitle\":\"Learning experiences and participation\",\"groupId\":\"membership-and-learning\",\"group\":\"Membership and learning\",\"screenId\":\"himi_owner_lite_module_programs\",\"icon\":\"play\",\"metricKey\":\"module:programs\",\"countLabel\":\"programs\"},{\"id\":\"badges\",\"title\":\"Badges\",\"subtitle\":\"Recognition, access and member badges\",\"groupId\":\"membership-and-learning\",\"group\":\"Membership and learning\",\"screenId\":\"himi_owner_lite_module_badges\",\"icon\":\"star\",\"metricKey\":\"module:badges\",\"countLabel\":\"badges\"},{\"id\":\"reservations\",\"title\":\"Reservations\",\"subtitle\":\"Guests, tables and arrival times\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_module_reservations\",\"icon\":\"calendar\",\"metricKey\":\"module:reservations\",\"countLabel\":\"reservations\"},{\"id\":\"forms\",\"title\":\"Forms\",\"subtitle\":\"Forms and their configuration\",\"groupId\":\"content\",\"group\":\"Content\",\"screenId\":\"himi_owner_lite_module_forms\",\"icon\":\"document\",\"metricKey\":\"module:forms\",\"countLabel\":\"forms\"},{\"id\":\"portfolio\",\"title\":\"Portfolio\",\"subtitle\":\"Projects, stories and galleries\",\"groupId\":\"content\",\"group\":\"Content\",\"screenId\":\"himi_owner_lite_module_portfolio\",\"icon\":\"image\",\"metricKey\":\"module:portfolio\",\"countLabel\":\"portfolio\"},{\"id\":\"donationCampaigns\",\"title\":\"Donation campaigns\",\"subtitle\":\"Campaign goals, status and fundraising\",\"groupId\":\"content\",\"group\":\"Content\",\"screenId\":\"himi_owner_lite_module_donationCampaigns\",\"icon\":\"heart\",\"metricKey\":\"module:donationCampaigns\",\"countLabel\":\"donation campaigns\"}]",
52020
- "copy": "{\"ownerManage.blogLabel\":\"Coach notes\",\"ownerManage.bookingsLabel\":\"Classes\",\"ownerManage.eventsLabel\":\"Challenges\",\"ownerManage.storeLabel\":\"Pro shop\",\"ownerManage.title\":\"Gym\"}"
52025
+ "copy": "{\"ownerManage.blogLabel\":\"Coach notes\",\"ownerManage.bookingsLabel\":\"Classes\",\"ownerManage.eventsLabel\":\"Challenges\",\"ownerManage.storeLabel\":\"Pro shop\",\"ownerManage.title\":\"Gym\"}",
52026
+ "businessName": "__HIMI_APP_NAME__"
52021
52027
  }
52022
52028
  }
52023
52029
  }
@@ -52136,7 +52142,7 @@ const SCREENS = runtimeSetting({
52136
52142
  "package": "himalaya",
52137
52143
  "type": "Text",
52138
52144
  "props": {
52139
- "text": "__HIMI_APP_NAME__",
52145
+ "text": "$service:himiOwnerLiteAccount.businessName",
52140
52146
  "style": "bodyEmphasis",
52141
52147
  "maxLines": 1
52142
52148
  }
@@ -52399,6 +52405,7 @@ const SCREENS = runtimeSetting({
52399
52405
  "supportUrl": "https://www.wix.com/support",
52400
52406
  "privacyUrl": "https://www.wix.com/about/privacy",
52401
52407
  "termsUrl": "https://www.wix.com/about/terms-of-use",
52408
+ "businessName": "__HIMI_APP_NAME__",
52402
52409
  "copy": "{\"ownerAccount.roleValue\":\"Gym owner\",\"ownerAccount.subtitle\":\"Gym owner\"}"
52403
52410
  }
52404
52411
  }
@@ -52946,7 +52953,10 @@ const SCREENS = runtimeSetting({
52946
52953
  },
52947
52954
  "fillMaxWidth": true,
52948
52955
  "onAppear": {
52949
- "actionId": "tier5.drawer.syncActive"
52956
+ "actionId": "tier5.drawer.refresh",
52957
+ "params": {
52958
+ "businessName": "__HIMI_APP_NAME__"
52959
+ }
52950
52960
  }
52951
52961
  }
52952
52962
  },
@@ -56468,7 +56478,7 @@ const SCREENS = runtimeSetting({
56468
56478
  "package": "himalaya",
56469
56479
  "type": "HStack",
56470
56480
  "props": {
56471
- "spacing": 16,
56481
+ "spacing": 0,
56472
56482
  "children": [
56473
56483
  {
56474
56484
  "id": "",
@@ -56479,43 +56489,57 @@ const SCREENS = runtimeSetting({
56479
56489
  }
56480
56490
  },
56481
56491
  {
56482
- "id": "himi_owner_lite_aria.history",
56483
- "body": {
56484
- "package": "himalaya",
56485
- "type": "Text",
56486
- "props": {
56487
- "text": "History",
56488
- "style": "bodyEmphasis",
56489
- "color": "accentPrimary",
56490
- "maxLines": 1
56491
- }
56492
- },
56493
- "modifiers": {
56494
- "onTap": {
56495
- "actionId": "himi.open",
56496
- "params": {
56497
- "screenId": "himi_owner_lite_aria_history"
56498
- }
56499
- }
56500
- }
56501
- },
56502
- {
56503
- "id": "himi_owner_lite_aria.newchat",
56492
+ "id": "",
56504
56493
  "body": {
56505
56494
  "package": "himalaya",
56506
- "type": "Icon",
56495
+ "type": "HStack",
56507
56496
  "props": {
56508
- "name": "edit",
56509
- "size": 22,
56510
- "tint": "accentPrimary"
56497
+ "spacing": 16,
56498
+ "children": [
56499
+ {
56500
+ "id": "himi_owner_lite_aria.history",
56501
+ "body": {
56502
+ "package": "himalaya",
56503
+ "type": "Text",
56504
+ "props": {
56505
+ "text": "History",
56506
+ "style": "bodyEmphasis",
56507
+ "color": "accentPrimary",
56508
+ "maxLines": 1
56509
+ }
56510
+ },
56511
+ "modifiers": {
56512
+ "onTap": {
56513
+ "actionId": "himi.open",
56514
+ "params": {
56515
+ "screenId": "himi_owner_lite_aria_history"
56516
+ }
56517
+ }
56518
+ }
56519
+ },
56520
+ {
56521
+ "id": "himi_owner_lite_aria.newchat",
56522
+ "body": {
56523
+ "package": "himalaya",
56524
+ "type": "Icon",
56525
+ "props": {
56526
+ "name": "edit",
56527
+ "size": 22,
56528
+ "tint": "accentPrimary"
56529
+ }
56530
+ },
56531
+ "modifiers": {
56532
+ "onTap": {
56533
+ "actionId": "tier5.himiOwnerLiteAria.newChat"
56534
+ },
56535
+ "accessibilityLabel": "New chat",
56536
+ "accessibilityRole": "button",
56537
+ "width": 44,
56538
+ "height": 44
56539
+ }
56540
+ }
56541
+ ]
56511
56542
  }
56512
- },
56513
- "modifiers": {
56514
- "onTap": {
56515
- "actionId": "tier5.himiOwnerLiteAria.newChat"
56516
- },
56517
- "accessibilityLabel": "New chat",
56518
- "accessibilityRole": "button"
56519
56543
  }
56520
56544
  }
56521
56545
  ]
@@ -56876,6 +56900,9 @@ const SCREENS = runtimeSetting({
56876
56900
  }
56877
56901
  ]
56878
56902
  }
56903
+ },
56904
+ "modifiers": {
56905
+ "hiddenPath": "$service:himiOwnerLiteAria.messagesHidden"
56879
56906
  }
56880
56907
  },
56881
56908
  {
@@ -57174,7 +57201,8 @@ const SCREENS = runtimeSetting({
57174
57201
  "text": "$service:himiOwnerLiteAria.error",
57175
57202
  "style": "footnote",
57176
57203
  "color": "danger",
57177
- "maxLines": 3
57204
+ "maxLines": 3,
57205
+ "collapseWhenEmpty": true
57178
57206
  }
57179
57207
  },
57180
57208
  "modifiers": {
@@ -61411,6 +61439,9 @@ const SCREENS = runtimeSetting({
61411
61439
  }
61412
61440
  ]
61413
61441
  }
61442
+ },
61443
+ "modifiers": {
61444
+ "hiddenPath": "$service:himiOwnerLiteAriaHistory.itemsHidden"
61414
61445
  }
61415
61446
  }
61416
61447
  ]
@@ -61917,10 +61948,10 @@ const SCREENS = runtimeSetting({
61917
61948
  },
61918
61949
  "fillMaxWidth": true,
61919
61950
  "onTap": {
61920
- "actionId": "himi.open",
61951
+ "actionId": "tier5.himiOwnerLiteSites.pick",
61921
61952
  "params": {
61922
- "screenId": "himi_owner_lite_home",
61923
- "business": "$item.id"
61953
+ "id": "$item.id",
61954
+ "name": "$item.name"
61924
61955
  }
61925
61956
  },
61926
61957
  "pressFeedback": "scale",
@@ -62017,7 +62048,6 @@ const SCREENS = runtimeSetting({
62017
62048
  "contentType": "application/javascript+ts-bundle",
62018
62049
  "declaredCapabilities": [
62019
62050
  "wix_api",
62020
- "wix_platform",
62021
62051
  "local_database"
62022
62052
  ],
62023
62053
  "minBinaryVersion": "0.1.0",
@@ -62478,10 +62508,10 @@ const SCREENS = runtimeSetting({
62478
62508
  },
62479
62509
  "fillMaxWidth": true,
62480
62510
  "onTap": {
62481
- "actionId": "himi.open",
62511
+ "actionId": "tier5.himiOwnerLiteOverview.pick",
62482
62512
  "params": {
62483
- "screenId": "himi_owner_lite_home",
62484
- "business": "$item.id"
62513
+ "id": "$item.id",
62514
+ "name": "$item.name"
62485
62515
  }
62486
62516
  },
62487
62517
  "pressFeedback": "scale",
@@ -79,6 +79,7 @@ import { MENTION_PAGE_SIZE, allowlisted, emptyMentionModel, mentionView,
79
79
  type MentionItemRow, type MentionLabels, type MentionModel, type MentionProvider, type MentionView } from "./aria-mentions.js";
80
80
  import { isTransportFailure, ownerTransportFailureText } from "./owner-load-error.js";
81
81
  import { LOCAL_ID_PREFIX, createRowMemo, mintLocalId, transcriptKeys, type RowMemo } from "./aria-hot-path.js";
82
+ import { calendarDay, formatClock, formatDateMedium, formatMonthDay } from "./engine-intl.js";
82
83
 
83
84
  // ---------------------------------------------------------------------------
84
85
  // Shapes
@@ -166,6 +167,9 @@ export interface AriaChatState {
166
167
  * is computed once in `gated` rather than maintained by every reducer. */
167
168
  replyActionsHidden: boolean;
168
169
  messages: AriaBubble[];
170
+ /** Collapses the transcript list while it is empty — an empty list still costs
171
+ * its parent stack a gap. Derived in `gated`, like `stopHidden`. */
172
+ messagesHidden: boolean;
169
173
  /** Non-empty ONLY on the greeting-only empty state. */
170
174
  prompts: AriaPromptChip[];
171
175
  _convId: string;
@@ -1499,7 +1503,7 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
1499
1503
 
1500
1504
  const initialState: AriaChatState = {
1501
1505
  status: "loading", statusText: "", error: "", input: "", copyNote: "", replyActionsHidden: true,
1502
- messages: [], prompts: [], _convId: "", _siteId: "", _pending: "", _pendingRefs: "", _pendingAttach: [],
1506
+ messages: [], messagesHidden: true, prompts: [], _convId: "", _siteId: "", _pending: "", _pendingRefs: "", _pendingAttach: [],
1503
1507
  _pendingAfter: 0, _pendingId: "", _replyAfter: 0, _srvUsers: 0, _srvAssistants: 0,
1504
1508
  _abortId: "", _turnId: "", stopHidden: true, ok: false,
1505
1509
  listening: false, micHidden: !o.dictation, listeningHidden: true,
@@ -2460,10 +2464,12 @@ export function createAriaChat(o: AriaChatOptions): AriaChatCore {
2460
2464
  const listening = s.listening === true;
2461
2465
  const micHidden = !o.dictation || dictationAvailable === false || listening;
2462
2466
  const listeningHidden = !listening;
2467
+ // And the transcript list: hidden while empty, so it costs its stack no gap.
2468
+ const messagesHidden = s.messages.length === 0;
2463
2469
  const actioned = s.stopHidden === hidden && s.replyActionsHidden === replyActionsHidden
2464
- && s.micHidden === micHidden && s.listeningHidden === listeningHidden
2470
+ && s.micHidden === micHidden && s.listeningHidden === listeningHidden && s.messagesHidden === messagesHidden
2465
2471
  ? s
2466
- : { ...s, stopHidden: hidden, replyActionsHidden, micHidden, listeningHidden };
2472
+ : { ...s, stopHidden: hidden, replyActionsHidden, micHidden, listeningHidden, messagesHidden };
2467
2473
  // The attachment projection rides the same exit, for the same reason: one
2468
2474
  // place that every action's result passes through, so no reducer can hand
2469
2475
  // back a stale copy of the chips. Seeded first, so the very first action of
@@ -3493,6 +3499,9 @@ export interface AriaHistoryState {
3493
3499
  items: AriaHistoryRow[];
3494
3500
  /** Non-empty ONLY when the list is empty (collapses otherwise). */
3495
3501
  emptyText: string;
3502
+ /** Collapses the (empty) row list, which would otherwise still cost its parent
3503
+ * stack a gap. True until a load lands rows. */
3504
+ itemsHidden: boolean;
3496
3505
  /** The business the rows in `items` belong to. A kept list is only safe to
3497
3506
  * keep while this still matches, so it is state rather than a closure — the
3498
3507
  * chat service tracks its own `_siteId` for the same reason. */
@@ -3512,6 +3521,8 @@ export interface AriaHistoryLabels {
3512
3521
  last7?: Resolvable<string>;
3513
3522
  last30?: Resolvable<string>;
3514
3523
  older?: Resolvable<string>;
3524
+ /** Prefix for a conversation from today: "Today · 9:12 AM". */
3525
+ today?: Resolvable<string>;
3515
3526
  }
3516
3527
 
3517
3528
  export interface AriaHistoryOptions {
@@ -3525,8 +3536,8 @@ export interface AriaHistoryOptions {
3525
3536
  localHistory?: boolean;
3526
3537
  }
3527
3538
 
3528
- interface BucketLabels { last7: string; last30: string; older: string; }
3529
- const STOCK_BUCKETS: BucketLabels = { last7: "Last 7 days", last30: "Last 30 days", older: "Older" };
3539
+ interface BucketLabels { last7: string; last30: string; older: string; today: string; }
3540
+ const STOCK_BUCKETS: BucketLabels = { last7: "Last 7 days", last30: "Last 30 days", older: "Older", today: "Today" };
3530
3541
 
3531
3542
  /** Parse an ISO-8601 string (serialized Timestamp) or epoch-ms into ms. 0 when
3532
3543
  * absent or unparseable. */
@@ -3539,15 +3550,17 @@ export function toMs(v: unknown): number {
3539
3550
  return 0;
3540
3551
  }
3541
3552
 
3542
- function formatTs(ms: number): string {
3553
+ /** A history card's date, through the shared engine-intl shapes: "Today · 9:12 AM" for today,
3554
+ * "Sep 21" earlier this year, "Sep 21, 2025" before that. It was `toLocaleString()` —
3555
+ * "9/24/2026, 9:12:00 AM", seconds and all. These are the owner's own
3556
+ * conversations, so the device's calendar is the right one. */
3557
+ function formatTs(ms: number, now: number, today: string): string {
3543
3558
  if (!ms) return "";
3544
- try {
3545
- const d = new Date(ms);
3546
- if (isNaN(d.getTime())) return "";
3547
- return d.toLocaleString();
3548
- } catch {
3549
- return "";
3550
- }
3559
+ const d = new Date(ms);
3560
+ if (isNaN(d.getTime())) return "";
3561
+ const day = calendarDay(d), current = calendarDay(new Date(now));
3562
+ if (day === current) return `${today} · ${formatClock(d)}`;
3563
+ return day.slice(0, 4) === current.slice(0, 4) ? formatMonthDay(d) : formatDateMedium(d);
3551
3564
  }
3552
3565
 
3553
3566
  const DAY = 24 * 60 * 60 * 1000;
@@ -3568,7 +3581,7 @@ export function bucketRows(entries: Array<{ id: string; title: string; ms: numbe
3568
3581
  const b = bucketOf(e.ms, now, labels);
3569
3582
  const section = b === lastBucket ? "" : b;
3570
3583
  lastBucket = b;
3571
- return { id: e.id, title: e.title, subtitle: formatTs(e.ms), section };
3584
+ return { id: e.id, title: e.title, subtitle: formatTs(e.ms, now, labels.today), section };
3572
3585
  });
3573
3586
  }
3574
3587
 
@@ -3601,9 +3614,10 @@ export function createAriaHistory(o: AriaHistoryOptions) {
3601
3614
  last7: res(o.labels?.last7 ?? STOCK_BUCKETS.last7),
3602
3615
  last30: res(o.labels?.last30 ?? STOCK_BUCKETS.last30),
3603
3616
  older: res(o.labels?.older ?? STOCK_BUCKETS.older),
3617
+ today: res(o.labels?.today ?? STOCK_BUCKETS.today),
3604
3618
  });
3605
3619
  const initialState: AriaHistoryState = {
3606
- status: "loading", items: [], emptyText: "", _siteId: "", failed: false,
3620
+ status: "loading", items: [], itemsHidden: true, emptyText: "", _siteId: "", failed: false,
3607
3621
  };
3608
3622
  return {
3609
3623
  initialState,
@@ -3631,7 +3645,7 @@ export function createAriaHistory(o: AriaHistoryOptions) {
3631
3645
  // owner the previous business's conversation titles, which is precisely
3632
3646
  // the leak `localHistory: false` is set to avoid.
3633
3647
  if (fetched === null && s.items.length && s._siteId === site) {
3634
- return { ...s, status: "ready", failed: true };
3648
+ return { ...s, status: "ready", itemsHidden: false, failed: true };
3635
3649
  }
3636
3650
 
3637
3651
  // A SUCCESSFUL empty answer is authoritative and DOES clear. The tempting
@@ -3651,6 +3665,7 @@ export function createAriaHistory(o: AriaHistoryOptions) {
3651
3665
  ...s,
3652
3666
  status: "ready",
3653
3667
  items,
3668
+ itemsHidden: items.length === 0,
3654
3669
  emptyText: items.length ? "" : emptyText(),
3655
3670
  _siteId: site,
3656
3671
  failed: fetched === null,
@@ -48,6 +48,36 @@ const MONTHS_LONG = [
48
48
  "July", "August", "September", "October", "November", "December",
49
49
  ] as const;
50
50
 
51
+ /**
52
+ * A DateTimeFormat for `timeZone` when one is given and this engine knows it. An unknown or
53
+ * malformed IANA id is a RangeError in ECMA-402; these helpers never throw, so it degrades to
54
+ * the device zone rather than killing the screen. Without Intl there is no zone database at all,
55
+ * and the fallbacks below render in the device zone for the same reason.
56
+ *
57
+ * Formatters are memoised per (locale, zone, options): a management page formats several dates
58
+ * per row, and building a DateTimeFormat (or throwing on a bad zone) each time is not free on
59
+ * JSC or QuickJS. Only call it where `hasIntl()` holds — every caller does.
60
+ */
61
+ const FORMATTERS = new Map<string, Intl.DateTimeFormat>();
62
+ function dateFormat(locale: string, options: Intl.DateTimeFormatOptions, timeZone?: string): Intl.DateTimeFormat {
63
+ const key = `${locale}|${timeZone ?? ""}|${JSON.stringify(options)}`;
64
+ let formatter = FORMATTERS.get(key);
65
+ if (!formatter) {
66
+ if (hasIntl()) {
67
+ if (timeZone) {
68
+ try {
69
+ formatter = new Intl.DateTimeFormat(locale, { ...options, timeZone });
70
+ } catch {
71
+ /* unknown zone: device zone below, remembered under this key */
72
+ }
73
+ }
74
+ formatter ??= new Intl.DateTimeFormat(locale, options);
75
+ FORMATTERS.set(key, formatter);
76
+ }
77
+ }
78
+ return formatter as Intl.DateTimeFormat;
79
+ }
80
+
51
81
  // The four shapes below are not invented — they are the option bags this corpus actually uses,
52
82
  // counted across every bundle: "Jan 5, 2026" (33 sites), "Jan 5" (11), "Mon, Jan 5, 3:07 PM" (8)
53
83
  // and "Jan 5, 3:07 PM" (4). Naming them means a conversion is a one-line swap rather than a
@@ -55,46 +85,46 @@ const MONTHS_LONG = [
55
85
  // ECMA-402 in engine-intl-fallback.test.ts.
56
86
 
57
87
  /** `{ month: "short", day: "numeric", year: "numeric" }` — "Jan 5, 2026". */
58
- export function formatDateMedium(date: Date, locale = "en-US"): string {
88
+ export function formatDateMedium(date: Date, locale = "en-US", timeZone?: string): string {
59
89
  if (hasIntl()) {
60
- return new Intl.DateTimeFormat(locale, { month: "short", day: "numeric", year: "numeric" }).format(date);
90
+ return dateFormat(locale, { month: "short", day: "numeric", year: "numeric" }, timeZone).format(date);
61
91
  }
62
92
  return `${MONTHS_SHORT[date.getMonth()]} ${date.getDate()}, ${date.getFullYear()}`;
63
93
  }
64
94
 
65
95
  /** `{ month: "short", day: "numeric" }` — "Jan 5". */
66
- export function formatMonthDay(date: Date, locale = "en-US"): string {
96
+ export function formatMonthDay(date: Date, locale = "en-US", timeZone?: string): string {
67
97
  if (hasIntl()) {
68
- return new Intl.DateTimeFormat(locale, { month: "short", day: "numeric" }).format(date);
98
+ return dateFormat(locale, { month: "short", day: "numeric" }, timeZone).format(date);
69
99
  }
70
100
  return `${MONTHS_SHORT[date.getMonth()]} ${date.getDate()}`;
71
101
  }
72
102
 
73
103
  /** `{ month: "long", day: "numeric" }` — "January 5". */
74
- export function formatMonthDayLong(date: Date, locale = "en-US"): string {
104
+ export function formatMonthDayLong(date: Date, locale = "en-US", timeZone?: string): string {
75
105
  if (hasIntl()) {
76
- return new Intl.DateTimeFormat(locale, { month: "long", day: "numeric" }).format(date);
106
+ return dateFormat(locale, { month: "long", day: "numeric" }, timeZone).format(date);
77
107
  }
78
108
  return `${MONTHS_LONG[date.getMonth()]} ${date.getDate()}`;
79
109
  }
80
110
 
81
111
  /** `{ weekday: "short", month: "short", day: "numeric", hour: "numeric", minute: "2-digit" }`
82
112
  * — "Mon, Jan 5, 3:07 PM". */
83
- export function formatWeekdayDateTime(date: Date, locale = "en-US"): string {
113
+ export function formatWeekdayDateTime(date: Date, locale = "en-US", timeZone?: string): string {
84
114
  if (hasIntl()) {
85
- return new Intl.DateTimeFormat(locale, {
115
+ return dateFormat(locale, {
86
116
  weekday: "short", month: "short", day: "numeric", hour: "numeric", minute: "2-digit",
87
- }).format(date);
117
+ }, timeZone).format(date);
88
118
  }
89
119
  return `${WEEKDAYS_SHORT[date.getDay()]}, ${MONTHS_SHORT[date.getMonth()]} ${date.getDate()}, ${clock12(date)}`;
90
120
  }
91
121
 
92
122
  /** `{ month: "short", day: "numeric", hour: "numeric", minute: "2-digit" }` — "Jan 5, 3:07 PM". */
93
- export function formatMonthDayTime(date: Date, locale = "en-US"): string {
123
+ export function formatMonthDayTime(date: Date, locale = "en-US", timeZone?: string): string {
94
124
  if (hasIntl()) {
95
- return new Intl.DateTimeFormat(locale, {
125
+ return dateFormat(locale, {
96
126
  month: "short", day: "numeric", hour: "numeric", minute: "2-digit",
97
- }).format(date);
127
+ }, timeZone).format(date);
98
128
  }
99
129
  return `${MONTHS_SHORT[date.getMonth()]} ${date.getDate()}, ${clock12(date)}`;
100
130
  }
@@ -380,9 +410,9 @@ export function normalizeFormattedPrice(formatted: string): string {
380
410
  return `${m[1]}${m[3]}${m[2]}`;
381
411
  }
382
412
 
383
- function clockParts(d: Date, locale: string): { time: string; meridiem: string } {
413
+ function clockParts(d: Date, locale: string, timeZone?: string): { time: string; meridiem: string } {
384
414
  const full = hasIntl()
385
- ? new Intl.DateTimeFormat(locale, { hour: "numeric", minute: "2-digit", hour12: true }).format(d)
415
+ ? dateFormat(locale, { hour: "numeric", minute: "2-digit", hour12: true }, timeZone).format(d)
386
416
  : clock12(d);
387
417
  // ICU puts a narrow no-break space before the meridiem; normalize so callers can split on it.
388
418
  const clean = full.replace(/[  ]/g, " ");
@@ -391,8 +421,8 @@ function clockParts(d: Date, locale: string): { time: string; meridiem: string }
391
421
  }
392
422
 
393
423
  /** "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);
424
+ export function formatClock(date: Date, locale = "en-US", timeZone?: string): string {
425
+ const { time, meridiem } = clockParts(date, locale, timeZone);
396
426
  return meridiem ? `${time} ${meridiem}` : time;
397
427
  }
398
428
 
@@ -403,3 +433,14 @@ export function isPastDate(iso: string | undefined | null, now: number = Date.no
403
433
  const t = Date.parse(iso);
404
434
  return !Number.isNaN(t) && t < now;
405
435
  }
436
+
437
+ /** The calendar day `date` falls on in `timeZone` (device zone when absent, unknown, or when
438
+ * the engine has no Intl), as `YYYY-MM-DD`. For "is this today / this year" comparisons. */
439
+ export function calendarDay(date: Date, timeZone?: string): string {
440
+ if (hasIntl()) {
441
+ const parts = dateFormat("en-CA", { year: "numeric", month: "2-digit", day: "2-digit" }, timeZone).formatToParts(date);
442
+ const get = (type: string) => parts.find((p) => p.type === type)?.value ?? "";
443
+ return `${get("year")}-${get("month")}-${get("day")}`;
444
+ }
445
+ return `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`;
446
+ }
@@ -0,0 +1,24 @@
1
+ // Shared display-text helpers for himi cards: trim catalog artifacts from titles and
2
+ // derive up-to-two-letter placeholder initials so same-first-letter lists still vary.
3
+
4
+ /** Trim trailing artifact markers (stray asterisks / footnote daggers) and whitespace
5
+ * that leak from test/seed catalogs, without touching interior punctuation. Falls back
6
+ * to the original when trimming would empty the string. */
7
+ export function cleanTitle(value?: string): string {
8
+ const raw = (value ?? "").trim();
9
+ const cleaned = raw.replace(/[\s*†‡]+$/u, "").trim();
10
+ return cleaned || raw;
11
+ }
12
+
13
+ /** Up to two significant initials for a placeholder avatar. Two-plus words → first
14
+ * letter of the first two; a single word → its first two alphanumerics. Keeps a list
15
+ * of similar names (e.g. many "Booking…") from collapsing to one identical glyph. */
16
+ export function initials(value?: string): string {
17
+ const words = (value ?? "").trim().split(/\s+/).filter(Boolean);
18
+ if (words.length === 0) return "#";
19
+ if (words.length === 1) {
20
+ const alnum = words[0].replace(/[^\p{L}\p{N}]/gu, "");
21
+ return (alnum.slice(0, 2) || "#").toUpperCase();
22
+ }
23
+ return ((words[0][0] ?? "") + (words[1][0] ?? "")).toUpperCase();
24
+ }
@@ -3,6 +3,9 @@
3
3
 
4
4
  export interface AccountState {
5
5
  status: "loading" | "ready";
6
+ /** The business the "Business" row names: the one picked on Sites, else the
7
+ * build-time fallback (see `owner-selected-site.ts`). */
8
+ businessName: string;
6
9
  /** "Name · email", the email alone, or "" (the line collapses). */
7
10
  ownerLine: string;
8
11
  /** "Version 1.2.0 (34)", or "" when the host cannot say. */
@@ -36,6 +39,7 @@ export function shapeAccount(s: Partial<AccountState>): AccountState {
36
39
  const supportUrl = safeUrl(s.supportUrl), privacyUrl = safeUrl(s.privacyUrl), termsUrl = safeUrl(s.termsUrl);
37
40
  return {
38
41
  status: s.status ?? "loading",
42
+ businessName: s.businessName ?? "",
39
43
  ownerLine: s.ownerLine ?? "",
40
44
  versionLine: s.versionLine ?? "",
41
45
  error: s.error ?? "",