@pisell/private-materials 3.4.44 → 3.4.46

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 (193) 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/index.js +1 -1
  5. package/build/lowcode/meta.js +2 -2
  6. package/build/lowcode/preview.js +150 -164
  7. package/build/lowcode/render/default/view.css +1 -1
  8. package/build/lowcode/render/default/view.js +9 -9
  9. package/build/lowcode/view.css +1 -1
  10. package/build/lowcode/view.js +9 -9
  11. package/es/components/booking/addons/model.d.ts +1 -10
  12. package/es/components/booking/forms/model.d.ts +1 -10
  13. package/es/components/booking/forms/sendModal/useSendModal.d.ts +1 -1
  14. package/es/components/booking/info/model.d.ts +1 -10
  15. package/es/components/booking/info/service/addService/utils.d.ts +1 -1
  16. package/es/components/booking/info/service2/utils.d.ts +1 -1
  17. package/es/components/booking/info2/service/addService/utils.d.ts +1 -1
  18. package/es/components/booking/model.d.ts +1 -9
  19. package/es/components/booking/notes/model.d.ts +1 -10
  20. package/es/components/booking/payments/model.d.ts +1 -10
  21. package/es/components/booking/utils.d.ts +2 -2
  22. package/es/components/eftposPay/amount.d.ts +1 -1
  23. package/es/components/eftposPay/device.d.ts +1 -1
  24. package/es/components/eftposPay/hooks.d.ts +2 -2
  25. package/es/components/eftposPay/store/index.d.ts +4 -4
  26. package/es/components/pay/toC/index.js +23 -20
  27. package/es/components/pay/toC/model.d.ts +1 -9
  28. package/es/components/schedules/model.d.ts +1 -9
  29. package/es/components/wallet/Detail/model.d.ts +1 -13
  30. package/es/components/wallet/DiscountCard/model.d.ts +1 -14
  31. package/es/components/wallet/PointCard/model.d.ts +1 -13
  32. package/es/components/wallet/RechargeableCard/model.d.ts +1 -29
  33. package/es/components/wallet/Voucher/model.d.ts +1 -13
  34. package/es/components/wallet/model.d.ts +1 -9
  35. package/es/index.d.ts +1 -0
  36. package/es/index.js +2 -1
  37. package/es/pro/Login2.0/AuthModal.d.ts +143 -0
  38. package/es/pro/Login2.0/AuthModal.js +630 -0
  39. package/es/pro/Login2.0/Login2.d.ts +61 -0
  40. package/es/pro/Login2.0/Login2.js +2235 -0
  41. package/es/pro/Login2.0/Register2.d.ts +65 -0
  42. package/es/pro/Login2.0/Register2.js +1501 -0
  43. package/es/pro/Login2.0/components/ForgotPasswordFlow.d.ts +31 -0
  44. package/es/pro/Login2.0/components/ForgotPasswordFlow.js +330 -0
  45. package/es/pro/Login2.0/components/LegalTerms.d.ts +8 -0
  46. package/es/pro/Login2.0/components/LegalTerms.js +51 -0
  47. package/es/pro/Login2.0/components/LegalTerms.less +74 -0
  48. package/es/pro/Login2.0/components/LoginCodeInput.d.ts +27 -0
  49. package/es/pro/Login2.0/components/LoginCodeInput.js +207 -0
  50. package/es/pro/Login2.0/components/OAuthButtonGroup.d.ts +22 -0
  51. package/es/pro/Login2.0/components/OAuthButtonGroup.js +55 -0
  52. package/es/pro/Login2.0/components/PhoneInput.d.ts +53 -0
  53. package/es/pro/Login2.0/components/PhoneInput.js +414 -0
  54. package/es/pro/Login2.0/components/PhoneInput.less +148 -0
  55. package/es/pro/Login2.0/components/phoneValidation.d.ts +17 -0
  56. package/es/pro/Login2.0/components/phoneValidation.js +228 -0
  57. package/es/pro/Login2.0/hooks/index.d.ts +2 -0
  58. package/es/pro/Login2.0/hooks/index.js +1 -0
  59. package/es/pro/Login2.0/hooks/usePasswordValidationRules.d.ts +24 -0
  60. package/es/pro/Login2.0/hooks/usePasswordValidationRules.js +87 -0
  61. package/es/pro/Login2.0/hooks/useRegisterFlow.d.ts +39 -0
  62. package/es/pro/Login2.0/hooks/useRegisterFlow.js +158 -0
  63. package/es/pro/Login2.0/hooks/useRegistrationMethods.d.ts +9 -0
  64. package/es/pro/Login2.0/hooks/useRegistrationMethods.js +31 -0
  65. package/es/pro/Login2.0/index.js +8 -0
  66. package/es/pro/Login2.0/index.less +1002 -0
  67. package/es/pro/Login2.0/locales.d.ts +543 -0
  68. package/es/pro/Login2.0/locales.js +622 -0
  69. package/es/pro/Login2.0/shared/Header.d.ts +11 -0
  70. package/es/pro/Login2.0/shared/Header.js +42 -0
  71. package/es/pro/Login2.0/shared/OAuthButtons.d.ts +11 -0
  72. package/es/pro/Login2.0/shared/OAuthButtons.js +59 -0
  73. package/es/pro/Login2.0/shared/registerFlow.d.ts +116 -0
  74. package/es/pro/Login2.0/shared/registerFlow.js +171 -0
  75. package/es/pro/Login2.0/shared/types.d.ts +232 -0
  76. package/es/pro/Login2.0/shared/types.js +1 -0
  77. package/es/pro/Login2.0/steps/CodeInput.d.ts +24 -0
  78. package/es/pro/Login2.0/steps/CodeInput.js +209 -0
  79. package/es/pro/Login2.0/steps/EmailAlreadyRegistered.d.ts +12 -0
  80. package/es/pro/Login2.0/steps/EmailAlreadyRegistered.js +35 -0
  81. package/es/pro/Login2.0/steps/EmailLinkAlreadyUsed.d.ts +7 -0
  82. package/es/pro/Login2.0/steps/EmailLinkAlreadyUsed.js +25 -0
  83. package/es/pro/Login2.0/steps/EmailLinkExpired.d.ts +9 -0
  84. package/es/pro/Login2.0/steps/EmailLinkExpired.js +33 -0
  85. package/es/pro/Login2.0/steps/SetPassword.d.ts +19 -0
  86. package/es/pro/Login2.0/steps/SetPassword.js +148 -0
  87. package/es/pro/Login2.0/steps/VerificationSuccess.d.ts +8 -0
  88. package/es/pro/Login2.0/steps/VerificationSuccess.js +35 -0
  89. package/es/pro/Login2.0/steps/VerifyingEmailLink.d.ts +7 -0
  90. package/es/pro/Login2.0/steps/VerifyingEmailLink.js +17 -0
  91. package/es/pro/Login2.0/steps/WaitEmailLink.d.ts +18 -0
  92. package/es/pro/Login2.0/steps/WaitEmailLink.js +54 -0
  93. package/es/pro/Login2.0/steps/index.d.ts +19 -0
  94. package/es/pro/Login2.0/steps/index.js +11 -0
  95. package/es/pro/Login2.0/steps/steps.less +423 -0
  96. package/es/pro/Login2.0/types.d.ts +167 -0
  97. package/es/pro/Login2.0/types.js +1 -0
  98. package/lib/components/booking/addons/model.d.ts +1 -10
  99. package/lib/components/booking/forms/model.d.ts +1 -10
  100. package/lib/components/booking/forms/sendModal/useSendModal.d.ts +1 -1
  101. package/lib/components/booking/info/model.d.ts +1 -10
  102. package/lib/components/booking/info/service/addService/utils.d.ts +1 -1
  103. package/lib/components/booking/info/service2/utils.d.ts +1 -1
  104. package/lib/components/booking/info2/service/addService/utils.d.ts +1 -1
  105. package/lib/components/booking/model.d.ts +1 -9
  106. package/lib/components/booking/notes/model.d.ts +1 -10
  107. package/lib/components/booking/payments/model.d.ts +1 -10
  108. package/lib/components/booking/utils.d.ts +2 -2
  109. package/lib/components/eftposPay/amount.d.ts +1 -1
  110. package/lib/components/eftposPay/device.d.ts +1 -1
  111. package/lib/components/eftposPay/hooks.d.ts +2 -2
  112. package/lib/components/eftposPay/store/index.d.ts +4 -4
  113. package/lib/components/pay/toC/index.js +9 -1
  114. package/lib/components/pay/toC/model.d.ts +1 -9
  115. package/lib/components/schedules/model.d.ts +1 -9
  116. package/lib/components/wallet/Detail/model.d.ts +1 -13
  117. package/lib/components/wallet/DiscountCard/model.d.ts +1 -14
  118. package/lib/components/wallet/PointCard/model.d.ts +1 -13
  119. package/lib/components/wallet/RechargeableCard/model.d.ts +1 -29
  120. package/lib/components/wallet/Voucher/model.d.ts +1 -13
  121. package/lib/components/wallet/model.d.ts +1 -9
  122. package/lib/index.d.ts +1 -0
  123. package/lib/index.js +7 -0
  124. package/lib/pro/Login2.0/AuthModal.d.ts +143 -0
  125. package/lib/pro/Login2.0/AuthModal.js +503 -0
  126. package/lib/pro/Login2.0/Login2.d.ts +61 -0
  127. package/lib/pro/Login2.0/Login2.js +1544 -0
  128. package/lib/pro/Login2.0/Register2.d.ts +65 -0
  129. package/lib/pro/Login2.0/Register2.js +1062 -0
  130. package/lib/pro/Login2.0/components/ForgotPasswordFlow.d.ts +31 -0
  131. package/lib/pro/Login2.0/components/ForgotPasswordFlow.js +213 -0
  132. package/lib/pro/Login2.0/components/LegalTerms.d.ts +8 -0
  133. package/lib/pro/Login2.0/components/LegalTerms.js +76 -0
  134. package/lib/pro/Login2.0/components/LegalTerms.less +74 -0
  135. package/lib/pro/Login2.0/components/LoginCodeInput.d.ts +27 -0
  136. package/lib/pro/Login2.0/components/LoginCodeInput.js +161 -0
  137. package/lib/pro/Login2.0/components/OAuthButtonGroup.d.ts +22 -0
  138. package/lib/pro/Login2.0/components/OAuthButtonGroup.js +87 -0
  139. package/lib/pro/Login2.0/components/PhoneInput.d.ts +53 -0
  140. package/lib/pro/Login2.0/components/PhoneInput.js +263 -0
  141. package/lib/pro/Login2.0/components/PhoneInput.less +148 -0
  142. package/lib/pro/Login2.0/components/phoneValidation.d.ts +17 -0
  143. package/lib/pro/Login2.0/components/phoneValidation.js +153 -0
  144. package/lib/pro/Login2.0/hooks/index.d.ts +2 -0
  145. package/lib/pro/Login2.0/hooks/index.js +29 -0
  146. package/lib/pro/Login2.0/hooks/usePasswordValidationRules.d.ts +24 -0
  147. package/lib/pro/Login2.0/hooks/usePasswordValidationRules.js +140 -0
  148. package/lib/pro/Login2.0/hooks/useRegisterFlow.d.ts +39 -0
  149. package/lib/pro/Login2.0/hooks/useRegisterFlow.js +149 -0
  150. package/lib/pro/Login2.0/hooks/useRegistrationMethods.d.ts +9 -0
  151. package/lib/pro/Login2.0/hooks/useRegistrationMethods.js +51 -0
  152. package/lib/pro/Login2.0/index.js +45 -0
  153. package/lib/pro/Login2.0/index.less +1002 -0
  154. package/lib/pro/Login2.0/locales.d.ts +543 -0
  155. package/lib/pro/Login2.0/locales.js +646 -0
  156. package/lib/pro/Login2.0/shared/Header.d.ts +11 -0
  157. package/lib/pro/Login2.0/shared/Header.js +81 -0
  158. package/lib/pro/Login2.0/shared/OAuthButtons.d.ts +11 -0
  159. package/lib/pro/Login2.0/shared/OAuthButtons.js +78 -0
  160. package/lib/pro/Login2.0/shared/registerFlow.d.ts +116 -0
  161. package/lib/pro/Login2.0/shared/registerFlow.js +235 -0
  162. package/lib/pro/Login2.0/shared/types.d.ts +232 -0
  163. package/lib/pro/Login2.0/shared/types.js +17 -0
  164. package/lib/pro/Login2.0/steps/CodeInput.d.ts +24 -0
  165. package/lib/pro/Login2.0/steps/CodeInput.js +160 -0
  166. package/lib/pro/Login2.0/steps/EmailAlreadyRegistered.d.ts +12 -0
  167. package/lib/pro/Login2.0/steps/EmailAlreadyRegistered.js +46 -0
  168. package/lib/pro/Login2.0/steps/EmailLinkAlreadyUsed.d.ts +7 -0
  169. package/lib/pro/Login2.0/steps/EmailLinkAlreadyUsed.js +51 -0
  170. package/lib/pro/Login2.0/steps/EmailLinkExpired.d.ts +9 -0
  171. package/lib/pro/Login2.0/steps/EmailLinkExpired.js +51 -0
  172. package/lib/pro/Login2.0/steps/SetPassword.d.ts +19 -0
  173. package/lib/pro/Login2.0/steps/SetPassword.js +131 -0
  174. package/lib/pro/Login2.0/steps/VerificationSuccess.d.ts +8 -0
  175. package/lib/pro/Login2.0/steps/VerificationSuccess.js +49 -0
  176. package/lib/pro/Login2.0/steps/VerifyingEmailLink.d.ts +7 -0
  177. package/lib/pro/Login2.0/steps/VerifyingEmailLink.js +41 -0
  178. package/lib/pro/Login2.0/steps/WaitEmailLink.d.ts +18 -0
  179. package/lib/pro/Login2.0/steps/WaitEmailLink.js +67 -0
  180. package/lib/pro/Login2.0/steps/index.d.ts +19 -0
  181. package/lib/pro/Login2.0/steps/index.js +60 -0
  182. package/lib/pro/Login2.0/steps/steps.less +423 -0
  183. package/lib/pro/Login2.0/types.d.ts +167 -0
  184. package/lib/pro/Login2.0/types.js +17 -0
  185. package/lowcode/authmodal/meta.ts +395 -0
  186. package/lowcode/login2/CONFIG.md +447 -0
  187. package/lowcode/login2/TEST_CONFIG.md +324 -0
  188. package/lowcode/login2/VERIFICATION_METHODS.md +364 -0
  189. package/lowcode/login2/meta.ts +560 -0
  190. package/lowcode/login2/snippets.ts +124 -0
  191. package/lowcode/register2/meta.ts +562 -0
  192. package/lowcode/register2/snippets.ts +257 -0
  193. package/package.json +5 -5
