@pisell/private-materials 6.3.132 → 6.3.134

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 (177) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/meta.js +1 -1
  5. package/build/lowcode/render/default/view.js +1 -1
  6. package/build/lowcode/view.js +1 -1
  7. package/es/components/venueBooking/components/Content/index.js +2 -2
  8. package/es/components/venueBooking/components/Header/index.js +1 -1
  9. package/es/components/venueBooking/components/VenueSelection/components/CourtFilter.js +1 -17
  10. package/es/components/venueBooking/components/VenueSelection/components/TimeGrid.js +11 -18
  11. package/es/components/venueBooking/components/VenueSelection/index.js +1 -1
  12. package/es/components/venueBooking/context.js +49 -20
  13. package/es/components/venueBooking/locales.d.ts +5 -0
  14. package/es/components/venueBooking/locales.js +5 -0
  15. package/lib/components/venueBooking/components/Content/index.js +2 -2
  16. package/lib/components/venueBooking/components/Header/index.js +1 -1
  17. package/lib/components/venueBooking/components/VenueSelection/components/CourtFilter.js +1 -10
  18. package/lib/components/venueBooking/components/VenueSelection/components/TimeGrid.js +8 -7
  19. package/lib/components/venueBooking/components/VenueSelection/index.js +1 -1
  20. package/lib/components/venueBooking/context.js +20 -5
  21. package/lib/components/venueBooking/locales.d.ts +5 -0
  22. package/lib/components/venueBooking/locales.js +5 -0
  23. package/package.json +1 -1
  24. package/es/components/appointmentBooking/components/Form/index.d.ts +0 -4
  25. package/es/components/appointmentBooking/components/Services/index.d.ts +0 -4
  26. package/es/components/appointmentBooking/deposit/components/PolicyModal/index.d.ts +0 -4
  27. package/es/components/appointmentBooking/hooks.d.ts +0 -107
  28. package/es/components/appointmentBooking/utils.d.ts +0 -227
  29. package/es/components/booking/components/footer/utils.d.ts +0 -47
  30. package/es/components/booking/components/reloadResourceModal/index.d.ts +0 -9
  31. package/es/components/booking/components/voucher/index.d.ts +0 -4
  32. package/es/components/booking/info/service/editService/constants.d.ts +0 -1
  33. package/es/components/booking/info/service/editService/index.d.ts +0 -7
  34. package/es/components/booking/info/service2/utils.d.ts +0 -248
  35. package/es/components/booking/info2/index.d.ts +0 -12
  36. package/es/components/booking/info2/service/addService/index.d.ts +0 -12
  37. package/es/components/booking/locales.d.ts +0 -1489
  38. package/es/components/booking/model.d.ts +0 -120
  39. package/es/components/eftposPay/amount.d.ts +0 -21
  40. package/es/components/eftposPay/app.d.ts +0 -11
  41. package/es/components/eftposPay/component/fail/failCustom.d.ts +0 -4
  42. package/es/components/eftposPay/component/fail/index.d.ts +0 -4
  43. package/es/components/eftposPay/component/fail/network.d.ts +0 -9
  44. package/es/components/eftposPay/component/fail/unknow.d.ts +0 -10
  45. package/es/components/eftposPay/component/manual/index.d.ts +0 -10
  46. package/es/components/eftposPay/component/signature/index.d.ts +0 -9
  47. package/es/components/eftposPay/device.d.ts +0 -24
  48. package/es/components/eftposPay/index.d.ts +0 -5
  49. package/es/components/eftposPay/linkly/hooks/normal.d.ts +0 -30
  50. package/es/components/eftposPay/linkly/hooks/useTimeQuery.d.ts +0 -4
  51. package/es/components/eftposPay/linkly/index.d.ts +0 -3
  52. package/es/components/eftposPay/pay.d.ts +0 -21
  53. package/es/components/eftposPay/payo/config.d.ts +0 -13
  54. package/es/components/eftposPay/payo/hooks.d.ts +0 -10
  55. package/es/components/eftposPay/payo/payment.d.ts +0 -66
  56. package/es/components/eftposPay/tip.d.ts +0 -10
  57. package/es/components/eftposPay/tyro/index.d.ts +0 -9
  58. package/es/components/eftposPay/utils/payLog.d.ts +0 -81
  59. package/es/components/eftposPay/windcave/receiptAction.d.ts +0 -23
  60. package/es/components/eftposPay/windcave/windcave.d.ts +0 -7
  61. package/es/components/kioskSkuDetail/index.d.ts +0 -39
  62. package/es/components/kioskSkuDetail/locales.d.ts +0 -48
  63. package/es/components/pay/toC/PaymentMethods/GlobePayAliPayH5/index.d.ts +0 -10
  64. package/es/components/pay/toC/PaymentMethods/GlobePayPaypalH5/index.d.ts +0 -10
  65. package/es/components/pay/toC/PaymentMethods/GlobePayWxH5/index.d.ts +0 -10
  66. package/es/components/pay/toC/PaymentMethods/MWCreditCard/TDSPay/index.d.ts +0 -16
  67. package/es/components/pay/toC/PaymentMethods/MWCreditCard/index.d.ts +0 -15
  68. package/es/components/pay/toC/PaymentMethods/MWCreditCard/tds2.d.ts +0 -83
  69. package/es/components/pay/toC/PaymentMethods/SuperPayAliPayH5/index.d.ts +0 -10
  70. package/es/components/pay/toC/PaymentMethods/SuperPayWxPayH5/index.d.ts +0 -10
  71. package/es/components/pay/toC/PaymentMethods/WalletPass/List/index.d.ts +0 -22
  72. package/es/components/pay/toC/PaymentMethods/WalletPass/index.d.ts +0 -25
  73. package/es/components/pay/toC/PaymentMethods/WalletPass/utils.d.ts +0 -16
  74. package/es/components/pay/toC/PaymentMethods/index.d.ts +0 -9
  75. package/es/components/pay/toC/index.d.ts +0 -3
  76. package/es/components/pay/toC/locales.d.ts +0 -631
  77. package/es/components/pay/toC/payGroup.d.ts +0 -59
  78. package/es/components/pay/toC/serve.d.ts +0 -87
  79. package/es/components/pay/toC/utils.d.ts +0 -65
  80. package/es/components/ruleSetting/locales.d.ts +0 -78
  81. package/es/components/ticketBooking/components/addServiceVariant/addService.d.ts +0 -10
  82. package/es/components/ticketBooking/components/ticketBooking/index.d.ts +0 -5
  83. package/es/components/ticketBooking/components/timeBar/index.d.ts +0 -13
  84. package/es/components/ticketBooking/index.d.ts +0 -8
  85. package/es/components/venueBooking/components/Cart/index.d.ts +0 -28
  86. package/es/components/venueBooking/components/Footer/index.d.ts +0 -8
  87. package/es/index.d.ts +0 -87
  88. package/es/plus/skuOptionsSelection/components/NormalCard/index.d.ts +0 -6
  89. package/es/plus/skuOptionsSelection/components/OptionsCard/OptionItemCard.d.ts +0 -4
  90. package/es/plus/skuOptionsSelection/components/OptionsModal/index.d.ts +0 -16
  91. package/es/plus/skuOptionsSelection/index.d.ts +0 -5
  92. package/es/plus/skuOptionsSelection/locales.d.ts +0 -58
  93. package/es/plus/skuOptionsSelection/types.d.ts +0 -458
  94. package/es/plus/skuOptionsSelection/utils/transformBundleGroup.d.ts +0 -19
  95. package/es/plus/skuOptionsSelection/utils/transformOptionGroup.d.ts +0 -1
  96. package/es/plus/skuOptionsSelection/utils/transformSelectorValueToValue.d.ts +0 -4
  97. package/es/plus/skuOptionsSelection/utils/transformValueToSelectorValue.d.ts +0 -4
  98. package/es/plus/skuOptionsSelection/utils/transformVariantGroup.d.ts +0 -1
  99. package/es/pro/Cards/components/SKUCard/index.d.ts +0 -5
  100. package/es/pro/Login2.0/components/phoneValidation.d.ts +0 -17
  101. package/lib/components/appointmentBooking/components/Form/index.d.ts +0 -4
  102. package/lib/components/appointmentBooking/components/Services/index.d.ts +0 -4
  103. package/lib/components/appointmentBooking/deposit/components/PolicyModal/index.d.ts +0 -4
  104. package/lib/components/appointmentBooking/hooks.d.ts +0 -107
  105. package/lib/components/appointmentBooking/utils.d.ts +0 -227
  106. package/lib/components/booking/components/footer/utils.d.ts +0 -47
  107. package/lib/components/booking/components/reloadResourceModal/index.d.ts +0 -9
  108. package/lib/components/booking/components/voucher/index.d.ts +0 -4
  109. package/lib/components/booking/info/service/editService/constants.d.ts +0 -1
  110. package/lib/components/booking/info/service/editService/index.d.ts +0 -7
  111. package/lib/components/booking/info/service2/utils.d.ts +0 -248
  112. package/lib/components/booking/info2/index.d.ts +0 -12
  113. package/lib/components/booking/info2/service/addService/index.d.ts +0 -12
  114. package/lib/components/booking/locales.d.ts +0 -1489
  115. package/lib/components/booking/model.d.ts +0 -120
  116. package/lib/components/eftposPay/amount.d.ts +0 -21
  117. package/lib/components/eftposPay/app.d.ts +0 -11
  118. package/lib/components/eftposPay/component/fail/failCustom.d.ts +0 -4
  119. package/lib/components/eftposPay/component/fail/index.d.ts +0 -4
  120. package/lib/components/eftposPay/component/fail/network.d.ts +0 -9
  121. package/lib/components/eftposPay/component/fail/unknow.d.ts +0 -10
  122. package/lib/components/eftposPay/component/manual/index.d.ts +0 -10
  123. package/lib/components/eftposPay/component/signature/index.d.ts +0 -9
  124. package/lib/components/eftposPay/device.d.ts +0 -24
  125. package/lib/components/eftposPay/index.d.ts +0 -5
  126. package/lib/components/eftposPay/linkly/hooks/normal.d.ts +0 -30
  127. package/lib/components/eftposPay/linkly/hooks/useTimeQuery.d.ts +0 -4
  128. package/lib/components/eftposPay/linkly/index.d.ts +0 -3
  129. package/lib/components/eftposPay/pay.d.ts +0 -21
  130. package/lib/components/eftposPay/payo/config.d.ts +0 -13
  131. package/lib/components/eftposPay/payo/hooks.d.ts +0 -10
  132. package/lib/components/eftposPay/payo/payment.d.ts +0 -66
  133. package/lib/components/eftposPay/tip.d.ts +0 -10
  134. package/lib/components/eftposPay/tyro/index.d.ts +0 -9
  135. package/lib/components/eftposPay/utils/payLog.d.ts +0 -81
  136. package/lib/components/eftposPay/windcave/receiptAction.d.ts +0 -23
  137. package/lib/components/eftposPay/windcave/windcave.d.ts +0 -7
  138. package/lib/components/kioskSkuDetail/index.d.ts +0 -39
  139. package/lib/components/kioskSkuDetail/locales.d.ts +0 -48
  140. package/lib/components/pay/toC/PaymentMethods/GlobePayAliPayH5/index.d.ts +0 -10
  141. package/lib/components/pay/toC/PaymentMethods/GlobePayPaypalH5/index.d.ts +0 -10
  142. package/lib/components/pay/toC/PaymentMethods/GlobePayWxH5/index.d.ts +0 -10
  143. package/lib/components/pay/toC/PaymentMethods/MWCreditCard/TDSPay/index.d.ts +0 -16
  144. package/lib/components/pay/toC/PaymentMethods/MWCreditCard/index.d.ts +0 -15
  145. package/lib/components/pay/toC/PaymentMethods/MWCreditCard/tds2.d.ts +0 -83
  146. package/lib/components/pay/toC/PaymentMethods/SuperPayAliPayH5/index.d.ts +0 -10
  147. package/lib/components/pay/toC/PaymentMethods/SuperPayWxPayH5/index.d.ts +0 -10
  148. package/lib/components/pay/toC/PaymentMethods/WalletPass/List/index.d.ts +0 -22
  149. package/lib/components/pay/toC/PaymentMethods/WalletPass/index.d.ts +0 -25
  150. package/lib/components/pay/toC/PaymentMethods/WalletPass/utils.d.ts +0 -16
  151. package/lib/components/pay/toC/PaymentMethods/index.d.ts +0 -9
  152. package/lib/components/pay/toC/index.d.ts +0 -3
  153. package/lib/components/pay/toC/locales.d.ts +0 -631
  154. package/lib/components/pay/toC/payGroup.d.ts +0 -59
  155. package/lib/components/pay/toC/serve.d.ts +0 -87
  156. package/lib/components/pay/toC/utils.d.ts +0 -65
  157. package/lib/components/ruleSetting/locales.d.ts +0 -78
  158. package/lib/components/ticketBooking/components/addServiceVariant/addService.d.ts +0 -10
  159. package/lib/components/ticketBooking/components/ticketBooking/index.d.ts +0 -5
  160. package/lib/components/ticketBooking/components/timeBar/index.d.ts +0 -13
  161. package/lib/components/ticketBooking/index.d.ts +0 -8
  162. package/lib/components/venueBooking/components/Cart/index.d.ts +0 -28
  163. package/lib/components/venueBooking/components/Footer/index.d.ts +0 -8
  164. package/lib/index.d.ts +0 -87
  165. package/lib/plus/skuOptionsSelection/components/NormalCard/index.d.ts +0 -6
  166. package/lib/plus/skuOptionsSelection/components/OptionsCard/OptionItemCard.d.ts +0 -4
  167. package/lib/plus/skuOptionsSelection/components/OptionsModal/index.d.ts +0 -16
  168. package/lib/plus/skuOptionsSelection/index.d.ts +0 -5
  169. package/lib/plus/skuOptionsSelection/locales.d.ts +0 -58
  170. package/lib/plus/skuOptionsSelection/types.d.ts +0 -458
  171. package/lib/plus/skuOptionsSelection/utils/transformBundleGroup.d.ts +0 -19
  172. package/lib/plus/skuOptionsSelection/utils/transformOptionGroup.d.ts +0 -1
  173. package/lib/plus/skuOptionsSelection/utils/transformSelectorValueToValue.d.ts +0 -4
  174. package/lib/plus/skuOptionsSelection/utils/transformValueToSelectorValue.d.ts +0 -4
  175. package/lib/plus/skuOptionsSelection/utils/transformVariantGroup.d.ts +0 -1
  176. package/lib/pro/Cards/components/SKUCard/index.d.ts +0 -5
  177. package/lib/pro/Login2.0/components/phoneValidation.d.ts +0 -17
