@h-ai/ui 0.1.0-alpha.67 → 0.1.0-alpha.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +31 -5
- package/README.ja.md +31 -5
- package/README.md +64 -38
- package/dist/components/compounds/Accordion.svelte +24 -0
- package/dist/components/compounds/Accordion.svelte.d.ts +34 -0
- package/dist/components/compounds/ActionSheet.svelte +24 -0
- package/dist/components/compounds/ActionSheet.svelte.d.ts +38 -0
- package/dist/components/compounds/Alert.svelte +15 -4
- package/dist/components/compounds/Alert.svelte.d.ts +10 -0
- package/dist/components/compounds/AppBar.svelte +24 -0
- package/dist/components/compounds/AppBar.svelte.d.ts +33 -0
- package/dist/components/compounds/BottomNav.svelte +37 -0
- package/dist/components/compounds/BottomNav.svelte.d.ts +43 -0
- package/dist/components/compounds/Breadcrumb.svelte +11 -0
- package/dist/components/compounds/Breadcrumb.svelte.d.ts +20 -0
- package/dist/components/compounds/Calendar.svelte +20 -6
- package/dist/components/compounds/Calendar.svelte.d.ts +20 -6
- package/dist/components/compounds/Card.svelte +10 -0
- package/dist/components/compounds/Card.svelte.d.ts +10 -0
- package/dist/components/compounds/Combobox.svelte +35 -18
- package/dist/components/compounds/Combobox.svelte.d.ts +35 -18
- package/dist/components/compounds/Confirm.svelte +11 -0
- package/dist/components/compounds/Confirm.svelte.d.ts +21 -0
- package/dist/components/compounds/DataTable.svelte +40 -17
- package/dist/components/compounds/DataTable.svelte.d.ts +9 -13
- package/dist/components/compounds/DatePicker.svelte +20 -6
- package/dist/components/compounds/DatePicker.svelte.d.ts +20 -6
- package/dist/components/compounds/Drawer.svelte +11 -0
- package/dist/components/compounds/Drawer.svelte.d.ts +21 -0
- package/dist/components/compounds/Dropdown.svelte +10 -0
- package/dist/components/compounds/Dropdown.svelte.d.ts +10 -0
- package/dist/components/compounds/Empty.svelte +16 -5
- package/dist/components/compounds/Empty.svelte.d.ts +20 -0
- package/dist/components/compounds/Form.svelte +37 -2
- package/dist/components/compounds/Form.svelte.d.ts +20 -0
- package/dist/components/compounds/FormField.svelte +11 -0
- package/dist/components/compounds/FormField.svelte.d.ts +20 -0
- package/dist/components/compounds/FormLayout.svelte +13 -1
- package/dist/components/compounds/FormLayout.svelte.d.ts +13 -0
- package/dist/components/compounds/InfiniteScroll.svelte +24 -0
- package/dist/components/compounds/InfiniteScroll.svelte.d.ts +34 -0
- package/dist/components/compounds/MessageBoxContainer.svelte +11 -0
- package/dist/components/compounds/MessageBoxContainer.svelte.d.ts +21 -0
- package/dist/components/compounds/MessageBoxDialog.svelte +14 -0
- package/dist/components/compounds/MessageBoxDialog.svelte.d.ts +21 -0
- package/dist/components/compounds/MessageContainer.svelte +11 -0
- package/dist/components/compounds/MessageContainer.svelte.d.ts +21 -0
- package/dist/components/compounds/Modal.svelte +10 -0
- package/dist/components/compounds/Modal.svelte.d.ts +10 -0
- package/dist/components/compounds/PageHeader.svelte +21 -8
- package/dist/components/compounds/PageHeader.svelte.d.ts +21 -8
- package/dist/components/compounds/Pagination.svelte +34 -8
- package/dist/components/compounds/Pagination.svelte.d.ts +20 -0
- package/dist/components/compounds/Popover.svelte +11 -0
- package/dist/components/compounds/Popover.svelte.d.ts +20 -0
- package/dist/components/compounds/PullRefresh.svelte +24 -0
- package/dist/components/compounds/PullRefresh.svelte.d.ts +32 -0
- package/dist/components/compounds/Result.svelte +11 -0
- package/dist/components/compounds/Result.svelte.d.ts +20 -0
- package/dist/components/compounds/SafeArea.svelte +24 -0
- package/dist/components/compounds/SafeArea.svelte.d.ts +32 -0
- package/dist/components/compounds/Skeleton.svelte +10 -0
- package/dist/components/compounds/Skeleton.svelte.d.ts +10 -0
- package/dist/components/compounds/Steps.svelte +11 -0
- package/dist/components/compounds/Steps.svelte.d.ts +20 -0
- package/dist/components/compounds/SwipeCell.svelte +24 -0
- package/dist/components/compounds/SwipeCell.svelte.d.ts +37 -0
- package/dist/components/compounds/TableToolbar.svelte +66 -28
- package/dist/components/compounds/TableToolbar.svelte.d.ts +29 -19
- package/dist/components/compounds/Tabs.svelte +58 -10
- package/dist/components/compounds/Tabs.svelte.d.ts +10 -0
- package/dist/components/compounds/TagInput.svelte +11 -0
- package/dist/components/compounds/TagInput.svelte.d.ts +20 -0
- package/dist/components/compounds/Timeline.svelte +24 -0
- package/dist/components/compounds/Timeline.svelte.d.ts +34 -0
- package/dist/components/compounds/ToastContainer.svelte +11 -0
- package/dist/components/compounds/ToastContainer.svelte.d.ts +26 -0
- package/dist/components/compounds/Tooltip.svelte +11 -0
- package/dist/components/compounds/Tooltip.svelte.d.ts +22 -0
- package/dist/components/compounds/accordion-types.d.ts +10 -1
- package/dist/components/compounds/action-sheet-types.d.ts +9 -0
- package/dist/components/compounds/bottom-nav-types.d.ts +9 -0
- package/dist/components/compounds/swipe-cell-types.d.ts +9 -0
- package/dist/components/compounds/timeline-types.d.ts +9 -0
- package/dist/components/control-size.d.ts +17 -0
- package/dist/components/control-size.js +8 -0
- package/dist/components/primitives/Avatar.svelte +10 -0
- package/dist/components/primitives/Avatar.svelte.d.ts +10 -0
- package/dist/components/primitives/Badge.svelte +10 -0
- package/dist/components/primitives/Badge.svelte.d.ts +10 -0
- package/dist/components/primitives/BareButton.svelte +11 -0
- package/dist/components/primitives/BareButton.svelte.d.ts +20 -0
- package/dist/components/primitives/BareInput.svelte +11 -0
- package/dist/components/primitives/BareInput.svelte.d.ts +20 -0
- package/dist/components/primitives/Button.svelte +10 -0
- package/dist/components/primitives/Button.svelte.d.ts +10 -0
- package/dist/components/primitives/Checkbox.svelte +11 -0
- package/dist/components/primitives/Checkbox.svelte.d.ts +20 -0
- package/dist/components/primitives/IconButton.svelte +11 -0
- package/dist/components/primitives/IconButton.svelte.d.ts +20 -0
- package/dist/components/primitives/Input.svelte +10 -0
- package/dist/components/primitives/Input.svelte.d.ts +10 -0
- package/dist/components/primitives/Progress.svelte +11 -0
- package/dist/components/primitives/Progress.svelte.d.ts +20 -0
- package/dist/components/primitives/Radio.svelte +11 -0
- package/dist/components/primitives/Radio.svelte.d.ts +20 -0
- package/dist/components/primitives/Range.svelte +24 -0
- package/dist/components/primitives/Range.svelte.d.ts +34 -0
- package/dist/components/primitives/Rating.svelte +24 -0
- package/dist/components/primitives/Rating.svelte.d.ts +34 -0
- package/dist/components/primitives/Select.svelte +11 -0
- package/dist/components/primitives/Select.svelte.d.ts +21 -0
- package/dist/components/primitives/Spinner.svelte +11 -0
- package/dist/components/primitives/Spinner.svelte.d.ts +20 -0
- package/dist/components/primitives/Switch.svelte +11 -0
- package/dist/components/primitives/Switch.svelte.d.ts +20 -0
- package/dist/components/primitives/Tag.svelte +11 -0
- package/dist/components/primitives/Tag.svelte.d.ts +20 -0
- package/dist/components/primitives/Textarea.svelte +11 -0
- package/dist/components/primitives/Textarea.svelte.d.ts +21 -0
- package/dist/components/primitives/ToggleCheckbox.svelte +11 -0
- package/dist/components/primitives/ToggleCheckbox.svelte.d.ts +20 -0
- package/dist/components/primitives/ToggleInput.svelte +11 -0
- package/dist/components/primitives/ToggleInput.svelte.d.ts +20 -0
- package/dist/components/primitives/ToggleRadio.svelte +11 -0
- package/dist/components/primitives/ToggleRadio.svelte.d.ts +20 -0
- package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte +27 -0
- package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte.d.ts +27 -0
- package/dist/components/scenes/ai/AiDocumentEditor.svelte +79 -0
- package/dist/components/scenes/ai/AiDocumentEditor.svelte.d.ts +23 -0
- package/dist/components/scenes/ai/MarkdownRenderer.svelte +11 -0
- package/dist/components/scenes/ai/MarkdownRenderer.svelte.d.ts +28 -0
- package/dist/components/scenes/ai/code-preview.d.ts +28 -0
- package/dist/components/scenes/ai/code-preview.js +20 -0
- package/dist/components/scenes/ai/document-download.d.ts +52 -0
- package/dist/components/scenes/ai/document-download.js +30 -2
- package/dist/components/scenes/ai/document-parse.d.ts +71 -14
- package/dist/components/scenes/ai/document-parse.js +19 -9
- package/dist/components/scenes/ai/document-types.d.ts +222 -88
- package/dist/components/scenes/ai/editor-markdown-extensions.d.ts +16 -0
- package/dist/components/scenes/ai/editor-markdown-extensions.js +16 -0
- package/dist/components/scenes/ai/highlight.d.ts +11 -0
- package/dist/components/scenes/ai/highlight.js +11 -0
- package/dist/components/scenes/ai/markdown-parse.d.ts +8 -2
- package/dist/components/scenes/ai/markdown-parse.js +2 -2
- package/dist/components/scenes/ai/mermaid-host-sync.d.ts +38 -0
- package/dist/components/scenes/ai/mermaid-host-sync.js +30 -0
- package/dist/components/scenes/ai/mermaid-render.d.ts +23 -0
- package/dist/components/scenes/ai/mermaid-render.js +23 -0
- package/dist/components/scenes/ai/safe-html.d.ts +54 -6
- package/dist/components/scenes/ai/safe-html.js +54 -6
- package/dist/components/scenes/ai/table/AiTableEditor.svelte +48 -0
- package/dist/components/scenes/ai/table/AiTableEditor.svelte.d.ts +24 -0
- package/dist/components/scenes/ai/table/table-types.d.ts +79 -0
- package/dist/components/scenes/app/FeedbackModal.svelte +45 -5
- package/dist/components/scenes/app/FeedbackModal.svelte.d.ts +45 -5
- package/dist/components/scenes/app/LanguageSwitch.svelte +29 -19
- package/dist/components/scenes/app/LanguageSwitch.svelte.d.ts +28 -19
- package/dist/components/scenes/app/SettingsLayout.svelte +21 -9
- package/dist/components/scenes/app/SettingsLayout.svelte.d.ts +21 -9
- package/dist/components/scenes/app/SettingsModal.svelte +23 -0
- package/dist/components/scenes/app/SettingsModal.svelte.d.ts +23 -0
- package/dist/components/scenes/app/ThemeColorPicker.svelte +31 -0
- package/dist/components/scenes/app/ThemeColorPicker.svelte.d.ts +31 -0
- package/dist/components/scenes/app/ThemeSelector.svelte +21 -6
- package/dist/components/scenes/app/ThemeSelector.svelte.d.ts +21 -6
- package/dist/components/scenes/app/ThemeToggle.svelte +21 -4
- package/dist/components/scenes/app/ThemeToggle.svelte.d.ts +21 -4
- package/dist/components/scenes/app/index.d.ts +1 -1
- package/dist/components/scenes/app/index.js +1 -1
- package/dist/components/scenes/charts/Chart.svelte +11 -0
- package/dist/components/scenes/charts/Chart.svelte.d.ts +20 -0
- package/dist/components/scenes/charts/chart-theme.d.ts +25 -1
- package/dist/components/scenes/charts/chart-theme.js +25 -1
- package/dist/components/scenes/charts/chart-types.d.ts +83 -7
- package/dist/components/scenes/charts/renderers/LineChart.svelte +53 -0
- package/dist/components/scenes/charts/renderers/LineChart.svelte.d.ts +13 -0
- package/dist/components/scenes/crud/CrudDeleteConfirm.svelte +10 -0
- package/dist/components/scenes/crud/CrudDeleteConfirm.svelte.d.ts +10 -0
- package/dist/components/scenes/crud/CrudDetailDrawer.svelte +8 -0
- package/dist/components/scenes/crud/CrudDetailDrawer.svelte.d.ts +8 -0
- package/dist/components/scenes/crud/CrudDetailPanel.svelte +18 -0
- package/dist/components/scenes/crud/CrudDetailPanel.svelte.d.ts +18 -0
- package/dist/components/scenes/crud/CrudEditPanel.svelte +10 -0
- package/dist/components/scenes/crud/CrudEditPanel.svelte.d.ts +10 -0
- package/dist/components/scenes/crud/CrudFilterBar.svelte +18 -0
- package/dist/components/scenes/crud/CrudFilterBar.svelte.d.ts +18 -0
- package/dist/components/scenes/crud/CrudPage.svelte +37 -5
- package/dist/components/scenes/crud/CrudPage.svelte.d.ts +35 -3
- package/dist/components/scenes/crud/crud-controller.svelte.d.ts +142 -23
- package/dist/components/scenes/crud/crud-controller.svelte.js +22 -11
- package/dist/components/scenes/crud/crud-form-validation.d.ts +12 -0
- package/dist/components/scenes/crud/crud-form-validation.js +12 -0
- package/dist/components/scenes/crud/crud-types.d.ts +79 -8
- package/dist/components/scenes/crud/nav-adapter.d.ts +14 -0
- package/dist/components/scenes/crud/nav-adapter.js +8 -0
- package/dist/components/scenes/crypto/EncryptedInput.svelte +24 -0
- package/dist/components/scenes/crypto/EncryptedInput.svelte.d.ts +34 -0
- package/dist/components/scenes/crypto/HashDisplay.svelte +11 -0
- package/dist/components/scenes/crypto/HashDisplay.svelte.d.ts +21 -0
- package/dist/components/scenes/crypto/SignatureDisplay.svelte +11 -0
- package/dist/components/scenes/crypto/SignatureDisplay.svelte.d.ts +21 -0
- package/dist/components/scenes/error/ErrorPage.svelte +8 -1
- package/dist/components/scenes/error/ErrorPage.svelte.d.ts +8 -1
- package/dist/components/scenes/error/error-presets.d.ts +40 -4
- package/dist/components/scenes/error/error-presets.js +22 -2
- package/dist/components/scenes/guide/GuideHost.svelte +27 -0
- package/dist/components/scenes/guide/GuideHost.svelte.d.ts +27 -0
- package/dist/components/scenes/guide/HelpCenter.svelte +27 -0
- package/dist/components/scenes/guide/HelpCenter.svelte.d.ts +27 -0
- package/dist/components/scenes/iam/AuthPanel.svelte +26 -2
- package/dist/components/scenes/iam/AuthPanel.svelte.d.ts +25 -0
- package/dist/components/scenes/iam/AuthShell.svelte +8 -3
- package/dist/components/scenes/iam/AuthShell.svelte.d.ts +8 -3
- package/dist/components/scenes/iam/ChangePasswordForm.svelte +10 -0
- package/dist/components/scenes/iam/ChangePasswordForm.svelte.d.ts +10 -0
- package/dist/components/scenes/iam/ForgotPasswordForm.svelte +11 -0
- package/dist/components/scenes/iam/ForgotPasswordForm.svelte.d.ts +21 -0
- package/dist/components/scenes/iam/LoginForm.svelte +24 -31
- package/dist/components/scenes/iam/LoginForm.svelte.d.ts +10 -0
- package/dist/components/scenes/iam/PasswordInput.svelte +23 -0
- package/dist/components/scenes/iam/PasswordInput.svelte.d.ts +23 -0
- package/dist/components/scenes/iam/PermGuard.svelte +21 -11
- package/dist/components/scenes/iam/PermGuard.svelte.d.ts +30 -0
- package/dist/components/scenes/iam/RegisterForm.svelte +10 -0
- package/dist/components/scenes/iam/RegisterForm.svelte.d.ts +10 -0
- package/dist/components/scenes/iam/ResetPasswordForm.svelte +10 -0
- package/dist/components/scenes/iam/ResetPasswordForm.svelte.d.ts +10 -0
- package/dist/components/scenes/iam/UserProfile.svelte +11 -0
- package/dist/components/scenes/iam/UserProfile.svelte.d.ts +21 -0
- package/dist/components/scenes/iam/auth-error-message.d.ts +10 -0
- package/dist/components/scenes/iam/auth-error-message.js +10 -0
- package/dist/components/scenes/iam/password-utils.d.ts +39 -1
- package/dist/components/scenes/iam/password-utils.js +39 -1
- package/dist/components/scenes/iam/permission-context.svelte.d.ts +33 -23
- package/dist/components/scenes/iam/permission-context.svelte.js +20 -22
- package/dist/components/scenes/storage/AvatarUpload.svelte +11 -0
- package/dist/components/scenes/storage/AvatarUpload.svelte.d.ts +20 -0
- package/dist/components/scenes/storage/FileList.svelte +13 -2
- package/dist/components/scenes/storage/FileList.svelte.d.ts +20 -0
- package/dist/components/scenes/storage/FileUpload.svelte +37 -2
- package/dist/components/scenes/storage/FileUpload.svelte.d.ts +21 -0
- package/dist/components/scenes/storage/ImageUpload.svelte +11 -0
- package/dist/components/scenes/storage/ImageUpload.svelte.d.ts +21 -0
- package/dist/components/scenes/types.d.ts +352 -11
- package/dist/guide-storage.d.ts +13 -1
- package/dist/guide-storage.js +13 -1
- package/dist/guide-types.d.ts +67 -2
- package/dist/guide.svelte.d.ts +22 -1
- package/dist/guide.svelte.js +22 -1
- package/dist/i18n.svelte.d.ts +64 -3
- package/dist/i18n.svelte.js +99 -18
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -2
- package/dist/internal/browser-safety.d.ts +51 -2
- package/dist/internal/browser-safety.js +45 -7
- package/dist/internal/form-context.d.ts +73 -0
- package/dist/internal/form-context.js +57 -0
- package/dist/internal/form-validation.svelte.d.ts +42 -0
- package/dist/internal/form-validation.svelte.js +26 -0
- package/dist/internal/icon-safety.d.ts +7 -0
- package/dist/internal/icon-safety.js +7 -0
- package/dist/internal/locale.d.ts +19 -0
- package/dist/internal/locale.js +21 -0
- package/dist/message.svelte.d.ts +90 -0
- package/dist/message.svelte.js +84 -0
- package/dist/messagebox.svelte.d.ts +61 -13
- package/dist/messagebox.svelte.js +55 -13
- package/dist/messages/en-US.json +6 -1
- package/dist/messages/ja-JP.json +389 -0
- package/dist/messages/zh-CN.json +6 -1
- package/dist/messages.d.ts +24 -3
- package/dist/messages.js +18 -3
- package/dist/styles/design-tokens.css +4 -2
- package/dist/styles/global.css +28 -8
- package/dist/styles/theme.css +2 -0
- package/dist/theme-config.d.ts +173 -0
- package/dist/theme-config.js +143 -0
- package/dist/toast.svelte.d.ts +114 -4
- package/dist/toast.svelte.js +108 -4
- package/dist/types.d.ts +526 -9
- package/dist/utils/platform.svelte.d.ts +28 -15
- package/dist/utils/platform.svelte.js +19 -14
- package/dist/utils.d.ts +102 -0
- package/dist/utils.js +93 -0
- package/package.json +66 -6
package/dist/guide-types.d.ts
CHANGED
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
import type { NavAdapter } from './components/scenes/crud/nav-adapter.js';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* 业务文案使用函数延迟求值,切换语言时重新读取应用翻译。
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* import type { GuideText } from '@h-ai/ui'
|
|
8
|
+
* const example: GuideText = () => '开始使用'
|
|
9
|
+
* ```
|
|
10
|
+
*/
|
|
3
11
|
export type GuideText = string | (() => string);
|
|
12
|
+
/**
|
|
13
|
+
* 导览步骤;目标缺失时按 optional 决定跳过或停止,准备动作接受取消信号。
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import type { GuideStep } from '@h-ai/ui'
|
|
18
|
+
* const example: GuideStep = { target: 'save', title: '保存', description: '点击保存资料', side: 'bottom' }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
4
21
|
export interface GuideStep {
|
|
5
22
|
/** data-guide 的值;复杂定位可传入返回元素的函数。 */
|
|
6
23
|
target: string | (() => Element | null);
|
|
@@ -12,6 +29,15 @@ export interface GuideStep {
|
|
|
12
29
|
/** 可选元素缺失时跳过,必要元素缺失时停止并显示提示。 */
|
|
13
30
|
optional?: boolean;
|
|
14
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* 具备稳定 id 和版本的导览定义;enabled 仅控制界面是否提供此导览。
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* import type { GuideTour } from '@h-ai/ui'
|
|
38
|
+
* const example: GuideTour = { id: 'profile', title: '完善资料', version: 1, steps: [{ target: 'save', title: '保存', description: '保存当前资料' }] }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
15
41
|
export interface GuideTour {
|
|
16
42
|
id: string;
|
|
17
43
|
title: GuideText;
|
|
@@ -23,6 +49,15 @@ export interface GuideTour {
|
|
|
23
49
|
/** 按当前权限或功能开关决定是否提供此导览。 */
|
|
24
50
|
enabled?: () => boolean;
|
|
25
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* 帮助中心文章;业务文案可延迟翻译,Markdown 按组件安全策略渲染。
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* import type { GuideArticle } from '@h-ai/ui'
|
|
58
|
+
* const example: GuideArticle = { id: 'start', title: '开始使用', content: '# 操作说明', category: '入门' }
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
26
61
|
export interface GuideArticle {
|
|
27
62
|
id: string;
|
|
28
63
|
title: GuideText;
|
|
@@ -33,11 +68,29 @@ export interface GuideArticle {
|
|
|
33
68
|
tourId?: string;
|
|
34
69
|
enabled?: () => boolean;
|
|
35
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* 非敏感的导览偏好记录;版本变化后可重新向用户提供导览。
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* import type { GuideProgress } from '@h-ai/ui'
|
|
77
|
+
* const example: GuideProgress = { version: 1, status: 'completed', updatedAt: 1790812800000 }
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
36
80
|
export interface GuideProgress {
|
|
37
81
|
version: number;
|
|
38
82
|
status: 'completed' | 'dismissed' | 'deferred';
|
|
39
83
|
updatedAt: number;
|
|
40
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* 导览控制器配置;持久化仅存 UI 偏好,不保存凭证或服务端业务状态。
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* ```ts
|
|
90
|
+
* import type { GuideOptions } from '@h-ai/ui'
|
|
91
|
+
* const example: GuideOptions = { tours: [{ id: 'intro', title: '入门', steps: [{ target: 'save', title: '保存', description: '提交当前资料' }] }], persistence: 'memory', persistKey: 'demo-guide' }
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
41
94
|
export interface GuideOptions {
|
|
42
95
|
tours: readonly GuideTour[];
|
|
43
96
|
articles?: readonly GuideArticle[];
|
|
@@ -48,7 +101,19 @@ export interface GuideOptions {
|
|
|
48
101
|
/** 每个目标元素的等待上限,默认 3000 毫秒。 */
|
|
49
102
|
waitTimeout?: number;
|
|
50
103
|
}
|
|
51
|
-
/**
|
|
104
|
+
/**
|
|
105
|
+
* 浏览器 UI 控制器,操作失败返回 false 并设置 error,不抛业务异常。
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```ts
|
|
109
|
+
* import { createGuide } from '@h-ai/ui'
|
|
110
|
+
* import type { GuideController } from '@h-ai/ui'
|
|
111
|
+
* const guide: GuideController = createGuide({ tours: [], articles: [{ id: 'start', title: '开始', content: '# 操作说明' }], persistence: 'memory' })
|
|
112
|
+
* guide.openHelp('start')
|
|
113
|
+
* guide.closeHelp()
|
|
114
|
+
* guide.stop()
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
52
117
|
export interface GuideController {
|
|
53
118
|
readonly tours: readonly GuideTour[];
|
|
54
119
|
readonly articles: readonly GuideArticle[];
|
package/dist/guide.svelte.d.ts
CHANGED
|
@@ -1,8 +1,29 @@
|
|
|
1
1
|
import type { GuideController, GuideOptions, GuideText } from './guide-types.js';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* 解析业务文案;既支持普通字符串,也支持应用 i18n 函数。
|
|
4
|
+
* @param text - 待处理文本。
|
|
5
|
+
* @returns 业务字符串或延迟翻译函数的当前文本;空输入为空字符串。
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { resolveGuideText } from '@h-ai/ui'
|
|
10
|
+
* const title = resolveGuideText(() => '操作说明')
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
3
13
|
export declare function resolveGuideText(text?: GuideText): string;
|
|
4
14
|
/**
|
|
5
15
|
* 创建应用独享的新手引导控制器。SSR 可创建,DOM 操作只在客户端启动时发生。
|
|
6
16
|
* 配置和控制器应在布局组件内创建,避免在 SSR 模块级共享用户状态。
|
|
17
|
+
* @param options - 本次操作的行为与显示选项。
|
|
18
|
+
* @returns 导览与帮助中心控制器;交互失败使用 false/error 表达。
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* import { createGuide } from '@h-ai/ui'
|
|
23
|
+
* const guide = createGuide({ tours: [{ id: 'intro', title: '入门', steps: [{ target: 'save', title: '保存', description: '提交当前资料' }] }], persistence: 'memory' })
|
|
24
|
+
* const offered = guide.startIfNeeded('intro')
|
|
25
|
+
* if (offered) guide.openHelp()
|
|
26
|
+
* guide.stop()
|
|
27
|
+
* ```
|
|
7
28
|
*/
|
|
8
29
|
export declare function createGuide(options: GuideOptions): GuideController;
|
package/dist/guide.svelte.js
CHANGED
|
@@ -5,7 +5,17 @@ import { createGuideStorage } from './guide-storage.js';
|
|
|
5
5
|
import { getUILocale, uiM } from './messages.js';
|
|
6
6
|
/** 同一浏览器页面只允许一个导览拥有遮罩和键盘监听。 */
|
|
7
7
|
let stopActiveGuide;
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* 解析业务文案;既支持普通字符串,也支持应用 i18n 函数。
|
|
10
|
+
* @param text - 待处理文本。
|
|
11
|
+
* @returns 业务字符串或延迟翻译函数的当前文本;空输入为空字符串。
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { resolveGuideText } from '@h-ai/ui'
|
|
16
|
+
* const title = resolveGuideText(() => '操作说明')
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
9
19
|
export function resolveGuideText(text) {
|
|
10
20
|
return typeof text === 'function' ? text() : text ?? '';
|
|
11
21
|
}
|
|
@@ -71,6 +81,17 @@ function waitForTarget(step, signal, timeout, ready) {
|
|
|
71
81
|
/**
|
|
72
82
|
* 创建应用独享的新手引导控制器。SSR 可创建,DOM 操作只在客户端启动时发生。
|
|
73
83
|
* 配置和控制器应在布局组件内创建,避免在 SSR 模块级共享用户状态。
|
|
84
|
+
* @param options - 本次操作的行为与显示选项。
|
|
85
|
+
* @returns 导览与帮助中心控制器;交互失败使用 false/error 表达。
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```ts
|
|
89
|
+
* import { createGuide } from '@h-ai/ui'
|
|
90
|
+
* const guide = createGuide({ tours: [{ id: 'intro', title: '入门', steps: [{ target: 'save', title: '保存', description: '提交当前资料' }] }], persistence: 'memory' })
|
|
91
|
+
* const offered = guide.startIfNeeded('intro')
|
|
92
|
+
* if (offered) guide.openHelp()
|
|
93
|
+
* guide.stop()
|
|
94
|
+
* ```
|
|
74
95
|
*/
|
|
75
96
|
export function createGuide(options) {
|
|
76
97
|
const storage = createGuideStorage(options);
|
package/dist/i18n.svelte.d.ts
CHANGED
|
@@ -7,19 +7,71 @@
|
|
|
7
7
|
import type { Locale, LocaleInfo } from '@h-ai/core';
|
|
8
8
|
import { changeUILocale as setGlobalLocale } from './internal/locale.js';
|
|
9
9
|
declare const DEFAULT_LOCALE: string, DEFAULT_LOCALES: LocaleInfo[];
|
|
10
|
+
/**
|
|
11
|
+
* 检查语言是否匹配应用支持列表,允许区域回退,不把默认值计作命中。
|
|
12
|
+
* @param locale - 显式语言代码;省略时使用当前上下文。
|
|
13
|
+
* @param supportedLocales - 应用支持的语言列表。
|
|
14
|
+
* @returns 是否存在真实支持项。
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { isLocaleSupported } from '@h-ai/ui/i18n'
|
|
18
|
+
* const supported = isLocaleSupported('en-GB')
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
10
21
|
declare function isLocaleSupported(locale: Locale, supportedLocales?: LocaleInfo[]): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* 将候选语言归一化为支持列表中的实际代码,无命中时使用默认值。
|
|
24
|
+
* @param locale - 显式语言代码;省略时使用当前上下文。
|
|
25
|
+
* @param supportedLocales - 应用支持的语言列表。
|
|
26
|
+
* @param defaultLocale - 无候选命中时的默认语言。
|
|
27
|
+
* @returns 归一化后的文本。
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* import { resolveLocale } from '@h-ai/ui/i18n'
|
|
31
|
+
* const locale = resolveLocale('unsupported', undefined, 'zh-CN')
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
11
34
|
declare function resolveLocale(locale: Locale, supportedLocales?: LocaleInfo[], defaultLocale?: Locale): Locale;
|
|
35
|
+
/**
|
|
36
|
+
* 依浏览器语言顺序选择实际支持项;SSR 或无匹配项返回 null。
|
|
37
|
+
* @param supportedLocales - 应用支持的语言列表。
|
|
38
|
+
* @returns 规范的语言代码或 null。
|
|
39
|
+
* @example
|
|
40
|
+
* ```ts
|
|
41
|
+
* import { detectBrowserLocale } from '@h-ai/ui/i18n'
|
|
42
|
+
* const locale = detectBrowserLocale()
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
12
45
|
declare function detectBrowserLocale(supportedLocales?: LocaleInfo[]): Locale | null;
|
|
46
|
+
/**
|
|
47
|
+
* 替换消息模板中的命名参数;缺少的参数保留原占位符。
|
|
48
|
+
* @param template - 包含命名占位符的消息模板。
|
|
49
|
+
* @param params - 消息插值参数。
|
|
50
|
+
* @returns 归一化后的文本。
|
|
51
|
+
* @example
|
|
52
|
+
* ```ts
|
|
53
|
+
* import { interpolate } from '@h-ai/ui/i18n'
|
|
54
|
+
* const message = interpolate('你好,{name}', { name: 'Ada' })
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
13
57
|
declare function interpolate(template: string, params?: Record<string, string | number | boolean>): string;
|
|
14
58
|
/**
|
|
15
59
|
* 创建 locale 状态管理器
|
|
16
60
|
*
|
|
17
61
|
* @param options - 配置选项
|
|
18
|
-
* @param options.defaultLocale -
|
|
62
|
+
* @param options.defaultLocale - 全部候选不支持后的默认 locale;不在列表时使用首个支持项。
|
|
19
63
|
* @param options.supportedLocales - 支持的 locale 列表
|
|
20
|
-
* @param options.detectBrowser -
|
|
64
|
+
* @param options.detectBrowser - 是否按完整 navigator.languages 顺序匹配;全部失败才回退默认值。
|
|
21
65
|
* @param options.persistKey - localStorage key
|
|
22
66
|
* @returns locale 状态对象
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* import { createLocaleStore } from '@h-ai/ui'
|
|
71
|
+
* const locale = createLocaleStore({ defaultLocale: 'zh-CN', detectBrowser: false, persistKey: 'demo-locale' })
|
|
72
|
+
* locale.set('en-US')
|
|
73
|
+
* const selected = locale.current
|
|
74
|
+
* ```
|
|
23
75
|
*/
|
|
24
76
|
export declare function createLocaleStore(options?: {
|
|
25
77
|
defaultLocale?: Locale;
|
|
@@ -33,7 +85,7 @@ export declare function createLocaleStore(options?: {
|
|
|
33
85
|
readonly supported: LocaleInfo[];
|
|
34
86
|
/**
|
|
35
87
|
* 设置当前语言
|
|
36
|
-
*
|
|
88
|
+
* 浏览器同步到 @h-ai/core;SSR 仅改变当前 store,消息语言由 runWithLocale 绑定。
|
|
37
89
|
* 注意:你还需要调用 Paraglide 的 setLocale 来更新 UI 翻译
|
|
38
90
|
*/
|
|
39
91
|
set(locale: Locale): void;
|
|
@@ -42,4 +94,13 @@ export declare function createLocaleStore(options?: {
|
|
|
42
94
|
};
|
|
43
95
|
export type { InterpolationParams, Locale, LocaleInfo } from '@h-ai/core';
|
|
44
96
|
export { DEFAULT_LOCALE, DEFAULT_LOCALES, detectBrowserLocale, interpolate, isLocaleSupported, resolveLocale, setGlobalLocale, };
|
|
97
|
+
/**
|
|
98
|
+
* 读取 core 当前请求或浏览器上下文的语言,不由 UI store 隐式改写服务端默认值。
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* import { getGlobalLocale } from '@h-ai/ui'
|
|
103
|
+
* const currentLocale = getGlobalLocale()
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
45
106
|
export declare const getGlobalLocale: () => Locale;
|
package/dist/i18n.svelte.js
CHANGED
|
@@ -9,30 +9,91 @@ import { readStoredValue, writeStoredValue } from './internal/browser-safety.js'
|
|
|
9
9
|
import { changeUILocale as setGlobalLocale } from './internal/locale.js';
|
|
10
10
|
// 从 core.i18n 解构常用函数
|
|
11
11
|
const { DEFAULT_LOCALE, DEFAULT_LOCALES, } = core.i18n;
|
|
12
|
+
/** 匹配实际支持项;区域/脚本逐级回退,始终返回列表中的原始代码,不执行默认回退。 */
|
|
13
|
+
function matchSupportedLocale(locale, supportedLocales) {
|
|
14
|
+
const normalize = (value) => value.trim().replaceAll('_', '-').toLowerCase();
|
|
15
|
+
let candidate = normalize(locale);
|
|
16
|
+
while (candidate) {
|
|
17
|
+
const exact = supportedLocales.find(item => normalize(item.code) === candidate);
|
|
18
|
+
if (exact)
|
|
19
|
+
return exact.code;
|
|
20
|
+
const variant = supportedLocales.find(item => normalize(item.code).startsWith(`${candidate}-`));
|
|
21
|
+
if (variant)
|
|
22
|
+
return variant.code;
|
|
23
|
+
const separator = candidate.lastIndexOf('-');
|
|
24
|
+
candidate = separator < 0 ? '' : candidate.slice(0, separator);
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 检查语言是否匹配应用支持列表,允许区域回退,不把默认值计作命中。
|
|
30
|
+
* @param locale - 显式语言代码;省略时使用当前上下文。
|
|
31
|
+
* @param supportedLocales - 应用支持的语言列表。
|
|
32
|
+
* @returns 是否存在真实支持项。
|
|
33
|
+
* @example
|
|
34
|
+
* ```ts
|
|
35
|
+
* import { isLocaleSupported } from '@h-ai/ui/i18n'
|
|
36
|
+
* const supported = isLocaleSupported('en-GB')
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
12
39
|
function isLocaleSupported(locale, supportedLocales = DEFAULT_LOCALES) {
|
|
13
|
-
|
|
14
|
-
return supportedLocales.some(item => item.code === normalized);
|
|
40
|
+
return matchSupportedLocale(locale, supportedLocales) !== null;
|
|
15
41
|
}
|
|
42
|
+
/**
|
|
43
|
+
* 将候选语言归一化为支持列表中的实际代码,无命中时使用默认值。
|
|
44
|
+
* @param locale - 显式语言代码;省略时使用当前上下文。
|
|
45
|
+
* @param supportedLocales - 应用支持的语言列表。
|
|
46
|
+
* @param defaultLocale - 无候选命中时的默认语言。
|
|
47
|
+
* @returns 归一化后的文本。
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* import { resolveLocale } from '@h-ai/ui/i18n'
|
|
51
|
+
* const locale = resolveLocale('unsupported', undefined, 'zh-CN')
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
16
54
|
function resolveLocale(locale, supportedLocales = DEFAULT_LOCALES, defaultLocale = DEFAULT_LOCALE) {
|
|
17
|
-
|
|
18
|
-
|
|
55
|
+
return matchSupportedLocale(locale, supportedLocales)
|
|
56
|
+
?? matchSupportedLocale(defaultLocale, supportedLocales)
|
|
57
|
+
?? supportedLocales[0]?.code
|
|
58
|
+
?? defaultLocale;
|
|
19
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* 依浏览器语言顺序选择实际支持项;SSR 或无匹配项返回 null。
|
|
62
|
+
* @param supportedLocales - 应用支持的语言列表。
|
|
63
|
+
* @returns 规范的语言代码或 null。
|
|
64
|
+
* @example
|
|
65
|
+
* ```ts
|
|
66
|
+
* import { detectBrowserLocale } from '@h-ai/ui/i18n'
|
|
67
|
+
* const locale = detectBrowserLocale()
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
20
70
|
function detectBrowserLocale(supportedLocales = DEFAULT_LOCALES) {
|
|
21
|
-
if (typeof navigator === 'undefined') {
|
|
71
|
+
if (typeof window === 'undefined' || typeof navigator === 'undefined') {
|
|
22
72
|
return null;
|
|
23
73
|
}
|
|
24
74
|
const browserCandidates = [
|
|
25
|
-
navigator.language,
|
|
26
75
|
...(navigator.languages ?? []),
|
|
76
|
+
navigator.language,
|
|
27
77
|
];
|
|
28
78
|
for (const candidate of browserCandidates) {
|
|
29
|
-
const resolved =
|
|
30
|
-
if (
|
|
79
|
+
const resolved = matchSupportedLocale(candidate, supportedLocales);
|
|
80
|
+
if (resolved) {
|
|
31
81
|
return resolved;
|
|
32
82
|
}
|
|
33
83
|
}
|
|
34
84
|
return null;
|
|
35
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* 替换消息模板中的命名参数;缺少的参数保留原占位符。
|
|
88
|
+
* @param template - 包含命名占位符的消息模板。
|
|
89
|
+
* @param params - 消息插值参数。
|
|
90
|
+
* @returns 归一化后的文本。
|
|
91
|
+
* @example
|
|
92
|
+
* ```ts
|
|
93
|
+
* import { interpolate } from '@h-ai/ui/i18n'
|
|
94
|
+
* const message = interpolate('你好,{name}', { name: 'Ada' })
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
36
97
|
function interpolate(template, params = {}) {
|
|
37
98
|
return template.replace(/\{(\w+)\}/g, (_, key) => {
|
|
38
99
|
const value = params[key];
|
|
@@ -46,21 +107,30 @@ const LOCALE_STORAGE_KEY = 'hai-locale';
|
|
|
46
107
|
* 创建 locale 状态管理器
|
|
47
108
|
*
|
|
48
109
|
* @param options - 配置选项
|
|
49
|
-
* @param options.defaultLocale -
|
|
110
|
+
* @param options.defaultLocale - 全部候选不支持后的默认 locale;不在列表时使用首个支持项。
|
|
50
111
|
* @param options.supportedLocales - 支持的 locale 列表
|
|
51
|
-
* @param options.detectBrowser -
|
|
112
|
+
* @param options.detectBrowser - 是否按完整 navigator.languages 顺序匹配;全部失败才回退默认值。
|
|
52
113
|
* @param options.persistKey - localStorage key
|
|
53
114
|
* @returns locale 状态对象
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```ts
|
|
118
|
+
* import { createLocaleStore } from '@h-ai/ui'
|
|
119
|
+
* const locale = createLocaleStore({ defaultLocale: 'zh-CN', detectBrowser: false, persistKey: 'demo-locale' })
|
|
120
|
+
* locale.set('en-US')
|
|
121
|
+
* const selected = locale.current
|
|
122
|
+
* ```
|
|
54
123
|
*/
|
|
55
124
|
export function createLocaleStore(options = {}) {
|
|
56
125
|
const { defaultLocale = DEFAULT_LOCALE, supportedLocales = DEFAULT_LOCALES, detectBrowser = true, persistKey = LOCALE_STORAGE_KEY, } = options;
|
|
57
126
|
// 初始化 locale
|
|
58
|
-
let initialLocale = defaultLocale;
|
|
127
|
+
let initialLocale = resolveLocale(defaultLocale, supportedLocales, defaultLocale);
|
|
59
128
|
if (typeof window !== 'undefined') {
|
|
60
129
|
// 1. 优先从 localStorage 读取
|
|
61
130
|
const savedLocale = readStoredValue(persistKey);
|
|
62
|
-
|
|
63
|
-
|
|
131
|
+
const supportedSavedLocale = savedLocale ? matchSupportedLocale(savedLocale, supportedLocales) : null;
|
|
132
|
+
if (supportedSavedLocale) {
|
|
133
|
+
initialLocale = supportedSavedLocale;
|
|
64
134
|
}
|
|
65
135
|
// 2. 其次检测浏览器语言
|
|
66
136
|
else if (detectBrowser) {
|
|
@@ -70,8 +140,9 @@ export function createLocaleStore(options = {}) {
|
|
|
70
140
|
}
|
|
71
141
|
}
|
|
72
142
|
}
|
|
73
|
-
//
|
|
74
|
-
|
|
143
|
+
// SSR store 属于当前组件树,不能修改另一个请求的默认语言。
|
|
144
|
+
if (typeof window !== 'undefined')
|
|
145
|
+
setGlobalLocale(initialLocale);
|
|
75
146
|
// 使用 Svelte 5 runes 创建响应式状态
|
|
76
147
|
let currentLocale = $state(initialLocale);
|
|
77
148
|
return {
|
|
@@ -85,14 +156,15 @@ export function createLocaleStore(options = {}) {
|
|
|
85
156
|
},
|
|
86
157
|
/**
|
|
87
158
|
* 设置当前语言
|
|
88
|
-
*
|
|
159
|
+
* 浏览器同步到 @h-ai/core;SSR 仅改变当前 store,消息语言由 runWithLocale 绑定。
|
|
89
160
|
* 注意:你还需要调用 Paraglide 的 setLocale 来更新 UI 翻译
|
|
90
161
|
*/
|
|
91
162
|
set(locale) {
|
|
92
163
|
const resolved = resolveLocale(locale, supportedLocales, defaultLocale);
|
|
93
164
|
currentLocale = resolved;
|
|
94
|
-
//
|
|
95
|
-
|
|
165
|
+
// 服务端语言由外层 runWithLocale 明确绑定,store 只在浏览器同步应用状态。
|
|
166
|
+
if (typeof window !== 'undefined')
|
|
167
|
+
setGlobalLocale(resolved);
|
|
96
168
|
// 持久化到 localStorage
|
|
97
169
|
if (typeof window !== 'undefined') {
|
|
98
170
|
writeStoredValue(persistKey, resolved);
|
|
@@ -107,4 +179,13 @@ export function createLocaleStore(options = {}) {
|
|
|
107
179
|
// 重导出常用常量和函数(便于应用层使用)
|
|
108
180
|
export { DEFAULT_LOCALE, DEFAULT_LOCALES, detectBrowserLocale, interpolate, isLocaleSupported, resolveLocale, setGlobalLocale, };
|
|
109
181
|
// 导出额外的便捷函数
|
|
182
|
+
/**
|
|
183
|
+
* 读取 core 当前请求或浏览器上下文的语言,不由 UI store 隐式改写服务端默认值。
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```ts
|
|
187
|
+
* import { getGlobalLocale } from '@h-ai/ui'
|
|
188
|
+
* const currentLocale = getGlobalLocale()
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
110
191
|
export const getGlobalLocale = core.i18n.getGlobalLocale;
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export * from './components/index.js';
|
|
|
8
8
|
export * from './guide-types.js';
|
|
9
9
|
export * from './guide.svelte.js';
|
|
10
10
|
export * from './i18n.svelte.js';
|
|
11
|
-
export
|
|
11
|
+
export type { ClipboardHostWriter } from './internal/browser-safety.js';
|
|
12
|
+
export { registerClipboardHostWriter, writeTextToClipboard } from './internal/browser-safety.js';
|
|
12
13
|
export * from './message.svelte.js';
|
|
13
14
|
export * from './messagebox.svelte.js';
|
|
14
15
|
export * from './theme-config.js';
|
package/dist/index.js
CHANGED
|
@@ -10,8 +10,7 @@ export * from './guide-types.js';
|
|
|
10
10
|
export * from './guide.svelte.js';
|
|
11
11
|
// ─── i18n 国际化(Paraglide 辅助工具) ───
|
|
12
12
|
export * from './i18n.svelte.js';
|
|
13
|
-
|
|
14
|
-
export * from './internal/browser-safety.js';
|
|
13
|
+
export { registerClipboardHostWriter, writeTextToClipboard } from './internal/browser-safety.js';
|
|
15
14
|
// ─── Message 轻量消息提示(类似 ElementUI Message) ───
|
|
16
15
|
export * from './message.svelte.js';
|
|
17
16
|
// ─── MessageBox 命令式弹框(类似 ElementUI MessageBox) ───
|
|
@@ -4,15 +4,38 @@
|
|
|
4
4
|
* 统一封装容易在受限 WebView、隐私模式或不安全上下文中失败的浏览器 API,
|
|
5
5
|
* 让组件在能力缺失时优雅降级而不是抛出运行时错误。
|
|
6
6
|
*/
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* 宿主页面剪贴板写入器(跨域 iframe 场景由嵌入方注入)。
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import type { ClipboardHostWriter } from '@h-ai/ui'
|
|
13
|
+
* const writer: ClipboardHostWriter = async text => {
|
|
14
|
+
* try { await navigator.clipboard.writeText(text); return true }
|
|
15
|
+
* catch { return false }
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
8
19
|
export type ClipboardHostWriter = (text: string) => Promise<boolean>;
|
|
9
20
|
/**
|
|
10
21
|
* 注册宿主页面剪贴板写入器。
|
|
11
22
|
*
|
|
12
23
|
* 当 iframe 内 Clipboard API 与 execCommand 都不可用时,把文本交给宿主页面写入。
|
|
13
|
-
*
|
|
24
|
+
* 宿主仍须满足自身权限、焦点与用户激活要求;返回 false 表示实际写入未成功,不能保证兜底一定可用。
|
|
14
25
|
*
|
|
15
26
|
* @param writer - 宿主写入器;传入 null 注销
|
|
27
|
+
* @returns {void} 无返回值;替换宿主写入器,null 用于注销。
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* import { registerClipboardHostWriter } from '@h-ai/ui'
|
|
32
|
+
* registerClipboardHostWriter(async text => {
|
|
33
|
+
* try { await navigator.clipboard.writeText(text); return true }
|
|
34
|
+
* catch { return false }
|
|
35
|
+
* })
|
|
36
|
+
* // 宿主销毁时注销,避免保留过期窗口闭包。
|
|
37
|
+
* registerClipboardHostWriter(null)
|
|
38
|
+
* ```
|
|
16
39
|
*/
|
|
17
40
|
export declare function registerClipboardHostWriter(writer: ClipboardHostWriter | null): void;
|
|
18
41
|
/**
|
|
@@ -20,12 +43,29 @@ export declare function registerClipboardHostWriter(writer: ClipboardHostWriter
|
|
|
20
43
|
*
|
|
21
44
|
* 某些浏览器隐私模式或嵌入式 WebView 会在访问 localStorage 时直接抛出 SecurityError,
|
|
22
45
|
* 这里统一吞掉异常并回退为 null。
|
|
46
|
+
* @param key - 要读取的条目或消息键。
|
|
47
|
+
* @returns 偏好值;未保存、SSR 或读取失败时返回 null。
|
|
48
|
+
*
|
|
49
|
+
* @example 模块内部上下文
|
|
50
|
+
* ```ts
|
|
51
|
+
* const savedTheme = readStoredValue('demo-theme')
|
|
52
|
+
* // 只保存非敏感偏好;不可用于认证 Token。
|
|
53
|
+
* ```
|
|
23
54
|
*/
|
|
24
55
|
export declare function readStoredValue(key: string): string | null;
|
|
25
56
|
/**
|
|
26
57
|
* 安全写入 localStorage。
|
|
27
58
|
*
|
|
28
59
|
* 返回值显式告诉调用方持久化是否成功,方便调用方在失败时继续使用内存态而不必中断交互。
|
|
60
|
+
* @param key - 要读取的条目或消息键。
|
|
61
|
+
* @param value - 待处理或校验的值。
|
|
62
|
+
* @returns 持久化是否成功;失败时调用方可继续保留非敏感内存偏好。
|
|
63
|
+
*
|
|
64
|
+
* @example 模块内部上下文
|
|
65
|
+
* ```ts
|
|
66
|
+
* const persisted = writeStoredValue('demo-theme', 'dark')
|
|
67
|
+
* if (!persisted) { const memoryTheme = 'dark' }
|
|
68
|
+
* ```
|
|
29
69
|
*/
|
|
30
70
|
export declare function writeStoredValue(key: string, value: string): boolean;
|
|
31
71
|
/**
|
|
@@ -35,5 +75,14 @@ export declare function writeStoredValue(key: string, value: string): boolean;
|
|
|
35
75
|
* 或浏览器策略禁用时回退到 `document.execCommand('copy')`;
|
|
36
76
|
* 跨域 iframe 中上述两种方式都可能被权限/聚焦策略拒绝时,再回退到宿主页面写入器,
|
|
37
77
|
* 确保尽可能多的环境下复制操作可用。
|
|
78
|
+
* @param text - 待处理文本。
|
|
79
|
+
* @returns 任一实际写入路径是否成功。
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```ts
|
|
83
|
+
* import { writeTextToClipboard } from '@h-ai/ui'
|
|
84
|
+
* const copied = await writeTextToClipboard('https://example.com/help')
|
|
85
|
+
* if (!copied) throw new Error('Clipboard is unavailable')
|
|
86
|
+
* ```
|
|
38
87
|
*/
|
|
39
88
|
export declare function writeTextToClipboard(text: string): Promise<boolean>;
|
|
@@ -9,9 +9,21 @@ let clipboardHostWriter = null;
|
|
|
9
9
|
* 注册宿主页面剪贴板写入器。
|
|
10
10
|
*
|
|
11
11
|
* 当 iframe 内 Clipboard API 与 execCommand 都不可用时,把文本交给宿主页面写入。
|
|
12
|
-
*
|
|
12
|
+
* 宿主仍须满足自身权限、焦点与用户激活要求;返回 false 表示实际写入未成功,不能保证兜底一定可用。
|
|
13
13
|
*
|
|
14
14
|
* @param writer - 宿主写入器;传入 null 注销
|
|
15
|
+
* @returns {void} 无返回值;替换宿主写入器,null 用于注销。
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { registerClipboardHostWriter } from '@h-ai/ui'
|
|
20
|
+
* registerClipboardHostWriter(async text => {
|
|
21
|
+
* try { await navigator.clipboard.writeText(text); return true }
|
|
22
|
+
* catch { return false }
|
|
23
|
+
* })
|
|
24
|
+
* // 宿主销毁时注销,避免保留过期窗口闭包。
|
|
25
|
+
* registerClipboardHostWriter(null)
|
|
26
|
+
* ```
|
|
15
27
|
*/
|
|
16
28
|
export function registerClipboardHostWriter(writer) {
|
|
17
29
|
clipboardHostWriter = writer;
|
|
@@ -21,12 +33,20 @@ export function registerClipboardHostWriter(writer) {
|
|
|
21
33
|
*
|
|
22
34
|
* 某些浏览器隐私模式或嵌入式 WebView 会在访问 localStorage 时直接抛出 SecurityError,
|
|
23
35
|
* 这里统一吞掉异常并回退为 null。
|
|
36
|
+
* @param key - 要读取的条目或消息键。
|
|
37
|
+
* @returns 偏好值;未保存、SSR 或读取失败时返回 null。
|
|
38
|
+
*
|
|
39
|
+
* @example 模块内部上下文
|
|
40
|
+
* ```ts
|
|
41
|
+
* const savedTheme = readStoredValue('demo-theme')
|
|
42
|
+
* // 只保存非敏感偏好;不可用于认证 Token。
|
|
43
|
+
* ```
|
|
24
44
|
*/
|
|
25
45
|
export function readStoredValue(key) {
|
|
26
|
-
if (typeof localStorage === 'undefined') {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
46
|
try {
|
|
47
|
+
if (typeof localStorage === 'undefined') {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
30
50
|
return localStorage.getItem(key);
|
|
31
51
|
}
|
|
32
52
|
catch {
|
|
@@ -37,12 +57,21 @@ export function readStoredValue(key) {
|
|
|
37
57
|
* 安全写入 localStorage。
|
|
38
58
|
*
|
|
39
59
|
* 返回值显式告诉调用方持久化是否成功,方便调用方在失败时继续使用内存态而不必中断交互。
|
|
60
|
+
* @param key - 要读取的条目或消息键。
|
|
61
|
+
* @param value - 待处理或校验的值。
|
|
62
|
+
* @returns 持久化是否成功;失败时调用方可继续保留非敏感内存偏好。
|
|
63
|
+
*
|
|
64
|
+
* @example 模块内部上下文
|
|
65
|
+
* ```ts
|
|
66
|
+
* const persisted = writeStoredValue('demo-theme', 'dark')
|
|
67
|
+
* if (!persisted) { const memoryTheme = 'dark' }
|
|
68
|
+
* ```
|
|
40
69
|
*/
|
|
41
70
|
export function writeStoredValue(key, value) {
|
|
42
|
-
if (typeof localStorage === 'undefined') {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
71
|
try {
|
|
72
|
+
if (typeof localStorage === 'undefined') {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
46
75
|
localStorage.setItem(key, value);
|
|
47
76
|
return true;
|
|
48
77
|
}
|
|
@@ -57,6 +86,15 @@ export function writeStoredValue(key, value) {
|
|
|
57
86
|
* 或浏览器策略禁用时回退到 `document.execCommand('copy')`;
|
|
58
87
|
* 跨域 iframe 中上述两种方式都可能被权限/聚焦策略拒绝时,再回退到宿主页面写入器,
|
|
59
88
|
* 确保尽可能多的环境下复制操作可用。
|
|
89
|
+
* @param text - 待处理文本。
|
|
90
|
+
* @returns 任一实际写入路径是否成功。
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* import { writeTextToClipboard } from '@h-ai/ui'
|
|
95
|
+
* const copied = await writeTextToClipboard('https://example.com/help')
|
|
96
|
+
* if (!copied) throw new Error('Clipboard is unavailable')
|
|
97
|
+
* ```
|
|
60
98
|
*/
|
|
61
99
|
export async function writeTextToClipboard(text) {
|
|
62
100
|
// 现代 Clipboard API(仅安全上下文可用)
|