@@ -0,0 +1,87 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/pro/Login2.0/components/OAuthButtonGroup.tsx
30
+ var OAuthButtonGroup_exports = {};
31
+ __export(OAuthButtonGroup_exports, {
32
+ default: () => OAuthButtonGroup_default
33
+ });
34
+ module.exports = __toCommonJS(OAuthButtonGroup_exports);
35
+ var import_react = __toESM(require("react"));
36
+ var import_classnames = __toESM(require("classnames"));
37
+ var import_materials = require("@pisell/materials");
38
+ var OAuthButtonGroup = ({
39
+ providers,
40
+ layout = "vertical",
41
+ size = "large",
42
+ block = true,
43
+ wrapperClassName,
44
+ buttonClassName,
45
+ gap = 12
46
+ }) => {
47
+ if (!providers.length) {
48
+ return null;
49
+ }
50
+ const isVertical = layout === "vertical";
51
+ return /* @__PURE__ */ import_react.default.createElement(
52
+ "div",
53
+ {
54
+ className: (0, import_classnames.default)("oauth-button-group", wrapperClassName, {
55
+ "oauth-button-group-vertical": isVertical,
56
+ "oauth-button-group-horizontal": !isVertical
57
+ }),
58
+ style: isVertical ? { display: "grid", rowGap: gap } : { display: "flex", columnGap: gap, flexWrap: "wrap" }
59
+ },
60
+ providers.map(
61
+ ({
62
+ key,
63
+ label,
64
+ icon,
65
+ onClick,
66
+ disabled,
67
+ className,
68
+ badge,
69
+ badgeClassName
70
+ }) => /* @__PURE__ */ import_react.default.createElement(
71
+ import_materials.Button,
72
+ {
73
+ key,
74
+ size,
75
+ block,
76
+ disabled,
77
+ className: (0, import_classnames.default)(buttonClassName, className),
78
+ icon,
79
+ onClick
80
+ },
81
+ badge && /* @__PURE__ */ import_react.default.createElement("span", { className: (0, import_classnames.default)("oauth-button-badge", badgeClassName) }, badge),
82
+ label
83
+ )
84
+ )
85
+ );
86
+ };
87
+ var OAuthButtonGroup_default = OAuthButtonGroup;
@@ -0,0 +1,53 @@
1
+ import React from 'react';
2
+ import './PhoneInput.less';
3
+ /** 国家/地区配置(后端返回格式) */
4
+ export interface CountryOption {
5
+ /** 国家/地区名称 */
6
+ name: string;
7
+ /** 国家/地区代码 */
8
+ code: string;
9
+ /** 区号(不带+号) */
10
+ calling_code: string;
11
+ /** 货币代码 */
12
+ currency_code: string;
13
+ }
14
+ /** 手机号对象格式 */
15
+ export interface PhoneValueObject {
16
+ /** 手机号(不含区号) */
17
+ phone: string;
18
+ /** 国家区号(不带+号) */
19
+ country_calling_code: string;
20
+ }
21
+ /** 值格式类型 */
22
+ export declare type ValueFormat = 'string' | 'object';
23
+ /** 手机号输入组件属性 */
24
+ export interface PhoneInputProps {
25
+ /** 完整的手机号值(包含区号),格式:+86138****,或 +1555****(字符串模式) */
26
+ value?: string | PhoneValueObject;
27
+ /** 值变化回调 */
28
+ onChange?: (value: string | PhoneValueObject) => void;
29
+ /** Placeholder */
30
+ placeholder?: string;
31
+ /** 大小 */
32
+ size?: 'large' | 'middle' | 'small';
33
+ /** 是否禁用 */
34
+ disabled?: boolean;
35
+ /** 自定义类名 */
36
+ className?: string;
37
+ /** 可用的国家/地区列表 */
38
+ countries?: CountryOption[];
39
+ /** 默认国家/地区代码 */
40
+ defaultCountry?: string;
41
+ /** 值格式:'string' 返回 "+8613800138000",'object' 返回 { phone: "13800138000", country_calling_code: "86" } */
42
+ valueFormat?: ValueFormat;
43
+ /** 键盘按键事件回调 */
44
+ onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;
45
+ }
46
+ /**
47
+ * 手机号输入组件
48
+ *
49
+ * 支持国际区号选择和手机号输入
50
+ * 值格式:+区号+手机号,例如:+8613800138000 或 +15551234567
51
+ */
52
+ declare function PhoneInput({ value, onChange, placeholder, onKeyDown, size, disabled, className, countries, defaultCountry, valueFormat, }: PhoneInputProps): JSX.Element;
53
+ export default PhoneInput;
@@ -0,0 +1,263 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/pro/Login2.0/components/PhoneInput.tsx
30
+ var PhoneInput_exports = {};
31
+ __export(PhoneInput_exports, {
32
+ default: () => PhoneInput_default
33
+ });
34
+ module.exports = __toCommonJS(PhoneInput_exports);
35
+ var import_react = __toESM(require("react"));
36
+ var import_utils = require("@pisell/utils");
37
+ var import_PhoneInput = require("./PhoneInput.less");
38
+ var DEFAULT_COUNTRIES = [
39
+ { name: "United States", code: "US", calling_code: "1", currency_code: "USD" },
40
+ { name: "China", code: "CN", calling_code: "86", currency_code: "CNY" },
41
+ { name: "United Kingdom", code: "GB", calling_code: "44", currency_code: "GBP" },
42
+ { name: "Australia", code: "AU", calling_code: "61", currency_code: "AUD" },
43
+ { name: "Canada", code: "CA", calling_code: "1", currency_code: "CAD" },
44
+ { name: "Japan", code: "JP", calling_code: "81", currency_code: "JPY" },
45
+ { name: "South Korea", code: "KR", calling_code: "82", currency_code: "KRW" },
46
+ { name: "Singapore", code: "SG", calling_code: "65", currency_code: "SGD" },
47
+ { name: "Hong Kong", code: "HK", calling_code: "852", currency_code: "HKD" },
48
+ { name: "Taiwan", code: "TW", calling_code: "886", currency_code: "TWD" },
49
+ { name: "Malaysia", code: "MY", calling_code: "60", currency_code: "MYR" },
50
+ { name: "Thailand", code: "TH", calling_code: "66", currency_code: "THB" },
51
+ { name: "Vietnam", code: "VN", calling_code: "84", currency_code: "VND" },
52
+ { name: "Philippines", code: "PH", calling_code: "63", currency_code: "PHP" },
53
+ { name: "Indonesia", code: "ID", calling_code: "62", currency_code: "IDR" },
54
+ { name: "India", code: "IN", calling_code: "91", currency_code: "INR" },
55
+ { name: "Germany", code: "DE", calling_code: "49", currency_code: "EUR" },
56
+ { name: "France", code: "FR", calling_code: "33", currency_code: "EUR" },
57
+ { name: "Italy", code: "IT", calling_code: "39", currency_code: "EUR" },
58
+ { name: "Spain", code: "ES", calling_code: "34", currency_code: "EUR" }
59
+ ];
60
+ function detectUserCountry() {
61
+ try {
62
+ if (typeof Intl !== "undefined" && Intl.DateTimeFormat) {
63
+ const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
64
+ const timeZoneMap = {
65
+ "America/New_York": "US",
66
+ "America/Los_Angeles": "US",
67
+ "America/Chicago": "US",
68
+ "America/Denver": "US",
69
+ "America/Toronto": "CA",
70
+ "America/Vancouver": "CA",
71
+ "Europe/London": "GB",
72
+ "Europe/Paris": "FR",
73
+ "Europe/Berlin": "DE",
74
+ "Europe/Rome": "IT",
75
+ "Europe/Madrid": "ES",
76
+ "Asia/Shanghai": "CN",
77
+ "Asia/Hong_Kong": "HK",
78
+ "Asia/Taipei": "TW",
79
+ "Asia/Tokyo": "JP",
80
+ "Asia/Seoul": "KR",
81
+ "Asia/Singapore": "SG",
82
+ "Asia/Bangkok": "TH",
83
+ "Asia/Kuala_Lumpur": "MY",
84
+ "Asia/Jakarta": "ID",
85
+ "Asia/Manila": "PH",
86
+ "Asia/Ho_Chi_Minh": "VN",
87
+ "Asia/Kolkata": "IN",
88
+ "Australia/Sydney": "AU",
89
+ "Australia/Melbourne": "AU"
90
+ };
91
+ if (timeZone && timeZoneMap[timeZone]) {
92
+ return timeZoneMap[timeZone];
93
+ }
94
+ }
95
+ if (typeof navigator !== "undefined" && navigator.language) {
96
+ const lang = navigator.language;
97
+ const parts = lang.split("-");
98
+ if (parts.length > 1) {
99
+ const countryCode = parts[1].toUpperCase();
100
+ return countryCode;
101
+ }
102
+ const langMap = {
103
+ "zh": "CN",
104
+ "en": "US",
105
+ "ja": "JP",
106
+ "ko": "KR",
107
+ "de": "DE",
108
+ "fr": "FR",
109
+ "es": "ES",
110
+ "it": "IT",
111
+ "th": "TH",
112
+ "vi": "VN",
113
+ "id": "ID",
114
+ "ms": "MY"
115
+ };
116
+ if (langMap[parts[0]]) {
117
+ return langMap[parts[0]];
118
+ }
119
+ }
120
+ } catch (error) {
121
+ console.warn("Failed to detect user country:", error);
122
+ }
123
+ return null;
124
+ }
125
+ function PhoneInput({
126
+ value,
127
+ onChange,
128
+ placeholder,
129
+ onKeyDown,
130
+ size = "large",
131
+ disabled = false,
132
+ className = "",
133
+ countries = DEFAULT_COUNTRIES,
134
+ defaultCountry,
135
+ valueFormat = "string"
136
+ }) {
137
+ const effectivePlaceholder = placeholder || import_utils.locales.getText("pisell-phone-input-placeholder");
138
+ const normalizedValue = (0, import_react.useMemo)(() => {
139
+ if (!value) return "";
140
+ if (typeof value === "object" && "phone" in value) {
141
+ const { phone, country_calling_code } = value;
142
+ return `+${country_calling_code}${phone}`;
143
+ }
144
+ return value;
145
+ }, [value]);
146
+ const effectiveDefaultCountry = (0, import_react.useMemo)(() => {
147
+ var _a;
148
+ const detectedCountry = detectUserCountry();
149
+ if (detectedCountry && countries.some((c) => c.code === detectedCountry)) {
150
+ console.log("PhoneInput: Auto-detected country:", detectedCountry);
151
+ return detectedCountry;
152
+ }
153
+ if (defaultCountry && countries.some((c) => c.code === defaultCountry)) {
154
+ return defaultCountry;
155
+ }
156
+ return ((_a = countries == null ? void 0 : countries[0]) == null ? void 0 : _a.code) || "AU";
157
+ }, [countries, defaultCountry]);
158
+ const { dialCode: currentDialCode, phoneNumber: currentPhoneNumber } = (0, import_react.useMemo)(() => {
159
+ if (!(countries == null ? void 0 : countries.length)) {
160
+ return {
161
+ dialCode: "",
162
+ phoneNumber: ""
163
+ };
164
+ }
165
+ if (!normalizedValue || !normalizedValue.startsWith("+")) {
166
+ const defaultCountryOption2 = countries.find((c) => c.code === effectiveDefaultCountry) || countries[0];
167
+ return {
168
+ dialCode: `+${defaultCountryOption2.calling_code}`,
169
+ phoneNumber: ""
170
+ };
171
+ }
172
+ for (const country of countries) {
173
+ const countryDialCode = `+${country.calling_code}`;
174
+ if (normalizedValue.startsWith(countryDialCode)) {
175
+ return {
176
+ dialCode: countryDialCode,
177
+ phoneNumber: normalizedValue.slice(countryDialCode.length)
178
+ };
179
+ }
180
+ }
181
+ const defaultCountryOption = countries.find((c) => c.code === effectiveDefaultCountry) || countries[0];
182
+ return {
183
+ dialCode: `+${defaultCountryOption.calling_code}`,
184
+ phoneNumber: normalizedValue.startsWith("+") ? normalizedValue.slice(1) : normalizedValue
185
+ };
186
+ }, [normalizedValue, countries, effectiveDefaultCountry]);
187
+ const currentCountry = (0, import_react.useMemo)(() => {
188
+ return countries.find((c) => `+${c.calling_code}` === currentDialCode) || countries[0];
189
+ }, [currentDialCode, countries]);
190
+ const formatOutputValue = (dialCode, phoneNumber) => {
191
+ const fullString = `${dialCode}${phoneNumber}`;
192
+ if (valueFormat === "object") {
193
+ return {
194
+ phone: String(phoneNumber || ""),
195
+ country_calling_code: String(dialCode.replace("+", "") || "")
196
+ // 去掉 + 号并确保是字符串
197
+ };
198
+ }
199
+ return fullString;
200
+ };
201
+ const handleDialCodeChange = (e) => {
202
+ const newDialCode = e.target.value;
203
+ const newValue = formatOutputValue(newDialCode, currentPhoneNumber);
204
+ onChange == null ? void 0 : onChange(newValue);
205
+ };
206
+ const handlePhoneNumberChange = (e) => {
207
+ let inputValue = e.target.value;
208
+ const dialCodeWithoutPlus = currentDialCode.replace("+", "");
209
+ if (inputValue.startsWith("+")) {
210
+ if (inputValue.startsWith(currentDialCode)) {
211
+ inputValue = inputValue.slice(currentDialCode.length);
212
+ }
213
+ } else if (inputValue.startsWith(dialCodeWithoutPlus)) {
214
+ inputValue = inputValue.slice(dialCodeWithoutPlus.length);
215
+ }
216
+ const newPhoneNumber = inputValue.replace(/[^\d]/g, "");
217
+ const newValue = formatOutputValue(currentDialCode, newPhoneNumber);
218
+ onChange == null ? void 0 : onChange(newValue);
219
+ };
220
+ return /* @__PURE__ */ import_react.default.createElement("div", { className: `phone-input-wrapper ${className}` }, /* @__PURE__ */ import_react.default.createElement("div", { className: "phone-input-container" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "phone-input-prefix" }, /* @__PURE__ */ import_react.default.createElement("span", { className: "phone-input-country-display" }, currentCountry == null ? void 0 : currentCountry.code, "(", currentDialCode, ")"), /* @__PURE__ */ import_react.default.createElement(
221
+ "select",
222
+ {
223
+ className: "phone-input-select",
224
+ value: currentDialCode,
225
+ onChange: handleDialCodeChange,
226
+ disabled
227
+ },
228
+ countries.map((country) => /* @__PURE__ */ import_react.default.createElement("option", { key: country.code, value: `+${country.calling_code}` }, country.code, " +", country.calling_code))
229
+ ), /* @__PURE__ */ import_react.default.createElement(
230
+ "svg",
231
+ {
232
+ className: "phone-input-arrow",
233
+ width: "12",
234
+ height: "12",
235
+ viewBox: "0 0 12 12",
236
+ fill: "none",
237
+ xmlns: "http://www.w3.org/2000/svg"
238
+ },
239
+ /* @__PURE__ */ import_react.default.createElement(
240
+ "path",
241
+ {
242
+ d: "M3 4.5L6 7.5L9 4.5",
243
+ stroke: "currentColor",
244
+ strokeWidth: "1.5",
245
+ strokeLinecap: "round",
246
+ strokeLinejoin: "round"
247
+ }
248
+ )
249
+ )), /* @__PURE__ */ import_react.default.createElement("div", { className: "phone-input-divider" }), /* @__PURE__ */ import_react.default.createElement(
250
+ "input",
251
+ {
252
+ type: "tel",
253
+ className: `phone-input-field phone-input-field-${size}`,
254
+ value: currentPhoneNumber,
255
+ onChange: handlePhoneNumberChange,
256
+ onKeyDown,
257
+ placeholder: effectivePlaceholder,
258
+ disabled,
259
+ autoComplete: "tel"
260
+ }
261
+ )));
262
+ }
263
+ var PhoneInput_default = PhoneInput;
@@ -0,0 +1,148 @@
1
+ .phone-input-wrapper {
2
+ width: 100%;
3
+
4
+ .phone-input-container {
5
+ display: flex;
6
+ align-items: center;
7
+ width: 100%;
8
+ height: 44px;
9
+ padding: 0 16px;
10
+ background: #FFFFFF;
11
+ border: 1px solid #D0D5DD;
12
+ border-radius: 8px;
13
+ transition: all 0.2s ease;
14
+
15
+ &:hover {
16
+ border-color: #98A2B3;
17
+ }
18
+
19
+ &:focus-within {
20
+ border-color: var(--theme-color, #7F56D9);
21
+ box-shadow: 0px 0px 0px 4px rgba(127, 86, 217, 0.12);
22
+ }
23
+ }
24
+
25
+ .phone-input-prefix {
26
+ position: relative;
27
+ display: flex;
28
+ align-items: center;
29
+ flex-shrink: 0;
30
+ gap: 6px;
31
+ cursor: pointer;
32
+ }
33
+
34
+ .phone-input-country-display {
35
+ font-size: 14px;
36
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
37
+ font-weight: 400;
38
+ line-height: 20px;
39
+ color: #344054;
40
+ pointer-events: none;
41
+ white-space: nowrap;
42
+ }
43
+
44
+ .phone-input-select {
45
+ position: absolute;
46
+ left: 0;
47
+ top: 0;
48
+ width: 100%;
49
+ height: 100%;
50
+ opacity: 0;
51
+ cursor: pointer;
52
+ font-size: 14px;
53
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
54
+
55
+ &:disabled {
56
+ cursor: not-allowed;
57
+ }
58
+ }
59
+
60
+ .phone-input-arrow {
61
+ flex-shrink: 0;
62
+ color: #667085;
63
+ pointer-events: none;
64
+ }
65
+
66
+ .phone-input-divider {
67
+ width: 1px;
68
+ height: 24px;
69
+ background: #D0D5DD;
70
+ margin: 0 12px;
71
+ flex-shrink: 0;
72
+ }
73
+
74
+ .phone-input-field {
75
+ flex: 1;
76
+ border: none;
77
+ outline: none;
78
+ background: transparent;
79
+ font-size: 16px;
80
+ font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
81
+ font-weight: 400;
82
+ line-height: 24px;
83
+ color: #101828;
84
+ min-width: 0;
85
+
86
+ &::placeholder {
87
+ color: #98A2B3;
88
+ }
89
+
90
+ &:disabled {
91
+ cursor: not-allowed;
92
+ color: #98A2B3;
93
+ }
94
+
95
+ // 移除 number 类型输入框的上下箭头
96
+ &::-webkit-outer-spin-button,
97
+ &::-webkit-inner-spin-button {
98
+ -webkit-appearance: none;
99
+ margin: 0;
100
+ }
101
+
102
+ &[type='number'] {
103
+ -moz-appearance: textfield;
104
+ }
105
+ }
106
+
107
+ // 大小变体
108
+ .phone-input-field-large {
109
+ font-size: 16px;
110
+ line-height: 24px;
111
+ }
112
+
113
+ .phone-input-field-middle {
114
+ font-size: 14px;
115
+ line-height: 22px;
116
+ }
117
+
118
+ .phone-input-field-small {
119
+ font-size: 14px;
120
+ line-height: 20px;
121
+ }
122
+
123
+ // 禁用状态
124
+ &.phone-input-disabled {
125
+ .phone-input-container {
126
+ background: #F9FAFB;
127
+ border-color: #D0D5DD;
128
+ cursor: not-allowed;
129
+
130
+ &:hover {
131
+ border-color: #D0D5DD;
132
+ }
133
+ }
134
+ }
135
+
136
+ // 错误状态
137
+ &.phone-input-error {
138
+ .phone-input-container {
139
+ border-color: #F04438;
140
+
141
+ &:focus-within {
142
+ border-color: #F04438;
143
+ box-shadow: 0px 0px 0px 4px rgba(240, 68, 56, 0.12);
144
+ }
145
+ }
146
+ }
147
+ }
148
+
@@ -0,0 +1,17 @@
1
+ import { PhoneValueObject } from './PhoneInput';
2
+ declare type GetTextFunction = (key: string) => string;
3
+ /**
4
+ * 手机号校验函数,用于 Ant Design Form 的 rules
5
+ * @param value 手机号值,可以是字符串或对象格式
6
+ * @param getText 国际化文本获取函数
7
+ * @returns Promise<void> 校验通过时 resolve,失败时 reject 并返回错误信息
8
+ */
9
+ export declare const validatePhoneNumber: (value: string | PhoneValueObject, getText: GetTextFunction) => Promise<void>;
10
+ /**
11
+ * 创建手机号校验规则,用于 Form.Item 的 rules 属性
12
+ * @param getText 国际化文本获取函数
13
+ * @param required 是否必填
14
+ * @returns Form 校验规则数组
15
+ */
16
+ export declare const createPhoneValidationRules: (getText: GetTextFunction, required?: boolean) => any[];
17
+ export {};