@@ -49,7 +49,7 @@ export default function Content() {
49
49
  };
50
50
  }, []);
51
51
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("style", null, "\n @keyframes slideLeft { from { opacity: 0; transform: translateX(34px); } to { opacity: 1; transform: translateX(0); } }\n @keyframes slideRight { from { opacity: 0; transform: translateX(-34px); } to { opacity: 1; transform: translateX(0); } }\n @keyframes fadeIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: translateY(0); } }\n /* \u9AA8\u67B6\u5C4F\u5149\u6761\uFF1A\u4ECE\u5DE6\u5230\u53F3\u626B\u8FC7\u8425\u9020\u6570\u636E\u52A0\u8F7D\u611F */\n @keyframes vbShimmer { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } }\n .vb-skeleton-shimmer {\n position: absolute;\n inset: 0;\n background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.6) 50%, transparent 100%);\n animation: vbShimmer 1.4s ease-in-out infinite;\n pointer-events: none;\n }\n\n /* \u4F5C\u7528\u57DF reset\uFF1A\u4FEE\u590D\u5BBF\u4E3B\u73AF\u5883 preflight: false \u5BFC\u81F4\u6D4F\u89C8\u5668\u9ED8\u8BA4\u6837\u5F0F\u6CC4\u5165 */\n .venue-booking-scope *,\n .venue-booking-scope *::before,\n .venue-booking-scope *::after {\n box-sizing: border-box;\n }\n .venue-booking-scope {\n --vb-primary: var(--theme-color, #ea1018);\n --vb-primary-light: color-mix(in srgb, var(--vb-primary) 12%, #fff);\n --vb-grid-sticky-top: 0px;\n font-size: 16px;\n line-height: 1.5;\n }\n .venue-booking-scope .vb-primary-text { color: var(--vb-primary); }\n .venue-booking-scope button {\n border: none;\n outline: none;\n background: transparent;\n font: inherit;\n color: inherit;\n padding: 0;\n cursor: pointer;\n }\n /* \u4EC5\u91CD\u7F6E\u65E0 class \u7684\u539F\u751F\u8F93\u5165\u6846\uFF0C\u907F\u514D\u8986\u76D6 Tailwind \u7EC4\u4EF6\u663E\u5F0F\u8FB9\u6846 */\n .venue-booking-scope input:not([class]),\n .venue-booking-scope textarea:not([class]) {\n border: none;\n outline: none;\n font: inherit;\n color: inherit;\n }\n\n /* \u8D2D\u7269\u8F66\u5185 Promotion \u533A\u5757\uFF1A\u7F29\u5C0F\u6807\u9898\u5B57\u53F7\uFF0C\u4E0E SubTotal \u7EDF\u4E00\u4E3A 16px */\n .venue-booking-scope .pisell-lowcode__appointment-booking-voucher-container .voucher-title .voucher-title-left {\n font-size: 16px;\n font-weight: 600;\n line-height: 24px;\n }\n .venue-booking-scope .pisell-lowcode__appointment-booking-voucher-container .voucher-title .voucher-title-right {\n font-size: 14px;\n font-weight: 500;\n }\n\n /* \u684C\u9762\u7AEF embedded-footer \u7C98\u5728\u4FA7\u8FB9\u680F\u5E95\u90E8 */\n .venue-booking-scope .pisell-venue-booking-cart-embedded-footer {\n position: sticky;\n bottom: 0;\n z-index: 5;\n background: #fff;\n border-radius: 0 0 28px 28px;\n }\n "), /*#__PURE__*/React.createElement("main", {
52
- className: "mx-auto max-w-[1500px] px-3 pt-3 md:px-6 md:pt-6 lg:pb-12 h-full overscroll-none"
52
+ className: "mx-auto max-w-[1500px] md:px-6 md:pt-6 lg:pb-12 h-full overscroll-none"
53
53
  }, /*#__PURE__*/React.createElement("div", {
54
54
  className: "space-y-2 md:space-y-4",
55
55
  style: {
@@ -76,6 +76,6 @@ export default function Content() {
76
76
  onNext: handlePrimaryAction,
77
77
  confirmLoading: isSubmittingOrder
78
78
  })))), /*#__PURE__*/React.createElement("div", {
79
- className: "sticky bottom-0 z-30 block lg:hidden"
79
+ className: "sticky bottom-0 z-50 block lg:hidden"
80
80
  }, /*#__PURE__*/React.createElement(Footer, null))));
