@h-ai/ui 0.1.0-alpha5
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/LICENSE +202 -0
- package/README.md +488 -0
- package/auto-import.d.ts +96 -0
- package/auto-import.js +259 -0
- package/dist/components/compounds/Accordion.svelte +142 -0
- package/dist/components/compounds/Accordion.svelte.d.ts +25 -0
- package/dist/components/compounds/ActionSheet.svelte +116 -0
- package/dist/components/compounds/ActionSheet.svelte.d.ts +22 -0
- package/dist/components/compounds/Alert.svelte +67 -0
- package/dist/components/compounds/Alert.svelte.d.ts +8 -0
- package/dist/components/compounds/AppBar.svelte +77 -0
- package/dist/components/compounds/AppBar.svelte.d.ts +20 -0
- package/dist/components/compounds/BottomNav.svelte +75 -0
- package/dist/components/compounds/BottomNav.svelte.d.ts +18 -0
- package/dist/components/compounds/Breadcrumb.svelte +49 -0
- package/dist/components/compounds/Breadcrumb.svelte.d.ts +4 -0
- package/dist/components/compounds/Calendar.svelte +116 -0
- package/dist/components/compounds/Calendar.svelte.d.ts +47 -0
- package/dist/components/compounds/Card.svelte +77 -0
- package/dist/components/compounds/Card.svelte.d.ts +8 -0
- package/dist/components/compounds/Combobox.svelte +327 -0
- package/dist/components/compounds/Combobox.svelte.d.ts +69 -0
- package/dist/components/compounds/Confirm.svelte +90 -0
- package/dist/components/compounds/Confirm.svelte.d.ts +4 -0
- package/dist/components/compounds/DataTable.svelte +133 -0
- package/dist/components/compounds/DataTable.svelte.d.ts +69 -0
- package/dist/components/compounds/DatePicker.svelte +135 -0
- package/dist/components/compounds/DatePicker.svelte.d.ts +46 -0
- package/dist/components/compounds/Drawer.svelte +113 -0
- package/dist/components/compounds/Drawer.svelte.d.ts +4 -0
- package/dist/components/compounds/Dropdown.svelte +91 -0
- package/dist/components/compounds/Dropdown.svelte.d.ts +8 -0
- package/dist/components/compounds/Empty.svelte +83 -0
- package/dist/components/compounds/Empty.svelte.d.ts +4 -0
- package/dist/components/compounds/Form.svelte +96 -0
- package/dist/components/compounds/Form.svelte.d.ts +7 -0
- package/dist/components/compounds/FormField.svelte +56 -0
- package/dist/components/compounds/FormField.svelte.d.ts +4 -0
- package/dist/components/compounds/InfiniteScroll.svelte +82 -0
- package/dist/components/compounds/InfiniteScroll.svelte.d.ts +22 -0
- package/dist/components/compounds/Modal.svelte +123 -0
- package/dist/components/compounds/Modal.svelte.d.ts +8 -0
- package/dist/components/compounds/PageHeader.svelte +44 -0
- package/dist/components/compounds/PageHeader.svelte.d.ts +28 -0
- package/dist/components/compounds/Pagination.svelte +157 -0
- package/dist/components/compounds/Pagination.svelte.d.ts +4 -0
- package/dist/components/compounds/Popover.svelte +137 -0
- package/dist/components/compounds/Popover.svelte.d.ts +4 -0
- package/dist/components/compounds/PullRefresh.svelte +98 -0
- package/dist/components/compounds/PullRefresh.svelte.d.ts +16 -0
- package/dist/components/compounds/Result.svelte +84 -0
- package/dist/components/compounds/Result.svelte.d.ts +4 -0
- package/dist/components/compounds/SafeArea.svelte +37 -0
- package/dist/components/compounds/SafeArea.svelte.d.ts +12 -0
- package/dist/components/compounds/Skeleton.svelte +75 -0
- package/dist/components/compounds/Skeleton.svelte.d.ts +8 -0
- package/dist/components/compounds/Steps.svelte +111 -0
- package/dist/components/compounds/Steps.svelte.d.ts +4 -0
- package/dist/components/compounds/SwipeCell.svelte +115 -0
- package/dist/components/compounds/SwipeCell.svelte.d.ts +19 -0
- package/dist/components/compounds/Tabs.svelte +79 -0
- package/dist/components/compounds/Tabs.svelte.d.ts +8 -0
- package/dist/components/compounds/TagInput.svelte +108 -0
- package/dist/components/compounds/TagInput.svelte.d.ts +4 -0
- package/dist/components/compounds/Timeline.svelte +167 -0
- package/dist/components/compounds/Timeline.svelte.d.ts +25 -0
- package/dist/components/compounds/ToastContainer.svelte +59 -0
- package/dist/components/compounds/ToastContainer.svelte.d.ts +3 -0
- package/dist/components/compounds/Tooltip.svelte +41 -0
- package/dist/components/compounds/Tooltip.svelte.d.ts +4 -0
- package/dist/components/compounds/accordion-types.d.ts +16 -0
- package/dist/components/compounds/accordion-types.js +5 -0
- package/dist/components/compounds/action-sheet-types.d.ts +14 -0
- package/dist/components/compounds/action-sheet-types.js +5 -0
- package/dist/components/compounds/bottom-nav-types.d.ts +17 -0
- package/dist/components/compounds/bottom-nav-types.js +5 -0
- package/dist/components/compounds/index.d.ts +44 -0
- package/dist/components/compounds/index.js +54 -0
- package/dist/components/compounds/swipe-cell-types.d.ts +14 -0
- package/dist/components/compounds/swipe-cell-types.js +5 -0
- package/dist/components/compounds/timeline-types.d.ts +20 -0
- package/dist/components/compounds/timeline-types.js +5 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.js +12 -0
- package/dist/components/primitives/Avatar.svelte +102 -0
- package/dist/components/primitives/Avatar.svelte.d.ts +8 -0
- package/dist/components/primitives/Badge.svelte +33 -0
- package/dist/components/primitives/Badge.svelte.d.ts +8 -0
- package/dist/components/primitives/BareButton.svelte +45 -0
- package/dist/components/primitives/BareButton.svelte.d.ts +4 -0
- package/dist/components/primitives/BareInput.svelte +101 -0
- package/dist/components/primitives/BareInput.svelte.d.ts +4 -0
- package/dist/components/primitives/Button.svelte +60 -0
- package/dist/components/primitives/Button.svelte.d.ts +8 -0
- package/dist/components/primitives/Checkbox.svelte +58 -0
- package/dist/components/primitives/Checkbox.svelte.d.ts +4 -0
- package/dist/components/primitives/IconButton.svelte +105 -0
- package/dist/components/primitives/IconButton.svelte.d.ts +4 -0
- package/dist/components/primitives/Input.svelte +130 -0
- package/dist/components/primitives/Input.svelte.d.ts +8 -0
- package/dist/components/primitives/Progress.svelte +58 -0
- package/dist/components/primitives/Progress.svelte.d.ts +4 -0
- package/dist/components/primitives/Radio.svelte +60 -0
- package/dist/components/primitives/Radio.svelte.d.ts +25 -0
- package/dist/components/primitives/Range.svelte +117 -0
- package/dist/components/primitives/Range.svelte.d.ts +27 -0
- package/dist/components/primitives/Rating.svelte +148 -0
- package/dist/components/primitives/Rating.svelte.d.ts +27 -0
- package/dist/components/primitives/Select.svelte +95 -0
- package/dist/components/primitives/Select.svelte.d.ts +25 -0
- package/dist/components/primitives/Spinner.svelte +54 -0
- package/dist/components/primitives/Spinner.svelte.d.ts +4 -0
- package/dist/components/primitives/Switch.svelte +53 -0
- package/dist/components/primitives/Switch.svelte.d.ts +4 -0
- package/dist/components/primitives/Tag.svelte +64 -0
- package/dist/components/primitives/Tag.svelte.d.ts +4 -0
- package/dist/components/primitives/Textarea.svelte +92 -0
- package/dist/components/primitives/Textarea.svelte.d.ts +4 -0
- package/dist/components/primitives/ToggleCheckbox.svelte +36 -0
- package/dist/components/primitives/ToggleCheckbox.svelte.d.ts +4 -0
- package/dist/components/primitives/ToggleInput.svelte +36 -0
- package/dist/components/primitives/ToggleInput.svelte.d.ts +4 -0
- package/dist/components/primitives/ToggleRadio.svelte +36 -0
- package/dist/components/primitives/ToggleRadio.svelte.d.ts +4 -0
- package/dist/components/primitives/index.d.ts +26 -0
- package/dist/components/primitives/index.js +30 -0
- package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte +387 -0
- package/dist/components/scenes/ai/AiDocumentDownloadMenu.svelte.d.ts +38 -0
- package/dist/components/scenes/ai/AiDocumentEditor.svelte +2259 -0
- package/dist/components/scenes/ai/AiDocumentEditor.svelte.d.ts +4 -0
- package/dist/components/scenes/ai/MarkdownRenderer.svelte +460 -0
- package/dist/components/scenes/ai/MarkdownRenderer.svelte.d.ts +4 -0
- package/dist/components/scenes/ai/document-download.d.ts +40 -0
- package/dist/components/scenes/ai/document-download.js +300 -0
- package/dist/components/scenes/ai/document-parse.d.ts +28 -0
- package/dist/components/scenes/ai/document-parse.js +243 -0
- package/dist/components/scenes/ai/document-types.d.ts +164 -0
- package/dist/components/scenes/ai/document-types.js +1 -0
- package/dist/components/scenes/ai/index.d.ts +17 -0
- package/dist/components/scenes/ai/index.js +13 -0
- package/dist/components/scenes/ai/markdown-parse.d.ts +32 -0
- package/dist/components/scenes/ai/markdown-parse.js +161 -0
- package/dist/components/scenes/app/FeedbackModal.svelte +160 -0
- package/dist/components/scenes/app/FeedbackModal.svelte.d.ts +47 -0
- package/dist/components/scenes/app/LanguageSwitch.svelte +136 -0
- package/dist/components/scenes/app/LanguageSwitch.svelte.d.ts +50 -0
- package/dist/components/scenes/app/SettingsModal.svelte +174 -0
- package/dist/components/scenes/app/SettingsModal.svelte.d.ts +31 -0
- package/dist/components/scenes/app/ThemeSelector.svelte +176 -0
- package/dist/components/scenes/app/ThemeSelector.svelte.d.ts +31 -0
- package/dist/components/scenes/app/ThemeToggle.svelte +76 -0
- package/dist/components/scenes/app/ThemeToggle.svelte.d.ts +29 -0
- package/dist/components/scenes/app/index.d.ts +11 -0
- package/dist/components/scenes/app/index.js +11 -0
- package/dist/components/scenes/crud/CrudDeleteConfirm.svelte +39 -0
- package/dist/components/scenes/crud/CrudDeleteConfirm.svelte.d.ts +18 -0
- package/dist/components/scenes/crud/CrudDetailDrawer.svelte +155 -0
- package/dist/components/scenes/crud/CrudDetailDrawer.svelte.d.ts +38 -0
- package/dist/components/scenes/crud/CrudEditDrawer.svelte +222 -0
- package/dist/components/scenes/crud/CrudEditDrawer.svelte.d.ts +48 -0
- package/dist/components/scenes/crud/CrudFilterBar.svelte +96 -0
- package/dist/components/scenes/crud/CrudFilterBar.svelte.d.ts +31 -0
- package/dist/components/scenes/crud/CrudPage.svelte +499 -0
- package/dist/components/scenes/crud/CrudPage.svelte.d.ts +114 -0
- package/dist/components/scenes/crud/crud-types.d.ts +135 -0
- package/dist/components/scenes/crud/crud-types.js +7 -0
- package/dist/components/scenes/crud/index.d.ts +12 -0
- package/dist/components/scenes/crud/index.js +11 -0
- package/dist/components/scenes/crypto/EncryptedInput.svelte +156 -0
- package/dist/components/scenes/crypto/EncryptedInput.svelte.d.ts +32 -0
- package/dist/components/scenes/crypto/HashDisplay.svelte +97 -0
- package/dist/components/scenes/crypto/HashDisplay.svelte.d.ts +4 -0
- package/dist/components/scenes/crypto/SignatureDisplay.svelte +161 -0
- package/dist/components/scenes/crypto/SignatureDisplay.svelte.d.ts +4 -0
- package/dist/components/scenes/crypto/index.d.ts +9 -0
- package/dist/components/scenes/crypto/index.js +11 -0
- package/dist/components/scenes/iam/ChangePasswordForm.svelte +134 -0
- package/dist/components/scenes/iam/ChangePasswordForm.svelte.d.ts +8 -0
- package/dist/components/scenes/iam/ForgotPasswordForm.svelte +147 -0
- package/dist/components/scenes/iam/ForgotPasswordForm.svelte.d.ts +4 -0
- package/dist/components/scenes/iam/LoginForm.svelte +191 -0
- package/dist/components/scenes/iam/LoginForm.svelte.d.ts +8 -0
- package/dist/components/scenes/iam/PasswordInput.svelte +203 -0
- package/dist/components/scenes/iam/PasswordInput.svelte.d.ts +49 -0
- package/dist/components/scenes/iam/PermGuard.svelte +69 -0
- package/dist/components/scenes/iam/PermGuard.svelte.d.ts +16 -0
- package/dist/components/scenes/iam/RegisterForm.svelte +269 -0
- package/dist/components/scenes/iam/RegisterForm.svelte.d.ts +8 -0
- package/dist/components/scenes/iam/ResetPasswordForm.svelte +153 -0
- package/dist/components/scenes/iam/ResetPasswordForm.svelte.d.ts +8 -0
- package/dist/components/scenes/iam/UserProfile.svelte +251 -0
- package/dist/components/scenes/iam/UserProfile.svelte.d.ts +4 -0
- package/dist/components/scenes/iam/index.d.ts +16 -0
- package/dist/components/scenes/iam/index.js +18 -0
- package/dist/components/scenes/iam/password-utils.d.ts +15 -0
- package/dist/components/scenes/iam/password-utils.js +19 -0
- package/dist/components/scenes/iam/permission-context.svelte.d.ts +90 -0
- package/dist/components/scenes/iam/permission-context.svelte.js +114 -0
- package/dist/components/scenes/index.d.ts +13 -0
- package/dist/components/scenes/index.js +20 -0
- package/dist/components/scenes/storage/AvatarUpload.svelte +218 -0
- package/dist/components/scenes/storage/AvatarUpload.svelte.d.ts +4 -0
- package/dist/components/scenes/storage/FileList.svelte +260 -0
- package/dist/components/scenes/storage/FileList.svelte.d.ts +4 -0
- package/dist/components/scenes/storage/FileUpload.svelte +400 -0
- package/dist/components/scenes/storage/FileUpload.svelte.d.ts +7 -0
- package/dist/components/scenes/storage/ImageUpload.svelte +285 -0
- package/dist/components/scenes/storage/ImageUpload.svelte.d.ts +4 -0
- package/dist/components/scenes/storage/index.d.ts +10 -0
- package/dist/components/scenes/storage/index.js +12 -0
- package/dist/components/scenes/types.d.ts +583 -0
- package/dist/components/scenes/types.js +7 -0
- package/dist/i18n.svelte.d.ts +44 -0
- package/dist/i18n.svelte.js +108 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +19 -0
- package/dist/messages/en-US.json +242 -0
- package/dist/messages/zh-CN.json +242 -0
- package/dist/messages.d.ts +29 -0
- package/dist/messages.js +42 -0
- package/dist/styles/design-tokens.css +58 -0
- package/dist/styles/global.css +218 -0
- package/dist/styles/mobile.css +105 -0
- package/dist/theme-config.d.ts +92 -0
- package/dist/theme-config.js +122 -0
- package/dist/toast.svelte.d.ts +45 -0
- package/dist/toast.svelte.js +77 -0
- package/dist/types.d.ts +944 -0
- package/dist/types.js +7 -0
- package/dist/utils/platform.svelte.d.ts +54 -0
- package/dist/utils/platform.svelte.js +87 -0
- package/dist/utils.d.ts +46 -0
- package/dist/utils.js +100 -0
- package/package.json +69 -0
package/auto-import.d.ts
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* =============================================================================
|
|
3
|
+
* @h-ai/ui - 自动导入类型声明
|
|
4
|
+
* =============================================================================
|
|
5
|
+
* 让 Svelte/TS 识别通过预处理器自动注入的组件名称。
|
|
6
|
+
* =============================================================================
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
type AutoImportMarkup = (args: { content: string; filename?: string }) => { code: string }
|
|
10
|
+
|
|
11
|
+
type AutoImportHaiUiPreprocessor = {
|
|
12
|
+
name: string
|
|
13
|
+
markup: AutoImportMarkup
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function autoImportHaiUi(): AutoImportHaiUiPreprocessor
|
|
17
|
+
|
|
18
|
+
declare global {
|
|
19
|
+
// primitives
|
|
20
|
+
const Avatar: typeof import('@h-ai/ui')['Avatar']
|
|
21
|
+
const Badge: typeof import('@h-ai/ui')['Badge']
|
|
22
|
+
const BareButton: typeof import('@h-ai/ui')['BareButton']
|
|
23
|
+
const BareInput: typeof import('@h-ai/ui')['BareInput']
|
|
24
|
+
const Button: typeof import('@h-ai/ui')['Button']
|
|
25
|
+
const Checkbox: typeof import('@h-ai/ui')['Checkbox']
|
|
26
|
+
const IconButton: typeof import('@h-ai/ui')['IconButton']
|
|
27
|
+
const Input: typeof import('@h-ai/ui')['Input']
|
|
28
|
+
const Progress: typeof import('@h-ai/ui')['Progress']
|
|
29
|
+
const Radio: typeof import('@h-ai/ui')['Radio']
|
|
30
|
+
const Rating: typeof import('@h-ai/ui')['Rating']
|
|
31
|
+
const Select: typeof import('@h-ai/ui')['Select']
|
|
32
|
+
const Spinner: typeof import('@h-ai/ui')['Spinner']
|
|
33
|
+
const Switch: typeof import('@h-ai/ui')['Switch']
|
|
34
|
+
const Tag: typeof import('@h-ai/ui')['Tag']
|
|
35
|
+
const Textarea: typeof import('@h-ai/ui')['Textarea']
|
|
36
|
+
const ToggleCheckbox: typeof import('@h-ai/ui')['ToggleCheckbox']
|
|
37
|
+
const ToggleInput: typeof import('@h-ai/ui')['ToggleInput']
|
|
38
|
+
const ToggleRadio: typeof import('@h-ai/ui')['ToggleRadio']
|
|
39
|
+
|
|
40
|
+
// compounds
|
|
41
|
+
const Accordion: typeof import('@h-ai/ui')['Accordion']
|
|
42
|
+
const Alert: typeof import('@h-ai/ui')['Alert']
|
|
43
|
+
const Breadcrumb: typeof import('@h-ai/ui')['Breadcrumb']
|
|
44
|
+
const Calendar: typeof import('@h-ai/ui')['Calendar']
|
|
45
|
+
const Card: typeof import('@h-ai/ui')['Card']
|
|
46
|
+
const Combobox: typeof import('@h-ai/ui')['Combobox']
|
|
47
|
+
const Confirm: typeof import('@h-ai/ui')['Confirm']
|
|
48
|
+
const DataTable: typeof import('@h-ai/ui')['DataTable']
|
|
49
|
+
const DatePicker: typeof import('@h-ai/ui')['DatePicker']
|
|
50
|
+
const Drawer: typeof import('@h-ai/ui')['Drawer']
|
|
51
|
+
const Dropdown: typeof import('@h-ai/ui')['Dropdown']
|
|
52
|
+
const Empty: typeof import('@h-ai/ui')['Empty']
|
|
53
|
+
const Form: typeof import('@h-ai/ui')['Form']
|
|
54
|
+
const FormField: typeof import('@h-ai/ui')['FormField']
|
|
55
|
+
const Modal: typeof import('@h-ai/ui')['Modal']
|
|
56
|
+
const PageHeader: typeof import('@h-ai/ui')['PageHeader']
|
|
57
|
+
const Pagination: typeof import('@h-ai/ui')['Pagination']
|
|
58
|
+
const Popover: typeof import('@h-ai/ui')['Popover']
|
|
59
|
+
const Result: typeof import('@h-ai/ui')['Result']
|
|
60
|
+
const Skeleton: typeof import('@h-ai/ui')['Skeleton']
|
|
61
|
+
const Steps: typeof import('@h-ai/ui')['Steps']
|
|
62
|
+
const Tabs: typeof import('@h-ai/ui')['Tabs']
|
|
63
|
+
const TagInput: typeof import('@h-ai/ui')['TagInput']
|
|
64
|
+
const Timeline: typeof import('@h-ai/ui')['Timeline']
|
|
65
|
+
const ToastContainer: typeof import('@h-ai/ui')['ToastContainer']
|
|
66
|
+
const Tooltip: typeof import('@h-ai/ui')['Tooltip']
|
|
67
|
+
|
|
68
|
+
// scenes - app
|
|
69
|
+
const FeedbackModal: typeof import('@h-ai/ui')['FeedbackModal']
|
|
70
|
+
const LanguageSwitch: typeof import('@h-ai/ui')['LanguageSwitch']
|
|
71
|
+
const SettingsModal: typeof import('@h-ai/ui')['SettingsModal']
|
|
72
|
+
const ThemeSelector: typeof import('@h-ai/ui')['ThemeSelector']
|
|
73
|
+
const ThemeToggle: typeof import('@h-ai/ui')['ThemeToggle']
|
|
74
|
+
|
|
75
|
+
// scenes - iam
|
|
76
|
+
const ChangePasswordForm: typeof import('@h-ai/ui')['ChangePasswordForm']
|
|
77
|
+
const ForgotPasswordForm: typeof import('@h-ai/ui')['ForgotPasswordForm']
|
|
78
|
+
const LoginForm: typeof import('@h-ai/ui')['LoginForm']
|
|
79
|
+
const PasswordInput: typeof import('@h-ai/ui')['PasswordInput']
|
|
80
|
+
const RegisterForm: typeof import('@h-ai/ui')['RegisterForm']
|
|
81
|
+
const ResetPasswordForm: typeof import('@h-ai/ui')['ResetPasswordForm']
|
|
82
|
+
const UserProfile: typeof import('@h-ai/ui')['UserProfile']
|
|
83
|
+
|
|
84
|
+
// scenes - storage
|
|
85
|
+
const AvatarUpload: typeof import('@h-ai/ui')['AvatarUpload']
|
|
86
|
+
const FileList: typeof import('@h-ai/ui')['FileList']
|
|
87
|
+
const FileUpload: typeof import('@h-ai/ui')['FileUpload']
|
|
88
|
+
const ImageUpload: typeof import('@h-ai/ui')['ImageUpload']
|
|
89
|
+
|
|
90
|
+
// scenes - crypto
|
|
91
|
+
const EncryptedInput: typeof import('@h-ai/ui')['EncryptedInput']
|
|
92
|
+
const HashDisplay: typeof import('@h-ai/ui')['HashDisplay']
|
|
93
|
+
const SignatureDisplay: typeof import('@h-ai/ui')['SignatureDisplay']
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export {}
|
package/auto-import.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* =============================================================================
|
|
3
|
+
* @h-ai/ui - 自动导入预处理器
|
|
4
|
+
* =============================================================================
|
|
5
|
+
* 目标:在 Svelte 编译阶段自动注入 @h-ai/ui 组件 import,避免页面显式引入。
|
|
6
|
+
* 说明:该预处理器会在 svelte-check 与 Vite 编译时生效。
|
|
7
|
+
* =============================================================================
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const UI_COMPONENTS = new Set([
|
|
11
|
+
// primitives
|
|
12
|
+
'Avatar',
|
|
13
|
+
'Badge',
|
|
14
|
+
'BareButton',
|
|
15
|
+
'BareInput',
|
|
16
|
+
'Button',
|
|
17
|
+
'Checkbox',
|
|
18
|
+
'IconButton',
|
|
19
|
+
'Input',
|
|
20
|
+
'Progress',
|
|
21
|
+
'Radio',
|
|
22
|
+
'Range',
|
|
23
|
+
'Rating',
|
|
24
|
+
'Select',
|
|
25
|
+
'Spinner',
|
|
26
|
+
'Switch',
|
|
27
|
+
'Tag',
|
|
28
|
+
'Textarea',
|
|
29
|
+
'ToggleCheckbox',
|
|
30
|
+
'ToggleInput',
|
|
31
|
+
'ToggleRadio',
|
|
32
|
+
// compounds
|
|
33
|
+
'Accordion',
|
|
34
|
+
'ActionSheet',
|
|
35
|
+
'Alert',
|
|
36
|
+
'AppBar',
|
|
37
|
+
'BottomNav',
|
|
38
|
+
'Breadcrumb',
|
|
39
|
+
'Calendar',
|
|
40
|
+
'Card',
|
|
41
|
+
'Combobox',
|
|
42
|
+
'Confirm',
|
|
43
|
+
'DataTable',
|
|
44
|
+
'DatePicker',
|
|
45
|
+
'Drawer',
|
|
46
|
+
'Dropdown',
|
|
47
|
+
'Empty',
|
|
48
|
+
'Form',
|
|
49
|
+
'FormField',
|
|
50
|
+
'InfiniteScroll',
|
|
51
|
+
'Modal',
|
|
52
|
+
'PageHeader',
|
|
53
|
+
'Pagination',
|
|
54
|
+
'Popover',
|
|
55
|
+
'PullRefresh',
|
|
56
|
+
'Result',
|
|
57
|
+
'SafeArea',
|
|
58
|
+
'Skeleton',
|
|
59
|
+
'Steps',
|
|
60
|
+
'SwipeCell',
|
|
61
|
+
'Tabs',
|
|
62
|
+
'TagInput',
|
|
63
|
+
'Timeline',
|
|
64
|
+
'ToastContainer',
|
|
65
|
+
'Tooltip',
|
|
66
|
+
// scenes - app
|
|
67
|
+
'FeedbackModal',
|
|
68
|
+
'LanguageSwitch',
|
|
69
|
+
'SettingsModal',
|
|
70
|
+
'ThemeSelector',
|
|
71
|
+
'ThemeToggle',
|
|
72
|
+
// scenes - iam
|
|
73
|
+
'ChangePasswordForm',
|
|
74
|
+
'ForgotPasswordForm',
|
|
75
|
+
'LoginForm',
|
|
76
|
+
'PasswordInput',
|
|
77
|
+
'PermGuard',
|
|
78
|
+
'RegisterForm',
|
|
79
|
+
'ResetPasswordForm',
|
|
80
|
+
'UserProfile',
|
|
81
|
+
// scenes - storage
|
|
82
|
+
'AvatarUpload',
|
|
83
|
+
'FileList',
|
|
84
|
+
'FileUpload',
|
|
85
|
+
'ImageUpload',
|
|
86
|
+
// scenes - crypto
|
|
87
|
+
'EncryptedInput',
|
|
88
|
+
'HashDisplay',
|
|
89
|
+
'SignatureDisplay',
|
|
90
|
+
// scenes - ai
|
|
91
|
+
'AiDocumentEditor',
|
|
92
|
+
'MarkdownRenderer',
|
|
93
|
+
])
|
|
94
|
+
|
|
95
|
+
const TAG_REGEX = /<([A-Z][A-Za-z0-9]*)\b/g
|
|
96
|
+
const SCRIPT_REGEX = /<script\b([^>]*)>([\s\S]*?)<\/script>/g
|
|
97
|
+
const UI_IMPORT_REGEX = /import\s*\{([^}]+)\}\s*from\s*['"]@h-ai\/ui['"];?/
|
|
98
|
+
|
|
99
|
+
function collectUsedComponents(content) {
|
|
100
|
+
const used = new Set()
|
|
101
|
+
for (const match of content.matchAll(TAG_REGEX)) {
|
|
102
|
+
const name = match[1]
|
|
103
|
+
if (UI_COMPONENTS.has(name)) {
|
|
104
|
+
used.add(name)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return used
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function collectImportedNames(scriptContent) {
|
|
111
|
+
const imported = new Set()
|
|
112
|
+
const lines = scriptContent.split('\n')
|
|
113
|
+
let buffer = ''
|
|
114
|
+
|
|
115
|
+
const flushImport = (statement) => {
|
|
116
|
+
const fromIndex = statement.lastIndexOf(' from ')
|
|
117
|
+
if (fromIndex === -1)
|
|
118
|
+
return
|
|
119
|
+
|
|
120
|
+
let clause = statement.slice('import '.length, fromIndex).trim()
|
|
121
|
+
clause = clause.replace(/^type\s+/, '')
|
|
122
|
+
if (!clause)
|
|
123
|
+
return
|
|
124
|
+
|
|
125
|
+
// default + named: Button, { Input as UiInput }
|
|
126
|
+
if (clause.includes('{')) {
|
|
127
|
+
const [defaultPart, namedPart] = clause.split('{')
|
|
128
|
+
const defaultName = defaultPart.replace(',', '').trim()
|
|
129
|
+
if (defaultName)
|
|
130
|
+
imported.add(defaultName)
|
|
131
|
+
|
|
132
|
+
const raw = namedPart.replace('}', '')
|
|
133
|
+
for (const segment of raw.split(',')) {
|
|
134
|
+
const cleaned = segment.trim().replace(/^type\s+/, '')
|
|
135
|
+
if (!cleaned)
|
|
136
|
+
continue
|
|
137
|
+
const [original] = cleaned.split(/\s+as\s+/i)
|
|
138
|
+
if (original)
|
|
139
|
+
imported.add(original.trim())
|
|
140
|
+
}
|
|
141
|
+
return
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// namespace import: * as name
|
|
145
|
+
if (clause.startsWith('* as ')) {
|
|
146
|
+
const name = clause.replace('* as ', '').trim()
|
|
147
|
+
if (name)
|
|
148
|
+
imported.add(name)
|
|
149
|
+
return
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// default import
|
|
153
|
+
imported.add(clause)
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
for (const line of lines) {
|
|
157
|
+
const trimmed = line.trim()
|
|
158
|
+
if (!buffer) {
|
|
159
|
+
if (!trimmed.startsWith('import '))
|
|
160
|
+
continue
|
|
161
|
+
buffer = trimmed
|
|
162
|
+
if (trimmed.endsWith(';')) {
|
|
163
|
+
flushImport(buffer)
|
|
164
|
+
buffer = ''
|
|
165
|
+
}
|
|
166
|
+
continue
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
buffer += ` ${trimmed}`
|
|
170
|
+
if (trimmed.endsWith(';')) {
|
|
171
|
+
flushImport(buffer)
|
|
172
|
+
buffer = ''
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (buffer)
|
|
177
|
+
flushImport(buffer)
|
|
178
|
+
|
|
179
|
+
return imported
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function mergeHaiUiImport(scriptContent, components) {
|
|
183
|
+
if (components.length === 0)
|
|
184
|
+
return scriptContent
|
|
185
|
+
|
|
186
|
+
const existingMatch = scriptContent.match(UI_IMPORT_REGEX)
|
|
187
|
+
if (existingMatch) {
|
|
188
|
+
const existing = existingMatch[1]
|
|
189
|
+
.split(',')
|
|
190
|
+
.map(name => name.trim())
|
|
191
|
+
.filter(Boolean)
|
|
192
|
+
|
|
193
|
+
const merged = [...existing, ...components.filter(name => !existing.includes(name))]
|
|
194
|
+
const updated = `import { ${merged.join(', ')} } from '@h-ai/ui'`
|
|
195
|
+
return scriptContent.replace(UI_IMPORT_REGEX, updated)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return `import { ${components.join(', ')} } from '@h-ai/ui'\n${scriptContent}`
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function updateScriptBlock(scriptContent, usedComponents) {
|
|
202
|
+
const imported = collectImportedNames(scriptContent)
|
|
203
|
+
const missing = [...usedComponents].filter(name => !imported.has(name))
|
|
204
|
+
return mergeHaiUiImport(scriptContent, missing)
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function autoImportHaiUi() {
|
|
208
|
+
return {
|
|
209
|
+
name: 'auto-import-hai-ui',
|
|
210
|
+
markup({ content, filename }) {
|
|
211
|
+
if (!filename || !filename.endsWith('.svelte')) {
|
|
212
|
+
return { code: content }
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// 跳过 @h-ai/ui 包自身的文件,避免重复导入
|
|
216
|
+
const normalizedPath = filename.replace(/\\/g, '/')
|
|
217
|
+
if (normalizedPath.includes('/packages/ui/') || normalizedPath.includes('/@h-ai/ui/')) {
|
|
218
|
+
return { code: content }
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const usedComponents = collectUsedComponents(content)
|
|
222
|
+
if (usedComponents.size === 0) {
|
|
223
|
+
return { code: content }
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
let lastIndex = 0
|
|
227
|
+
let updated = ''
|
|
228
|
+
let applied = false
|
|
229
|
+
|
|
230
|
+
for (const match of content.matchAll(SCRIPT_REGEX)) {
|
|
231
|
+
const [fullMatch, attrs, scriptContent] = match
|
|
232
|
+
const isModule = /context\s*=\s*['"]module['"]/i.test(attrs)
|
|
233
|
+
const start = match.index ?? 0
|
|
234
|
+
|
|
235
|
+
updated += content.slice(lastIndex, start)
|
|
236
|
+
lastIndex = start + fullMatch.length
|
|
237
|
+
|
|
238
|
+
if (!applied && !isModule) {
|
|
239
|
+
const newScript = updateScriptBlock(scriptContent, usedComponents)
|
|
240
|
+
updated += `<script${attrs}>${newScript}</script>`
|
|
241
|
+
applied = true
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
updated += fullMatch
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (!applied) {
|
|
249
|
+
const scriptBlock = `<script lang="ts">${updateScriptBlock('', usedComponents)}</script>\n`
|
|
250
|
+
return { code: scriptBlock + content }
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
updated += content.slice(lastIndex)
|
|
254
|
+
return { code: updated }
|
|
255
|
+
},
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export { autoImportHaiUi }
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
=============================================================================
|
|
3
|
+
@h-ai/ui - Accordion 组件
|
|
4
|
+
=============================================================================
|
|
5
|
+
手风琴/折叠面板组件,支持单选/多选模式、多种样式变体
|
|
6
|
+
|
|
7
|
+
使用 Svelte 5 Runes ($props, $state, $derived)
|
|
8
|
+
使用 DaisyUI collapse 类
|
|
9
|
+
=============================================================================
|
|
10
|
+
-->
|
|
11
|
+
|
|
12
|
+
<script lang='ts'>
|
|
13
|
+
import type { Snippet } from 'svelte'
|
|
14
|
+
import type { AccordionItem } from './accordion-types.js'
|
|
15
|
+
import { cn } from '../../utils.js'
|
|
16
|
+
import ToggleCheckbox from '../primitives/ToggleCheckbox.svelte'
|
|
17
|
+
import ToggleRadio from '../primitives/ToggleRadio.svelte'
|
|
18
|
+
|
|
19
|
+
interface Props {
|
|
20
|
+
/** 折叠项数据 */
|
|
21
|
+
items: AccordionItem[]
|
|
22
|
+
/** 当前展开的项(单选模式为 string,多选模式为 string[]) */
|
|
23
|
+
value?: string | string[]
|
|
24
|
+
/** 是否允许多选 */
|
|
25
|
+
multiple?: boolean
|
|
26
|
+
/** 样式变体 */
|
|
27
|
+
variant?: 'default' | 'bordered' | 'shadow' | 'joined'
|
|
28
|
+
/** 图标样式 */
|
|
29
|
+
icon?: 'arrow' | 'plus' | 'none'
|
|
30
|
+
/** 是否有分隔线 */
|
|
31
|
+
divider?: boolean
|
|
32
|
+
/** 变化事件 */
|
|
33
|
+
onchange?: (value: string | string[]) => void
|
|
34
|
+
/** 自定义类名 */
|
|
35
|
+
class?: string
|
|
36
|
+
/** 自定义内容渲染 */
|
|
37
|
+
children?: Snippet<[AccordionItem]>
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
let {
|
|
41
|
+
items,
|
|
42
|
+
value = $bindable(undefined),
|
|
43
|
+
multiple = false,
|
|
44
|
+
variant = 'default',
|
|
45
|
+
icon = 'arrow',
|
|
46
|
+
divider = false,
|
|
47
|
+
onchange,
|
|
48
|
+
class: className = '',
|
|
49
|
+
children,
|
|
50
|
+
}: Props = $props()
|
|
51
|
+
|
|
52
|
+
const groupName = `accordion-${Math.random().toString(36).slice(2, 9)}`
|
|
53
|
+
|
|
54
|
+
function isExpanded(itemId: string): boolean {
|
|
55
|
+
if (value === undefined)
|
|
56
|
+
return false
|
|
57
|
+
if (multiple) {
|
|
58
|
+
return Array.isArray(value) && value.includes(itemId)
|
|
59
|
+
}
|
|
60
|
+
return value === itemId
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function toggleItem(itemId: string) {
|
|
64
|
+
if (multiple) {
|
|
65
|
+
const current = Array.isArray(value) ? value : []
|
|
66
|
+
const newValue = current.includes(itemId)
|
|
67
|
+
? current.filter(id => id !== itemId)
|
|
68
|
+
: [...current, itemId]
|
|
69
|
+
value = newValue
|
|
70
|
+
onchange?.(newValue)
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
const newValue = value === itemId ? undefined : itemId
|
|
74
|
+
value = newValue as string
|
|
75
|
+
onchange?.(newValue as string)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const iconClass = $derived({
|
|
80
|
+
arrow: 'collapse-arrow',
|
|
81
|
+
plus: 'collapse-plus',
|
|
82
|
+
none: '',
|
|
83
|
+
}[icon] || 'collapse-arrow')
|
|
84
|
+
|
|
85
|
+
const containerClass = $derived(
|
|
86
|
+
cn(
|
|
87
|
+
variant === 'joined' && 'join join-vertical w-full',
|
|
88
|
+
className,
|
|
89
|
+
),
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
function getItemClass(item: AccordionItem): string {
|
|
93
|
+
return cn(
|
|
94
|
+
'collapse',
|
|
95
|
+
iconClass,
|
|
96
|
+
variant === 'bordered' && 'collapse-bordered border border-base-300',
|
|
97
|
+
variant === 'shadow' && 'shadow-md',
|
|
98
|
+
variant === 'joined' && 'join-item border border-base-300',
|
|
99
|
+
variant === 'default' && 'bg-base-100',
|
|
100
|
+
divider && variant !== 'joined' && 'border-b border-base-300',
|
|
101
|
+
item.disabled && 'opacity-50 pointer-events-none',
|
|
102
|
+
)
|
|
103
|
+
}
|
|
104
|
+
</script>
|
|
105
|
+
|
|
106
|
+
<div class={containerClass}>
|
|
107
|
+
{#each items as item (item.id)}
|
|
108
|
+
<div class={getItemClass(item)}>
|
|
109
|
+
{#if multiple}
|
|
110
|
+
<!-- 多选模式 - 使用 checkbox -->
|
|
111
|
+
<ToggleCheckbox
|
|
112
|
+
checked={isExpanded(item.id)}
|
|
113
|
+
disabled={item.disabled}
|
|
114
|
+
onchange={() => toggleItem(item.id)}
|
|
115
|
+
/>
|
|
116
|
+
{:else}
|
|
117
|
+
<!-- 单选模式 - 使用 radio -->
|
|
118
|
+
<ToggleRadio
|
|
119
|
+
name={groupName}
|
|
120
|
+
checked={isExpanded(item.id)}
|
|
121
|
+
disabled={item.disabled}
|
|
122
|
+
onchange={() => toggleItem(item.id)}
|
|
123
|
+
/>
|
|
124
|
+
{/if}
|
|
125
|
+
|
|
126
|
+
<div class='collapse-title font-semibold flex items-center gap-2'>
|
|
127
|
+
{#if item.icon}
|
|
128
|
+
<span class='text-lg'>{item.icon}</span>
|
|
129
|
+
{/if}
|
|
130
|
+
{item.title}
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<div class='collapse-content text-sm'>
|
|
134
|
+
{#if children}
|
|
135
|
+
{@render children(item)}
|
|
136
|
+
{:else if item.content}
|
|
137
|
+
<p>{item.content}</p>
|
|
138
|
+
{/if}
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
{/each}
|
|
142
|
+
</div>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Snippet } from 'svelte';
|
|
2
|
+
import type { AccordionItem } from './accordion-types.js';
|
|
3
|
+
interface Props {
|
|
4
|
+
/** 折叠项数据 */
|
|
5
|
+
items: AccordionItem[];
|
|
6
|
+
/** 当前展开的项(单选模式为 string,多选模式为 string[]) */
|
|
7
|
+
value?: string | string[];
|
|
8
|
+
/** 是否允许多选 */
|
|
9
|
+
multiple?: boolean;
|
|
10
|
+
/** 样式变体 */
|
|
11
|
+
variant?: 'default' | 'bordered' | 'shadow' | 'joined';
|
|
12
|
+
/** 图标样式 */
|
|
13
|
+
icon?: 'arrow' | 'plus' | 'none';
|
|
14
|
+
/** 是否有分隔线 */
|
|
15
|
+
divider?: boolean;
|
|
16
|
+
/** 变化事件 */
|
|
17
|
+
onchange?: (value: string | string[]) => void;
|
|
18
|
+
/** 自定义类名 */
|
|
19
|
+
class?: string;
|
|
20
|
+
/** 自定义内容渲染 */
|
|
21
|
+
children?: Snippet<[AccordionItem]>;
|
|
22
|
+
}
|
|
23
|
+
declare const Accordion: import("svelte").Component<Props, {}, "value">;
|
|
24
|
+
type Accordion = ReturnType<typeof Accordion>;
|
|
25
|
+
export default Accordion;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@h-ai/ui — ActionSheet(底部操作菜单)
|
|
3
|
+
|
|
4
|
+
用法:
|
|
5
|
+
<ActionSheet
|
|
6
|
+
open={showActions}
|
|
7
|
+
items={[
|
|
8
|
+
{ id: 'edit', label: '编辑' },
|
|
9
|
+
{ id: 'delete', label: '删除', destructive: true },
|
|
10
|
+
]}
|
|
11
|
+
onselect={(id) => handleAction(id)}
|
|
12
|
+
onclose={() => showActions = false}
|
|
13
|
+
/>
|
|
14
|
+
-->
|
|
15
|
+
<script lang='ts'>
|
|
16
|
+
import type { ActionSheetItem } from './action-sheet-types.js'
|
|
17
|
+
import { cn } from '../../utils.js'
|
|
18
|
+
|
|
19
|
+
// eslint-disable-next-line no-import-assign -- type re-export
|
|
20
|
+
export type { ActionSheetItem }
|
|
21
|
+
|
|
22
|
+
interface Props {
|
|
23
|
+
/** 是否显示 */
|
|
24
|
+
open?: boolean
|
|
25
|
+
/** 操作列表 */
|
|
26
|
+
items: ActionSheetItem[]
|
|
27
|
+
/** 标题 */
|
|
28
|
+
title?: string
|
|
29
|
+
/** 取消按钮文字 */
|
|
30
|
+
cancelText?: string
|
|
31
|
+
/** 选择回调 */
|
|
32
|
+
onselect?: (id: string) => void
|
|
33
|
+
/** 关闭回调 */
|
|
34
|
+
onclose?: () => void
|
|
35
|
+
/** 额外 CSS 类 */
|
|
36
|
+
class?: string
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const {
|
|
40
|
+
open = false,
|
|
41
|
+
items,
|
|
42
|
+
title,
|
|
43
|
+
cancelText = 'Cancel',
|
|
44
|
+
onselect,
|
|
45
|
+
onclose,
|
|
46
|
+
class: className,
|
|
47
|
+
}: Props = $props()
|
|
48
|
+
|
|
49
|
+
function handleSelect(id: string) {
|
|
50
|
+
onselect?.(id)
|
|
51
|
+
onclose?.()
|
|
52
|
+
}
|
|
53
|
+
</script>
|
|
54
|
+
|
|
55
|
+
{#if open}
|
|
56
|
+
<!-- 遮罩层 -->
|
|
57
|
+
<div
|
|
58
|
+
class='fixed inset-0 bg-black/50 z-50 transition-opacity'
|
|
59
|
+
role='button'
|
|
60
|
+
tabindex='-1'
|
|
61
|
+
onclick={onclose}
|
|
62
|
+
onkeydown={e => e.key === 'Escape' && onclose?.()}
|
|
63
|
+
></div>
|
|
64
|
+
|
|
65
|
+
<!-- 操作面板 -->
|
|
66
|
+
<div
|
|
67
|
+
class={cn(
|
|
68
|
+
'fixed bottom-0 left-0 right-0 z-50 bg-base-100 rounded-t-2xl hai-safe-bottom',
|
|
69
|
+
'animate-[slideUp_0.25s_ease-out]',
|
|
70
|
+
className,
|
|
71
|
+
)}
|
|
72
|
+
>
|
|
73
|
+
{#if title}
|
|
74
|
+
<div class='text-center text-sm text-base-content/60 py-3 border-b border-base-200'>
|
|
75
|
+
{title}
|
|
76
|
+
</div>
|
|
77
|
+
{/if}
|
|
78
|
+
|
|
79
|
+
<div class='py-1'>
|
|
80
|
+
{#each items as item (item.id)}
|
|
81
|
+
<button
|
|
82
|
+
type='button'
|
|
83
|
+
class={cn(
|
|
84
|
+
'w-full py-3.5 text-center text-base transition-colors',
|
|
85
|
+
'active:bg-base-200',
|
|
86
|
+
item.destructive && 'text-error',
|
|
87
|
+
item.disabled && 'opacity-50 cursor-not-allowed',
|
|
88
|
+
!item.destructive && !item.disabled && 'text-base-content',
|
|
89
|
+
)}
|
|
90
|
+
disabled={item.disabled}
|
|
91
|
+
onclick={() => handleSelect(item.id)}
|
|
92
|
+
>
|
|
93
|
+
{item.label}
|
|
94
|
+
</button>
|
|
95
|
+
{/each}
|
|
96
|
+
</div>
|
|
97
|
+
|
|
98
|
+
<!-- 取消按钮 -->
|
|
99
|
+
<div class='border-t-4 border-base-200'>
|
|
100
|
+
<button
|
|
101
|
+
type='button'
|
|
102
|
+
class='w-full py-3.5 text-center text-base font-medium text-base-content active:bg-base-200'
|
|
103
|
+
onclick={onclose}
|
|
104
|
+
>
|
|
105
|
+
{cancelText}
|
|
106
|
+
</button>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
{/if}
|
|
110
|
+
|
|
111
|
+
<style>
|
|
112
|
+
@keyframes slideUp {
|
|
113
|
+
from { transform: translateY(100%); }
|
|
114
|
+
to { transform: translateY(0); }
|
|
115
|
+
}
|
|
116
|
+
</style>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ActionSheetItem } from './action-sheet-types.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
/** 是否显示 */
|
|
4
|
+
open?: boolean;
|
|
5
|
+
/** 操作列表 */
|
|
6
|
+
items: ActionSheetItem[];
|
|
7
|
+
/** 标题 */
|
|
8
|
+
title?: string;
|
|
9
|
+
/** 取消按钮文字 */
|
|
10
|
+
cancelText?: string;
|
|
11
|
+
/** 选择回调 */
|
|
12
|
+
onselect?: (id: string) => void;
|
|
13
|
+
/** 关闭回调 */
|
|
14
|
+
onclose?: () => void;
|
|
15
|
+
/** 额外 CSS 类 */
|
|
16
|
+
class?: string;
|
|
17
|
+
}
|
|
18
|
+
declare const ActionSheet: import("svelte").Component<Props, {
|
|
19
|
+
ActionSheetItem: typeof ActionSheetItem;
|
|
20
|
+
}, "">;
|
|
21
|
+
type ActionSheet = ReturnType<typeof ActionSheet>;
|
|
22
|
+
export default ActionSheet;
|