@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,525 @@
1
+ # GroupRadioBox 组件
2
+
3
+ 单选按钮组组件,将多个单选按钮选项组织在一起,用于从多个选项中选择一个值。比单独使用多个RadioButton更加方便和语义化。
4
+
5
+ ## 属性
6
+
7
+ | 属性 | 类型 | 默认值 | 描述 |
8
+ |------|------|--------|------|
9
+ | `variant` | `'' \| 'plain' \| 'outlined' \| 'filled'` | `''` | 外观变体 |
10
+ | `disabled` | `boolean` | `false` | 是否禁用 |
11
+ | `readonly` | `boolean` | `false` | 是否只读 |
12
+ | `compact` | `boolean` | `false` | 是否紧凑模式 |
13
+ | `value` | `string | number` | - | 选中的值 |
14
+ | `options` | `Array<OptionItem>` | - | 选项数组 |
15
+ | `keyField` | `string` | `'code'` | 值字段名 |
16
+ | `textField` | `string` | `'text'` | 显示字段名 |
17
+ | `displayMode` | `DisplayMode` | `DisplayMode.Edit` | 显示模式 |
18
+ | `item$style` | `string` | `''` | 单个单选按钮的样式 |
19
+ | `disabledOptions` | `Array<string>` | `[]` | 禁用的选项值 |
20
+ | `style` | `string` | `''` | 自定义样式 |
21
+ | `onChange` | `OnChangeHandler<string | number>` | - | 值变化回调 |
22
+
23
+ ## 使用示例
24
+
25
+ ```svelte
26
+ <script lang="ts">
27
+ import type { OptionItem } from '@ticatec/uniface-element/types';
28
+ import GroupRadioBox from '@ticatec/uniface-element/GroupRadioBox';
29
+
30
+ // 性别选项
31
+ const genderOptions: OptionItem[] = [
32
+ { code: 'male', text: '男' },
33
+ { code: 'female', text: '女' },
34
+ { code: 'other', text: '其他' }
35
+ ];
36
+
37
+ // 用户级别选项
38
+ const userLevels: OptionItem[] = [
39
+ { code: 'basic', text: '基础用户' },
40
+ { code: 'premium', text: '高级用户' },
41
+ { code: 'vip', text: 'VIP用户' },
42
+ { code: 'enterprise', text: '企业用户' }
43
+ ];
44
+
45
+ // 通知频率选项
46
+ const notificationFrequency: OptionItem[] = [
47
+ { code: 'realtime', text: '实时通知' },
48
+ { code: 'daily', text: '每日摘要' },
49
+ { code: 'weekly', text: '每周摘要' },
50
+ { code: 'never', text: '从不通知' }
51
+ ];
52
+
53
+ let selectedGender: string = 'male';
54
+ let userLevel: string = 'basic';
55
+ let notifyFreq: string = 'daily';
56
+ let subscriptionPlan: string = 'free';
57
+
58
+ const handleGenderChange = (value: string): void => {
59
+ selectedGender = value;
60
+ console.log('选择的性别:', value);
61
+ };
62
+
63
+ const handleLevelChange = (value: string): void => {
64
+ userLevel = value;
65
+ console.log('用户级别:', value);
66
+ };
67
+
68
+ const handleNotificationChange = (value: string): void => {
69
+ notifyFreq = value;
70
+ console.log('通知频率:', value);
71
+ };
72
+ </script>
73
+
74
+ <!-- 性别选择 -->
75
+ <div class="form-group">
76
+ <label>性别:</label>
77
+ <GroupRadioBox
78
+ options={genderOptions}
79
+ keyField="code"
80
+ textField="text"
81
+ bind:value={selectedGender}
82
+ onChange={handleGenderChange}
83
+ />
84
+ </div>
85
+
86
+ <!-- 用户级别选择 -->
87
+ <div class="form-group">
88
+ <label>用户级别:</label>
89
+ <GroupRadioBox
90
+ options={userLevels}
91
+ keyField="code"
92
+ textField="text"
93
+ bind:value={userLevel}
94
+ onChange={handleLevelChange}
95
+ />
96
+ </div>
97
+
98
+ <!-- 通知频率选择(紧凑模式) -->
99
+ <div class="form-group">
100
+ <label>通知频率:</label>
101
+ <GroupRadioBox
102
+ options={notificationFrequency}
103
+ keyField="code"
104
+ textField="text"
105
+ compact={true}
106
+ item$style="margin-right: 16px;"
107
+ bind:value={notifyFreq}
108
+ onChange={handleNotificationChange}
109
+ />
110
+ </div>
111
+
112
+ <!-- 带禁用选项的单选组 -->
113
+ <div class="form-group">
114
+ <label>订阅计划:</label>
115
+ <GroupRadioBox
116
+ options={[
117
+ { code: 'free', text: '免费版' },
118
+ { code: 'pro', text: '专业版' },
119
+ { code: 'enterprise', text: '企业版' },
120
+ { code: 'custom', text: '定制版' }
121
+ ]}
122
+ keyField="code"
123
+ textField="text"
124
+ disabledOptions={['custom']}
125
+ bind:value={subscriptionPlan}
126
+ />
127
+ </div>
128
+ ```
129
+
130
+ ## 高级用法
131
+
132
+ ### 动态选项和条件禁用
133
+ ```svelte
134
+ <script lang="ts">
135
+ import type { OptionItem } from '@ticatec/uniface-element/types';
136
+ import { onMount } from 'svelte';
137
+
138
+ interface PaymentMethod extends OptionItem {
139
+ available: boolean;
140
+ }
141
+
142
+ type UserLocation = 'CN' | 'US' | 'OTHER';
143
+
144
+ const paymentMethods: PaymentMethod[] = [
145
+ { code: 'credit_card', text: '信用卡支付', available: true },
146
+ { code: 'paypal', text: 'PayPal', available: true },
147
+ { code: 'alipay', text: '支付宝', available: true },
148
+ { code: 'wechat', text: '微信支付', available: true },
149
+ { code: 'bitcoin', text: '比特币', available: false }
150
+ ];
151
+
152
+ let selectedPayment: string = 'credit_card';
153
+ let userLocation: UserLocation = 'CN'; // 用户位置
154
+
155
+ // 根据用户位置动态设置可用的支付方式
156
+ $: availablePaymentMethods = paymentMethods.filter((method: PaymentMethod): boolean => {
157
+ if (userLocation === 'CN') {
158
+ // 中国用户可以使用支付宝和微信
159
+ return ['credit_card', 'alipay', 'wechat'].includes(method.code);
160
+ } else if (userLocation === 'US') {
161
+ // 美国用户可以使用信用卡和PayPal
162
+ return ['credit_card', 'paypal'].includes(method.code);
163
+ }
164
+ return method.available;
165
+ });
166
+
167
+ // 动态设置禁用选项
168
+ $: disabledOptions: string[] = paymentMethods
169
+ .filter((method: PaymentMethod): boolean => !method.available)
170
+ .map((method: PaymentMethod): string => method.code);
171
+
172
+ const handlePaymentChange = (value: string): void => {
173
+ selectedPayment = value;
174
+ // 根据支付方式显示相应的表单
175
+ showPaymentForm(value);
176
+ };
177
+
178
+ const showPaymentForm = (paymentMethod: string): void => {
179
+ console.log(`显示${paymentMethod}支付表单`);
180
+ };
181
+ </script>
182
+
183
+ <div class="form-group">
184
+ <label>用户位置:</label>
185
+ <select bind:value={userLocation}>
186
+ <option value="CN">中国</option>
187
+ <option value="US">美国</option>
188
+ <option value="OTHER">其他</option>
189
+ </select>
190
+ </div>
191
+
192
+ <div class="form-group">
193
+ <label>支付方式:</label>
194
+ <GroupRadioBox
195
+ options={availablePaymentMethods}
196
+ keyField="code"
197
+ textField="text"
198
+ {disabledOptions}
199
+ bind:value={selectedPayment}
200
+ onChange={handlePaymentChange}
201
+ />
202
+ </div>
203
+ ```
204
+
205
+ ### 带描述信息的选项
206
+ ```svelte
207
+ <script lang="ts">
208
+ import type { OptionItem } from '@ticatec/uniface-element/types';
209
+
210
+ interface SubscriptionPlan extends OptionItem {
211
+ description: string;
212
+ price: string;
213
+ }
214
+
215
+ const subscriptionPlans: SubscriptionPlan[] = [
216
+ {
217
+ code: 'free',
218
+ text: '免费版',
219
+ description: '基础功能,适合个人使用',
220
+ price: '¥0/月'
221
+ },
222
+ {
223
+ code: 'pro',
224
+ text: '专业版',
225
+ description: '完整功能,适合小团队',
226
+ price: '¥99/月'
227
+ },
228
+ {
229
+ code: 'enterprise',
230
+ text: '企业版',
231
+ description: '高级功能,适合大型团队',
232
+ price: '¥299/月'
233
+ }
234
+ ];
235
+
236
+ let selectedPlan: string = 'free';
237
+
238
+ const handlePlanChange = (value: string): void => {
239
+ selectedPlan = value;
240
+ const plan: SubscriptionPlan | undefined = subscriptionPlans.find(p => p.code === value);
241
+ if (plan) {
242
+ console.log(`选择了${plan.text}计划`);
243
+ }
244
+ };
245
+ </script>
246
+
247
+ <div class="form-group">
248
+ <label>选择订阅计划:</label>
249
+ <div class="plan-options">
250
+ <GroupRadioBox
251
+ options={subscriptionPlans}
252
+ keyField="code"
253
+ textField="text"
254
+ bind:value={selectedPlan}
255
+ onChange={handlePlanChange}
256
+ />
257
+ </div>
258
+
259
+ <!-- 显示选中计划的详细信息 -->
260
+ {#each subscriptionPlans as plan}
261
+ {#if plan.code === selectedPlan}
262
+ <div class="plan-details">
263
+ <h4>{plan.text}</h4>
264
+ <p>{plan.description}</p>
265
+ <div class="price">{plan.price}</div>
266
+ </div>
267
+ {/if}
268
+ {/each}
269
+ </div>
270
+ ```
271
+
272
+ ### 分组单选框
273
+ ```svelte
274
+ <script lang="ts">
275
+ import type { OptionItem } from '@ticatec/uniface-element/types';
276
+
277
+ interface ThemeOptions {
278
+ light: OptionItem[];
279
+ dark: OptionItem[];
280
+ }
281
+
282
+ const themes: ThemeOptions = {
283
+ light: [
284
+ { code: 'default_light', text: '默认浅色' },
285
+ { code: 'blue_light', text: '蓝色浅色' },
286
+ { code: 'green_light', text: '绿色浅色' }
287
+ ],
288
+ dark: [
289
+ { code: 'default_dark', text: '默认深色' },
290
+ { code: 'blue_dark', text: '蓝色深色' },
291
+ { code: 'green_dark', text: '绿色深色' }
292
+ ]
293
+ };
294
+
295
+ let selectedTheme: string = 'default_light';
296
+
297
+ const handleThemeChange = (value: string): void => {
298
+ selectedTheme = value;
299
+ applyTheme(value);
300
+ };
301
+
302
+ const applyTheme = (themeCode: string): void => {
303
+ console.log(`应用主题:${themeCode}`);
304
+ // 应用主题逻辑
305
+ };
306
+ </script>
307
+
308
+ <div class="theme-selector">
309
+ <div class="theme-group">
310
+ <h4>浅色主题</h4>
311
+ <GroupRadioBox
312
+ options={themes.light}
313
+ keyField="code"
314
+ textField="text"
315
+ compact={true}
316
+ bind:value={selectedTheme}
317
+ onChange={handleThemeChange}
318
+ />
319
+ </div>
320
+
321
+ <div class="theme-group">
322
+ <h4>深色主题</h4>
323
+ <GroupRadioBox
324
+ options={themes.dark}
325
+ keyField="code"
326
+ textField="text"
327
+ compact={true}
328
+ bind:value={selectedTheme}
329
+ onChange={handleThemeChange}
330
+ />
331
+ </div>
332
+ </div>
333
+ ```
334
+
335
+ ### 表单验证
336
+ ```svelte
337
+ <script lang="ts">
338
+ import type { OptionItem } from '@ticatec/uniface-element/types';
339
+
340
+ const satisfactionLevels: OptionItem[] = [
341
+ { code: 'very_unsatisfied', text: '非常不满意' },
342
+ { code: 'unsatisfied', text: '不满意' },
343
+ { code: 'neutral', text: '一般' },
344
+ { code: 'satisfied', text: '满意' },
345
+ { code: 'very_satisfied', text: '非常满意' }
346
+ ];
347
+
348
+ let satisfaction: string | null = null;
349
+ let satisfactionError: string = '';
350
+
351
+ const validateSatisfaction = (value: string | null): void => {
352
+ if (!value) {
353
+ satisfactionError = '请选择您的满意度';
354
+ } else {
355
+ satisfactionError = '';
356
+ }
357
+ };
358
+
359
+ const handleSatisfactionChange = (value: string): void => {
360
+ satisfaction = value;
361
+ validateSatisfaction(value);
362
+ };
363
+
364
+ const handleSubmit = (): void => {
365
+ validateSatisfaction(satisfaction);
366
+ if (!satisfactionError) {
367
+ console.log('提交满意度调查:', satisfaction);
368
+ }
369
+ };
370
+ </script>
371
+
372
+ <div class="form-group">
373
+ <label>您对我们的服务满意度如何?*</label>
374
+ <GroupRadioBox
375
+ options={satisfactionLevels}
376
+ keyField="code"
377
+ textField="text"
378
+ bind:value={satisfaction}
379
+ onChange={handleSatisfactionChange}
380
+ />
381
+ {#if satisfactionError}
382
+ <div class="error-message">{satisfactionError}</div>
383
+ {/if}
384
+ </div>
385
+
386
+ <button on:click={handleSubmit} disabled={!!satisfactionError}>
387
+ 提交调查
388
+ </button>
389
+ ```
390
+
391
+ ## 样式定制
392
+
393
+ ```css
394
+ .form-group {
395
+ margin-bottom: 24px;
396
+ }
397
+
398
+ .form-group label {
399
+ display: block;
400
+ margin-bottom: 12px;
401
+ font-weight: 600;
402
+ color: #333;
403
+ }
404
+
405
+ .plan-options {
406
+ margin-bottom: 16px;
407
+ }
408
+
409
+ .plan-details {
410
+ padding: 16px;
411
+ background: #f8f9fa;
412
+ border-radius: 8px;
413
+ border-left: 4px solid #007bff;
414
+ }
415
+
416
+ .plan-details h4 {
417
+ margin: 0 0 8px 0;
418
+ color: #007bff;
419
+ }
420
+
421
+ .plan-details p {
422
+ margin: 0 0 12px 0;
423
+ color: #6c757d;
424
+ }
425
+
426
+ .price {
427
+ font-size: 18px;
428
+ font-weight: 700;
429
+ color: #28a745;
430
+ }
431
+
432
+ .theme-selector {
433
+ display: grid;
434
+ grid-template-columns: 1fr 1fr;
435
+ gap: 24px;
436
+ }
437
+
438
+ .theme-group {
439
+ padding: 16px;
440
+ border: 1px solid #e1e5e9;
441
+ border-radius: 8px;
442
+ }
443
+
444
+ .theme-group h4 {
445
+ margin: 0 0 12px 0;
446
+ color: #495057;
447
+ }
448
+
449
+ .error-message {
450
+ color: #dc3545;
451
+ font-size: 14px;
452
+ margin-top: 6px;
453
+ }
454
+
455
+ /* 自定义单选按钮样式 */
456
+ .custom-radio-group {
457
+ display: flex;
458
+ flex-wrap: wrap;
459
+ gap: 12px;
460
+ }
461
+
462
+ .custom-radio-group .radio-option {
463
+ flex: 1;
464
+ min-width: 120px;
465
+ }
466
+ ```
467
+
468
+ ## 组件优势
469
+
470
+ **相比单独使用RadioButton的优势:**
471
+
472
+ 1. **统一管理**:所有相关选项集中在一个组件中管理
473
+ 2. **数据绑定简化**:只需绑定一个值,而不是多个独立的值
474
+ 3. **样式一致性**:所有选项具有统一的样式和间距
475
+ 4. **选项动态管理**:可以轻松地显示/隐藏、启用/禁用特定选项
476
+ 5. **更好的语义化**:明确表达了选项之间的互斥关系
477
+ 6. **易于维护**:选项的增删改都在一个地方处理
478
+
479
+ ## 最佳实践
480
+
481
+ ### 1. 提供合理的默认值
482
+ ```svelte
483
+ <!-- 推荐:设置合理的默认值 -->
484
+ <GroupRadioBox
485
+ options={genderOptions}
486
+ bind:value={selectedGender}
487
+ defaultValue="other"
488
+ />
489
+
490
+ <!-- 避免:让用户必须选择 -->
491
+ <GroupRadioBox
492
+ options={genderOptions}
493
+ bind:value={selectedGender}
494
+ />
495
+ ```
496
+
497
+ ### 2. 限制选项数量
498
+ ```svelte
499
+ <!-- 推荐:选项数量适中(3-7个) -->
500
+ <GroupRadioBox options={satisfactionLevels} /> <!-- 5个选项 -->
501
+
502
+ <!-- 避免:选项过多时使用下拉选择 -->
503
+ <OptionsSelect options={countryList} /> <!-- 200+国家 -->
504
+ ```
505
+
506
+ ### 3. 提供清晰的标签
507
+ ```svelte
508
+ <!-- 推荐:清晰的描述 -->
509
+ <label>请选择您的年龄段:</label>
510
+ <GroupRadioBox options={ageRanges} />
511
+
512
+ <!-- 避免:模糊的标签 -->
513
+ <label>选择:</label>
514
+ <GroupRadioBox options={someOptions} />
515
+ ```
516
+
517
+ ### 4. 合理使用禁用状态
518
+ ```svelte
519
+ <!-- 推荐:明确原因 -->
520
+ <GroupRadioBox
521
+ options={premiumFeatures}
522
+ disabledOptions={nonPremiumUser ? ['advanced', 'pro'] : []}
523
+ />
524
+ <div class="help-text">升级到高级版以解锁更多功能</div>
525
+ ```