@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,443 @@
1
+ # NumberRange
2
+
3
+ A dual number input component for specifying numeric ranges, with automatic validation to ensure the "from" value doesn't exceed the "to" value.
4
+
5
+ ## Features
6
+
7
+ - **Range Input**: Two connected number inputs for "from" and "to" values
8
+ - **Automatic Validation**: Ensures logical range order (from ≤ to)
9
+ - **Negative Numbers**: Optional support for negative values
10
+ - **Boundary Constraints**: Set min/max limits for the entire range
11
+ - **Multiple Variants**: Support for outlined, filled, plain, and default styles
12
+ - **Compact Mode**: Space-efficient layout for dense forms
13
+ - **Clear Functionality**: Built-in clear button to reset both values
14
+ - **Real-time Validation**: Immediate feedback during input
15
+ - **Focus Management**: Automatic focus handling between inputs
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ npm install @ticatec/uniface-element
21
+ ```
22
+
23
+ ## Basic Usage
24
+
25
+ ```svelte
26
+ <script>
27
+ import NumberRange from '@ticatec/uniface-element/NumberRange';
28
+
29
+ let fromValue = 10;
30
+ let toValue = 50;
31
+ </script>
32
+
33
+ <NumberRange bind:fromValue bind:toValue />
34
+ ```
35
+
36
+ ## API Reference
37
+
38
+ ### Props
39
+
40
+ | Prop | Type | Default | Description |
41
+ |------|------|---------|-------------|
42
+ | `fromValue` | `number \| null` | `null` | The "from" (minimum) value of the range |
43
+ | `toValue` | `number \| null` | `null` | The "to" (maximum) value of the range |
44
+ | `variant` | `'' \| 'plain' \| 'outlined' \| 'filled'` | `''` | Visual style variant |
45
+ | `compact` | `boolean` | `false` | Enables compact display mode |
46
+ | `style` | `string` | `''` | Custom CSS styles |
47
+ | `min` | `number \| null` | `null` | Minimum allowed value for both inputs |
48
+ | `max` | `number \| null` | `null` | Maximum allowed value for both inputs |
49
+ | `allowNegative` | `boolean` | `false` | Allow negative numbers in both inputs |
50
+ | `class` | `string` | `''` | CSS class name |
51
+
52
+ ## Examples
53
+
54
+ ### Basic Range Selection
55
+
56
+ ```svelte
57
+ <script>
58
+ import NumberRange from '@ticatec/uniface-element/NumberRange';
59
+ import FormField from '@ticatec/uniface-element/FormField';
60
+
61
+ let ageFrom = 18;
62
+ let ageTo = 65;
63
+ </script>
64
+
65
+ <FormField label="Age Range">
66
+ <NumberRange
67
+ bind:fromValue={ageFrom}
68
+ bind:toValue={ageTo}
69
+ variant="outlined"
70
+ min={0}
71
+ max={120}
72
+ />
73
+ </FormField>
74
+ ```
75
+
76
+ ### Price Range Filter
77
+
78
+ ```svelte
79
+ <script>
80
+ import NumberRange from '@ticatec/uniface-element/NumberRange';
81
+
82
+ let priceMin = 100;
83
+ let priceMax = 1000;
84
+
85
+ $: console.log(`Price range: $${priceMin} - $${priceMax}`);
86
+ </script>
87
+
88
+ <div class="price-filter">
89
+ <label>Price Range ($)</label>
90
+ <NumberRange
91
+ bind:fromValue={priceMin}
92
+ bind:toValue={priceMax}
93
+ variant="filled"
94
+ min={0}
95
+ max={10000}
96
+ />
97
+ <div class="range-display">
98
+ ${priceMin || 0} - ${priceMax || 0}
99
+ </div>
100
+ </div>
101
+ ```
102
+
103
+ ### Temperature Range (with negative values)
104
+
105
+ ```svelte
106
+ <script>
107
+ import NumberRange from '@ticatec/uniface-element/NumberRange';
108
+
109
+ let tempMin = -10;
110
+ let tempMax = 25;
111
+ </script>
112
+
113
+ <div class="temperature-range">
114
+ <label>Temperature Range (°C)</label>
115
+ <NumberRange
116
+ bind:fromValue={tempMin}
117
+ bind:toValue={tempMax}
118
+ variant="outlined"
119
+ allowNegative={true}
120
+ min={-50}
121
+ max={50}
122
+ />
123
+ </div>
124
+ ```
125
+
126
+ ### Search Criteria Form
127
+
128
+ ```svelte
129
+ <script>
130
+ import NumberRange from '@ticatec/uniface-element/NumberRange';
131
+ import CriteriaField from '@ticatec/uniface-element/CriteriaField';
132
+
133
+ let criteria = {
134
+ salaryFrom: null,
135
+ salaryTo: null,
136
+ experienceFrom: 0,
137
+ experienceTo: 10,
138
+ ageFrom: 22,
139
+ ageTo: 60
140
+ };
141
+
142
+ function handleSearch() {
143
+ console.log('Search criteria:', criteria);
144
+ }
145
+ </script>
146
+
147
+ <div class="search-form">
148
+ <CriteriaField label="Salary Range" size="x30">
149
+ <NumberRange
150
+ bind:fromValue={criteria.salaryFrom}
151
+ bind:toValue={criteria.salaryTo}
152
+ variant="outlined"
153
+ min={0}
154
+ max={500000}
155
+ />
156
+ </CriteriaField>
157
+
158
+ <CriteriaField label="Years of Experience" size="x30">
159
+ <NumberRange
160
+ bind:fromValue={criteria.experienceFrom}
161
+ bind:toValue={criteria.experienceTo}
162
+ variant="outlined"
163
+ min={0}
164
+ max={50}
165
+ />
166
+ </CriteriaField>
167
+
168
+ <CriteriaField label="Age Range" size="x30">
169
+ <NumberRange
170
+ bind:fromValue={criteria.ageFrom}
171
+ bind:toValue={criteria.ageTo}
172
+ variant="outlined"
173
+ min={16}
174
+ max={80}
175
+ />
176
+ </CriteriaField>
177
+
178
+ <button on:click={handleSearch}>Search</button>
179
+ </div>
180
+ ```
181
+
182
+ ### Compact Layout for Tables
183
+
184
+ ```svelte
185
+ <script>
186
+ import NumberRange from '@ticatec/uniface-element/NumberRange';
187
+
188
+ let filters = [
189
+ { label: 'Score', from: 80, to: 100 },
190
+ { label: 'Quantity', from: 1, to: 999 },
191
+ { label: 'Rating', from: 3, to: 5 }
192
+ ];
193
+ </script>
194
+
195
+ <table class="filter-table">
196
+ <thead>
197
+ <tr>
198
+ <th>Filter</th>
199
+ <th>Range</th>
200
+ </tr>
201
+ </thead>
202
+ <tbody>
203
+ {#each filters as filter}
204
+ <tr>
205
+ <td>{filter.label}</td>
206
+ <td>
207
+ <NumberRange
208
+ bind:fromValue={filter.from}
209
+ bind:toValue={filter.to}
210
+ compact
211
+ variant="outlined"
212
+ min={0}
213
+ />
214
+ </td>
215
+ </tr>
216
+ {/each}
217
+ </tbody>
218
+ </table>
219
+ ```
220
+
221
+ ### Dynamic Range with Validation
222
+
223
+ ```svelte
224
+ <script>
225
+ import NumberRange from '@ticatec/uniface-element/NumberRange';
226
+
227
+ let budgetMin = 1000;
228
+ let budgetMax = 5000;
229
+ let isValidRange = true;
230
+
231
+ $: isValidRange = budgetMin <= budgetMax;
232
+ $: rangeSize = budgetMax - budgetMin;
233
+
234
+ function resetRange() {
235
+ budgetMin = 1000;
236
+ budgetMax = 5000;
237
+ }
238
+ </script>
239
+
240
+ <div class="budget-selector">
241
+ <label>Budget Range</label>
242
+ <NumberRange
243
+ bind:fromValue={budgetMin}
244
+ bind:toValue={budgetMax}
245
+ variant="outlined"
246
+ min={0}
247
+ max={100000}
248
+ />
249
+
250
+ <div class="range-info" class:error={!isValidRange}>
251
+ {#if isValidRange}
252
+ <span>Range size: ${rangeSize}</span>
253
+ {:else}
254
+ <span>Invalid range: minimum cannot exceed maximum</span>
255
+ {/if}
256
+ </div>
257
+
258
+ <button on:click={resetRange}>Reset</button>
259
+ </div>
260
+
261
+ <style>
262
+ .range-info.error {
263
+ color: #d32f2f;
264
+ }
265
+ </style>
266
+ ```
267
+
268
+ ### Statistical Analysis Range
269
+
270
+ ```svelte
271
+ <script>
272
+ import NumberRange from '@ticatec/uniface-element/NumberRange';
273
+
274
+ let dataRange = { min: -100, max: 100 };
275
+ let outlierThreshold = { from: -50, to: 50 };
276
+
277
+ $: normalDataPercentage = calculateNormalData(dataRange, outlierThreshold);
278
+
279
+ function calculateNormalData(range, threshold) {
280
+ const totalRange = range.max - range.min;
281
+ const normalRange = threshold.to - threshold.from;
282
+ return ((normalRange / totalRange) * 100).toFixed(1);
283
+ }
284
+ </script>
285
+
286
+ <div class="analysis-panel">
287
+ <h3>Data Analysis</h3>
288
+
289
+ <div class="range-control">
290
+ <label>Data Range</label>
291
+ <NumberRange
292
+ bind:fromValue={dataRange.min}
293
+ bind:toValue={dataRange.max}
294
+ variant="filled"
295
+ allowNegative={true}
296
+ min={-1000}
297
+ max={1000}
298
+ />
299
+ </div>
300
+
301
+ <div class="range-control">
302
+ <label>Normal Range (exclude outliers)</label>
303
+ <NumberRange
304
+ bind:fromValue={outlierThreshold.from}
305
+ bind:toValue={outlierThreshold.to}
306
+ variant="outlined"
307
+ allowNegative={true}
308
+ min={dataRange.min}
309
+ max={dataRange.max}
310
+ />
311
+ </div>
312
+
313
+ <div class="statistics">
314
+ <p>Normal data coverage: {normalDataPercentage}%</p>
315
+ </div>
316
+ </div>
317
+ ```
318
+
319
+ ### Inventory Management
320
+
321
+ ```svelte
322
+ <script>
323
+ import NumberRange from '@ticatec/uniface-element/NumberRange';
324
+
325
+ let stockLevels = {
326
+ lowStock: 0,
327
+ highStock: 100,
328
+ reorderFrom: 10,
329
+ reorderTo: 90
330
+ };
331
+
332
+ $: isValidReorderRange = (
333
+ stockLevels.reorderFrom >= stockLevels.lowStock &&
334
+ stockLevels.reorderTo <= stockLevels.highStock &&
335
+ stockLevels.reorderFrom <= stockLevels.reorderTo
336
+ );
337
+ </script>
338
+
339
+ <div class="inventory-config">
340
+ <h3>Inventory Configuration</h3>
341
+
342
+ <div class="config-row">
343
+ <label>Stock Level Range</label>
344
+ <NumberRange
345
+ bind:fromValue={stockLevels.lowStock}
346
+ bind:toValue={stockLevels.highStock}
347
+ variant="outlined"
348
+ min={0}
349
+ max={10000}
350
+ />
351
+ </div>
352
+
353
+ <div class="config-row">
354
+ <label>Reorder Range</label>
355
+ <NumberRange
356
+ bind:fromValue={stockLevels.reorderFrom}
357
+ bind:toValue={stockLevels.reorderTo}
358
+ variant="filled"
359
+ min={stockLevels.lowStock}
360
+ max={stockLevels.highStock}
361
+ />
362
+ </div>
363
+
364
+ <div class="validation" class:valid={isValidReorderRange}>
365
+ {isValidReorderRange ? '✓ Valid configuration' : '✗ Invalid reorder range'}
366
+ </div>
367
+ </div>
368
+
369
+ <style>
370
+ .validation.valid {
371
+ color: #2e7d32;
372
+ }
373
+ .validation:not(.valid) {
374
+ color: #d32f2f;
375
+ }
376
+ </style>
377
+ ```
378
+
379
+ ## Validation Logic
380
+
381
+ The NumberRange component automatically enforces logical constraints:
382
+
383
+ 1. **Range Order**: The "from" value cannot exceed the "to" value
384
+ 2. **Boundary Respect**: Both values respect the global min/max constraints
385
+ 3. **Cross-validation**: When one value changes, the other adjusts if necessary
386
+ 4. **Real-time Feedback**: Validation occurs during typing
387
+
388
+ ## Best Practices
389
+
390
+ 1. **Set Appropriate Boundaries**: Use min/max to prevent unrealistic values
391
+ 2. **Provide Clear Labels**: Indicate what the range represents
392
+ 3. **Handle Empty States**: Consider what happens when values are null
393
+ 4. **Use Compact Mode Wisely**: In dense layouts or tables
394
+ 5. **Validate Range Logic**: Ensure business rules are met
395
+ 6. **Consider User Workflow**: Which input should users typically fill first
396
+ 7. **Provide Feedback**: Show range calculations or validation messages
397
+
398
+ ## Styling
399
+
400
+ The NumberRange component uses the following CSS structure:
401
+
402
+ ```css
403
+ .uniface-range-editor {
404
+ display: flex;
405
+ align-items: center;
406
+ border: 1px solid #e0e0e0;
407
+ border-radius: 4px;
408
+ }
409
+
410
+ .uniface-range-editor .divider {
411
+ width: 8px;
412
+ height: 1px;
413
+ background: #ccc;
414
+ margin: 0 4px;
415
+ }
416
+
417
+ .uniface-range-editor.compact {
418
+ padding: 4px 8px;
419
+ }
420
+
421
+ .uniface-range-editor.outlined {
422
+ border: 2px solid #1976d2;
423
+ }
424
+
425
+ .uniface-range-editor.filled {
426
+ background-color: #f5f5f5;
427
+ }
428
+ ```
429
+
430
+ ## Accessibility
431
+
432
+ - Proper ARIA labels for screen readers
433
+ - Keyboard navigation between inputs
434
+ - Focus management and visual indicators
435
+ - Support for high contrast modes
436
+ - Logical tab order
437
+
438
+ ## Related Components
439
+
440
+ - [NumberEditor](../number-editor/README.md) - For single number input
441
+ - [DateRange](../date-range/README.md) - For date range selection
442
+ - [CriteriaField](../criteria-field/README.md) - For search form layouts
443
+ - [FormField](../form-field/README.md) - For form field labels and layout