81
81
  }
@@ -146,7 +146,7 @@ export default function Header() {
146
146
  });
147
147
  return /*#__PURE__*/React.createElement("div", {
148
148
  ref: cardRef,
149
- className: "relative rounded-[20px] bg-white p-3 md:rounded-[24px] md:p-4 ring-1 ring-black/6 shadow-[0_10px_30px_rgba(20,20,20,0.04)]"
149
+ className: "relative bg-white p-3 md:rounded-[24px] md:p-4 ring-1 ring-black/6 shadow-[0_10px_30px_rgba(20,20,20,0.04)]"
150
150
  }, /*#__PURE__*/React.createElement(Modal, {
151
151
  open: confirmOpen,
152
152
  onCancel: function onCancel() {
@@ -11,7 +11,6 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
11
11
  */
12
12
  import React, { useMemo } from 'react';
13
13
  import { locales } from '@pisell/utils';
14
- import { Iconfont } from '@pisell/materials';
15
14
  import { useVenueBookingContext } from "../../../context";
16
15
  export default function CourtFilter() {
17
16
  var _useVenueBookingConte = useVenueBookingContext(),
@@ -40,22 +39,7 @@ export default function CourtFilter() {
40
39
  })));
41
40
  return /*#__PURE__*/React.createElement("div", {
42
41
  className: "mt-4 grid gap-3 md:mt-5 xl:grid-cols-[1fr_auto] xl:items-center"
43
- }, /*#__PURE__*/React.createElement("div", {
44
- className: "flex items-center gap-3 rounded-[18px] border border-black/8 bg-[#fafafa] px-4 py-3"
45
- }, /*#__PURE__*/React.createElement(Iconfont, {
46
- type: "pisell2-search-lg",
47
- style: {
48
- fontSize: 16,
49
- color: '#a1a1aa'
50
- }
51
- }), /*#__PURE__*/React.createElement("input", {
52
- value: search,
53
- onChange: function onChange(e) {
54
- return setSearch(e.target.value);
55
- },
56
- placeholder: String(locales.getText('pisell2.venue.search.placeholder') || '搜索场地'),
57
- className: "w-full border-0 bg-transparent text-sm outline-none placeholder:text-zinc-400"
58
- })), courtTypes.length > 1 ? /*#__PURE__*/React.createElement("div", {
42
+ }, courtTypes.length > 1 ? /*#__PURE__*/React.createElement("div", {
59
43
  className: "flex flex-wrap gap-2"
60
44
  }, filterOptions.map(function (opt) {
61
45
  return /*#__PURE__*/React.createElement("button", {
@@ -277,7 +277,9 @@ export default function TimeGrid() {
277
277
  style: {
278
278
  color: 'var(--vb-primary)'
279
279
  }
280
- }, locales.getText('pisell2.venue.label.few.left') || '即将满') : null);
280
+ }, locales.getText('pisell2.venue.label.few.left') || '即将满') : null, !timeMeta.soldOut && !timeMeta.fewLeft && !headerTag ? /*#__PURE__*/React.createElement("div", {
281
+ className: "mt-1 text-[10px] font-bold text-zinc-500"
282
+ }, locales.getText('pisell2.venue.label.bookable') || '充足') : null);
281
283
  }))), /*#__PURE__*/React.createElement("div", {
282
284
  ref: scrollTableRef,
283
285
  onScroll: syncHeader,
@@ -295,21 +297,12 @@ export default function TimeGrid() {
295
297
  className: "grid border-b border-black/6",
296
298
  style: tableGridStyle
297
299
  }, /*#__PURE__*/React.createElement("div", {
298
- className: "sticky left-0 z-10 border-r border-black/6 px-2 py-4 shadow-[10px_0_16px_-14px_rgba(0,0,0,0.2)] md:px-4 ".concat(courtMeta.soldOut ? 'bg-zinc-50' : 'bg-white')
300
+ className: "sticky left-0 z-10 border-r border-black/6 px-2 py-2 shadow-[10px_0_16px_-14px_rgba(0,0,0,0.2)] md:px-4 ".concat(courtMeta.soldOut ? 'bg-zinc-50' : 'bg-white')
299
301
  }, /*#__PURE__*/React.createElement("div", {
300
302
  className: "flex items-start justify-between gap-2"
301
303
  }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
302
304
  className: "text-[13px] font-extrabold leading-5 md:text-[15px] ".concat(courtMeta.soldOut ? 'text-zinc-400' : 'text-zinc-900')
303
- }, resource.resourceName), /*#__PURE__*/React.createElement("div", {
304
- className: "mt-1 text-[11px] md:text-xs ".concat(courtMeta.soldOut ? 'text-zinc-400' : 'text-zinc-500')
305
- }, resource.productTitle), courtMeta.soldOut ? /*#__PURE__*/React.createElement("div", {
306
- className: "mt-1 text-[11px] font-semibold text-zinc-500"
307
- }, locales.getText('pisell2.venue.label.sold.out') || '已满') : null, !courtMeta.soldOut && courtMeta.fewLeft ? /*#__PURE__*/React.createElement("div", {
308
- className: "mt-1 text-[12px] font-bold",
309
- style: {
310
- color: 'var(--vb-primary)'
311
- }
312
- }, locales.getText('pisell2.venue.label.few.left') || '即将满') : null))), resource.slots.map(function (slot, slotIndex) {
305
+ }, resource.resourceName)))), resource.slots.map(function (slot, slotIndex) {
313
306
  var isAvailable = slot.status === 'available';
314
307
  // unavailable:该时段不提供服务(如非营业时段);occupied/past 同样不可选
315
308
  var isUnavailable = slot.status === 'occupied' || slot.status === 'past' || slot.status === 'unavailable';
@@ -328,7 +321,7 @@ export default function TimeGrid() {
328
321
  return handleSlotClick(resource.resourceId, slot);
329
322
  },
330
323
  disabled: isUnavailable,
331
- className: "px-1 py-3 text-center transition md:px-2 ".concat(isUnavailable ? 'cursor-not-allowed bg-zinc-100 text-zinc-400' : selected ? 'text-white' : 'bg-white hover:bg-[#fff6f6]'),
324
+ className: "px-1 py-2 text-center transition md:px-2 ".concat(isUnavailable ? 'cursor-not-allowed bg-zinc-100 text-zinc-400' : selected ? 'text-white' : 'bg-white hover:bg-[#fff6f6]'),
332
325
  style: _objectSpread({
333
326
  borderLeft: isHourBoundary(timeLabel) ? '1px solid rgba(0,0,0,0.08)' : '1px solid rgba(0,0,0,0.03)',
334
327
  borderBottom: '1px solid rgba(0,0,0,0.04)'
@@ -340,9 +333,9 @@ export default function TimeGrid() {
340
333
  }, /*#__PURE__*/React.createElement("div", {
341
334
  className: "text-lg font-bold leading-none"
342
335
  }, "\xD7")) : selected ? /*#__PURE__*/React.createElement("div", {
343
- className: "space-y-1"
336
+ className: "space-y-0.5"
344
337
  }, /*#__PURE__*/React.createElement("div", {
345
- className: "text-[11px] font-bold uppercase tracking-wide text-white/90"
338
+ className: "text-[11px] font-bold uppercase tracking-wide leading-4 text-white/90"
346
339
  }, locales.getText('pisell2.venue.label.selected') || '已选'), /*#__PURE__*/React.createElement(PisellText.Amount, {
347
340
  value: Number(slot.price || 0),
348
341
  symbol: symbol,
@@ -350,16 +343,16 @@ export default function TimeGrid() {
350
343
  showCurrencySymbol: true,
351
344
  className: "text-sm font-extrabold text-white"
352
345
  })) : /*#__PURE__*/React.createElement("div", {
353
- className: "space-y-1"
346
+ className: "space-y-0.5"
354
347
  }, /*#__PURE__*/React.createElement(PisellText.Amount, {
355
348
  value: Number(slot.price || 0),
356
349
  symbol: symbol,
357
350
  precision: 2,
358
351
  showCurrencySymbol: true,
359
352
  hideDecimalForWholeNumbers: false,
360
- className: "text-[13px] font-normal ".concat(priceClass, " md:text-sm")
353
+ className: "text-[13px] font-normal leading-4 ".concat(priceClass, " md:text-sm")
361
354
  }), tag ? /*#__PURE__*/React.createElement("div", {
362
- className: "inline-flex rounded-full px-1.5 py-0.5 text-[8px] font-semibold ring-1 md:text-[9px] ".concat(tag.className)
355
+ className: "inline-flex rounded-full px-1.5 py-0 text-[8px] font-semibold leading-4 ring-1 md:text-[9px] ".concat(tag.className)
363
356
  }, tagText) : null));
364
357
  }));
