@wix/himalaya-cli 0.1483.0 → 0.1484.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 (80) hide show
  1. package/dist/cli.mjs +27 -28
  2. package/dist/preview-assets.generated.bin +0 -0
  3. package/package.json +2 -2
  4. package/templates/beauty-salon/tier5-src/_shared/collection-query.ts +13 -4
  5. package/templates/beauty-salon/tier5-src/_shared/collection-service.ts +2 -1
  6. package/templates/beauty-salon-owner/dev/index.ts +58 -19
  7. package/templates/beauty-salon-owner/tier5-src/_shared/collection-query.ts +13 -4
  8. package/templates/beauty-salon-owner/tier5-src/_shared/collection-service.ts +2 -1
  9. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  10. package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
  11. package/templates/branded-lite/tier5-src/_shared/collection-query.ts +13 -4
  12. package/templates/branded-lite/tier5-src/_shared/collection-service.ts +2 -1
  13. package/templates/community-club/tier5-src/_shared/collection-query.ts +13 -4
  14. package/templates/community-club/tier5-src/_shared/collection-service.ts +2 -1
  15. package/templates/community-club-owner/dev/index.ts +58 -19
  16. package/templates/community-club-owner/tier5-src/_shared/collection-query.ts +13 -4
  17. package/templates/community-club-owner/tier5-src/_shared/collection-service.ts +2 -1
  18. package/templates/community-club-owner/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  19. package/templates/community-club-owner/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
  20. package/templates/events-meetups/tier5-src/_shared/collection-query.ts +13 -4
  21. package/templates/events-meetups/tier5-src/_shared/collection-service.ts +2 -1
  22. package/templates/events-meetups-owner/dev/index.ts +46 -16
  23. package/templates/events-meetups-owner/tier5-src/_shared/collection-query.ts +13 -4
  24. package/templates/events-meetups-owner/tier5-src/_shared/collection-service.ts +2 -1
  25. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  26. package/templates/events-meetups-owner/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
  27. package/templates/gym-fitness/tier5-src/_shared/collection-query.ts +13 -4
  28. package/templates/gym-fitness/tier5-src/_shared/collection-service.ts +2 -1
  29. package/templates/gym-fitness-owner/dev/index.ts +62 -20
  30. package/templates/gym-fitness-owner/tier5-src/_shared/collection-query.ts +13 -4
  31. package/templates/gym-fitness-owner/tier5-src/_shared/collection-service.ts +2 -1
  32. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  33. package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
  34. package/templates/nonprofit-cause/tier5-src/_shared/collection-query.ts +13 -4
  35. package/templates/nonprofit-cause/tier5-src/_shared/collection-service.ts +2 -1
  36. package/templates/nonprofit-cause-owner/dev/index.ts +50 -17
  37. package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-query.ts +13 -4
  38. package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-service.ts +2 -1
  39. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  40. package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
  41. package/templates/owner-lite/dev/index.ts +62 -20
  42. package/templates/owner-lite/tier5-src/_shared/collection-query.ts +13 -4
  43. package/templates/owner-lite/tier5-src/_shared/collection-service.ts +2 -1
  44. package/templates/owner-lite/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  45. package/templates/owner-lite/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
  46. package/templates/podcast-creator/tier5-src/_shared/collection-query.ts +13 -4
  47. package/templates/podcast-creator/tier5-src/_shared/collection-service.ts +2 -1
  48. package/templates/podcast-creator-owner/dev/index.ts +58 -19
  49. package/templates/podcast-creator-owner/tier5-src/_shared/collection-query.ts +13 -4
  50. package/templates/podcast-creator-owner/tier5-src/_shared/collection-service.ts +2 -1
  51. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  52. package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
  53. package/templates/portfolio-creative/tier5-src/_shared/collection-query.ts +13 -4
  54. package/templates/portfolio-creative/tier5-src/_shared/collection-service.ts +2 -1
  55. package/templates/portfolio-creative-owner/dev/index.ts +58 -19
  56. package/templates/portfolio-creative-owner/tier5-src/_shared/collection-query.ts +13 -4
  57. package/templates/portfolio-creative-owner/tier5-src/_shared/collection-service.ts +2 -1
  58. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  59. package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
  60. package/templates/restaurant/tier5-src/_shared/collection-query.ts +13 -4
  61. package/templates/restaurant/tier5-src/_shared/collection-service.ts +2 -1
  62. package/templates/restaurant-owner/dev/index.ts +62 -20
  63. package/templates/restaurant-owner/tier5-src/_shared/collection-query.ts +13 -4
  64. package/templates/restaurant-owner/tier5-src/_shared/collection-service.ts +2 -1
  65. package/templates/restaurant-owner/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  66. package/templates/restaurant-owner/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
  67. package/templates/retail-store/tier5-src/_shared/collection-query.ts +13 -4
  68. package/templates/retail-store/tier5-src/_shared/collection-service.ts +2 -1
  69. package/templates/retail-store-owner/dev/index.ts +54 -18
  70. package/templates/retail-store-owner/tier5-src/_shared/collection-query.ts +13 -4
  71. package/templates/retail-store-owner/tier5-src/_shared/collection-service.ts +2 -1
  72. package/templates/retail-store-owner/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  73. package/templates/retail-store-owner/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
  74. package/templates/yoga-studio/tier5-src/_shared/collection-query.ts +13 -4
  75. package/templates/yoga-studio/tier5-src/_shared/collection-service.ts +2 -1
  76. package/templates/yoga-studio-owner/dev/index.ts +50 -17
  77. package/templates/yoga-studio-owner/tier5-src/_shared/collection-query.ts +13 -4
  78. package/templates/yoga-studio-owner/tier5-src/_shared/collection-service.ts +2 -1
  79. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-manage/index.ts +5 -3
  80. package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-manage/logic.ts +30 -0
