@ticatec/uniface-element 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/README.md +320 -1
  2. package/README_CN.md +392 -0
  3. package/dist/accordion/Accordion.svelte +1 -1
  4. package/dist/action-bar/ActionBar.svelte +7 -1
  5. package/dist/attachment-files/FileRender.svelte +1 -1
  6. package/dist/attachment-files/FileUploadBar.svelte +7 -6
  7. package/dist/attachment-files/FileUploadPanel.svelte +2 -2
  8. package/dist/base-calendar/DateContext.js +5 -4
  9. package/dist/base-calendar/YearPickupPanel.svelte +4 -4
  10. package/dist/card/Card.svelte +1 -1
  11. package/dist/card/Card.svelte.d.ts +1 -1
  12. package/dist/cascade-options-select/CascadeOptionSelect.svelte +2 -3
  13. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +46 -1
  14. package/dist/cascade-options-select/CascadePanel.svelte +1 -1
  15. package/dist/checkbox/CheckBox.svelte +1 -1
  16. package/dist/color-picker/ColorPicker.svelte +9 -9
  17. package/dist/color-picker/ColorPicker.svelte.d.ts +0 -2
  18. package/dist/color-picker/ColorPickerPanel.svelte +11 -15
  19. package/dist/color-picker/ColorPickerPanel.svelte.d.ts +1 -1
  20. package/dist/common/CommonPicker.svelte +2 -2
  21. package/dist/common/CommonPicker.svelte.d.ts +1 -1
  22. package/dist/common/MouseClickHandler.d.ts +1 -1
  23. package/dist/common/Popover.svelte +28 -6
  24. package/dist/common/Popover.svelte.d.ts +9 -3
  25. package/dist/common/uniface-utils.js +6 -4
  26. package/dist/common-editor/CommonEditor.svelte +1 -1
  27. package/dist/common-editor/CommonEditor.svelte.d.ts +1 -1
  28. package/dist/common-editor/NumberInput.svelte +1 -1
  29. package/dist/common-editor/NumberInput.svelte.d.ts +1 -1
  30. package/dist/concise-data-table/ConciseListTable.svelte +7 -2
  31. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +1 -0
  32. package/dist/concise-data-table/DataRow.svelte +1 -1
  33. package/dist/concise-data-table/TableOptions.d.ts +1 -1
  34. package/dist/data-table/DataTable.svelte +1 -1
  35. package/dist/data-table/parts/ActionsPanel.svelte +4 -3
  36. package/dist/data-table/parts/ActionsRow.svelte +3 -3
  37. package/dist/data-table/parts/ContentPanel.svelte +3 -2
  38. package/dist/data-table/parts/FixedColumnsPanel.svelte +0 -1
  39. package/dist/data-table/parts/FixedColumnsPanel.svelte.d.ts +1 -2
  40. package/dist/data-table/parts/FixedHeaderPanel.svelte +2 -2
  41. package/dist/data-table/parts/FixedRow.svelte +2 -1
  42. package/dist/data-table/parts/FixedRow.svelte.d.ts +1 -1
  43. package/dist/data-table/parts/HrefCell.svelte +23 -2
  44. package/dist/data-table/parts/PopupMenu.svelte +25 -2
  45. package/dist/data-table/parts/PopupMenu.svelte.d.ts +8 -1
  46. package/dist/date-picker/DatePicker.svelte +0 -1
  47. package/dist/date-picker/DateTimePicker.svelte +3 -3
  48. package/dist/date-picker/ScrollBar.svelte +4 -7
  49. package/dist/date-range/DateRangeEditor.svelte +1 -1
  50. package/dist/dialog/CommonDialog.svelte +8 -5
  51. package/dist/dialog/CommonDialog.svelte.d.ts +2 -1
  52. package/dist/dialog/Dialog.svelte +37 -12
  53. package/dist/dialog/Dialog.svelte.d.ts +4 -3
  54. package/dist/dialog/DialogBoard.svelte +11 -8
  55. package/dist/dialog/DialogWrapper.svelte +10 -0
  56. package/dist/{common-editor/DateInput.svelte.d.ts → dialog/DialogWrapper.svelte.d.ts} +6 -13
  57. package/dist/dialog/Dialogs.js +1 -1
  58. package/dist/dialog/ModalResult.d.ts +5 -0
  59. package/dist/dialog/ModalResult.js +5 -0
  60. package/dist/drawer/Drawer.svelte +1 -1
  61. package/dist/form-field/FormField.svelte +2 -1
  62. package/dist/form-field/FormField.svelte.d.ts +1 -0
  63. package/dist/form-panel/flex-row-form/FormContainer.svelte +1 -1
  64. package/dist/form-panel/grid-form/EmptyCell.svelte +8 -7
  65. package/dist/form-panel/grid-form/EmptyCell.svelte.d.ts +2 -2
  66. package/dist/form-panel/grid-form/GridField.svelte +1 -1
  67. package/dist/i18nRes/i18nRes.d.ts +2 -0
  68. package/dist/i18nRes/i18nRes.js +44 -0
  69. package/dist/i18nRes/index.d.ts +2 -0
  70. package/dist/i18nRes/index.js +2 -0
  71. package/dist/image-files/ImageFilesField.svelte +1 -1
  72. package/dist/indicator/IndicatorBoard.svelte +1 -1
  73. package/dist/inline-cell-editor/InvalidEditor.svelte +1 -0
  74. package/dist/input-options-select/InputOptionsSelect.svelte +6 -6
  75. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +1 -1
  76. package/dist/layout/flex/FlexBlock.svelte +1 -1
  77. package/dist/lookup-editor/LookupEditor.svelte +1 -1
  78. package/dist/memo-editor/MemoEditor.svelte +2 -2
  79. package/dist/message-box/IMessageBox.d.ts +2 -4
  80. package/dist/message-box/IMessageBox.js +4 -6
  81. package/dist/message-box/MessageBoxBoard.svelte +1 -3
  82. package/dist/options-multi-select/OptionsMultiSelect.svelte +1 -1
  83. package/dist/prompts-text-editor/PromptsTextEditor.svelte +2 -2
  84. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +1 -1
  85. package/dist/property-editor/PropertyEditor.svelte +3 -3
  86. package/dist/text-editor/PasswordEditor.svelte +1 -1
  87. package/dist/transfer/Transfer.svelte +17 -12
  88. package/dist/transfer/Transfer.svelte.d.ts +0 -1
  89. package/dist/unit-number-editor/UnitNumberEditor.svelte +2 -2
  90. package/docs/buttons/cn/ActionBar.md +459 -0
  91. package/docs/buttons/cn/Button.md +228 -0
  92. package/docs/buttons/cn/IconButton.md +294 -0
  93. package/docs/buttons/cn/README.md +600 -0
  94. package/docs/buttons/cn/TextButton.md +163 -0
  95. package/docs/buttons/en/ActionBar.md +459 -0
  96. package/docs/buttons/en/Button.md +228 -0
  97. package/docs/buttons/en/IconButton.md +294 -0
  98. package/docs/buttons/en/README.md +600 -0
  99. package/docs/buttons/en/TextButton.md +163 -0
  100. package/docs/containers/cn/accordion.md +622 -0
  101. package/docs/containers/cn/box.md +445 -0
  102. package/docs/containers/cn/card.md +404 -0
  103. package/docs/containers/cn/page.md +576 -0
  104. package/docs/containers/cn/tabs.md +686 -0
  105. package/docs/containers/en/accordion.md +622 -0
  106. package/docs/containers/en/box.md +445 -0
  107. package/docs/containers/en/card.md +404 -0
  108. package/docs/containers/en/page.md +576 -0
  109. package/docs/containers/en/tabs.md +686 -0
  110. package/docs/data-display/cn/concise-data-table.md +731 -0
  111. package/docs/data-display/cn/listbox.md +786 -0
  112. package/docs/data-display/cn/treeview.md +863 -0
  113. package/docs/data-display/en/concise-data-table.md +732 -0
  114. package/docs/data-display/en/listbox.md +786 -0
  115. package/docs/data-display/en/treeview.md +863 -0
  116. package/docs/data-table/cn/README.md +596 -0
  117. package/docs/data-table/en/README.md +596 -0
  118. package/docs/dialog/cn/README.md +767 -0
  119. package/docs/dialog/en/README.md +767 -0
  120. package/docs/form/cn/README.md +847 -0
  121. package/docs/form/en/README.md +847 -0
  122. package/docs/form-components/cn/README.md +495 -0
  123. package/docs/form-components/cn/attachmentfilesfield.md +757 -0
  124. package/docs/form-components/cn/cascade-options-select.md +374 -0
  125. package/docs/form-components/cn/checkbox.md +58 -0
  126. package/docs/form-components/cn/date-picker.md +138 -0
  127. package/docs/form-components/cn/datetime-picker.md +228 -0
  128. package/docs/form-components/cn/group-checkbox.md +405 -0
  129. package/docs/form-components/cn/group-radiobox.md +525 -0
  130. package/docs/form-components/cn/imagefilesfield.md +651 -0
  131. package/docs/form-components/cn/input-options-select.md +250 -0
  132. package/docs/form-components/cn/lookup-editor.md +406 -0
  133. package/docs/form-components/cn/memoeditor.md +409 -0
  134. package/docs/form-components/cn/number-editor.md +261 -0
  135. package/docs/form-components/cn/options-multi-select.md +177 -0
  136. package/docs/form-components/cn/options-select.md +83 -0
  137. package/docs/form-components/cn/passwordeditor.md +538 -0
  138. package/docs/form-components/cn/prompts-text-editor.md +241 -0
  139. package/docs/form-components/cn/radiobutton.md +84 -0
  140. package/docs/form-components/cn/switch.md +178 -0
  141. package/docs/form-components/cn/text-editor.md +142 -0
  142. package/docs/form-components/cn/time-editor.md +159 -0
  143. package/docs/form-components/cn/unit-number-editor.md +164 -0
  144. package/docs/form-components/en/README.md +463 -0
  145. package/docs/form-components/en/attachmentfilesfield.md +757 -0
  146. package/docs/form-components/en/cascade-options-select.md +358 -0
  147. package/docs/form-components/en/checkbox.md +59 -0
  148. package/docs/form-components/en/date-picker.md +138 -0
  149. package/docs/form-components/en/datetime-picker.md +228 -0
  150. package/docs/form-components/en/group-checkbox.md +395 -0
  151. package/docs/form-components/en/group-radiobox.md +498 -0
  152. package/docs/form-components/en/imagefilesfield.md +651 -0
  153. package/docs/form-components/en/input-options-select.md +239 -0
  154. package/docs/form-components/en/lookup-editor.md +389 -0
  155. package/docs/form-components/en/memoeditor.md +409 -0
  156. package/docs/form-components/en/number-editor.md +249 -0
  157. package/docs/form-components/en/options-multi-select.md +177 -0
  158. package/docs/form-components/en/options-select.md +83 -0
  159. package/docs/form-components/en/passwordeditor.md +538 -0
  160. package/docs/form-components/en/prompts-text-editor.md +241 -0
  161. package/docs/form-components/en/radiobutton.md +84 -0
  162. package/docs/form-components/en/switch.md +180 -0
  163. package/docs/form-components/en/text-editor.md +142 -0
  164. package/docs/form-components/en/time-editor.md +159 -0
  165. package/docs/form-components/en/unit-number-editor.md +164 -0
  166. package/docs/form-layout/cn/criteria-field.md +652 -0
  167. package/docs/form-layout/cn/flex-form.md +454 -0
  168. package/docs/form-layout/cn/flex-row-form.md +542 -0
  169. package/docs/form-layout/cn/form-field.md +923 -0
  170. package/docs/form-layout/cn/grid-form.md +676 -0
  171. package/docs/form-layout/en/criteria-field.md +652 -0
  172. package/docs/form-layout/en/flex-form.md +454 -0
  173. package/docs/form-layout/en/flex-row-form.md +542 -0
  174. package/docs/form-layout/en/form-field.md +923 -0
  175. package/docs/form-layout/en/grid-form.md +676 -0
  176. package/docs/global/cn/README.md +534 -0
  177. package/docs/global/en/README.md +534 -0
  178. package/docs/layout/cn/classiclayout.md +460 -0
  179. package/docs/layout/cn/headerlayout.md +524 -0
  180. package/docs/layout/cn/sidebarlayout.md +263 -0
  181. package/docs/layout/en/classiclayout.md +951 -0
  182. package/docs/layout/en/headerlayout.md +524 -0
  183. package/docs/layout/en/sidebarlayout.md +262 -0
  184. package/docs/misc/cn/README.md +1217 -0
  185. package/docs/misc/en/README.md +1217 -0
  186. package/docs/navigation/cn/breadcrumb.md +291 -0
  187. package/docs/navigation/cn/navigator.md +322 -0
  188. package/docs/navigation/cn/navigatormenu.md +512 -0
  189. package/docs/navigation/cn/progressbar.md +199 -0
  190. package/docs/navigation/cn/progressstepbar.md +299 -0
  191. package/docs/navigation/en/breadcrumb.md +291 -0
  192. package/docs/navigation/en/navigator.md +322 -0
  193. package/docs/navigation/en/navigatormenu.md +512 -0
  194. package/docs/navigation/en/progressbar.md +199 -0
  195. package/docs/navigation/en/progressstepbar.md +299 -0
  196. package/docs/search-filters/cn/daterange.md +1156 -0
  197. package/docs/search-filters/cn/numberrange.md +688 -0
  198. package/docs/search-filters/cn/searchbox.md +1582 -0
  199. package/docs/search-filters/en/daterange.md +1156 -0
  200. package/docs/search-filters/en/numberrange.md +688 -0
  201. package/docs/search-filters/en/searchbox.md +1582 -0
  202. package/package.json +53 -13
  203. package/dist/common-editor/DateInput.svelte +0 -27
  204. package/dist/i18n_resources/index.d.ts +0 -3
  205. package/dist/i18n_resources/index.js +0 -3
  206. /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.d.ts +0 -0
  207. /package/dist/{i18n_resources → i18nRes}/uniface_cn_resource.js +0 -0
  208. /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.d.ts +0 -0
  209. /package/dist/{i18n_resources → i18nRes}/uniface_en_resource.js +0 -0