365
358
  }))));
@@ -52,7 +52,7 @@ export default function VenueSelection() {
52
52
  navigateWeek(7);
53
53
  }
54
54
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
55
- className: "rounded-[24px] bg-white p-3 shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6 md:rounded-[28px] md:p-6"
55
+ className: "rounded-b-[24px] bg-white p-3 shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6 md:rounded-[28px] md:p-6"
56
56
  }, /*#__PURE__*/React.createElement("div", {
57
57
  className: "flex flex-col gap-2 xl:flex-row xl:items-center xl:justify-between"
58
58
  }, /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h2", {
@@ -57,6 +57,19 @@ function getWeekRange(anchor) {
57
57
  };
58
58
  }
59
59
 
60
+ /**
61
+ * 把 startDate 夹紧到今天:避免把已过去的日期传给 OS。
62
+ * 若整段范围都已过去(endDate < 今天),返回 null 表示该段不需要请求。
63
+ */
64
+ function clampRangeToToday(startDate, endDate) {
65
+ var todayKey = formatDateKey(dayjs());
66
+ if (endDate < todayKey) return null;
67
+ return {
68
+ startDate: startDate < todayKey ? todayKey : startDate,
69
+ endDate: endDate
70
+ };
71
+ }
72
+
60
73
  /**
61
74
  * 从 submitOrder 异常中提取可读错误文案(优先规则校验提示)
62
75
  */
@@ -299,7 +312,7 @@ export function VenueBookingProvider(_ref) {
299
312
  */
300
313
  var fetchWeekData = useCallback( /*#__PURE__*/function () {
301
314
  var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(startDate, endDate) {
302
- var summary, currentDateKey, grid;
315
+ var clamped, summary, raw, currentDateKey, grid;
303
316
  return _regeneratorRuntime().wrap(function _callee2$(_context2) {
304
317
  while (1) switch (_context2.prev = _context2.next) {
305
318
  case 0:
@@ -311,27 +324,36 @@ export function VenueBookingProvider(_ref) {
311
324
  case 2:
312
325
  setIsWeekLoading(true);
313
326
  _context2.prev = 3;
314
- _context2.next = 6;
315
- return fetchResourceAvailability(venueBookingModule, startDate, endDate);
316
- case 6:
317
- summary = getDateRangeSummary(venueBookingModule, startDate, endDate);
327
+ // 把区间起点夹紧到今天,避免把已过去的日期传给 OS;整段已过去时直接跳过 OS 请求
328
+ clamped = clampRangeToToday(startDate, endDate);
329
+ summary = [];
330
+ if (!clamped) {
331
+ _context2.next = 11;
332
+ break;
333
+ }
334
+ _context2.next = 9;
335
+ return fetchResourceAvailability(venueBookingModule, clamped.startDate, clamped.endDate);
336
+ case 9:
337
+ raw = getDateRangeSummary(venueBookingModule, clamped.startDate, clamped.endDate);
338
+ summary = Array.isArray(raw) ? raw : [];
339
+ case 11:
318
340
  currentDateKey = formatDateKey(anchorDateRef.current);
319
341
  grid = getTimeSlotGrid(venueBookingModule, currentDateKey);
320
342
  setViewModel(function (prev) {
321
343
  return _objectSpread(_objectSpread({}, prev), {}, {
322
- dateSummary: Array.isArray(summary) ? summary : [],
344
+ dateSummary: summary,
323
345
  timeSlotGrid: grid
324
346
  });
325
347
  });
326
- case 10:
327
- _context2.prev = 10;
348
+ case 14:
349
+ _context2.prev = 14;
328
350
  setIsWeekLoading(false);
329
- return _context2.finish(10);
330
- case 13:
351
+ return _context2.finish(14);
352
+ case 17:
331
353
  case "end":
332
354
  return _context2.stop();
333
355
  }
334
- }, _callee2, null, [[3,, 10, 13]]);
356
+ }, _callee2, null, [[3,, 14, 17]]);
335
357
  }));
