@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.
- package/dist/cli.mjs +112 -18
- package/dist/preview-assets.generated.bin +0 -0
- package/package.json +2 -2
- package/templates/beauty-salon/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/beauty-salon-owner/dev/index.ts +80 -50
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/beauty-salon-owner/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/beauty-salon-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/beauty-salon-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/beauty-salon-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/branded-lite/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/community-club/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/community-club-owner/dev/index.ts +80 -50
- package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/community-club-owner/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/community-club-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/community-club-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/community-club-owner/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/community-club-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/community-club-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/community-club-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/community-club-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/community-club-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/community-club-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/community-club-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/community-club-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/community-club-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/events-meetups/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/events-meetups-owner/dev/index.ts +80 -50
- package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/events-meetups-owner/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/events-meetups-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/events-meetups-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/events-meetups-owner/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/events-meetups-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/events-meetups-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/gym-fitness/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/gym-fitness-owner/dev/index.ts +80 -50
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/gym-fitness-owner/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/gym-fitness-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/gym-fitness-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/gym-fitness-owner/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/gym-fitness-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/gym-fitness-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/nonprofit-cause/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/nonprofit-cause-owner/dev/index.ts +80 -50
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/nonprofit-cause-owner/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/nonprofit-cause-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/nonprofit-cause-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/owner-lite/dev/index.ts +81 -51
- package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/owner-lite/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/owner-lite/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/owner-lite/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/owner-lite/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/owner-lite/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/owner-lite/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/owner-lite/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/owner-lite/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/owner-lite/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/owner-lite/tier5-src/himi-owner-lite-faq/index.ts +8 -2
- package/templates/owner-lite/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/owner-lite/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/owner-lite/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/owner-lite/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/podcast-creator/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/podcast-creator-owner/dev/index.ts +80 -50
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/podcast-creator-owner/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/podcast-creator-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/podcast-creator-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/podcast-creator-owner/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/podcast-creator-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/podcast-creator-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/portfolio-creative/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/portfolio-creative-owner/dev/index.ts +80 -50
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/portfolio-creative-owner/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/portfolio-creative-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/portfolio-creative-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/portfolio-creative-owner/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/portfolio-creative-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/portfolio-creative-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/restaurant/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/restaurant-owner/dev/index.ts +80 -50
- package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/restaurant-owner/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/restaurant-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/restaurant-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/restaurant-owner/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/restaurant-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/restaurant-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/retail-store/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/retail-store-owner/dev/index.ts +80 -50
- package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/retail-store-owner/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/retail-store-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/retail-store-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/retail-store-owner/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/retail-store-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/retail-store-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-sites/index.ts +14 -31
- package/templates/yoga-studio/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/yoga-studio-owner/dev/index.ts +80 -50
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +31 -16
- package/templates/yoga-studio-owner/tier5-src/_shared/engine-intl.ts +57 -16
- package/templates/yoga-studio-owner/tier5-src/_shared/himi-text.ts +24 -0
- package/templates/yoga-studio-owner/tier5-src/_shared/owner-account.ts +4 -0
- package/templates/yoga-studio-owner/tier5-src/_shared/owner-module-data.ts +105 -37
- package/templates/yoga-studio-owner/tier5-src/_shared/owner-selected-site.ts +103 -0
- package/templates/yoga-studio-owner/tier5-src/_shared/owner-site-pick.ts +74 -0
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-account/index.ts +12 -2
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-aria-history/index.ts +1 -0
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-drawer/index.ts +21 -2
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-home/index.ts +29 -1
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-manage/index.ts +25 -5
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-overview/index.ts +8 -0
- 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": "
|
|
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.
|
|
48956
|
+
"hiddenPath": "$service:himiOwnerLiteHome.hideSourceFailures"
|
|
48957
48957
|
}
|
|
48958
48958
|
},
|
|
48959
48959
|
{
|
|
@@ -50706,7 +50706,8 @@ const SCREENS = runtimeSetting({
|
|
|
50706
50706
|
"params": {
|
|
50707
50707
|
"copy": "{\"ownerHome.acrossBusiness\":\"Across the practice\",\"ownerHome.briefCta\":\"Show me the studio\",\"ownerHome.briefSubtitle\":\"Which shoot is next, which print orders are waiting on the framer, and what’s still sitting unpublished in the journal.\",\"ownerHome.briefTitle\":\"In the studio today\",\"ownerHome.errorLabel\":\"Couldn’t load the studio\",\"ownerHome.headerSubtitle\":\"Studio · commissions and prints\",\"ownerHome.openManage\":\"Open the practice\",\"ownerHome.ordersDaily\":\"Print sales · daily\",\"ownerHome.statAppointments\":\"Sessions booked\",\"ownerHome.statOrders\":\"Print orders\",\"ownerHome.statPosts\":\"Journal entries\",\"ownerHome.statProducts\":\"Prints for sale\",\"ownerHome.statRevenue\":\"Earned\",\"ownerHome.statSites\":\"Studios\",\"ownerHome.switchBusiness\":\"Switch studio\"}",
|
|
50708
50708
|
"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\"}]",
|
|
50709
|
-
"enabledSources": "[\"products\",\"posts\",\"sites\",\"orders\",\"bookings\",\"members\",\"reviews\",\"reservations\"]"
|
|
50709
|
+
"enabledSources": "[\"products\",\"posts\",\"sites\",\"orders\",\"bookings\",\"members\",\"reviews\",\"reservations\"]",
|
|
50710
|
+
"businessName": "__HIMI_APP_NAME__"
|
|
50710
50711
|
}
|
|
50711
50712
|
}
|
|
50712
50713
|
}
|
|
@@ -50775,7 +50776,7 @@ const SCREENS = runtimeSetting({
|
|
|
50775
50776
|
"package": "himalaya",
|
|
50776
50777
|
"type": "Text",
|
|
50777
50778
|
"props": {
|
|
50778
|
-
"text": "
|
|
50779
|
+
"text": "$service:himiOwnerLiteManage.businessName",
|
|
50779
50780
|
"style": "footnote",
|
|
50780
50781
|
"color": "textSecondary",
|
|
50781
50782
|
"collapseWhenEmpty": true
|
|
@@ -50968,7 +50969,8 @@ const SCREENS = runtimeSetting({
|
|
|
50968
50969
|
"props": {
|
|
50969
50970
|
"text": "$service:himiOwnerLiteManage.summary",
|
|
50970
50971
|
"style": "caption",
|
|
50971
|
-
"color": "textSecondary"
|
|
50972
|
+
"color": "textSecondary",
|
|
50973
|
+
"collapseWhenEmpty": true
|
|
50972
50974
|
}
|
|
50973
50975
|
}
|
|
50974
50976
|
},
|
|
@@ -51563,6 +51565,9 @@ const SCREENS = runtimeSetting({
|
|
|
51563
51565
|
}
|
|
51564
51566
|
]
|
|
51565
51567
|
}
|
|
51568
|
+
},
|
|
51569
|
+
"modifiers": {
|
|
51570
|
+
"hiddenPath": "$service:himiOwnerLiteManage.noSections"
|
|
51566
51571
|
}
|
|
51567
51572
|
},
|
|
51568
51573
|
{
|
|
@@ -51946,7 +51951,8 @@ const SCREENS = runtimeSetting({
|
|
|
51946
51951
|
"actionId": "tier5.himiOwnerLiteManage.load",
|
|
51947
51952
|
"params": {
|
|
51948
51953
|
"areas": "[{\"id\":\"store\",\"title\":\"Prints\",\"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\":\"Print 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\":\"Commissions\",\"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\":\"Sessions\",\"subtitle\":\"Your upcoming appointments\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_appointments\",\"icon\":\"clock\",\"metricKey\":\"appointments\",\"countLabel\":\"appointments\"},{\"id\":\"blog\",\"title\":\"Journal\",\"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\"}]",
|
|
51949
|
-
"copy": "{\"ownerManage.blogLabel\":\"Journal\",\"ownerManage.bookingsLabel\":\"Commissions\",\"ownerManage.storeLabel\":\"Prints\",\"ownerManage.title\":\"Practice\"}"
|
|
51954
|
+
"copy": "{\"ownerManage.blogLabel\":\"Journal\",\"ownerManage.bookingsLabel\":\"Commissions\",\"ownerManage.storeLabel\":\"Prints\",\"ownerManage.title\":\"Practice\"}",
|
|
51955
|
+
"businessName": "__HIMI_APP_NAME__"
|
|
51950
51956
|
}
|
|
51951
51957
|
}
|
|
51952
51958
|
}
|
|
@@ -52065,7 +52071,7 @@ const SCREENS = runtimeSetting({
|
|
|
52065
52071
|
"package": "himalaya",
|
|
52066
52072
|
"type": "Text",
|
|
52067
52073
|
"props": {
|
|
52068
|
-
"text": "
|
|
52074
|
+
"text": "$service:himiOwnerLiteAccount.businessName",
|
|
52069
52075
|
"style": "bodyEmphasis",
|
|
52070
52076
|
"maxLines": 1
|
|
52071
52077
|
}
|
|
@@ -52328,6 +52334,7 @@ const SCREENS = runtimeSetting({
|
|
|
52328
52334
|
"supportUrl": "https://www.wix.com/support",
|
|
52329
52335
|
"privacyUrl": "https://www.wix.com/about/privacy",
|
|
52330
52336
|
"termsUrl": "https://www.wix.com/about/terms-of-use",
|
|
52337
|
+
"businessName": "__HIMI_APP_NAME__",
|
|
52331
52338
|
"copy": "{\"ownerAccount.roleValue\":\"Artist\",\"ownerAccount.subtitle\":\"Studio owner\"}"
|
|
52332
52339
|
}
|
|
52333
52340
|
}
|
|
@@ -52875,7 +52882,10 @@ const SCREENS = runtimeSetting({
|
|
|
52875
52882
|
},
|
|
52876
52883
|
"fillMaxWidth": true,
|
|
52877
52884
|
"onAppear": {
|
|
52878
|
-
"actionId": "tier5.drawer.
|
|
52885
|
+
"actionId": "tier5.drawer.refresh",
|
|
52886
|
+
"params": {
|
|
52887
|
+
"businessName": "__HIMI_APP_NAME__"
|
|
52888
|
+
}
|
|
52879
52889
|
}
|
|
52880
52890
|
}
|
|
52881
52891
|
},
|
|
@@ -56397,7 +56407,7 @@ const SCREENS = runtimeSetting({
|
|
|
56397
56407
|
"package": "himalaya",
|
|
56398
56408
|
"type": "HStack",
|
|
56399
56409
|
"props": {
|
|
56400
|
-
"spacing":
|
|
56410
|
+
"spacing": 0,
|
|
56401
56411
|
"children": [
|
|
56402
56412
|
{
|
|
56403
56413
|
"id": "",
|
|
@@ -56408,43 +56418,57 @@ const SCREENS = runtimeSetting({
|
|
|
56408
56418
|
}
|
|
56409
56419
|
},
|
|
56410
56420
|
{
|
|
56411
|
-
"id": "
|
|
56412
|
-
"body": {
|
|
56413
|
-
"package": "himalaya",
|
|
56414
|
-
"type": "Text",
|
|
56415
|
-
"props": {
|
|
56416
|
-
"text": "History",
|
|
56417
|
-
"style": "bodyEmphasis",
|
|
56418
|
-
"color": "accentPrimary",
|
|
56419
|
-
"maxLines": 1
|
|
56420
|
-
}
|
|
56421
|
-
},
|
|
56422
|
-
"modifiers": {
|
|
56423
|
-
"onTap": {
|
|
56424
|
-
"actionId": "himi.open",
|
|
56425
|
-
"params": {
|
|
56426
|
-
"screenId": "himi_owner_lite_aria_history"
|
|
56427
|
-
}
|
|
56428
|
-
}
|
|
56429
|
-
}
|
|
56430
|
-
},
|
|
56431
|
-
{
|
|
56432
|
-
"id": "himi_owner_lite_aria.newchat",
|
|
56421
|
+
"id": "",
|
|
56433
56422
|
"body": {
|
|
56434
56423
|
"package": "himalaya",
|
|
56435
|
-
"type": "
|
|
56424
|
+
"type": "HStack",
|
|
56436
56425
|
"props": {
|
|
56437
|
-
"
|
|
56438
|
-
"
|
|
56439
|
-
|
|
56426
|
+
"spacing": 16,
|
|
56427
|
+
"children": [
|
|
56428
|
+
{
|
|
56429
|
+
"id": "himi_owner_lite_aria.history",
|
|
56430
|
+
"body": {
|
|
56431
|
+
"package": "himalaya",
|
|
56432
|
+
"type": "Text",
|
|
56433
|
+
"props": {
|
|
56434
|
+
"text": "History",
|
|
56435
|
+
"style": "bodyEmphasis",
|
|
56436
|
+
"color": "accentPrimary",
|
|
56437
|
+
"maxLines": 1
|
|
56438
|
+
}
|
|
56439
|
+
},
|
|
56440
|
+
"modifiers": {
|
|
56441
|
+
"onTap": {
|
|
56442
|
+
"actionId": "himi.open",
|
|
56443
|
+
"params": {
|
|
56444
|
+
"screenId": "himi_owner_lite_aria_history"
|
|
56445
|
+
}
|
|
56446
|
+
}
|
|
56447
|
+
}
|
|
56448
|
+
},
|
|
56449
|
+
{
|
|
56450
|
+
"id": "himi_owner_lite_aria.newchat",
|
|
56451
|
+
"body": {
|
|
56452
|
+
"package": "himalaya",
|
|
56453
|
+
"type": "Icon",
|
|
56454
|
+
"props": {
|
|
56455
|
+
"name": "edit",
|
|
56456
|
+
"size": 22,
|
|
56457
|
+
"tint": "accentPrimary"
|
|
56458
|
+
}
|
|
56459
|
+
},
|
|
56460
|
+
"modifiers": {
|
|
56461
|
+
"onTap": {
|
|
56462
|
+
"actionId": "tier5.himiOwnerLiteAria.newChat"
|
|
56463
|
+
},
|
|
56464
|
+
"accessibilityLabel": "New chat",
|
|
56465
|
+
"accessibilityRole": "button",
|
|
56466
|
+
"width": 44,
|
|
56467
|
+
"height": 44
|
|
56468
|
+
}
|
|
56469
|
+
}
|
|
56470
|
+
]
|
|
56440
56471
|
}
|
|
56441
|
-
},
|
|
56442
|
-
"modifiers": {
|
|
56443
|
-
"onTap": {
|
|
56444
|
-
"actionId": "tier5.himiOwnerLiteAria.newChat"
|
|
56445
|
-
},
|
|
56446
|
-
"accessibilityLabel": "New chat",
|
|
56447
|
-
"accessibilityRole": "button"
|
|
56448
56472
|
}
|
|
56449
56473
|
}
|
|
56450
56474
|
]
|
|
@@ -56805,6 +56829,9 @@ const SCREENS = runtimeSetting({
|
|
|
56805
56829
|
}
|
|
56806
56830
|
]
|
|
56807
56831
|
}
|
|
56832
|
+
},
|
|
56833
|
+
"modifiers": {
|
|
56834
|
+
"hiddenPath": "$service:himiOwnerLiteAria.messagesHidden"
|
|
56808
56835
|
}
|
|
56809
56836
|
},
|
|
56810
56837
|
{
|
|
@@ -57103,7 +57130,8 @@ const SCREENS = runtimeSetting({
|
|
|
57103
57130
|
"text": "$service:himiOwnerLiteAria.error",
|
|
57104
57131
|
"style": "footnote",
|
|
57105
57132
|
"color": "danger",
|
|
57106
|
-
"maxLines": 3
|
|
57133
|
+
"maxLines": 3,
|
|
57134
|
+
"collapseWhenEmpty": true
|
|
57107
57135
|
}
|
|
57108
57136
|
},
|
|
57109
57137
|
"modifiers": {
|
|
@@ -61340,6 +61368,9 @@ const SCREENS = runtimeSetting({
|
|
|
61340
61368
|
}
|
|
61341
61369
|
]
|
|
61342
61370
|
}
|
|
61371
|
+
},
|
|
61372
|
+
"modifiers": {
|
|
61373
|
+
"hiddenPath": "$service:himiOwnerLiteAriaHistory.itemsHidden"
|
|
61343
61374
|
}
|
|
61344
61375
|
}
|
|
61345
61376
|
]
|
|
@@ -61846,10 +61877,10 @@ const SCREENS = runtimeSetting({
|
|
|
61846
61877
|
},
|
|
61847
61878
|
"fillMaxWidth": true,
|
|
61848
61879
|
"onTap": {
|
|
61849
|
-
"actionId": "
|
|
61880
|
+
"actionId": "tier5.himiOwnerLiteSites.pick",
|
|
61850
61881
|
"params": {
|
|
61851
|
-
"
|
|
61852
|
-
"
|
|
61882
|
+
"id": "$item.id",
|
|
61883
|
+
"name": "$item.name"
|
|
61853
61884
|
}
|
|
61854
61885
|
},
|
|
61855
61886
|
"pressFeedback": "scale",
|
|
@@ -61946,7 +61977,6 @@ const SCREENS = runtimeSetting({
|
|
|
61946
61977
|
"contentType": "application/javascript+ts-bundle",
|
|
61947
61978
|
"declaredCapabilities": [
|
|
61948
61979
|
"wix_api",
|
|
61949
|
-
"wix_platform",
|
|
61950
61980
|
"local_database"
|
|
61951
61981
|
],
|
|
61952
61982
|
"minBinaryVersion": "0.1.0",
|
|
@@ -62407,10 +62437,10 @@ const SCREENS = runtimeSetting({
|
|
|
62407
62437
|
},
|
|
62408
62438
|
"fillMaxWidth": true,
|
|
62409
62439
|
"onTap": {
|
|
62410
|
-
"actionId": "
|
|
62440
|
+
"actionId": "tier5.himiOwnerLiteOverview.pick",
|
|
62411
62441
|
"params": {
|
|
62412
|
-
"
|
|
62413
|
-
"
|
|
62442
|
+
"id": "$item.id",
|
|
62443
|
+
"name": "$item.name"
|
|
62414
62444
|
}
|
|
62415
62445
|
},
|
|
62416
62446
|
"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
|
-
|
|
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
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
|
|
3548
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
?
|
|
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 ?? "",
|