@@ -49603,7 +49603,10 @@ const SCREENS = runtimeSetting({
49603
49603
  "action": {
49604
49604
  "actionId": "himi.open",
49605
49605
  "params": {
49606
- "screenId": "himi_owner_lite_sites"
49606
+ "screenId": "himi_owner_lite_sites",
49607
+ "title": "Your businesses",
49608
+ "subtitle": "Choose a business to manage",
49609
+ "search": "button"
49607
49610
  }
49608
49611
  }
49609
49612
  }
@@ -50793,7 +50796,10 @@ const SCREENS = runtimeSetting({
50793
50796
  "actionId": "himi.open",
50794
50797
  "params": {
50795
50798
  "screenId": "himi_owner_lite_orders",
50796
- "collectionFilter": "value:Recent 7 days"
50799
+ "collectionFilter": "value:Recent 7 days",
50800
+ "title": "Orders",
50801
+ "subtitle": "Follow up on payments and fulfillment.",
50802
+ "search": "button"
50797
50803
  }
50798
50804
  },
50799
50805
  "pressFeedback": "scale",
@@ -50862,7 +50868,10 @@ const SCREENS = runtimeSetting({
50862
50868
  "actionId": "himi.open",
50863
50869
  "params": {
50864
50870
  "screenId": "himi_owner_lite_orders",
50865
- "collectionFilter": "value:Recent 7 days"
50871
+ "collectionFilter": "value:Recent 7 days",
50872
+ "title": "Orders",
50873
+ "subtitle": "Follow up on payments and fulfillment.",
50874
+ "search": "button"
50866
50875
  }
50867
50876
  },
50868
50877
  "pressFeedback": "scale",
@@ -51079,7 +51088,10 @@ const SCREENS = runtimeSetting({
51079
51088
  "actionId": "himi.open",
51080
51089
  "params": {
51081
51090
  "screenId": "himi_owner_lite_appointments",
51082
- "collectionFilter": "all"
51091
+ "collectionFilter": "all",
51092
+ "title": "Appointments",
51093
+ "subtitle": "Upcoming bookings across your services.",
51094
+ "search": "button"
51083
51095
  }
51084
51096
  },
51085
51097
  "pressFeedback": "scale",
@@ -51148,7 +51160,10 @@ const SCREENS = runtimeSetting({
51148
51160
  "actionId": "himi.open",
51149
51161
  "params": {
51150
51162
  "screenId": "himi_owner_lite_events",
51151
- "collectionFilter": "value:Upcoming"
51163
+ "collectionFilter": "value:Upcoming",
51164
+ "title": "Events",
51165
+ "subtitle": "Your upcoming events.",
51166
+ "search": "button"
51152
51167
  }
51153
51168
  },
51154
51169
  "pressFeedback": "scale",
@@ -51229,7 +51244,10 @@ const SCREENS = runtimeSetting({
51229
51244
  "actionId": "himi.open",
51230
51245
  "params": {
51231
51246
  "screenId": "himi_owner_lite_products",
51232
- "collectionFilter": "all"
51247
+ "collectionFilter": "all",
51248
+ "title": "Store",
51249
+ "subtitle": "Products in your Wix store.",
51250
+ "search": "button"
51233
51251
  }
51234
51252
  },
51235
51253
  "pressFeedback": "scale",
@@ -51298,7 +51316,10 @@ const SCREENS = runtimeSetting({
51298
51316
  "actionId": "himi.open",
51299
51317
  "params": {
51300
51318
  "screenId": "himi_owner_lite_posts",
51301
- "collectionFilter": "all"
51319
+ "collectionFilter": "all",
51320
+ "title": "Blog",
51321
+ "subtitle": "Your posts — drafts and published.",
51322
+ "search": "button"
51302
51323
  }
51303
51324
  },
51304
51325
  "pressFeedback": "scale",
@@ -51367,7 +51388,10 @@ const SCREENS = runtimeSetting({
51367
51388
  "actionId": "himi.open",
51368
51389
  "params": {
51369
51390
  "screenId": "himi_owner_lite_sites",
51370
- "collectionFilter": "all"
51391
+ "collectionFilter": "all",
51392
+ "title": "Your businesses",
51393
+ "subtitle": "Choose a business to manage",
51394
+ "search": "button"
51371
51395
  }
51372
51396
  },
51373
51397
  "pressFeedback": "scale",
@@ -51461,7 +51485,9 @@ const SCREENS = runtimeSetting({
51461
51485
  "action": {
51462
51486
  "actionId": "himi.open",
51463
51487
  "params": {
51464
- "screenId": "himi_owner_lite_brief"
51488
+ "screenId": "himi_owner_lite_brief",
51489
+ "title": "Today",
51490
+ "subtitle": "What needs your attention, laid out by the assistant."
51465
51491
  }
51466
51492
  }
51467
51493
  }
@@ -51816,7 +51842,8 @@ const SCREENS = runtimeSetting({
51816
51842
  "action": {
51817
51843
  "actionId": "himi.open",
51818
51844
  "params": {
51819
- "screenId": "himi_owner_lite_manage"
51845
+ "screenId": "himi_owner_lite_manage",
51846
+ "search": "drawer"
51820
51847
  }
51821
51848
  }
51822
51849
  }
@@ -52842,7 +52869,10 @@ const SCREENS = runtimeSetting({
52842
52869
  "onTap": {
52843
52870
  "actionId": "himi.open",
52844
52871
  "params": {
52845
- "screenId": "himi_owner_lite_search"
52872
+ "screenId": "himi_owner_lite_search",
52873
+ "title": "Search records",
52874
+ "subtitle": "Across your business areas",
52875
+ "search": "drawer"
52846
52876
  }
52847
52877
  },
52848
52878
  "pressFeedback": "scale",
@@ -53042,7 +53072,9 @@ const SCREENS = runtimeSetting({
53042
53072
  "onTap": {
53043
53073
  "actionId": "himi.open",
53044
53074
  "params": {
53045
- "screenId": "himi_owner_lite_analytics"
53075
+ "screenId": "himi_owner_lite_analytics",
53076
+ "title": "Analytics",
53077
+ "subtitle": "How your site is doing"
53046
53078
  }
53047
53079
  },
53048
53080
  "pressFeedback": "scale",
@@ -53066,7 +53098,7 @@ const SCREENS = runtimeSetting({
53066
53098
  "onAppear": {
53067
53099
  "actionId": "tier5.himiOwnerLiteManage.load",
53068
53100
  "params": {
53069
- "areas": "[{\"id\":\"store\",\"title\":\"Store\",\"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\",\"handoffLabel\":\"Open in Wix: Store\"},{\"id\":\"himi_owner_lite_orders\",\"title\":\"Orders\",\"subtitle\":\"Review and complete customer orders\",\"groupId\":\"commerce\",\"group\":\"Commerce\",\"screenId\":\"himi_owner_lite_orders\",\"icon\":\"cart\",\"metricKey\":\"orders\",\"countLabel\":\"orders\",\"handoffLabel\":\"Open in Wix: Orders\"},{\"id\":\"bookings\",\"title\":\"Bookings\",\"subtitle\":\"Services and your schedule\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_services\",\"icon\":\"calendar\",\"metricKey\":\"services\",\"countLabel\":\"services\",\"handoffLabel\":\"Open in Wix: Bookings\"},{\"id\":\"himi_owner_lite_appointments\",\"title\":\"Appointments\",\"subtitle\":\"Your upcoming appointments\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_appointments\",\"icon\":\"clock\",\"metricKey\":\"appointments\",\"countLabel\":\"appointments\",\"handoffLabel\":\"Open in Wix: Appointments\"},{\"id\":\"events\",\"title\":\"Events\",\"subtitle\":\"Events and attendance\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_events\",\"icon\":\"calendar\",\"metricKey\":\"events\",\"countLabel\":\"events\",\"handoffLabel\":\"Open in Wix: Events\"},{\"id\":\"blog\",\"title\":\"Blog\",\"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\",\"handoffLabel\":\"Open in Wix: Blog\"},{\"id\":\"faq\",\"title\":\"FAQ\",\"subtitle\":\"Questions, answers and categories\",\"groupId\":\"content\",\"group\":\"Content\",\"screenId\":\"himi_owner_lite_faq\",\"icon\":\"question\",\"metricKey\":\"faq\",\"countLabel\":\"questions\",\"createScreenId\":\"himi_owner_lite_faq_question_new\",\"createLabel\":\"Add question\",\"handoffLabel\":\"Open in Wix: FAQ\"},{\"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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: 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\",\"handoffLabel\":\"Open in Wix: Donation campaigns\"}]",
53101
+ "areas": "[{\"id\":\"store\",\"title\":\"Store\",\"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\",\"handoffLabel\":\"Open in Wix: Store\",\"navigation\":{\"title\":\"Store\",\"subtitle\":\"Products in your Wix store.\",\"search\":\"button\"}},{\"id\":\"himi_owner_lite_orders\",\"title\":\"Orders\",\"subtitle\":\"Review and complete customer orders\",\"groupId\":\"commerce\",\"group\":\"Commerce\",\"screenId\":\"himi_owner_lite_orders\",\"icon\":\"cart\",\"metricKey\":\"orders\",\"countLabel\":\"orders\",\"handoffLabel\":\"Open in Wix: Orders\",\"navigation\":{\"title\":\"Orders\",\"subtitle\":\"Follow up on payments and fulfillment.\",\"search\":\"button\"}},{\"id\":\"bookings\",\"title\":\"Bookings\",\"subtitle\":\"Services and your schedule\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_services\",\"icon\":\"calendar\",\"metricKey\":\"services\",\"countLabel\":\"services\",\"handoffLabel\":\"Open in Wix: Bookings\",\"navigation\":{\"title\":\"Bookings\",\"subtitle\":\"Services this business offers.\",\"search\":\"button\"}},{\"id\":\"himi_owner_lite_appointments\",\"title\":\"Appointments\",\"subtitle\":\"Your upcoming appointments\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_appointments\",\"icon\":\"clock\",\"metricKey\":\"appointments\",\"countLabel\":\"appointments\",\"handoffLabel\":\"Open in Wix: Appointments\",\"navigation\":{\"title\":\"Appointments\",\"subtitle\":\"Upcoming bookings across your services.\",\"search\":\"button\"}},{\"id\":\"events\",\"title\":\"Events\",\"subtitle\":\"Events and attendance\",\"groupId\":\"scheduling\",\"group\":\"Scheduling\",\"screenId\":\"himi_owner_lite_events\",\"icon\":\"calendar\",\"metricKey\":\"events\",\"countLabel\":\"events\",\"handoffLabel\":\"Open in Wix: Events\",\"navigation\":{\"title\":\"Events\",\"subtitle\":\"Your upcoming events.\",\"search\":\"button\"}},{\"id\":\"blog\",\"title\":\"Blog\",\"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\",\"handoffLabel\":\"Open in Wix: Blog\",\"navigation\":{\"title\":\"Blog\",\"subtitle\":\"Your posts — drafts and published.\",\"search\":\"button\"}},{\"id\":\"faq\",\"title\":\"FAQ\",\"subtitle\":\"Questions, answers and categories\",\"groupId\":\"content\",\"group\":\"Content\",\"screenId\":\"himi_owner_lite_faq\",\"icon\":\"question\",\"metricKey\":\"faq\",\"countLabel\":\"questions\",\"createScreenId\":\"himi_owner_lite_faq_question_new\",\"createLabel\":\"Add question\",\"handoffLabel\":\"Open in Wix: FAQ\",\"navigation\":{\"title\":\"FAQ\",\"subtitle\":\"Manage visitor questions, answers and categories.\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Coupons\",\"navigation\":{\"title\":\"Coupons\",\"subtitle\":\"Offers, codes and usage\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Invoices\",\"navigation\":{\"title\":\"Invoices\",\"subtitle\":\"Customers, balances and payment status\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Gift cards\",\"navigation\":{\"title\":\"Gift cards\",\"subtitle\":\"Balances, recipients and expiration\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Contacts\",\"navigation\":{\"title\":\"Contacts\",\"subtitle\":\"Your customer relationships\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Members\",\"navigation\":{\"title\":\"Members\",\"subtitle\":\"Membership access and profiles\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Groups\",\"navigation\":{\"title\":\"Groups\",\"subtitle\":\"Communities and conversations\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Reviews\",\"navigation\":{\"title\":\"Reviews\",\"subtitle\":\"Published and pending customer feedback\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Plans\",\"navigation\":{\"title\":\"Plans\",\"subtitle\":\"Pricing, benefits and visibility\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Subscriptions\",\"navigation\":{\"title\":\"Subscriptions\",\"subtitle\":\"Member plans and subscription status\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Programs\",\"navigation\":{\"title\":\"Programs\",\"subtitle\":\"Learning experiences and participation\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Badges\",\"navigation\":{\"title\":\"Badges\",\"subtitle\":\"Recognition, access and member badges\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Reservations\",\"navigation\":{\"title\":\"Reservations\",\"subtitle\":\"Guests, tables and arrival times\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Forms\",\"navigation\":{\"title\":\"Forms\",\"subtitle\":\"Forms and their configuration\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Portfolio\",\"navigation\":{\"title\":\"Portfolio\",\"subtitle\":\"Projects, stories and galleries\",\"search\":\"button\"}},{\"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\",\"handoffLabel\":\"Open in Wix: Donation campaigns\",\"navigation\":{\"title\":\"Donation campaigns\",\"subtitle\":\"Campaign goals, status and fundraising\",\"search\":\"button\"}}]",
53070
53102
  "businessName": "__HIMI_APP_NAME__"
53071
53103
  }
53072
53104
  }
@@ -55578,7 +55610,9 @@ const SCREENS = runtimeSetting({
55578
55610
  "onTap": {
55579
55611
  "actionId": "himi.open",
55580
55612
  "params": {
55581
- "screenId": "himi_owner_lite_analytics_report"
55613
+ "screenId": "himi_owner_lite_analytics_report",
55614
+ "title": "Build a report",
55615
+ "subtitle": "Any subject area your site tracks"
55582
55616
  }
55583
55617
  },
55584
55618
  "pressFeedback": "highlight"
@@ -56734,7 +56768,8 @@ const SCREENS = runtimeSetting({
56734
56768
  "action": {
56735
56769
  "actionId": "himi.open",
56736
56770
  "params": {
56737
- "screenId": "himi_owner_lite_manage"
56771
+ "screenId": "himi_owner_lite_manage",
56772
+ "search": "drawer"
56738
56773
  }
56739
56774
  }
56740
56775
  }
@@ -57371,7 +57406,8 @@ const SCREENS = runtimeSetting({
57371
57406
  "action": {
57372
57407
  "actionId": "himi.open",
57373
57408
  "params": {
57374
- "screenId": "himi_owner_lite_manage"
57409
+ "screenId": "himi_owner_lite_manage",
57410
+ "search": "drawer"
57375
57411
  }
57376
57412
  }
57377
57413
  }
@@ -62568,7 +62604,9 @@ const SCREENS = runtimeSetting({
62568
62604
  "onTap": {
62569
62605
  "actionId": "himi.open",
62570
62606
  "params": {
62571
- "screenId": "himi_owner_lite_aria_history"
62607
+ "screenId": "himi_owner_lite_aria_history",
62608
+ "title": "Conversations",
62609
+ "subtitle": "Pick up where you left off."
62572
62610
  }
62573
62611
  },
62574
62612
  "accessibilityLabel": "History",
@@ -63875,7 +63913,8 @@ const SCREENS = runtimeSetting({
63875
63913
  "actionId": "himi.open",
63876
63914
  "params": {
63877
63915
  "screenId": "himi_owner_lite_aria",
63878
- "conversationId": "$item.id"
63916
+ "conversationId": "$item.id",
63917
+ "title": "Aria"
63879
63918
  }
63880
63919
  }
63881
63920
  }
@@ -64013,7 +64052,9 @@ const SCREENS = runtimeSetting({
64013
64052
  "action": {
64014
64053
  "actionId": "himi.open",
64015
64054
  "params": {
64016
- "screenId": "himi_owner_lite_overview"
64055
+ "screenId": "himi_owner_lite_overview",
64056
+ "title": "Across your businesses",
64057
+ "subtitle": "What needs you, everywhere at once"
64017
64058
  }
64018
64059
  }
64019
64060
  }
@@ -90593,7 +90634,8 @@ const TEMPLATED: { pattern: string; display: string; liveSeed?: LiveSeed; static
90593
90634
  "action": {
90594
90635
  "actionId": "himi.open",
90595
90636
  "params": {
90596
- "screenId": "himi_owner_lite_manage"
90637
+ "screenId": "himi_owner_lite_manage",
90638
+ "search": "drawer"
90597
90639
  }
90598
90640
  }
90599
90641
  }
@@ -84,14 +84,17 @@ export function createCollectionQuery<Row>(source: CollectionQuerySource<Row>, p
84
84
  }
85
85
  return result;
86
86
  };
87
- const fetch = async (append: boolean): Promise<void> => {
87
+ /** [keepRows]: a search typed over the rows on screen leaves them there until its answer arrives (status stays
88
+ * `loading`, and nothing pages under the old answer), so the list is not blanked on each keystroke. */
89
+ const fetch = async (append: boolean, keepRows = false): Promise<void> => {
88
90
  if (disposed || (append && (state.loadingMore || state.status === 'loading' || !state.nextCursor))) return;
89
91
  const revision = append ? generation : ++generation;
90
92
  const cursor = append ? state.nextCursor : '';
91
93
  const criteria = copyQuery(state.criteria);
92
94
  if (!append) loadedPages = 0;
93
95
  state = { ...state, status: append ? 'ready' : 'loading', loadingMore: append, pageError: false, error: '',
94
- ...(append ? {} : { items: [], nextCursor: '', total: undefined, metadata: undefined, complete: false, provisional: false }) };
96
+ ...(append ? {} : keepRows ? { nextCursor: '', complete: false, provisional: false }
97
+ : { items: [], nextCursor: '', total: undefined, metadata: undefined, complete: false, provisional: false }) };
95
98
  emit();
96
99
  try {
97
100
  if (!append && source.cached) {
@@ -117,7 +120,9 @@ export function createCollectionQuery<Row>(source: CollectionQuerySource<Row>, p
117
120
  clearedByError = clear || /HTTP 40[13]\b/.test(String(error));
118
121
  if (clearedByError) lastShown = undefined;
119
122
  if (clear) loadedPages = 0;
120
- state = { ...state, ...(clear ? { items: [], nextCursor: '', total: undefined, metadata: undefined } : {}),
123
+ // The rows a typed search kept on screen while it ran were never its answer: a failed one shows none of them.
124
+ const drop = clear || keepRows;
125
+ state = { ...state, ...(drop ? { items: [], nextCursor: '', total: undefined, metadata: undefined } : {}),
121
126
  status: append && !clear ? 'ready' : 'error', loadingMore: false, pageError: append && !clear, complete: false,
122
127
  provisional: false, error: source.errorMessage?.(error) ?? '' };
123
128
  }
@@ -134,9 +139,13 @@ export function createCollectionQuery<Row>(source: CollectionQuerySource<Row>, p
134
139
  const count = restorePages && same ? Math.max(loadedPages, restoringPages, 1) : 1;
135
140
  const showing = lastShown && sameCriteria(lastShown.state.criteria, next) ? lastShown : undefined;
136
141
  restoringPages = count;
142
+ // Only the search text changed: the user is typing over the rows on screen, also while the last keystroke's
143
+ // search is still out.
144
+ const typing = !same && (state.status === 'ready' || state.status === 'loading')
145
+ && sameCriteria({ ...state.criteria, query: '' }, { ...next, query: '' });
137
146
  state = { ...state, criteria: next };
138
147
  if (revalidate && showing) { revalidating = generation + 1; clearedByError = false; }
139
- const pending = fetch(false);
148
+ const pending = fetch(false, typing);
140
149
  const revision = generation;
141
150
  await pending;
142
151
  // Re-appearance revalidates every previously opened page using fresh
@@ -194,7 +194,8 @@ export function decorateCollection(name: string, def: { state: State; actions?:
194
194
  noSignIn: !signInRequired,
195
195
  errorTitle: signInRequired ? copyParam('collection.signInTitle', 'Sign in to see this') : copyParam('collection.loadErrorTitle', 'This collection could not load'),
196
196
  errorMessage,
197
- noLoading: !loading,
197
+ // A skeleton only with nothing to show: a search re-running over the rows on screen keeps them.
198
+ noLoading: !loading || rows.length > 0,
198
199
  // De-dup against a domain that paints its OWN empty block (screen-kit emptyBlock is
199
200
  // gated on the domain's top-level `noEmpty`): only one empty state ever shows.
200
201
  noEmptySource: !sourceEmpty || s.noEmpty === false,
@@ -17,7 +17,7 @@ import { OWNER_MODULES, ownerModuleId } from '../_shared/owner-modules.js';
17
17
  import { localPreferences } from '../_shared/local-preferences.js';
18
18
  import { stashCopy, copyParam, copyTemplate } from '../_shared/himi-copy.js';
19
19
  import { fallbackNameFrom, selectedSiteName } from '../_shared/owner-selected-site.js';
20
- import { DASHBOARD_PATHS, deriveManage, parseAreas, recentAreas, metricFailure, rememberArea, withMetrics, type ManageArea, type Metric, type MetricFailure } from './logic.js';
20
+ import { DASHBOARD_PATHS, deriveManage, navigationArgs, parseAreas, recentAreas, metricFailure, rememberArea, withMetrics, type ManageArea, type Metric, type MetricFailure } from './logic.js';
21
21
 
22
22
  interface State {
23
23
  /** The business the header names: the one picked on Sites, else the descriptor's
@@ -339,13 +339,15 @@ const svc = defineService<State, {
339
339
  const area = findArea(state, arg);
340
340
  if (!area) return state;
341
341
  const next = remember(state, area);
342
- return navigate(next, { screenId: area.screenId }) as State;
342
+ const args = navigationArgs(area.navigation);
343
+ return navigate(next, { screenId: area.screenId, ...(args ? { args } : {}) }) as State;
343
344
  },
344
345
  create: (state, arg) => {
345
346
  const area = findArea(state, arg);
346
347
  if (!area?.createScreenId) return state;
347
348
  const next = remember(state, area);
348
- return navigate(next, { screenId: area.createScreenId }) as State;
349
+ const args = navigationArgs(area.createNavigation);
350
+ return navigate(next, { screenId: area.createScreenId, ...(args ? { args } : {}) }) as State;
349
351
  },
350
352
  handoff: async (state, arg) => {
351
353
  const area = findArea(state, arg);
@@ -52,6 +52,34 @@ export interface ManageArea {
52
52
  hideHandoff?: boolean;
53
53
  /** The accessible name of this area's "Open in Wix", which carries the area ("Open in Wix: Store"). */
54
54
  handoffLabel?: string;
55
+ /** The navigation its page declares (`hostTitle`, `topBar.searchable`), for the host's bar the moment it opens it. */
56
+ navigation?: ManageNavigation;
57
+ /** The same for its create screen. */
58
+ createNavigation?: ManageNavigation;
59
+ }
60
+
61
+ /** A page's navigation as the build declares it: its title and subtitle, and where its search goes (none without one). */
62
+ export interface ManageNavigation {
63
+ title?: string;
64
+ subtitle?: string;
65
+ search?: "drawer" | "button";
66
+ }
67
+
68
+ function parseNavigation(value: unknown): ManageNavigation | undefined {
69
+ if (!value || typeof value !== "object") return undefined;
70
+ const raw = value as Record<string, unknown>;
71
+ const title = clean(raw.title);
72
+ const subtitle = title ? clean(raw.subtitle) : "";
73
+ const search = raw.search === "drawer" || raw.search === "button" ? raw.search : undefined;
74
+ if (!title && !search) return undefined;
75
+ return { ...(title ? { title } : {}), ...(subtitle ? { subtitle } : {}), ...(search ? { search } : {}) };
76
+ }
77
+
78
+ /** The open action's arguments that carry [navigation] to the host: strings only, as `_nav.args` takes them. */
79
+ export function navigationArgs(navigation: ManageNavigation | undefined): Record<string, string> | undefined {
80
+ if (!navigation) return undefined;
81
+ return { ...(navigation.title ? { title: navigation.title } : {}), ...(navigation.subtitle ? { subtitle: navigation.subtitle } : {}),
82
+ ...(navigation.search ? { search: navigation.search } : {}) };
55
83
  }
56
84
 
57
85
  export interface ManageSection {
@@ -98,6 +126,8 @@ export function parseAreas(value: unknown): ManageArea[] {
98
126
  hideCreate: !(createScreenId && createLabel),
99
127
  hideHandoff: !DASHBOARD_PATHS[area.id],
100
128
  handoffLabel: clean(raw.handoffLabel) || `Open in Wix: ${area.title}`,
129
+ ...(parseNavigation(raw.navigation) ? { navigation: parseNavigation(raw.navigation) } : {}),
130
+ ...(createScreenId && createLabel && parseNavigation(raw.createNavigation) ? { createNavigation: parseNavigation(raw.createNavigation) } : {}),
101
131
  metricText: "—",
102
132
  statusText: "",
103
133
  unavailable: false,
@@ -84,14 +84,17 @@ export function createCollectionQuery<Row>(source: CollectionQuerySource<Row>, p
84
84
  }
85
85
  return result;
86
86
  };
87
- const fetch = async (append: boolean): Promise<void> => {
87
+ /** [keepRows]: a search typed over the rows on screen leaves them there until its answer arrives (status stays
88
+ * `loading`, and nothing pages under the old answer), so the list is not blanked on each keystroke. */
89
+ const fetch = async (append: boolean, keepRows = false): Promise<void> => {
88
90
  if (disposed || (append && (state.loadingMore || state.status === 'loading' || !state.nextCursor))) return;
89
91
  const revision = append ? generation : ++generation;
90
92
  const cursor = append ? state.nextCursor : '';
91
93
  const criteria = copyQuery(state.criteria);
92
94
  if (!append) loadedPages = 0;
93
95
  state = { ...state, status: append ? 'ready' : 'loading', loadingMore: append, pageError: false, error: '',
94
- ...(append ? {} : { items: [], nextCursor: '', total: undefined, metadata: undefined, complete: false, provisional: false }) };
96
+ ...(append ? {} : keepRows ? { nextCursor: '', complete: false, provisional: false }
97
+ : { items: [], nextCursor: '', total: undefined, metadata: undefined, complete: false, provisional: false }) };
95
98
  emit();
96
99
  try {
97
100
  if (!append && source.cached) {
@@ -117,7 +120,9 @@ export function createCollectionQuery<Row>(source: CollectionQuerySource<Row>, p
117
120
  clearedByError = clear || /HTTP 40[13]\b/.test(String(error));
118
121
  if (clearedByError) lastShown = undefined;
119
122
  if (clear) loadedPages = 0;
120
- state = { ...state, ...(clear ? { items: [], nextCursor: '', total: undefined, metadata: undefined } : {}),
123
+ // The rows a typed search kept on screen while it ran were never its answer: a failed one shows none of them.
124
+ const drop = clear || keepRows;
125
+ state = { ...state, ...(drop ? { items: [], nextCursor: '', total: undefined, metadata: undefined } : {}),
121
126
  status: append && !clear ? 'ready' : 'error', loadingMore: false, pageError: append && !clear, complete: false,
122
127
  provisional: false, error: source.errorMessage?.(error) ?? '' };
123
128
  }
@@ -134,9 +139,13 @@ export function createCollectionQuery<Row>(source: CollectionQuerySource<Row>, p
134
139
  const count = restorePages && same ? Math.max(loadedPages, restoringPages, 1) : 1;
135
140
  const showing = lastShown && sameCriteria(lastShown.state.criteria, next) ? lastShown : undefined;
136
141
  restoringPages = count;
142
+ // Only the search text changed: the user is typing over the rows on screen, also while the last keystroke's
143
+ // search is still out.
144
+ const typing = !same && (state.status === 'ready' || state.status === 'loading')
145
+ && sameCriteria({ ...state.criteria, query: '' }, { ...next, query: '' });
137
146
  state = { ...state, criteria: next };
138
147
  if (revalidate && showing) { revalidating = generation + 1; clearedByError = false; }
139
- const pending = fetch(false);
148
+ const pending = fetch(false, typing);
140
149
  const revision = generation;
141
150
  await pending;
142
151
  // Re-appearance revalidates every previously opened page using fresh
@@ -194,7 +194,8 @@ export function decorateCollection(name: string, def: { state: State; actions?:
194
194
  noSignIn: !signInRequired,
195
195
  errorTitle: signInRequired ? copyParam('collection.signInTitle', 'Sign in to see this') : copyParam('collection.loadErrorTitle', 'This collection could not load'),
196
196
  errorMessage,
197
- noLoading: !loading,
197
+ // A skeleton only with nothing to show: a search re-running over the rows on screen keeps them.
198
+ noLoading: !loading || rows.length > 0,
198
199
  // De-dup against a domain that paints its OWN empty block (screen-kit emptyBlock is
199
200
  // gated on the domain's top-level `noEmpty`): only one empty state ever shows.
200
201
  noEmptySource: !sourceEmpty || s.noEmpty === false,