336
358
  return function (_x2, _x3) {
337
359
  return _ref3.apply(this, arguments);
@@ -360,27 +382,34 @@ export function VenueBookingProvider(_ref) {
360
382
  MAX_FORWARD_WEEKS = 8;
361
383
  fallbackSummary = [];
362
384
  _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop() {
363
- var probeDate, _getWeekRange, startDate, endDate, weekSummary, candidateDate, grid;
385
+ var probeDate, _getWeekRange, startDate, endDate, clamped, weekSummary, candidateDate, grid;
364
386
  return _regeneratorRuntime().wrap(function _loop$(_context3) {
365
387
  while (1) switch (_context3.prev = _context3.next) {
366
388
  case 0:
367
389
  probeDate = fromDate.add(weekOffset * 7, 'day');
368
- _getWeekRange = getWeekRange(probeDate), startDate = _getWeekRange.startDate, endDate = _getWeekRange.endDate;
369
- _context3.next = 4;
370
- return fetchResourceAvailability(venueBookingModule, startDate, endDate);
371
- case 4:
372
- weekSummary = getDateRangeSummary(venueBookingModule, startDate, endDate);
390
+ _getWeekRange = getWeekRange(probeDate), startDate = _getWeekRange.startDate, endDate = _getWeekRange.endDate; // 夹紧到今天再请求 OS:当前周会从今天开始,未来周不受影响;整段已过去则跳过
391
+ clamped = clampRangeToToday(startDate, endDate);
392
+ if (clamped) {
393
+ _context3.next = 5;
394
+ break;
395
+ }
396
+ return _context3.abrupt("return", 0);
397
+ case 5:
398
+ _context3.next = 7;
399
+ return fetchResourceAvailability(venueBookingModule, clamped.startDate, clamped.endDate);
400
+ case 7:
401
+ weekSummary = getDateRangeSummary(venueBookingModule, clamped.startDate, clamped.endDate);
373
402
  if (weekOffset === 0) fallbackSummary = Array.isArray(weekSummary) ? weekSummary : [];
374
403
  candidateDate = findNearestAvailableDate({
375
404
  summary: Array.isArray(weekSummary) ? weekSummary : [],
376
405
  preferredDate: weekOffset === 0 ? fromDate : probeDate.startOf('week')
377
406
  });
378
407
  if (candidateDate) {
379
- _context3.next = 9;
408
+ _context3.next = 12;
380
409
  break;
381
410
  }
382
411
  return _context3.abrupt("return", 0);
383
- case 9:
412
+ case 12:
384
413
  setAnchorDate(candidateDate);
385
414
  setMonthCursor(candidateDate.startOf('month'));
386
415
  grid = getTimeSlotGrid(venueBookingModule, formatDateKey(candidateDate));
@@ -393,7 +422,7 @@ export function VenueBookingProvider(_ref) {
393
422
  return _context3.abrupt("return", {
394
423
  v: void 0
395
424
  });
396
- case 14:
425
+ case 17:
397
426
  case "end":
398
427
  return _context3.stop();
399
428
  }
@@ -41,6 +41,7 @@ declare const _default: {
41
41
  'pisell2.venue.label.selected': string;
42
42
  'pisell2.venue.label.sold.out': string;
43
43
  'pisell2.venue.label.few.left': string;
44
+ 'pisell2.venue.label.bookable': string;
44
45
  'pisell2.venue.label.off.peak': string;
45
46
  'pisell2.venue.label.peak': string;
46
47
  'pisell2.venue.label.promo': string;
@@ -161,6 +162,7 @@ declare const _default: {
161
162
  'pisell2.venue.label.selected': string;
162
163
  'pisell2.venue.label.sold.out': string;
163
164
  'pisell2.venue.label.few.left': string;
165
+ 'pisell2.venue.label.bookable': string;
164
166
  'pisell2.venue.label.off.peak': string;
165
167
  'pisell2.venue.label.peak': string;
166
168
  'pisell2.venue.label.promo': string;
@@ -281,6 +283,7 @@ declare const _default: {
281
283
  'pisell2.venue.label.selected': string;
282
284
  'pisell2.venue.label.sold.out': string;
283
285
  'pisell2.venue.label.few.left': string;
286
+ 'pisell2.venue.label.bookable': string;
284
287
  'pisell2.venue.label.off.peak': string;
285
288
  'pisell2.venue.label.peak': string;
286
289
  'pisell2.venue.label.promo': string;
@@ -401,6 +404,7 @@ declare const _default: {
401
404
  'pisell2.venue.label.selected': string;
402
405
  'pisell2.venue.label.sold.out': string;
403
406
  'pisell2.venue.label.few.left': string;
407
+ 'pisell2.venue.label.bookable': string;
404
408
  'pisell2.venue.label.off.peak': string;
405
409
  'pisell2.venue.label.peak': string;
406
410
  'pisell2.venue.label.promo': string;
@@ -521,6 +525,7 @@ declare const _default: {
521
525
  'pisell2.venue.label.selected': string;
522
526
  'pisell2.venue.label.sold.out': string;
523
527
  'pisell2.venue.label.few.left': string;
528
+ 'pisell2.venue.label.bookable': string;
524
529
  'pisell2.venue.label.off.peak': string;
525
530
  'pisell2.venue.label.peak': string;
526
531
  'pisell2.venue.label.promo': string;
@@ -41,6 +41,7 @@ export default {
41
41
  'pisell2.venue.label.selected': 'Selected',
42
42
  'pisell2.venue.label.sold.out': 'Sold out',
43
43
  'pisell2.venue.label.few.left': 'Few left',
44
+ 'pisell2.venue.label.bookable': 'Bookable',
44
45
  'pisell2.venue.label.off.peak': 'Off-Peak',
45
46
  'pisell2.venue.label.peak': 'Peak',
46
47
  'pisell2.venue.label.promo': 'Promo',
@@ -161,6 +162,7 @@ export default {
161
162
  'pisell2.venue.label.selected': '已选',
162
163
  'pisell2.venue.label.sold.out': '已满',
163
164
  'pisell2.venue.label.few.left': '即将满',
165
+ 'pisell2.venue.label.bookable': '充足',
164
166
  'pisell2.venue.label.off.peak': '非高峰',
165
167
  'pisell2.venue.label.peak': '高峰',
166
168
  'pisell2.venue.label.promo': '促销',
@@ -281,6 +283,7 @@ export default {
281
283
  'pisell2.venue.label.selected': '已選',
282
284
  'pisell2.venue.label.sold.out': '已滿',
283
285
  'pisell2.venue.label.few.left': '即將滿',
286
+ 'pisell2.venue.label.bookable': '充足',
284
287
  'pisell2.venue.label.off.peak': '非高峰',
285
288
  'pisell2.venue.label.peak': '高峰',
286
289
  'pisell2.venue.label.promo': '促銷',
@@ -401,6 +404,7 @@ export default {
401
404
  'pisell2.venue.label.selected': '選択済み',
402
405
  'pisell2.venue.label.sold.out': '満席',
403
406
  'pisell2.venue.label.few.left': '残りわずか',
407
+ 'pisell2.venue.label.bookable': '予約可',
404
408
  'pisell2.venue.label.off.peak': 'オフピーク',
405
409
  'pisell2.venue.label.peak': 'ピーク',
406
410
  'pisell2.venue.label.promo': 'プロモ',
@@ -521,6 +525,7 @@ export default {
521
525
  'pisell2.venue.label.selected': 'Selecionado',
522
526
  'pisell2.venue.label.sold.out': 'Esgotado',
523
527
  'pisell2.venue.label.few.left': 'Poucas vagas',
528
+ 'pisell2.venue.label.bookable': 'Disponível',
524
529
  'pisell2.venue.label.off.peak': 'Fora de pico',
525
530
  'pisell2.venue.label.peak': 'Pico',
526
531
  'pisell2.venue.label.promo': 'Promoção',
@@ -131,7 +131,7 @@ function Content() {
131
131
  background: #fff;
132
132
  border-radius: 0 0 28px 28px;
133
133
  }
134
- `), /* @__PURE__ */ import_react.default.createElement("main", { className: "mx-auto max-w-[1500px] px-3 pt-3 md:px-6 md:pt-6 lg:pb-12 h-full overscroll-none" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-2 md:space-y-4", style: { minHeight: "100%" } }, /* @__PURE__ */ import_react.default.createElement("div", { ref: stepHeaderRef, className: "sticky top-0 z-40" }, /* @__PURE__ */ import_react.default.createElement(import_Header.default, null)), /* @__PURE__ */ import_react.default.createElement("div", { className: "grid max-w-full gap-2 md:gap-4 lg:grid-cols-[minmax(0,1fr)_390px] xl:grid-cols-[minmax(0,1fr)_420px]" }, /* @__PURE__ */ import_react.default.createElement("section", { className: "min-w-0 space-y-3 overscroll-none md:space-y-5" }, stepRegistry[currentStep]), /* @__PURE__ */ import_react.default.createElement(
134
+ `), /* @__PURE__ */ import_react.default.createElement("main", { className: "mx-auto max-w-[1500px] md:px-6 md:pt-6 lg:pb-12 h-full overscroll-none" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-2 md:space-y-4", style: { minHeight: "100%" } }, /* @__PURE__ */ import_react.default.createElement("div", { ref: stepHeaderRef, className: "sticky top-0 z-40" }, /* @__PURE__ */ import_react.default.createElement(import_Header.default, null)), /* @__PURE__ */ import_react.default.createElement("div", { className: "grid max-w-full gap-2 md:gap-4 lg:grid-cols-[minmax(0,1fr)_390px] xl:grid-cols-[minmax(0,1fr)_420px]" }, /* @__PURE__ */ import_react.default.createElement("section", { className: "min-w-0 space-y-3 overscroll-none md:space-y-5" }, stepRegistry[currentStep]), /* @__PURE__ */ import_react.default.createElement(
135
135
  "aside",
136
136
  {
137
137
  className: "hidden lg:block sticky self-start z-10 rounded-[28px] bg-white shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6",
@@ -150,5 +150,5 @@ function Content() {
150
150
  confirmLoading: isSubmittingOrder
151
151
  }
152
152
  )
153
- ))), /* @__PURE__ */ import_react.default.createElement("div", { className: "sticky bottom-0 z-30 block lg:hidden" }, /* @__PURE__ */ import_react.default.createElement(import_Footer.default, null))));
153
+ ))), /* @__PURE__ */ import_react.default.createElement("div", { className: "sticky bottom-0 z-50 block lg:hidden" }, /* @__PURE__ */ import_react.default.createElement(import_Footer.default, null))));
154
154
  }
@@ -104,7 +104,7 @@ function Header() {
104
104
  "div",
105
105
  {
106
106
  ref: cardRef,
107
- className: "relative rounded-[20px] bg-white p-3 md:rounded-[24px] md:p-4 ring-1 ring-black/6 shadow-[0_10px_30px_rgba(20,20,20,0.04)]"
107
+ className: "relative bg-white p-3 md:rounded-[24px] md:p-4 ring-1 ring-black/6 shadow-[0_10px_30px_rgba(20,20,20,0.04)]"
108
108
  },
109
109
  /* @__PURE__ */ import_react.default.createElement(
110
110
  import_antd.Modal,
@@ -34,7 +34,6 @@ __export(CourtFilter_exports, {
34
34
  module.exports = __toCommonJS(CourtFilter_exports);
35
35
  var import_react = __toESM(require("react"));
36
36
  var import_utils = require("@pisell/utils");
37
- var import_materials = require("@pisell/materials");
38
37
  var import_context = require("../../../context");
39
38
  function CourtFilter() {
40
39
  const { search, setSearch, filter, setFilter, viewModel } = (0, import_context.useVenueBookingContext)();
@@ -47,15 +46,7 @@ function CourtFilter() {
47
46
  { label: import_utils.locales.getText("pisell2.venue.filter.all") || "全部", value: "ALL" },
48
47
  ...courtTypes.map((type) => ({ label: type, value: type }))
49
48
  ];
50
- return /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-4 grid gap-3 md:mt-5 xl:grid-cols-[1fr_auto] xl:items-center" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-center gap-3 rounded-[18px] border border-black/8 bg-[#fafafa] px-4 py-3" }, /* @__PURE__ */ import_react.default.createElement(import_materials.Iconfont, { type: "pisell2-search-lg", style: { fontSize: 16, color: "#a1a1aa" } }), /* @__PURE__ */ import_react.default.createElement(
51
- "input",
52
- {
53
- value: search,
54
- onChange: (e) => setSearch(e.target.value),
55
- placeholder: String(import_utils.locales.getText("pisell2.venue.search.placeholder") || "搜索场地"),
56
- className: "w-full border-0 bg-transparent text-sm outline-none placeholder:text-zinc-400"
57
- }
58
- )), courtTypes.length > 1 ? /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-wrap gap-2" }, filterOptions.map((opt) => /* @__PURE__ */ import_react.default.createElement(
49
+ return /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-4 grid gap-3 md:mt-5 xl:grid-cols-[1fr_auto] xl:items-center" }, courtTypes.length > 1 ? /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-wrap gap-2" }, filterOptions.map((opt) => /* @__PURE__ */ import_react.default.createElement(
59
50
  "button",
60
51
  {
61
52
  key: opt.value,
@@ -231,7 +231,8 @@ function TimeGrid() {
231
231
  },
232
232
  headerTag && !timeMeta.soldOut ? /* @__PURE__ */ import_react.default.createElement("span", { className: `inline-flex rounded-full px-1.5 py-0.5 text-[8px] font-semibold ring-1 md:text-[9px] ${headerTag.className}` }, headerTag.text) : null,
233
233
  timeMeta.soldOut ? /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-1 text-[10px] font-bold text-zinc-400" }, import_utils.locales.getText("pisell2.venue.label.sold.out") || "已满") : null,
234
- !timeMeta.soldOut && timeMeta.fewLeft ? /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-1 text-[10px] font-bold", style: { color: "var(--vb-primary)" } }, import_utils.locales.getText("pisell2.venue.label.few.left") || "即将满") : null
234
+ !timeMeta.soldOut && timeMeta.fewLeft ? /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-1 text-[10px] font-bold", style: { color: "var(--vb-primary)" } }, import_utils.locales.getText("pisell2.venue.label.few.left") || "即将满") : null,
235
+ !timeMeta.soldOut && !timeMeta.fewLeft && !headerTag ? /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-1 text-[10px] font-bold text-zinc-500" }, import_utils.locales.getText("pisell2.venue.label.bookable") || "充足") : null
235
236
  );
236
237
  })
237
238
  )
@@ -245,7 +246,7 @@ function TimeGrid() {
245
246
  },
246
247
  /* @__PURE__ */ import_react.default.createElement("div", { className: "w-full", key: grid.date }, visibleResources.map((resource) => {
247
248
  const courtMeta = (0, import_utils2.getResourceCourtMeta)(resource);
248
- return /* @__PURE__ */ import_react.default.createElement("div", { key: `${resource.resourceId}-${grid.date}`, className: "grid border-b border-black/6", style: tableGridStyle }, /* @__PURE__ */ import_react.default.createElement("div", { className: `sticky left-0 z-10 border-r border-black/6 px-2 py-4 shadow-[10px_0_16px_-14px_rgba(0,0,0,0.2)] md:px-4 ${courtMeta.soldOut ? "bg-zinc-50" : "bg-white"}` }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-start justify-between gap-2" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("div", { className: `text-[13px] font-extrabold leading-5 md:text-[15px] ${courtMeta.soldOut ? "text-zinc-400" : "text-zinc-900"}` }, resource.resourceName), /* @__PURE__ */ import_react.default.createElement("div", { className: `mt-1 text-[11px] md:text-xs ${courtMeta.soldOut ? "text-zinc-400" : "text-zinc-500"}` }, resource.productTitle), courtMeta.soldOut ? /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-1 text-[11px] font-semibold text-zinc-500" }, import_utils.locales.getText("pisell2.venue.label.sold.out") || "已满") : null, !courtMeta.soldOut && courtMeta.fewLeft ? /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-1 text-[12px] font-bold", style: { color: "var(--vb-primary)" } }, import_utils.locales.getText("pisell2.venue.label.few.left") || "即将满") : null))), resource.slots.map((slot, slotIndex) => {
249
+ return /* @__PURE__ */ import_react.default.createElement("div", { key: `${resource.resourceId}-${grid.date}`, className: "grid border-b border-black/6", style: tableGridStyle }, /* @__PURE__ */ import_react.default.createElement("div", { className: `sticky left-0 z-10 border-r border-black/6 px-2 py-2 shadow-[10px_0_16px_-14px_rgba(0,0,0,0.2)] md:px-4 ${courtMeta.soldOut ? "bg-zinc-50" : "bg-white"}` }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex items-start justify-between gap-2" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("div", { className: `text-[13px] font-extrabold leading-5 md:text-[15px] ${courtMeta.soldOut ? "text-zinc-400" : "text-zinc-900"}` }, resource.resourceName)))), resource.slots.map((slot, slotIndex) => {
249
250
  const isAvailable = slot.status === "available";
250
251
  const isUnavailable = slot.status === "occupied" || slot.status === "past" || slot.status === "unavailable";
251
252
  const selected = isAvailable && (0, import_hooks.isSlotSelected)(
@@ -265,14 +266,14 @@ function TimeGrid() {
265
266
  key: `${resource.resourceId}-${slot.startTime}`,
266
267
  onClick: () => handleSlotClick(resource.resourceId, slot),
267
268
  disabled: isUnavailable,
268
- className: `px-1 py-3 text-center transition md:px-2 ${isUnavailable ? "cursor-not-allowed bg-zinc-100 text-zinc-400" : selected ? "text-white" : "bg-white hover:bg-[#fff6f6]"}`,
269
+ className: `px-1 py-2 text-center transition md:px-2 ${isUnavailable ? "cursor-not-allowed bg-zinc-100 text-zinc-400" : selected ? "text-white" : "bg-white hover:bg-[#fff6f6]"}`,
269
270
  style: {
270
271
  borderLeft: (0, import_utils2.isHourBoundary)(timeLabel) ? "1px solid rgba(0,0,0,0.08)" : "1px solid rgba(0,0,0,0.03)",
271
272
  borderBottom: "1px solid rgba(0,0,0,0.04)",
272
273
  ...selected && !isUnavailable ? { backgroundColor: "var(--vb-primary)" } : null
273
274
  }
274
275
  },
275
- isUnavailable ? /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-col items-center justify-center gap-1 text-zinc-400" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-lg font-bold leading-none" }, "×")) : selected ? /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-wide text-white/90" }, import_utils.locales.getText("pisell2.venue.label.selected") || "已选"), /* @__PURE__ */ import_react.default.createElement(
276
+ isUnavailable ? /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-col items-center justify-center gap-1 text-zinc-400" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-lg font-bold leading-none" }, "×")) : selected ? /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-0.5" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "text-[11px] font-bold uppercase tracking-wide leading-4 text-white/90" }, import_utils.locales.getText("pisell2.venue.label.selected") || "已选"), /* @__PURE__ */ import_react.default.createElement(
276
277
  import_materials.PisellText.Amount,
277
278
  {
278
279
  value: Number(slot.price || 0),
@@ -281,7 +282,7 @@ function TimeGrid() {
281
282
  showCurrencySymbol: true,
282
283
  className: "text-sm font-extrabold text-white"
283
284
  }
284
- )) : /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ import_react.default.createElement(
285
+ )) : /* @__PURE__ */ import_react.default.createElement("div", { className: "space-y-0.5" }, /* @__PURE__ */ import_react.default.createElement(
285
286
  import_materials.PisellText.Amount,
286
287
  {
287
288
  value: Number(slot.price || 0),
@@ -289,9 +290,9 @@ function TimeGrid() {
289
290
  precision: 2,
290
291
  showCurrencySymbol: true,
291
292
  hideDecimalForWholeNumbers: false,
292
- className: `text-[13px] font-normal ${priceClass} md:text-sm`
293
+ className: `text-[13px] font-normal leading-4 ${priceClass} md:text-sm`
293
294
  }
294
- ), tag ? /* @__PURE__ */ import_react.default.createElement("div", { className: `inline-flex rounded-full px-1.5 py-0.5 text-[8px] font-semibold ring-1 md:text-[9px] ${tag.className}` }, tagText) : null)
295
+ ), tag ? /* @__PURE__ */ import_react.default.createElement("div", { className: `inline-flex rounded-full px-1.5 py-0 text-[8px] font-semibold leading-4 ring-1 md:text-[9px] ${tag.className}` }, tagText) : null)
295
296
  );
296
297
  }));