@@ -0,0 +1,576 @@
1
+ # Page 页面组件
2
+
3
+ 一个全面的页面容器组件,提供带有头部、导航操作和内容区域的结构化布局,用于构建完整的应用程序页面。
4
+
5
+ ## 概述
6
+
7
+ Page 组件旨在创建一致的全页面布局,具有内置的头部功能、导航操作(返回/重新加载)和内容容器。它非常适合创建应用程序页面、表单、仪表板和具有专业外观的详情视图。
8
+
9
+ ## 安装
10
+
11
+ ```typescript
12
+ import Page from '@ticatec/uniface-element/Page';
13
+ import { PageHeader } from '@ticatec/uniface-element/Page';
14
+ import type { PageAction } from '@ticatec/uniface-element/Page';
15
+ ```
16
+
17
+ ## 基本用法
18
+
19
+ ```svelte
20
+ <script lang="ts">
21
+ import Page from '@ticatec/uniface-element/Page';
22
+ </script>
23
+
24
+ <Page title="仪表板" comment="系统指标概览">
25
+ <div class="dashboard-content">
26
+ <p>您的页面内容在这里...</p>
27
+ </div>
28
+ </Page>
29
+ ```
30
+
31
+ ## 属性
32
+
33
+ | 属性 | 类型 | 默认值 | 描述 |
34
+ |------|------|--------|------|
35
+ | `title` | `string` | `''` | 显示在头部的页面标题 |
36
+ | `comment` | `string` | `null` | 副标题或描述文本 |
37
+ | `header$style` | `string` | `''` | 头部区域的自定义样式 |
38
+ | `content$style` | `string` | `''` | 内容区域的自定义样式 |
39
+ | `round` | `boolean` | `false` | 为页面应用圆角 |
40
+ | `shadow` | `boolean` | `true` | 为页面应用阴影效果 |
41
+ | `goBack` | `PageAction \| null` | `null` | 返回导航操作 |
42
+ | `reload` | `PageAction \| null` | `null` | 重新加载/刷新操作 |
43
+ | `style` | `string` | `''` | 页面包装器的自定义样式 |
44
+
45
+ ## 插槽
46
+
47
+ | 插槽 | 描述 |
48
+ |------|------|
49
+ | `default` | 页面的主要内容区域 |
50
+ | `page-header` | 自定义头部内容(覆盖默认头部) |
51
+ | `header-ext` | 额外的头部内容(扩展默认头部) |
52
+
53
+ ## PageAction 类型
54
+
55
+ ```typescript
56
+ export type PageAction = () => any;
57
+ ```
58
+
59
+ ## 使用示例
60
+
61
+ ### 基础页面
62
+
63
+ ```svelte
64
+ <script lang="ts">
65
+ import Page from '@ticatec/uniface-element/Page';
66
+ </script>
67
+
68
+ <Page title="用户资料" comment="管理您的账户设置">
69
+ <div class="profile-form">
70
+ <h3>个人信息</h3>
71
+ <p>在下面编辑您的资料详情...</p>
72
+ <!-- 表单内容 -->
73
+ </div>
74
+ </Page>
75
+ ```
76
+
77
+ ### 带导航操作的页面
78
+
79
+ ```svelte
80
+ <script lang="ts">
81
+ import Page from '@ticatec/uniface-element/Page';
82
+ import type { PageAction } from '@ticatec/uniface-element/Page';
83
+
84
+ const handleGoBack: PageAction = () => {
85
+ window.history.back();
86
+ console.log('正在返回...');
87
+ };
88
+
89
+ const handleReload: PageAction = () => {
90
+ window.location.reload();
91
+ console.log('正在重新加载页面...');
92
+ };
93
+ </script>
94
+
95
+ <Page
96
+ title="订单详情"
97
+ comment="订单 #12345 - 处理中"
98
+ goBack={handleGoBack}
99
+ reload={handleReload}
100
+ >
101
+ <div class="order-details">
102
+ <h3>订单信息</h3>
103
+ <p>客户: 张三</p>
104
+ <p>总计: ¥299.99</p>
105
+ <p>状态: 处理中</p>
106
+ </div>
107
+ </Page>
108
+ ```
109
+
110
+ ### 样式化页面
111
+
112
+ ```svelte
113
+ <script lang="ts">
114
+ import Page from '@ticatec/uniface-element/Page';
115
+ </script>
116
+
117
+ <Page
118
+ title="分析仪表板"
119
+ comment="实时业务指标"
120
+ round={true}
121
+ shadow={true}
122
+ style="max-width: 1200px; margin: 0 auto;"
123
+ header$style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white;"
124
+ content$style="padding: 30px;"
125
+ >
126
+ <div class="dashboard-grid">
127
+ <div class="metric-card">
128
+ <h4>收入</h4>
129
+ <div class="metric-value">¥45,231</div>
130
+ </div>
131
+ <div class="metric-card">
132
+ <h4>用户</h4>
133
+ <div class="metric-value">1,234</div>
134
+ </div>
135
+ <div class="metric-card">
136
+ <h4>转化率</h4>
137
+ <div class="metric-value">3.4%</div>
138
+ </div>
139
+ </div>
140
+ </Page>
141
+
142
+ <style>
143
+ .dashboard-grid {
144
+ display: grid;
145
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
146
+ gap: 20px;
147
+ }
148
+
149
+ .metric-card {
150
+ background: white;
151
+ border-radius: 8px;
152
+ padding: 20px;
153
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
154
+ text-align: center;
155
+ }
156
+
157
+ .metric-card h4 {
158
+ margin: 0 0 10px 0;
159
+ color: #666;
160
+ font-weight: normal;
161
+ }
162
+
163
+ .metric-value {
164
+ font-size: 2rem;
165
+ font-weight: bold;
166
+ color: #333;
167
+ }
168
+ </style>
169
+ ```
170
+
171
+ ### 带自定义头部的页面
172
+
173
+ ```svelte
174
+ <script lang="ts">
175
+ import Page from '@ticatec/uniface-element/Page';
176
+ import { PageHeader } from '@ticatec/uniface-element/Page';
177
+ </script>
178
+
179
+ <Page>
180
+ <div slot="page-header" class="custom-header">
181
+ <div class="header-left">
182
+ <h1>自定义仪表板</h1>
183
+ <p>高级分析和报告</p>
184
+ </div>
185
+ <div class="header-right">
186
+ <button class="export-btn">导出数据</button>
187
+ <button class="settings-btn">设置</button>
188
+ </div>
189
+ </div>
190
+
191
+ <div class="page-content">
192
+ <p>带有操作按钮和布局的自定义头部</p>
193
+ </div>
194
+ </Page>
195
+
196
+ <style>
197
+ .custom-header {
198
+ display: flex;
199
+ justify-content: space-between;
200
+ align-items: center;
201
+ padding: 20px;
202
+ background: #f8f9fa;
203
+ border-bottom: 1px solid #dee2e6;
204
+ }
205
+
206
+ .header-left h1 {
207
+ margin: 0 0 5px 0;
208
+ font-size: 1.5rem;
209
+ }
210
+
211
+ .header-left p {
212
+ margin: 0;
213
+ color: #666;
214
+ font-size: 0.875rem;
215
+ }
216
+
217
+ .header-right {
218
+ display: flex;
219
+ gap: 10px;
220
+ }
221
+
222
+ .export-btn, .settings-btn {
223
+ padding: 8px 16px;
224
+ border: 1px solid #007bff;
225
+ background: #007bff;
226
+ color: white;
227
+ border-radius: 4px;
228
+ cursor: pointer;
229
+ }
230
+
231
+ .settings-btn {
232
+ background: transparent;
233
+ color: #007bff;
234
+ }
235
+ </style>
236
+ ```
237
+
238
+ ### 带扩展头部的页面
239
+
240
+ ```svelte
241
+ <script lang="ts">
242
+ import Page from '@ticatec/uniface-element/Page';
243
+ import type { PageAction } from '@ticatec/uniface-element/Page';
244
+
245
+ const handleBack: PageAction = () => {
246
+ console.log('正在返回...');
247
+ };
248
+
249
+ let activeTab = 'overview';
250
+ </script>
251
+
252
+ <Page
253
+ title="项目管理"
254
+ comment="管理项目任务和团队协作"
255
+ goBack={handleBack}
256
+ >
257
+ <div slot="header-ext" class="header-tabs">
258
+ <button
259
+ class="tab"
260
+ class:active={activeTab === 'overview'}
261
+ on:click={() => activeTab = 'overview'}
262
+ >
263
+ 概览
264
+ </button>
265
+ <button
266
+ class="tab"
267
+ class:active={activeTab === 'tasks'}
268
+ on:click={() => activeTab = 'tasks'}
269
+ >
270
+ 任务
271
+ </button>
272
+ <button
273
+ class="tab"
274
+ class:active={activeTab === 'team'}
275
+ on:click={() => activeTab = 'team'}
276
+ >
277
+ 团队
278
+ </button>
279
+ </div>
280
+
281
+ <div class="tab-content">
282
+ {#if activeTab === 'overview'}
283
+ <div class="overview-section">
284
+ <h3>项目概览</h3>
285
+ <p>当前项目状态和关键指标</p>
286
+ </div>
287
+ {:else if activeTab === 'tasks'}
288
+ <div class="tasks-section">
289
+ <h3>任务管理</h3>
290
+ <p>查看和管理项目任务</p>
291
+ </div>
292
+ {:else if activeTab === 'team'}
293
+ <div class="team-section">
294
+ <h3>团队成员</h3>
295
+ <p>与您的团队协作</p>
296
+ </div>
297
+ {/if}
298
+ </div>
299
+ </Page>
300
+
301
+ <style>
302
+ .header-tabs {
303
+ display: flex;
304
+ gap: 1px;
305
+ background: #e9ecef;
306
+ border-radius: 4px;
307
+ padding: 4px;
308
+ }
309
+
310
+ .tab {
311
+ padding: 8px 16px;
312
+ border: none;
313
+ background: transparent;
314
+ border-radius: 2px;
315
+ cursor: pointer;
316
+ font-size: 0.875rem;
317
+ transition: background-color 0.2s;
318
+ }
319
+
320
+ .tab:hover {
321
+ background: rgba(255,255,255,0.5);
322
+ }
323
+
324
+ .tab.active {
325
+ background: white;
326
+ font-weight: 500;
327
+ }
328
+
329
+ .tab-content {
330
+ padding: 20px 0;
331
+ }
332
+ </style>
333
+ ```
334
+
335
+ ### 表单页面示例
336
+
337
+ ```svelte
338
+ <script lang="ts">
339
+ import Page from '@ticatec/uniface-element/Page';
340
+ import type { PageAction } from '@ticatec/uniface-element/Page';
341
+
342
+ let formData = {
343
+ name: '',
344
+ email: '',
345
+ department: 'engineering'
346
+ };
347
+
348
+ const handleBack: PageAction = () => {
349
+ if (confirm('确定要离开吗?未保存的更改将丢失。')) {
350
+ window.history.back();
351
+ }
352
+ };
353
+
354
+ const handleReload: PageAction = () => {
355
+ if (confirm('重新加载页面?未保存的更改将丢失。')) {
356
+ window.location.reload();
357
+ }
358
+ };
359
+
360
+ function handleSubmit() {
361
+ console.log('提交表单:', formData);
362
+ // 处理表单提交
363
+ }
364
+
365
+ function handleReset() {
366
+ formData = { name: '', email: '', department: 'engineering' };
367
+ }
368
+ </script>
369
+
370
+ <Page
371
+ title="添加新员工"
372
+ comment="完成表单以添加新团队成员"
373
+ goBack={handleBack}
374
+ reload={handleReload}
375
+ round={true}
376
+ content$style="max-width: 600px; margin: 0 auto; padding: 30px;"
377
+ >
378
+ <form class="employee-form" on:submit|preventDefault={handleSubmit}>
379
+ <div class="form-group">
380
+ <label for="name">全名 *</label>
381
+ <input
382
+ id="name"
383
+ type="text"
384
+ bind:value={formData.name}
385
+ required
386
+ placeholder="输入全名"
387
+ />
388
+ </div>
389
+
390
+ <div class="form-group">
391
+ <label for="email">邮箱地址 *</label>
392
+ <input
393
+ id="email"
394
+ type="email"
395
+ bind:value={formData.email}
396
+ required
397
+ placeholder="输入邮箱地址"
398
+ />
399
+ </div>
400
+
401
+ <div class="form-group">
402
+ <label for="department">部门</label>
403
+ <select id="department" bind:value={formData.department}>
404
+ <option value="engineering">工程部</option>
405
+ <option value="design">设计部</option>
406
+ <option value="marketing">市场部</option>
407
+ <option value="sales">销售部</option>
408
+ </select>
409
+ </div>
410
+
411
+ <div class="form-actions">
412
+ <button type="button" class="btn-secondary" on:click={handleReset}>
413
+ 重置
414
+ </button>
415
+ <button type="submit" class="btn-primary">
416
+ 添加员工
417
+ </button>
418
+ </div>
419
+ </form>
420
+ </Page>
421
+
422
+ <style>
423
+ .employee-form {
424
+ display: flex;
425
+ flex-direction: column;
426
+ gap: 20px;
427
+ }
428
+
429
+ .form-group {
430
+ display: flex;
431
+ flex-direction: column;
432
+ gap: 5px;
433
+ }
434
+
435
+ .form-group label {
436
+ font-weight: 500;
437
+ color: #333;
438
+ }
439
+
440
+ .form-group input,
441
+ .form-group select {
442
+ padding: 10px;
443
+ border: 1px solid #ddd;
444
+ border-radius: 4px;
445
+ font-size: 1rem;
446
+ }
447
+
448
+ .form-group input:focus,
449
+ .form-group select:focus {
450
+ outline: none;
451
+ border-color: #007bff;
452
+ box-shadow: 0 0 0 2px rgba(0,123,255,0.25);
453
+ }
454
+
455
+ .form-actions {
456
+ display: flex;
457
+ gap: 10px;
458
+ justify-content: flex-end;
459
+ margin-top: 20px;
460
+ }
461
+
462
+ .btn-primary,
463
+ .btn-secondary {
464
+ padding: 10px 20px;
465
+ border-radius: 4px;
466
+ cursor: pointer;
467
+ font-size: 1rem;
468
+ border: none;
469
+ }
470
+
471
+ .btn-primary {
472
+ background: #007bff;
473
+ color: white;
474
+ }
475
+
476
+ .btn-secondary {
477
+ background: #6c757d;
478
+ color: white;
479
+ }
480
+
481
+ .btn-primary:hover {
482
+ background: #0056b3;
483
+ }
484
+
485
+ .btn-secondary:hover {
486
+ background: #545b62;
487
+ }
488
+ </style>
489
+ ```
490
+
491
+ ## 样式
492
+
493
+ Page 组件使用以下 CSS 类:
494
+
495
+ ```css
496
+ .uniface-page-wrapper {
497
+ /* 页面包装器容器 */
498
+ }
499
+
500
+ .uniface-page {
501
+ /* 主页面容器 */
502
+ }
503
+
504
+ .uniface-page.shadow {
505
+ /* 带阴影效果的页面 */
506
+ }
507
+
508
+ .uniface-page.round {
509
+ /* 带圆角的页面 */
510
+ }
511
+
512
+ .uniface-page-header {
513
+ /* 头部容器 */
514
+ }
515
+
516
+ .page-container {
517
+ /* 内容容器 */
518
+ }
519
+ ```
520
+
521
+ ## API 参考
522
+
523
+ ### Page 组件属性
524
+
525
+ 除非标记为必需,否则所有属性都是可选的。
526
+
527
+ ```typescript
528
+ interface PageProps {
529
+ title: string; // 页面标题
530
+ comment?: string | null; // 副标题/描述
531
+ header$style?: string; // 头部自定义样式
532
+ content$style?: string; // 内容自定义样式
533
+ round?: boolean; // 圆角
534
+ shadow?: boolean; // 阴影效果
535
+ goBack?: PageAction | null; // 返回导航
536
+ reload?: PageAction | null; // 重新加载操作
537
+ style?: string; // 包装器自定义样式
538
+ }
539
+ ```
540
+
541
+ ### PageAction 类型
542
+
543
+ ```typescript
544
+ export type PageAction = () => any;
545
+ ```
546
+
547
+ ## 最佳实践
548
+
549
+ 1. **一致的导航** - 始终为详情页面提供返回导航
550
+ 2. **描述性标题** - 使用清晰、描述性的页面标题来解释页面用途
551
+ 3. **有用的注释** - 添加副标题/注释文本以提供上下文
552
+ 4. **响应式布局** - 使用内容样式确保适当的响应式行为
553
+ 5. **操作确认** - 确认诸如从未保存表单导航等破坏性操作
554
+ 6. **加载状态** - 当操作是异步时,优雅地处理加载状态
555
+ 7. **错误处理** - 为页面操作实现适当的错误处理
556
+ 8. **可访问性** - 确保适当的标题层次结构和键盘导航
557
+
558
+ ## 与路由器集成
559
+
560
+ Page 组件与路由库配合良好:
561
+
562
+ ```svelte
563
+ <script lang="ts">
564
+ import Page from '@ticatec/uniface-element/Page';
565
+ import { goto } from '$app/navigation';
566
+ import type { PageAction } from '@ticatec/uniface-element/Page';
567
+
568
+ const handleBack: PageAction = () => {
569
+ goto('/dashboard');
570
+ };
571
+ </script>
572
+
573
+ <Page title="设置" goBack={handleBack}>
574
+ <!-- 页面内容 -->
575
+ </Page>
576
+ ```