@ticatec/uniface-element 0.2.3 → 0.3.0

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 (178) hide show
  1. package/dist/accordion/README.md +169 -0
  2. package/dist/accordion/README_CN.md +176 -0
  3. package/dist/action-bar/README.md +275 -0
  4. package/dist/action-bar/README_CN.md +285 -0
  5. package/dist/app-layout/README.md +374 -0
  6. package/dist/app-layout/README_CN.md +381 -0
  7. package/dist/app-top-bar/README.md +357 -0
  8. package/dist/app-top-bar/README_CN.md +365 -0
  9. package/dist/attachment-files/AttachmentFilesField.svelte +67 -1
  10. package/dist/attachment-files/AttachmentFilesField.svelte.d.ts +8 -1
  11. package/dist/base-calendar/CalendarBase.svelte +0 -3
  12. package/dist/box/README.md +385 -0
  13. package/dist/box/README_CN.md +393 -0
  14. package/dist/breadcrumbs/README.md +442 -0
  15. package/dist/breadcrumbs/README_CN.md +442 -0
  16. package/dist/button/Button.svelte +27 -7
  17. package/dist/button/Button.svelte.d.ts +3 -1
  18. package/dist/button/IconButton.svelte +26 -6
  19. package/dist/button/IconButton.svelte.d.ts +3 -1
  20. package/dist/button/IconButton_README.md +513 -0
  21. package/dist/button/IconButton_README_CN.md +513 -0
  22. package/dist/button/README.md +428 -0
  23. package/dist/button/README_CN.md +428 -0
  24. package/dist/button/TextButton.svelte +26 -6
  25. package/dist/button/TextButton.svelte.d.ts +3 -1
  26. package/dist/button/TextButton_README.md +571 -0
  27. package/dist/button/TextButton_README_CN.md +571 -0
  28. package/dist/card/README.md +666 -0
  29. package/dist/card/README_CN.md +666 -0
  30. package/dist/cascade-options-select/CascadeOptionSelect.svelte +43 -7
  31. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +3 -4
  32. package/dist/cascade-options-select/README.md +663 -2
  33. package/dist/cascade-options-select/README_CN.md +664 -0
  34. package/dist/checkbox/CheckBox.svelte +20 -6
  35. package/dist/checkbox/CheckBox.svelte.d.ts +4 -2
  36. package/dist/checkbox/README.md +562 -0
  37. package/dist/checkbox/README_CN.md +727 -0
  38. package/dist/common-editor/NumberInput.svelte +39 -26
  39. package/dist/common-editor/NumberInput.svelte.d.ts +5 -1
  40. package/dist/concise-data-table/ConciseListTable.svelte +133 -36
  41. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +8 -1
  42. package/dist/concise-data-table/DataCell.svelte +5 -6
  43. package/dist/concise-data-table/DataRow.svelte +22 -2
  44. package/dist/concise-data-table/DataRow.svelte.d.ts +1 -0
  45. package/dist/concise-data-table/README.md +606 -0
  46. package/dist/concise-data-table/README_CN.md +611 -0
  47. package/dist/context-menu/ContextMenu.svelte +138 -21
  48. package/dist/context-menu/ContextMenu.svelte.d.ts +5 -0
  49. package/dist/context-menu/ContextMenuItem.d.ts +20 -4
  50. package/dist/context-menu/README.md +551 -0
  51. package/dist/context-menu/README_CN.md +551 -0
  52. package/dist/criteria-field/CriteriaField.svelte +3 -5
  53. package/dist/criteria-field/README.md +532 -0
  54. package/dist/criteria-field/README_CN.md +532 -0
  55. package/dist/data-table/README.md +712 -0
  56. package/dist/data-table/README_CN.md +712 -0
  57. package/dist/date-picker/DatePicker.svelte +44 -7
  58. package/dist/date-picker/DatePicker.svelte.d.ts +3 -4
  59. package/dist/date-picker/DateTimePicker.svelte +32 -8
  60. package/dist/date-picker/DateTimePicker.svelte.d.ts +3 -4
  61. package/dist/date-picker/README.md +326 -0
  62. package/dist/date-picker/README_CN.md +316 -0
  63. package/dist/date-picker/ScrollBar.svelte +18 -8
  64. package/dist/date-picker/ScrollBar.svelte.d.ts +1 -1
  65. package/dist/date-picker/TimePanel.svelte +5 -5
  66. package/dist/date-picker/TimePanel.svelte.d.ts +1 -1
  67. package/dist/date-range/README.md +374 -0
  68. package/dist/date-range/README_CN.md +374 -0
  69. package/dist/dialog/DialogBoard.svelte +1 -1
  70. package/dist/dialog/README.md +596 -0
  71. package/dist/dialog/README_CN.md +596 -0
  72. package/dist/drawer/README.md +679 -1
  73. package/dist/drawer/README_CN.md +679 -0
  74. package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
  75. package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
  76. package/dist/group-box/group-check-box/README.md +749 -0
  77. package/dist/group-box/group-check-box/README_CN.md +750 -0
  78. package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
  79. package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
  80. package/dist/group-box/group-radio-box/README.md +920 -0
  81. package/dist/group-box/group-radio-box/README_CN.md +920 -0
  82. package/dist/image-files/README.md +1346 -0
  83. package/dist/image-files/README_CN.md +1346 -0
  84. package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
  85. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
  86. package/dist/lib/forwardAllEvents.d.ts +3 -0
  87. package/dist/lib/forwardAllEvents.js +24 -0
  88. package/dist/list-box/README.md +579 -0
  89. package/dist/list-box/README_CN.md +682 -0
  90. package/dist/lookup-editor/LookupEditor.svelte +15 -3
  91. package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
  92. package/dist/lookup-editor/README.md +684 -0
  93. package/dist/lookup-editor/README_CN.md +684 -0
  94. package/dist/memo-editor/MemoEditor.svelte +77 -27
  95. package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
  96. package/dist/memo-editor/README.md +819 -0
  97. package/dist/memo-editor/README_CN.md +819 -0
  98. package/dist/message-box/README.md +398 -0
  99. package/dist/message-box/README_CN.md +398 -0
  100. package/dist/number-editor/NumberEditor.svelte +2 -2
  101. package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
  102. package/dist/number-editor/README.md +353 -22
  103. package/dist/number-editor/README_CN.md +357 -0
  104. package/dist/number-range/README.md +443 -0
  105. package/dist/number-range/README_CN.md +443 -0
  106. package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
  107. package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
  108. package/dist/options-multi-select/README.md +480 -0
  109. package/dist/options-multi-select/README_CN.md +480 -0
  110. package/dist/options-select/OptionsSelect.svelte +36 -5
  111. package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
  112. package/dist/options-select/README.md +632 -0
  113. package/dist/options-select/README_CN.md +632 -0
  114. package/dist/page/README.md +605 -0
  115. package/dist/page/README_CN.md +605 -0
  116. package/dist/pagination/README.md +946 -0
  117. package/dist/pagination/README_CN.md +946 -0
  118. package/dist/pagination-panel/README.md +1075 -0
  119. package/dist/pagination-panel/README_CN.md +1075 -0
  120. package/dist/popup-hint/README.md +841 -0
  121. package/dist/popup-hint/README_CN.md +840 -0
  122. package/dist/progress-bar/README.md +242 -0
  123. package/dist/progress-bar/README_CN.md +242 -0
  124. package/dist/progress-step-bar/README.md +316 -0
  125. package/dist/progress-step-bar/README_CN.md +316 -0
  126. package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
  127. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
  128. package/dist/prompts-text-editor/README.md +329 -0
  129. package/dist/prompts-text-editor/README_CN.md +329 -0
  130. package/dist/property-editor/README.md +969 -0
  131. package/dist/property-editor/README_CN.md +969 -0
  132. package/dist/radio-button/README.md +372 -0
  133. package/dist/radio-button/README_CN.md +372 -0
  134. package/dist/radio-button/RadioButton.svelte +32 -3
  135. package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
  136. package/dist/search-box/README.md +425 -0
  137. package/dist/search-box/README_CN.md +424 -0
  138. package/dist/search-box/SearchBox.svelte +22 -6
  139. package/dist/search-box/SearchBox.svelte.d.ts +4 -1
  140. package/dist/tabs/README.md +919 -0
  141. package/dist/tabs/README_CN.md +920 -0
  142. package/dist/tag/README.md +922 -0
  143. package/dist/tag/README_CN.md +922 -0
  144. package/dist/text-editor/PasswordEditor.svelte +17 -2
  145. package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
  146. package/dist/text-editor/PasswordEditor_README.md +551 -0
  147. package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
  148. package/dist/text-editor/README.md +466 -0
  149. package/dist/text-editor/README_CN.md +466 -0
  150. package/dist/text-editor/TextEditor.svelte +51 -19
  151. package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
  152. package/dist/ticatec-uniface-web.css +1 -0
  153. package/dist/time-editor/README.md +498 -24
  154. package/dist/time-editor/README_CN.md +498 -0
  155. package/dist/time-editor/TimeEditor.svelte +7 -3
  156. package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
  157. package/dist/toast/README.md +667 -0
  158. package/dist/toast/README_CN.md +667 -0
  159. package/dist/transfer/README.md +795 -0
  160. package/dist/transfer/Transfer.svelte +6 -4
  161. package/dist/transfer/Transfer.svelte.d.ts +3 -1
  162. package/dist/tree-view/README.md +761 -0
  163. package/dist/tree-view/README_CN.md +761 -0
  164. package/dist/tree-view/TreeView.svelte +5 -3
  165. package/dist/tree-view/TreeView.svelte.d.ts +3 -1
  166. package/dist/unit-number-editor/README.md +546 -20
  167. package/dist/unit-number-editor/README_CN.md +525 -0
  168. package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
  169. package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
  170. package/docs/form-field/cn/README_CN.md +364 -0
  171. package/docs/form-field/en/README.md +364 -0
  172. package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
  173. package/docs/form-panel/flex-form/en/README.md +586 -0
  174. package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
  175. package/docs/form-panel/flex-row-form/en/README.md +787 -0
  176. package/docs/form-panel/grid-form/en/README.md +744 -0
  177. package/package.json +1 -1
  178. package/dist/drawer/README-CN.md +0 -1