297
298
  }))
@@ -57,7 +57,7 @@ function VenueSelection() {
57
57
  function goNextWeek() {
58
58
  navigateWeek(7);
59
59
  }
60
- return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-[24px] bg-white p-3 shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6 md:rounded-[28px] md:p-6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-col gap-2 xl:flex-row xl:items-center xl:justify-between" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h2", { className: "text-2xl font-extrabold leading-tight text-zinc-900 md:text-[30px]" }, import_utils.locales.getText("pisell2.venue.step1.title") || "选择场地"), /* @__PURE__ */ import_react.default.createElement("p", { className: "mt-1 text-xs leading-5 text-zinc-500 md:mt-2 md:text-sm md:leading-6" }, import_utils.locales.getText("pisell2.venue.step1.subtitle") || "仅显示可用时段和价格。")), /* @__PURE__ */ import_react.default.createElement(import_DateNavigator.default, { onPrevWeek: goPrevWeek, onNextWeek: goNextWeek })), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 md:mt-5" }, /* @__PURE__ */ import_react.default.createElement(import_DayTabs.default, { onPrevWeek: goPrevWeek, onNextWeek: goNextWeek })), /* @__PURE__ */ import_react.default.createElement(import_CourtFilter.default, null)), /* @__PURE__ */ import_react.default.createElement(
60
+ return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "rounded-b-[24px] bg-white p-3 shadow-[0_10px_40px_rgba(20,20,20,0.06)] ring-1 ring-black/6 md:rounded-[28px] md:p-6" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "flex flex-col gap-2 xl:flex-row xl:items-center xl:justify-between" }, /* @__PURE__ */ import_react.default.createElement("div", null, /* @__PURE__ */ import_react.default.createElement("h2", { className: "text-2xl font-extrabold leading-tight text-zinc-900 md:text-[30px]" }, import_utils.locales.getText("pisell2.venue.step1.title") || "选择场地"), /* @__PURE__ */ import_react.default.createElement("p", { className: "mt-1 text-xs leading-5 text-zinc-500 md:mt-2 md:text-sm md:leading-6" }, import_utils.locales.getText("pisell2.venue.step1.subtitle") || "仅显示可用时段和价格。")), /* @__PURE__ */ import_react.default.createElement(import_DateNavigator.default, { onPrevWeek: goPrevWeek, onNextWeek: goNextWeek })), /* @__PURE__ */ import_react.default.createElement("div", { className: "mt-3 md:mt-5" }, /* @__PURE__ */ import_react.default.createElement(import_DayTabs.default, { onPrevWeek: goPrevWeek, onNextWeek: goNextWeek })), /* @__PURE__ */ import_react.default.createElement(import_CourtFilter.default, null)), /* @__PURE__ */ import_react.default.createElement(
61
61
  "div",
62
62
  {
63
63
  ref: tableSectionRef,
@@ -60,6 +60,14 @@ function getWeekRange(anchor) {
60
60
  endDate: (0, import_utils2.formatDateKey)(days[days.length - 1])
61
61
  };
62
62
  }
63
+ function clampRangeToToday(startDate, endDate) {
64
+ const todayKey = (0, import_utils2.formatDateKey)((0, import_dayjs.default)());
65
+ if (endDate < todayKey) return null;
66
+ return {
67
+ startDate: startDate < todayKey ? todayKey : startDate,
68
+ endDate
69
+ };
70
+ }
63
71
  function getSubmitOrderErrorMessage(error) {
64
72
  const firstFailure = Array.isArray(error == null ? void 0 : error.failures) ? error.failures[0] : null;
65
73
  const failureTips = String((firstFailure == null ? void 0 : firstFailure.validationMessage) || "").trim();
@@ -147,13 +155,18 @@ function VenueBookingProvider({ entryContext, children }) {
147
155
  if (!venueBookingModule) return;
148
156
  setIsWeekLoading(true);
149
157
  try {
150
- await (0, import_hooks.fetchResourceAvailability)(venueBookingModule, startDate, endDate);
151
- const summary = (0, import_hooks.getDateRangeSummary)(venueBookingModule, startDate, endDate);
158
+ const clamped = clampRangeToToday(startDate, endDate);
159
+ let summary = [];
160
+ if (clamped) {
161
+ await (0, import_hooks.fetchResourceAvailability)(venueBookingModule, clamped.startDate, clamped.endDate);
162
+ const raw = (0, import_hooks.getDateRangeSummary)(venueBookingModule, clamped.startDate, clamped.endDate);
163
+ summary = Array.isArray(raw) ? raw : [];
164
+ }
152
165
  const currentDateKey = (0, import_utils2.formatDateKey)(anchorDateRef.current);
153
166
  const grid = (0, import_hooks.getTimeSlotGrid)(venueBookingModule, currentDateKey);
154
167
  setViewModel((prev) => ({
155
168
  ...prev,
156
- dateSummary: Array.isArray(summary) ? summary : [],
169
+ dateSummary: summary,
157
170
  timeSlotGrid: grid
158
171
  }));
159
172
  } finally {
@@ -169,8 +182,10 @@ function VenueBookingProvider({ entryContext, children }) {
169
182
  for (let weekOffset = 0; weekOffset <= MAX_FORWARD_WEEKS; weekOffset++) {
170
183
  const probeDate = fromDate.add(weekOffset * 7, "day");
171
184
  const { startDate, endDate } = getWeekRange(probeDate);
172
- await (0, import_hooks.fetchResourceAvailability)(venueBookingModule, startDate, endDate);
173
- const weekSummary = (0, import_hooks.getDateRangeSummary)(venueBookingModule, startDate, endDate);
185
+ const clamped = clampRangeToToday(startDate, endDate);
186
+ if (!clamped) continue;
187
+ await (0, import_hooks.fetchResourceAvailability)(venueBookingModule, clamped.startDate, clamped.endDate);
188
+ const weekSummary = (0, import_hooks.getDateRangeSummary)(venueBookingModule, clamped.startDate, clamped.endDate);
174
189
  if (weekOffset === 0) fallbackSummary = Array.isArray(weekSummary) ? weekSummary : [];
175
190
  const candidateDate = findNearestAvailableDate({
176
191
  summary: Array.isArray(weekSummary) ? weekSummary : [],
@@ -41,6 +41,7 @@ declare const _default: {
41
41
  'pisell2.venue.label.selected': string;
42
42
  'pisell2.venue.label.sold.out': string;
43
43
  'pisell2.venue.label.few.left': string;
44
+ 'pisell2.venue.label.bookable': string;
44
45
  'pisell2.venue.label.off.peak': string;
45
46
  'pisell2.venue.label.peak': string;
46
47
  'pisell2.venue.label.promo': string;
@@ -161,6 +162,7 @@ declare const _default: {
161
162
  'pisell2.venue.label.selected': string;
162
163
  'pisell2.venue.label.sold.out': string;
163
164
  'pisell2.venue.label.few.left': string;
165
+ 'pisell2.venue.label.bookable': string;
164
166
  'pisell2.venue.label.off.peak': string;
165
167
  'pisell2.venue.label.peak': string;
166
168
  'pisell2.venue.label.promo': string;
@@ -281,6 +283,7 @@ declare const _default: {
281
283
  'pisell2.venue.label.selected': string;
282
284
  'pisell2.venue.label.sold.out': string;
283
285
  'pisell2.venue.label.few.left': string;
286
+ 'pisell2.venue.label.bookable': string;
284
287
  'pisell2.venue.label.off.peak': string;
285
288
  'pisell2.venue.label.peak': string;
286
289
  'pisell2.venue.label.promo': string;
@@ -401,6 +404,7 @@ declare const _default: {
401
404
  'pisell2.venue.label.selected': string;
402
405
  'pisell2.venue.label.sold.out': string;
403
406
  'pisell2.venue.label.few.left': string;
407
+ 'pisell2.venue.label.bookable': string;
404
408
  'pisell2.venue.label.off.peak': string;
405
409
  'pisell2.venue.label.peak': string;
406
410
  'pisell2.venue.label.promo': string;
@@ -521,6 +525,7 @@ declare const _default: {
521
525
  'pisell2.venue.label.selected': string;
522
526
  'pisell2.venue.label.sold.out': string;
523
527
  'pisell2.venue.label.few.left': string;
528
+ 'pisell2.venue.label.bookable': string;
524
529
  'pisell2.venue.label.off.peak': string;
525
530
  'pisell2.venue.label.peak': string;
526
531
  'pisell2.venue.label.promo': string;
@@ -61,6 +61,7 @@ var locales_default = {
61
61
  "pisell2.venue.label.selected": "Selected",
62
62
  "pisell2.venue.label.sold.out": "Sold out",
63
63
  "pisell2.venue.label.few.left": "Few left",
64
+ "pisell2.venue.label.bookable": "Bookable",
64
65
  "pisell2.venue.label.off.peak": "Off-Peak",
65
66
  "pisell2.venue.label.peak": "Peak",
66
67
  "pisell2.venue.label.promo": "Promo",
@@ -181,6 +182,7 @@ var locales_default = {
181
182
  "pisell2.venue.label.selected": "已选",
182
183
  "pisell2.venue.label.sold.out": "已满",
183
184
  "pisell2.venue.label.few.left": "即将满",
185
+ "pisell2.venue.label.bookable": "充足",
184
186
  "pisell2.venue.label.off.peak": "非高峰",
185
187
  "pisell2.venue.label.peak": "高峰",
186
188
  "pisell2.venue.label.promo": "促销",
@@ -301,6 +303,7 @@ var locales_default = {
301
303
  "pisell2.venue.label.selected": "已選",
302
304
  "pisell2.venue.label.sold.out": "已滿",
303
305
  "pisell2.venue.label.few.left": "即將滿",
306
+ "pisell2.venue.label.bookable": "充足",
304
307
  "pisell2.venue.label.off.peak": "非高峰",
305
308
  "pisell2.venue.label.peak": "高峰",
306
309
  "pisell2.venue.label.promo": "促銷",
@@ -421,6 +424,7 @@ var locales_default = {
421
424
  "pisell2.venue.label.selected": "選択済み",
422
425
  "pisell2.venue.label.sold.out": "満席",
423
426
  "pisell2.venue.label.few.left": "残りわずか",
427
+ "pisell2.venue.label.bookable": "予約可",
424
428
  "pisell2.venue.label.off.peak": "オフピーク",
425
429
  "pisell2.venue.label.peak": "ピーク",
426
430
  "pisell2.venue.label.promo": "プロモ",
@@ -541,6 +545,7 @@ var locales_default = {
541
545
  "pisell2.venue.label.selected": "Selecionado",
542
546
  "pisell2.venue.label.sold.out": "Esgotado",
543
547
  "pisell2.venue.label.few.left": "Poucas vagas",
548
+ "pisell2.venue.label.bookable": "Disponível",
544
549
  "pisell2.venue.label.off.peak": "Fora de pico",
545
550
  "pisell2.venue.label.peak": "Pico",
546
551
  "pisell2.venue.label.promo": "Promoção",