@h-ai/ui 0.1.0-alpha.59 → 0.1.0-alpha.61

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.
@@ -4,6 +4,7 @@
4
4
  * 场景化组件的 Props 类型
5
5
  * @module types
6
6
  */
7
+ import type { HaiResult } from '@h-ai/core';
7
8
  import type { Snippet } from 'svelte';
8
9
  import type { DataAttributes, Size } from '../../types.js';
9
10
  /**
@@ -49,6 +50,10 @@ export interface PasswordInputProps extends DataAttributes {
49
50
  * 协议展示配置
50
51
  */
51
52
  export interface AgreementDisplay {
53
+ /** 用户协议 Markdown 正文;配置时优先于 URL。 */
54
+ userAgreementMarkdown?: string;
55
+ /** 隐私协议 Markdown 正文;由内置安全渲染器显示。 */
56
+ privacyPolicyMarkdown?: string;
52
57
  /** 用户协议 URL */
53
58
  userAgreementUrl?: string;
54
59
  /** 隐私协议 URL */
@@ -58,6 +63,10 @@ export interface AgreementDisplay {
58
63
  * 登录表单数据
59
64
  */
60
65
  export interface LoginFormData {
66
+ /** 当前登录方式;省略时使用密码。 */
67
+ method?: AuthLoginMethod;
68
+ /** 邮件/短信验证码 */
69
+ code?: string;
61
70
  username: string;
62
71
  password: string;
63
72
  rememberMe: boolean;
@@ -66,6 +75,14 @@ export interface LoginFormData {
66
75
  * 登录表单属性
67
76
  */
68
77
  export interface LoginFormProps extends DataAttributes {
78
+ /** 实际可用的方式;空数组表示无可用登录方式。 */
79
+ methods?: AuthLoginMethod[];
80
+ /** 验证码长度 */
81
+ otpLength?: number;
82
+ /** 重发间隔(秒) */
83
+ resendInterval?: number;
84
+ /** 发送验证码;失败信息在表单内显示。 */
85
+ onsendotp?: (identifier: string) => Promise<HaiResult<unknown>>;
69
86
  /** 加载状态 */
70
87
  loading?: boolean;
71
88
  /** 禁用状态 */
@@ -96,6 +113,8 @@ export interface LoginFormProps extends DataAttributes {
96
113
  onforgotpassword?: () => void;
97
114
  /** 头部插槽 */
98
115
  header?: Snippet;
116
+ /** 内置字段后、提交按钮前的扩展内容;额外字段值由应用自行绑定与提交。 */
117
+ extraFields?: Snippet;
99
118
  /** 底部插槽 */
100
119
  footer?: Snippet;
101
120
  }
@@ -118,6 +137,7 @@ export interface RegisterFormData {
118
137
  * 注册表单属性
119
138
  */
120
139
  export interface RegisterFormProps extends DataAttributes {
140
+ passwordPolicy?: PasswordPolicy;
121
141
  /** 加载状态 */
122
142
  loading?: boolean;
123
143
  /** 禁用状态 */
@@ -148,6 +168,8 @@ export interface RegisterFormProps extends DataAttributes {
148
168
  onsubmit?: (data: RegisterFormData) => void | Promise<void>;
149
169
  /** 头部插槽 */
150
170
  header?: Snippet;
171
+ /** 内置字段后、提交按钮前的扩展内容;额外字段值由应用自行绑定与提交。 */
172
+ extraFields?: Snippet;
151
173
  /** 底部插槽 */
152
174
  footer?: Snippet;
153
175
  }
@@ -163,6 +185,7 @@ export interface ChangePasswordFormData {
163
185
  * 修改密码表单属性
164
186
  */
165
187
  export interface ChangePasswordFormProps extends DataAttributes {
188
+ passwordPolicy?: PasswordPolicy;
166
189
  /** 加载状态 */
167
190
  loading?: boolean;
168
191
  /** 禁用状态 */
@@ -232,6 +255,7 @@ export interface ResetPasswordFormData {
232
255
  * 重置密码表单属性
233
256
  */
234
257
  export interface ResetPasswordFormProps extends DataAttributes {
258
+ passwordPolicy?: PasswordPolicy;
235
259
  /** 加载状态 */
236
260
  loading?: boolean;
237
261
  /** 禁用状态 */
@@ -259,6 +283,103 @@ export interface ResetPasswordFormProps extends DataAttributes {
259
283
  /** 提交事件 */
260
284
  onsubmit?: (data: ResetPasswordFormData) => void | Promise<void>;
261
285
  }
286
+ /** 认证页面直接消费 IAM 白名单配置,无需依赖服务端 IAM 包。 */
287
+ export type AuthLoginMethod = 'password' | 'ldap' | 'email' | 'sms';
288
+ /** 与 IAM 公开密码策略一致;前端提示不能代替服务端校验。 */
289
+ export interface PasswordPolicy {
290
+ minLength: number;
291
+ maxLength: number;
292
+ requireUppercase: boolean;
293
+ requireLowercase: boolean;
294
+ requireNumber: boolean;
295
+ requireSpecialChar: boolean;
296
+ }
297
+ /** 仅消费安全公开配置,不能将 iam.config 或连接密钥传入浏览器。 */
298
+ export interface AuthPanelConfig {
299
+ /** 只有已启用且具备运行时依赖的方式才应为 true。 */
300
+ login: {
301
+ password: boolean;
302
+ ldap: boolean;
303
+ email: boolean;
304
+ sms: boolean;
305
+ };
306
+ register: {
307
+ enabled: boolean;
308
+ };
309
+ passwordReset: {
310
+ enabled: boolean;
311
+ mode?: 'email' | 'phone';
312
+ };
313
+ password: PasswordPolicy;
314
+ /** 验证码位数和重发间隔(秒),用于输入校验和倒计时。 */
315
+ otp: {
316
+ length: number;
317
+ resendInterval: number;
318
+ };
319
+ /** 协议 URL 由服务端校验;弹窗展示开关按当前页面分别生效。 */
320
+ agreements: AgreementDisplay & {
321
+ showOnLogin: boolean;
322
+ showOnRegister: boolean;
323
+ };
324
+ ui: {
325
+ variant: 'card' | 'split';
326
+ title?: string;
327
+ subtitle?: string;
328
+ brandTitle?: string;
329
+ brandText?: string;
330
+ logoUrl?: string;
331
+ illustrationUrl?: string;
332
+ };
333
+ }
334
+ /** 认证动作可由框架工厂直接创建,也可包装以处理应用自己的扩展数据。 */
335
+ export interface AuthPanelActions {
336
+ /** password/ldap 使用 password,email/sms 使用 code;成功后由工厂保存凭证。 */
337
+ login: (input: {
338
+ identifier: string;
339
+ password: string;
340
+ method?: AuthLoginMethod;
341
+ code?: string;
342
+ }) => Promise<HaiResult<unknown>>;
343
+ /** 注册并登录;禁用新账户的待启用状态由面板单独提示。 */
344
+ register: (input: {
345
+ username: string;
346
+ password: string;
347
+ email?: string;
348
+ phone?: string;
349
+ displayName?: string;
350
+ }) => Promise<HaiResult<unknown>>;
351
+ sendOtp: (identifier: string) => Promise<HaiResult<unknown>>;
352
+ requestPasswordReset: (identifier: string) => Promise<HaiResult<unknown>>;
353
+ confirmPasswordReset: (token: string, newPassword: string) => Promise<HaiResult<unknown>>;
354
+ }
355
+ /** AuthPanel 的初始页面;未传独立路由时由组件内部导航。 */
356
+ export type AuthPanelMode = 'login' | 'register' | 'forgot' | 'reset';
357
+ /** 配置驱动认证场景;网络、通知和令牌存储由应用注入 actions。 */
358
+ export interface AuthPanelProps extends DataAttributes {
359
+ /** 未取得配置时显示加载状态,只消费 IAM 的公开配置。 */
360
+ config: AuthPanelConfig | null;
361
+ /** 由 Kit 或 API client 提供标准动作,组件不处理底层传输。 */
362
+ actions: AuthPanelActions;
363
+ initialMode?: AuthPanelMode;
364
+ /** 来自重置链接的令牌;未传时显示手动输入框。 */
365
+ resetToken?: string;
366
+ loginUrl?: string;
367
+ registerUrl?: string;
368
+ forgotPasswordUrl?: string;
369
+ /** 登录或注册成功后由应用导航或刷新用户资料。 */
370
+ onauthenticated?: () => void | Promise<void>;
371
+ /** 公开配置获取失败的提示与重试动作。 */
372
+ error?: string;
373
+ onretry?: () => void;
374
+ /** 登录表单的头部、扩展字段、底部;底部仍保留内置导航。 */
375
+ loginHeader?: Snippet;
376
+ loginFields?: Snippet;
377
+ loginFooter?: Snippet;
378
+ /** 注册表单的头部、扩展字段、底部;额外字段通过应用状态处理。 */
379
+ registerHeader?: Snippet;
380
+ registerFields?: Snippet;
381
+ registerFooter?: Snippet;
382
+ }
262
383
  /**
263
384
  * 用户个人信息字段
264
385
  */
@@ -93,8 +93,8 @@
93
93
  "user_profile_save": "Save",
94
94
  "user_profile_cancel": "Cancel",
95
95
  "user_profile_edit": "Edit Profile",
96
- "reset_password_code_label": "Verification Code",
97
- "reset_password_code_placeholder": "Enter verification code",
96
+ "reset_password_code_label": "Reset Token",
97
+ "reset_password_code_placeholder": "Enter the reset token from your email or SMS",
98
98
  "reset_password_new_label": "New Password",
99
99
  "reset_password_new_placeholder": "Enter new password",
100
100
  "reset_password_confirm_label": "Confirm Password",
@@ -124,16 +124,17 @@
124
124
  "agreement_prefix": "By continuing, you agree to our",
125
125
  "agreement_user_agreement": "Terms of Service",
126
126
  "agreement_and": "and",
127
+ "agreement_open_page": "View in a new window",
127
128
  "agreement_privacy_policy": "Privacy Policy",
128
129
  "forgot_password_email_label": "Email Address",
129
130
  "forgot_password_email_placeholder": "Enter your registered email",
130
131
  "forgot_password_email_hint": "We will send a password reset link to your email",
131
132
  "forgot_password_phone_label": "Phone Number",
132
133
  "forgot_password_phone_placeholder": "Enter your registered phone number",
133
- "forgot_password_phone_hint": "We will send a verification code to your phone",
134
- "forgot_password_submit": "Send Verification Code",
134
+ "forgot_password_phone_hint": "We will send password reset instructions to your phone",
135
+ "forgot_password_submit": "Send Reset Instructions",
135
136
  "forgot_password_title": "Forgot Password",
136
- "forgot_password_desc": "Enter your registered email and we'll send you a password reset link.",
137
+ "forgot_password_desc": "Enter your registered email or phone number to receive password reset instructions.",
137
138
  "forgot_password_back": "Back to Login",
138
139
  "change_password_old": "Current Password",
139
140
  "change_password_new": "New Password",
@@ -318,5 +319,37 @@
318
319
  "error_500_title": "Internal Server Error",
319
320
  "error_500_desc": "Something went wrong on our end. We're working on it, please try again later.",
320
321
  "error_503_title": "Under Maintenance",
321
- "error_503_desc": "The system is currently undergoing maintenance. Please check back soon."
322
+ "error_503_desc": "The system is currently undergoing maintenance. Please check back soon.",
323
+ "login_method_password": "Password",
324
+ "login_method_ldap": "Organization",
325
+ "login_method_email": "Email code",
326
+ "login_method_sms": "SMS code",
327
+ "login_methods": "Login method",
328
+ "login_code": "Verification code",
329
+ "login_code_placeholder": "Enter the {length}-digit code",
330
+ "login_send_code": "Send code",
331
+ "login_resend_wait": "Resend in {seconds}s",
332
+ "auth_network_error": "Unable to connect. Please try again later.",
333
+ "auth_error_credentials": "Username or password is incorrect.",
334
+ "auth_error_disabled": "Your account is disabled. Contact your administrator.",
335
+ "auth_error_locked": "Your account is temporarily locked. Try again later.",
336
+ "auth_error_duplicate": "This username or contact address is already registered.",
337
+ "auth_error_password_expired": "Your password has expired. Reset it before signing in.",
338
+ "auth_error_password_policy": "Your password does not meet the current requirements.",
339
+ "auth_error_otp": "The code is invalid or expired. Request a new one.",
340
+ "auth_error_otp_wait": "Please wait before requesting another code.",
341
+ "auth_error_reset_token": "The reset token is invalid or expired. Request a new one.",
342
+ "auth_error_busy": "Too many requests. Please try again shortly.",
343
+ "auth_error_service": "Unable to complete this authentication request. Try again later.",
344
+ "auth_registration_pending": "Your account has been created. Wait for administrator approval before signing in.",
345
+ "auth_unavailable": "This authentication feature is unavailable.",
346
+ "auth_reset_sent": "If the account exists, a reset notification has been sent. Check your email or SMS.",
347
+ "auth_reset_done": "Password reset. Sign in with your new password.",
348
+ "auth_have_token": "I have a reset token",
349
+ "auth_brand": "Account center",
350
+ "password_policy_length": "Use {min}–{max} characters",
351
+ "password_policy_uppercase": "Include uppercase letters",
352
+ "password_policy_lowercase": "Include lowercase letters",
353
+ "password_policy_number": "Include numbers",
354
+ "password_policy_special": "Include special characters"
322
355
  }
@@ -93,8 +93,8 @@
93
93
  "user_profile_save": "保存",
94
94
  "user_profile_cancel": "取消",
95
95
  "user_profile_edit": "编辑资料",
96
- "reset_password_code_label": "验证码",
97
- "reset_password_code_placeholder": "请输入验证码",
96
+ "reset_password_code_label": "重置令牌",
97
+ "reset_password_code_placeholder": "请输入邮件或短信中的重置令牌",
98
98
  "reset_password_new_label": "新密码",
99
99
  "reset_password_new_placeholder": "请输入新密码",
100
100
  "reset_password_confirm_label": "确认密码",
@@ -124,16 +124,17 @@
124
124
  "agreement_prefix": "登录/注册即表示同意",
125
125
  "agreement_user_agreement": "用户协议",
126
126
  "agreement_and": "和",
127
+ "agreement_open_page": "在新窗口查看",
127
128
  "agreement_privacy_policy": "隐私政策",
128
129
  "forgot_password_email_label": "邮箱地址",
129
130
  "forgot_password_email_placeholder": "请输入注册邮箱",
130
131
  "forgot_password_email_hint": "我们将向您的邮箱发送密码重置链接",
131
132
  "forgot_password_phone_label": "手机号码",
132
133
  "forgot_password_phone_placeholder": "请输入注册手机号",
133
- "forgot_password_phone_hint": "我们将向您的手机发送验证码",
134
- "forgot_password_submit": "发送验证码",
134
+ "forgot_password_phone_hint": "我们将向您的手机发送密码重置通知",
135
+ "forgot_password_submit": "发送重置通知",
135
136
  "forgot_password_title": "忘记密码",
136
- "forgot_password_desc": "请输入您的注册邮箱,我们将向您发送密码重置链接。",
137
+ "forgot_password_desc": "请输入您的注册邮箱或手机号,我们将发送密码重置通知。",
137
138
  "forgot_password_back": "返回登录",
138
139
  "change_password_old": "当前密码",
139
140
  "change_password_new": "新密码",
@@ -318,5 +319,37 @@
318
319
  "error_500_title": "服务器错误",
319
320
  "error_500_desc": "服务器出现了一些问题。我们正在处理,请稍后重试。",
320
321
  "error_503_title": "服务维护中",
321
- "error_503_desc": "系统正在维护升级,请稍后再访问。"
322
+ "error_503_desc": "系统正在维护升级,请稍后再访问。",
323
+ "login_method_password": "密码",
324
+ "login_method_ldap": "企业账号",
325
+ "login_method_email": "邮件验证码",
326
+ "login_method_sms": "短信验证码",
327
+ "login_methods": "登录方式",
328
+ "login_code": "验证码",
329
+ "login_code_placeholder": "请输入 {length} 位验证码",
330
+ "login_send_code": "发送验证码",
331
+ "login_resend_wait": "{seconds} 秒后重发",
332
+ "auth_network_error": "网络连接失败,请稍后重试",
333
+ "auth_error_credentials": "用户名或密码不正确",
334
+ "auth_error_disabled": "账号已禁用,请联系管理员",
335
+ "auth_error_locked": "账号暂时锁定,请稍后再试",
336
+ "auth_error_duplicate": "用户名或联系方式已注册",
337
+ "auth_error_password_expired": "密码已过期,请重置后登录",
338
+ "auth_error_password_policy": "密码不符合当前策略,请检查密码要求",
339
+ "auth_error_otp": "验证码无效或已过期,请重新获取",
340
+ "auth_error_otp_wait": "请稍后再获取验证码",
341
+ "auth_error_reset_token": "重置令牌无效或已过期,请重新申请",
342
+ "auth_error_busy": "请求较多,请稍后重试",
343
+ "auth_error_service": "暂时无法完成认证请求,请稍后重试",
344
+ "auth_registration_pending": "账号已创建,请等待管理员启用后再登录。",
345
+ "auth_unavailable": "此认证功能暂不可用",
346
+ "auth_reset_sent": "如果账号存在,重置通知已发送,请查看邮箱或短信。",
347
+ "auth_reset_done": "密码已重置,请使用新密码登录。",
348
+ "auth_have_token": "已有重置令牌",
349
+ "auth_brand": "账号中心",
350
+ "password_policy_length": "密码长度为 {min}–{max} 个字符",
351
+ "password_policy_uppercase": "包含大写字母",
352
+ "password_policy_lowercase": "包含小写字母",
353
+ "password_policy_number": "包含数字",
354
+ "password_policy_special": "包含特殊字符"
322
355
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@h-ai/ui",
3
3
  "type": "module",
4
- "version": "0.1.0-alpha.59",
4
+ "version": "0.1.0-alpha.61",
5
5
  "description": "Hai Framework UI component library for Svelte 5 Runes.",
6
6
  "license": "Apache-2.0",
7
7
  "svelte": "./dist/index.js",
@@ -49,7 +49,7 @@
49
49
  "svelte": "^5.57.2"
50
50
  },
51
51
  "dependencies": {
52
- "@h-ai/core": "0.1.0-alpha.59",
52
+ "@h-ai/core": "0.1.0-alpha.61",
53
53
  "@internationalized/date": "^3.12.4",
54
54
  "@shikijs/langs": "^4.5.0",
55
55
  "bits-ui": "^2.19.5",