@@ -0,0 +1,750 @@
1
+ # GroupCheckBox 组复选框组件
2
+
3
+ 一个灵活的组复选框组件,允许用户从预定义的选项列表中选择多个选项。支持基于字符串和基于位的值存储、自定义样式变体以及全面的状态管理,包括焦点/失焦事件处理。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install @ticatec/uniface-element
9
+ ```
10
+
11
+ ## 导入
12
+
13
+ ```typescript
14
+ import GroupCheckBox from "@ticatec/uniface-element/GroupCheckBox";
15
+ import { DisplayMode } from "@ticatec/uniface-element";
16
+ import type { OnChangeHandler } from "@ticatec/uniface-element";
17
+ ```
18
+
19
+ ## 基本用法
20
+
21
+ ```svelte
22
+ <script>
23
+ import GroupCheckBox from "@ticatec/uniface-element/GroupCheckBox";
24
+
25
+ const options = [
26
+ { code: "js", text: "JavaScript" },
27
+ { code: "ts", text: "TypeScript" },
28
+ { code: "py", text: "Python" },
29
+ { code: "go", text: "Go" }
30
+ ];
31
+
32
+ let selectedLanguages = "";
33
+
34
+ function handleChange(value) {
35
+ console.log('选择的编程语言:', value);
36
+ }
37
+ </script>
38
+
39
+ <GroupCheckBox
40
+ {options}
41
+ bind:value={selectedLanguages}
42
+ onchange={handleChange}
43
+ />
44
+ ```
45
+
46
+ ## 属性
47
+
48
+ | 属性 | 类型 | 默认值 | 描述 |
49
+ |------|------|---------|-------------|
50
+ | `value` | `string \| number` | 必需 | 选中的值(带分隔符的字符串或位值) |
51
+ | `options` | `Array<any>` | 必需 | 选项对象数组 |
52
+ | `keyField` | `string` | `"code"` | 选项键/值的字段名称 |
53
+ | `textField` | `string` | `"text"` | 选项显示文本的字段名称 |
54
+ | `delimiter` | `string` | `";"` | 基于字符串的值的分隔符 |
55
+ | `bitBase` | `boolean` | `false` | 是否使用基于位的值存储 |
56
+ | `disabled` | `boolean` | `false` | 组件是否禁用 |
57
+ | `readonly` | `boolean` | `false` | 组件是否只读 |
58
+ | `displayMode` | `DisplayMode` | `DisplayMode.Edit` | 显示模式(编辑或查看) |
59
+ | `variant` | `"" \| "plain" \| "outlined" \| "filled"` | `""` | 视觉变体 |
60
+ | `compact` | `boolean` | `false` | 是否使用紧凑间距 |
61
+ | `disabledOptions` | `Array<string>` | `[]` | 要禁用的选项键数组 |
62
+ | `hideOptions` | `Array<string>` | `[]` | 要隐藏的选项键数组 |
63
+ | `style` | `string` | `""` | 附加 CSS 样式 |
64
+ | `item$style` | `string` | `""` | 单个复选框项目的 CSS 样式 |
65
+ | `onchange` | `OnChangeHandler<string \| number>` | `null` | 更改事件处理程序 |
66
+ | `onfocus` | `(() => void) \| null` | `null` | 焦点事件处理程序 |
67
+ | `onblur` | `(() => void) \| null` | `null` | 失焦事件处理程序 |
68
+
69
+ ## 方法
70
+
71
+ | 方法 | 描述 |
72
+ |--------|-------------|
73
+ | `setFocus()` | 以编程方式聚焦第一个启用的复选框 |
74
+
75
+ ## 示例
76
+
77
+ ### 基于字符串的选择
78
+
79
+ ```svelte
80
+ <script>
81
+ import GroupCheckBox from "@ticatec/uniface-element/GroupCheckBox";
82
+ import FormField from "@ticatec/uniface-element/FormField";
83
+
84
+ const technologies = [
85
+ { code: "react", text: "React" },
86
+ { code: "vue", text: "Vue.js" },
87
+ { code: "svelte", text: "Svelte" },
88
+ { code: "angular", text: "Angular" }
89
+ ];
90
+
91
+ let selectedTech = "";
92
+
93
+ function handleTechChange(value) {
94
+ console.log('选择的技术:', value);
95
+ console.log('数组形式:', value ? value.split(';') : []);
96
+ }
97
+ </script>
98
+
99
+ <div class="demo-section">
100
+ <FormField label="选择您偏好的技术">
101
+ <GroupCheckBox
102
+ options={technologies}
103
+ bind:value={selectedTech}
104
+ onchange={handleTechChange}
105
+ onfocus={() => console.log('获得焦点')}
106
+ onblur={() => console.log('失去焦点')}
107
+ />
108
+ </FormField>
109
+
110
+ <p>已选择: {selectedTech || '无'}</p>
111
+ </div>
112
+
113
+ <style>
114
+ .demo-section {
115
+ margin: 20px;
116
+ padding: 20px;
117
+ border: 1px solid #e2e8f0;
118
+ border-radius: 8px;
119
+ }
120
+ </style>
121
+ ```
122
+
123
+ ### 基于位的选择以提高性能
124
+
125
+ ```svelte
126
+ <script>
127
+ import GroupCheckBox from "@ticatec/uniface-element/GroupCheckBox";
128
+ import FormField from "@ticatec/uniface-element/FormField";
129
+
130
+ const permissions = [
131
+ { code: "read", text: "读取" }, // 位 0(值 1)
132
+ { code: "write", text: "写入" }, // 位 1(值 2)
133
+ { code: "delete", text: "删除" }, // 位 2(值 4)
134
+ { code: "admin", text: "管理员" } // 位 3(值 8)
135
+ ];
136
+
137
+ let userPermissions = 0;
138
+
139
+ function handlePermissionChange(value) {
140
+ console.log('权限位:', value);
141
+ console.log('二进制表示:', value.toString(2));
142
+
143
+ // 解码权限
144
+ const activePermissions = [];
145
+ permissions.forEach((perm, index) => {
146
+ if (value & (1 << index)) {
147
+ activePermissions.push(perm.text);
148
+ }
149
+ });
150
+ console.log('活跃权限:', activePermissions);
151
+ }
152
+
153
+ // 检查特定权限是否启用
154
+ function hasPermission(permissionBit) {
155
+ return (userPermissions & (1 << permissionBit)) !== 0;
156
+ }
157
+ </script>
158
+
159
+ <div class="permissions-demo">
160
+ <FormField label="用户权限">
161
+ <GroupCheckBox
162
+ options={permissions}
163
+ bitBase={true}
164
+ bind:value={userPermissions}
165
+ onchange={handlePermissionChange}
166
+ />
167
+ </FormField>
168
+
169
+ <div class="permission-info">
170
+ <p>权限值: {userPermissions}</p>
171
+ <p>二进制: {userPermissions.toString(2).padStart(4, '0')}</p>
172
+ <div class="permission-checks">
173
+ <p>可读取: {hasPermission(0) ? '✓' : '✗'}</p>
174
+ <p>可写入: {hasPermission(1) ? '✓' : '✗'}</p>
175
+ <p>可删除: {hasPermission(2) ? '✓' : '✗'}</p>
176
+ <p>是管理员: {hasPermission(3) ? '✓' : '✗'}</p>
177
+ </div>
178
+ </div>
179
+ </div>
180
+
181
+ <style>
182
+ .permissions-demo {
183
+ margin: 20px;
184
+ padding: 20px;
185
+ background: #f8fafc;
186
+ border-radius: 8px;
187
+ }
188
+
189
+ .permission-info {
190
+ margin-top: 16px;
191
+ padding: 12px;
192
+ background: white;
193
+ border-radius: 6px;
194
+ }
195
+
196
+ .permission-checks {
197
+ display: grid;
198
+ grid-template-columns: 1fr 1fr;
199
+ gap: 8px;
200
+ margin-top: 8px;
201
+ }
202
+ </style>
203
+ ```
204
+
205
+ ### 不同视觉变体
206
+
207
+ ```svelte
208
+ <script>
209
+ import GroupCheckBox from "@ticatec/uniface-element/GroupCheckBox";
210
+ import FormField from "@ticatec/uniface-element/FormField";
211
+
212
+ const colors = [
213
+ { code: "red", text: "红色" },
214
+ { code: "blue", text: "蓝色" },
215
+ { code: "green", text: "绿色" },
216
+ { code: "yellow", text: "黄色" }
217
+ ];
218
+
219
+ let selectedColors = "";
220
+ </script>
221
+
222
+ <div class="variants-demo">
223
+ <div class="variant-section">
224
+ <h3>默认变体</h3>
225
+ <FormField label="选择颜色">
226
+ <GroupCheckBox options={colors} bind:value={selectedColors} />
227
+ </FormField>
228
+ </div>
229
+
230
+ <div class="variant-section">
231
+ <h3>轮廓变体</h3>
232
+ <FormField label="选择颜色">
233
+ <GroupCheckBox
234
+ options={colors}
235
+ variant="outlined"
236
+ bind:value={selectedColors}
237
+ />
238
+ </FormField>
239
+ </div>
240
+
241
+ <div class="variant-section">
242
+ <h3>填充变体</h3>
243
+ <FormField label="选择颜色">
244
+ <GroupCheckBox
245
+ options={colors}
246
+ variant="filled"
247
+ bind:value={selectedColors}
248
+ />
249
+ </FormField>
250
+ </div>
251
+
252
+ <div class="variant-section">
253
+ <h3>紧凑变体</h3>
254
+ <FormField label="选择颜色">
255
+ <GroupCheckBox
256
+ options={colors}
257
+ compact={true}
258
+ bind:value={selectedColors}
259
+ />
260
+ </FormField>
261
+ </div>
262
+ </div>
263
+
264
+ <style>
265
+ .variants-demo {
266
+ display: grid;
267
+ grid-template-columns: 1fr 1fr;
268
+ gap: 20px;
269
+ margin: 20px;
270
+ }
271
+
272
+ .variant-section {
273
+ padding: 16px;
274
+ border: 1px solid #e2e8f0;
275
+ border-radius: 8px;
276
+ }
277
+ </style>
278
+ ```
279
+
280
+ ### 条件选项和动态行为
281
+
282
+ ```svelte
283
+ <script>
284
+ import GroupCheckBox from "@ticatec/uniface-element/GroupCheckBox";
285
+ import FormField from "@ticatec/uniface-element/FormField";
286
+
287
+ const airlines = [
288
+ { code: "none", text: "无" },
289
+ { code: "aa", text: "中国国际航空" },
290
+ { code: "ua", text: "中国东方航空" },
291
+ { code: "dl", text: "南方航空" },
292
+ { code: "sw", text: "海南航空" }
293
+ ];
294
+
295
+ let selectedAirlines = "";
296
+ let disabledOptions = [];
297
+ let hideOptions = [];
298
+
299
+ function handleAirlineChange(value) {
300
+ const selected = value ? value.split(';') : [];
301
+
302
+ // 如果选择了“无”,禁用其他选项
303
+ if (selected.includes('none')) {
304
+ if (selected.length > 1) {
305
+ // 如果“无”与其他选项一起被选中,仅保留“无”
306
+ selectedAirlines = "none";
307
+ }
308
+ disabledOptions = airlines
309
+ .filter(airline => airline.code !== 'none')
310
+ .map(airline => airline.code);
311
+ } else {
312
+ disabledOptions = [];
313
+ }
314
+
315
+ // 周末隐藏海南航空(演示逻辑)
316
+ const today = new Date();
317
+ if (today.getDay() === 0 || today.getDay() === 6) {
318
+ hideOptions = ['sw'];
319
+ } else {
320
+ hideOptions = [];
321
+ }
322
+ }
323
+
324
+ // 处理特殊的“无”选择逻辑
325
+ function handleSpecialLogic(value) {
326
+ const selected = value ? value.split(';') : [];
327
+
328
+ if (selected.includes('none') && selected.length > 1) {
329
+ // 如果选择了其他选项,移除“无”
330
+ const filteredSelected = selected.filter(option => option !== 'none');
331
+ selectedAirlines = filteredSelected.join(';');
332
+ } else {
333
+ handleAirlineChange(value);
334
+ }
335
+ }
336
+ </script>
337
+
338
+ <div class="conditional-demo">
339
+ <FormField label="选择偏好的航空公司">
340
+ <GroupCheckBox
341
+ options={airlines}
342
+ bind:value={selectedAirlines}
343
+ {disabledOptions}
344
+ {hideOptions}
345
+ onchange={handleSpecialLogic}
346
+ />
347
+ </FormField>
348
+
349
+ <div class="info-panel">
350
+ <p><strong>已选择:</strong> {selectedAirlines || '无'}</p>
351
+ <p><strong>已禁用:</strong> {disabledOptions.join(', ') || '无'}</p>
352
+ <p><strong>已隐藏:</strong> {hideOptions.join(', ') || '无'}</p>
353
+ <p class="hint">💡 选择“无”以禁用其他选项</p>
354
+ {#if hideOptions.includes('sw')}
355
+ <p class="weekend-notice">🚫 周末不可选择海南航空</p>
356
+ {/if}
357
+ </div>
358
+ </div>
359
+
360
+ <style>
361
+ .conditional-demo {
362
+ margin: 20px;
363
+ padding: 20px;
364
+ border: 1px solid #e2e8f0;
365
+ border-radius: 8px;
366
+ }
367
+
368
+ .info-panel {
369
+ margin-top: 16px;
370
+ padding: 12px;
371
+ background: #f8fafc;
372
+ border-radius: 6px;
373
+ }
374
+
375
+ .hint {
376
+ color: #6b7280;
377
+ font-style: italic;
378
+ }
379
+
380
+ .weekend-notice {
381
+ color: #dc2626;
382
+ font-weight: 500;
383
+ }
384
+ </style>
385
+ ```
386
+
387
+ ### 只读和显示模式
388
+
389
+ ```svelte
390
+ <script>
391
+ import GroupCheckBox from "@ticatec/uniface-element/GroupCheckBox";
392
+ import FormField from "@ticatec/uniface-element/FormField";
393
+ import { DisplayMode } from "@ticatec/uniface-element";
394
+
395
+ const skills = [
396
+ { code: "js", text: "JavaScript" },
397
+ { code: "ts", text: "TypeScript" },
398
+ { code: "react", text: "React" },
399
+ { code: "node", text: "Node.js" }
400
+ ];
401
+
402
+ let userSkills = "js;react;node"; // 预选技能
403
+ </script>
404
+
405
+ <div class="readonly-demo">
406
+ <div class="mode-section">
407
+ <h3>可编辑模式</h3>
408
+ <FormField label="编辑您的技能">
409
+ <GroupCheckBox
410
+ options={skills}
411
+ bind:value={userSkills}
412
+ />
413
+ </FormField>
414
+ </div>
415
+
416
+ <div class="mode-section">
417
+ <h3>只读模式</h3>
418
+ <FormField label="您的技能(只读)">
419
+ <GroupCheckBox
420
+ options={skills}
421
+ value={userSkills}
422
+ readonly={true}
423
+ />
424
+ </FormField>
425
+ </div>
426
+
427
+ <div class="mode-section">
428
+ <h3>禁用模式</h3>
429
+ <FormField label="您的技能(禁用)">
430
+ <GroupCheckBox
431
+ options={skills}
432
+ value={userSkills}
433
+ disabled={true}
434
+ />
435
+ </FormField>
436
+ </div>
437
+
438
+ <div class="mode-section">
439
+ <h3>仅显示模式</h3>
440
+ <FormField label="您的技能(显示)">
441
+ <GroupCheckBox
442
+ options={skills}
443
+ value={userSkills}
444
+ displayMode={DisplayMode.View}
445
+ />
446
+ </FormField>
447
+ </div>
448
+ </div>
449
+
450
+ <style>
451
+ .readonly-demo {
452
+ display: grid;
453
+ grid-template-columns: 1fr 1fr;
454
+ gap: 20px;
455
+ margin: 20px;
456
+ }
457
+
458
+ .mode-section {
459
+ padding: 16px;
460
+ border: 1px solid #e2e8f0;
461
+ border-radius: 8px;
462
+ }
463
+ </style>
464
+ ```
465
+
466
+ ### 自定义样式和字段配置
467
+
468
+ ```svelte
469
+ <script>
470
+ import GroupCheckBox from "@ticatec/uniface-element/GroupCheckBox";
471
+ import FormField from "@ticatec/uniface-element/FormField";
472
+
473
+ const departments = [
474
+ { id: "eng", name: "工程部", active: true },
475
+ { id: "sales", name: "销售部", active: true },
476
+ { id: "marketing", name: "市场部", active: false },
477
+ { id: "hr", name: "人力资源部", active: true }
478
+ ];
479
+
480
+ let selectedDepartments = "";
481
+ </script>
482
+
483
+ <div class="custom-demo">
484
+ <FormField label="选择部门">
485
+ <GroupCheckBox
486
+ options={departments}
487
+ keyField="id"
488
+ textField="name"
489
+ delimiter=","
490
+ bind:value={selectedDepartments}
491
+ variant="outlined"
492
+ style="border: 2px solid #3b82f6; border-radius: 12px; padding: 16px;"
493
+ item$style="margin: 8px 0; padding: 4px 8px; background: #f0f9ff; border-radius: 6px;"
494
+ />
495
+ </FormField>
496
+
497
+ <div class="result">
498
+ <p><strong>选择的部门:</strong></p>
499
+ <p>原始值: {selectedDepartments}</p>
500
+ <p>数组形式: {JSON.stringify(selectedDepartments ? selectedDepartments.split(',') : [])}</p>
501
+ </div>
502
+ </div>
503
+
504
+ <style>
505
+ .custom-demo {
506
+ margin: 20px;
507
+ padding: 20px;
508
+ border: 1px solid #e2e8f0;
509
+ border-radius: 8px;
510
+ }
511
+
512
+ .result {
513
+ margin-top: 16px;
514
+ padding: 12px;
515
+ background: #f8fafc;
516
+ border-radius: 6px;
517
+ }
518
+ </style>
519
+ ```
520
+
521
+ ### 表单集成与验证
522
+
523
+ ```svelte
524
+ <script>
525
+ import GroupCheckBox from "@ticatec/uniface-element/GroupCheckBox";
526
+ import FormField from "@ticatec/uniface-element/FormField";
527
+
528
+ const interests = [
529
+ { code: "sports", text: "运动" },
530
+ { code: "music", text: "音乐" },
531
+ { code: "travel", text: "旅行" },
532
+ { code: "cooking", text: "烹饪" },
533
+ { code: "reading", text: "阅读" },
534
+ { code: "gaming", text: "游戏" }
535
+ ];
536
+
537
+ let formData = {
538
+ name: '',
539
+ interests: '',
540
+ newsletter: false
541
+ };
542
+
543
+ let errors = {};
544
+ let groupCheckBoxRef;
545
+
546
+ function validateForm() {
547
+ errors = {};
548
+
549
+ if (!formData.name.trim()) {
550
+ errors.name = '姓名是必填项';
551
+ }
552
+
553
+ if (!formData.interests) {
554
+ errors.interests = '请至少选择一个兴趣';
555
+ } else {
556
+ const selectedCount = formData.interests.split(';').length;
557
+ if (selectedCount > 3) {
558
+ errors.interests = '最多选择3个兴趣';
559
+ }
560
+ }
561
+
562
+ return Object.keys(errors).length === 0;
563
+ }
564
+
565
+ function handleSubmit() {
566
+ if (validateForm()) {
567
+ console.log('表单提交:', formData);
568
+ alert('表单提交成功!');
569
+ } else {
570
+ console.log('验证错误:', errors);
571
+ // 聚焦第一个错误字段
572
+ if (errors.interests) {
573
+ groupCheckBoxRef.setFocus();
574
+ }
575
+ }
576
+ }
577
+
578
+ function handleInterestChange(value) {
579
+ formData.interests = value;
580
+ // 用户选择时清除错误
581
+ if (errors.interests && value) {
582
+ delete errors.interests;
583
+ errors = { ...errors };
584
+ }
585
+ }
586
+ </script>
587
+
588
+ <div class="form-demo">
589
+ <form on:submit|preventDefault={handleSubmit}>
590
+ <FormField label="您的姓名" error={errors.name}>
591
+ <input
592
+ type="text"
593
+ bind:value={formData.name}
594
+ class="form-input"
595
+ class:error={errors.name}
596
+ />
597
+ </FormField>
598
+
599
+ <FormField label="您的兴趣(选择1-3项)" error={errors.interests}>
600
+ <GroupCheckBox
601
+ bind:this={groupCheckBoxRef}
602
+ options={interests}
603
+ bind:value={formData.interests}
604
+ onchange={handleInterestChange}
605
+ variant="outlined"
606
+ />
607
+ <p class="field-hint">选择最多3个最能描述您的兴趣</p>
608
+ </FormField>
609
+
610
+ <FormField label="订阅简讯">
611
+ <label class="checkbox-label">
612
+ <input type="checkbox" bind:checked={formData.newsletter} />
613
+ 订阅我们的简讯
614
+ </label>
615
+ </FormField>
616
+
617
+ <div class="form-actions">
618
+ <button type="submit" class="submit-btn">提交</button>
619
+ <button type="button" on:click={() => console.log(formData)} class="preview-btn">
620
+ 预览数据
621
+ </button>
622
+ </div>
623
+ </form>
624
+ </div>
625
+
626
+ <style>
627
+ .form-demo {
628
+ max-width: 500px;
629
+ margin: 20px;
630
+ padding: 24px;
631
+ border: 1px solid #e2e8f0;
632
+ border-radius: 8px;
633
+ }
634
+
635
+ .form-input {
636
+ width: 100%;
637
+ padding: 8px 12px;
638
+ border: 1px solid #d1d5db;
639
+ border-radius: 6px;
640
+ }
641
+
642
+ .form-input.error {
643
+ border-color: #dc2626;
644
+ }
645
+
646
+ .field-hint {
647
+ margin-top: 4px;
648
+ font-size: 0.875rem;
649
+ color: #6b7280;
650
+ }
651
+
652
+ .checkbox-label {
653
+ display: flex;
654
+ align-items: center;
655
+ gap: 8px;
656
+ cursor: pointer;
657
+ }
658
+
659
+ .form-actions {
660
+ display: flex;
661
+ gap: 12px;
662
+ margin-top: 20px;
663
+ }
664
+
665
+ .submit-btn, .preview-btn {
666
+ padding: 10px 20px;
667
+ border-radius: 6px;
668
+ border: none;
669
+ cursor: pointer;
670
+ }
671
+
672
+ .submit-btn {
673
+ background: #3b82f6;
674
+ color: white;
675
+ }
676
+
677
+ .preview-btn {
678
+ background: #f3f4f6;
679
+ color: #374151;
680
+ border: 1px solid #d1d5db;
681
+ }
682
+ </style>
683
+ ```
684
+
685
+ ## 值格式
686
+
687
+ ### 基于字符串的值
688
+ 当 `bitBase` 为 `false`(默认值)时,选中的值存储为带分隔符的字符串:
689
+ - 单一选择:`"option1"`
690
+ - 多项选择:`"option1;option2;option3"`
691
+ - 无选择:`""`
692
+
693
+ ### 基于位的值
694
+ 当 `bitBase` 为 `true` 时,选中的值存储为一个数字,每个位表示一个选项:
695
+ - 第一个选项(索引0):位0(值1)
696
+ - 第二个选项(索引1):位1(值2)
697
+ - 第三个选项(索引2):位2(值4)
698
+ - 组合:第一和第三个选项 = 1 + 4 = 5
699
+
700
+ ## 样式
701
+
702
+ GroupCheckBox 组件可通过 CSS 自定义属性进行样式化:
703
+
704
+ ```css
705
+ .uniface-group-box {
706
+ --checkbox-spacing: 8px;
707
+ --checkbox-padding: 4px 8px;
708
+ --border-color: #e2e8f0;
709
+ --background-color: #ffffff;
710
+ --hover-background: #f9fafb;
711
+ }
712
+
713
+ /* 变体特定样式 */
714
+ .uniface-group-box.outlined {
715
+ border: 1px solid var(--border-color);
716
+ border-radius: 6px;
717
+ padding: 12px;
718
+ }
719
+
720
+ .uniface-group-box.filled {
721
+ background-color: #f8fafc;
722
+ border-radius: 6px;
723
+ padding: 12px;
724
+ }
725
+
726
+ .uniface-group-box.compact {
727
+ --checkbox-spacing: 4px;
728
+ --checkbox-padding: 2px 4px;
729
+ }
730
+ ```
731
+
732
+ ## 可访问性
733
+
734
+ GroupCheckBox 组件包括以下可访问性功能:
735
+
736
+ - 复选框之间的键盘导航
737
+ - 使用 `setFocus()` 方法进行焦点管理
738
+ - ARIA 标签和描述
739
+ - 状态变化的屏幕阅读器提示
740
+ - 适当的 Tab 键顺序管理
741
+
742
+ ## 最佳实践
743
+
744
+ 1. **选项管理**:保持选项数组的稳定性以避免不必要的重新渲染
745
+ 2. **性能**:对于大型数据集或性能关键场景,使用基于位的值
746
+ 3. **验证**:为必选项目实现适当的验证
747
+ 4. **用户体验**:为禁用/隐藏选项提供清晰的反馈
748
+ 5. **可访问性**:始终提供有意义的标签和描述
749
+ 6. **状态管理**:适当地处理焦点/失焦事件以进行表单验证
750
+