@ticatec/uniface-element 5.0.0 → 5.0.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 (282) hide show
  1. package/README.md +29 -54
  2. package/README_CN.md +37 -57
  3. package/dist/app_layout/ClassicLayout.svelte +8 -40
  4. package/dist/app_layout/ColumnsLayout.svelte +3 -3
  5. package/dist/app_layout/HeaderLayout.svelte +4 -20
  6. package/dist/app_layout/RowsLayout.svelte +3 -3
  7. package/dist/app_layout/SidebarLayout.svelte +4 -20
  8. package/dist/base-calendar/CalendarBase.svelte +29 -6
  9. package/dist/base-calendar/CalendarBase.svelte.d.ts +4 -0
  10. package/dist/base-calendar/MonthPickupPanel.svelte +19 -6
  11. package/dist/base-calendar/MonthPickupPanel.svelte.d.ts +1 -1
  12. package/dist/base-calendar/MonthlyCalendar.svelte +18 -2
  13. package/dist/base-calendar/YearPickupPanel.svelte +24 -6
  14. package/dist/base-calendar/YearPickupPanel.svelte.d.ts +1 -1
  15. package/dist/composite/pagination_panel/PaginationPanel.svelte +2 -0
  16. package/dist/composite/transfer/Transfer.svelte +12 -6
  17. package/dist/data_display/accordion/Accordion.svelte +1 -4
  18. package/dist/data_display/card/CommonCardActionBar.svelte +31 -37
  19. package/dist/data_display/concise_data_table/Column.d.ts +6 -0
  20. package/dist/data_display/concise_data_table/ConciseListTable.svelte +4 -3
  21. package/dist/data_display/concise_data_table/DataCell.svelte +3 -3
  22. package/dist/data_display/list_box/ListBox.svelte +96 -23
  23. package/dist/data_display/list_box/ListBox.svelte.d.ts +4 -0
  24. package/dist/data_display/tree_view/TreeNodeView.svelte +25 -4
  25. package/dist/data_table/DataTable.svelte +5 -5
  26. package/dist/data_table/DataTable.svelte.d.ts +36 -16
  27. package/dist/data_table/lib/ActionsColumn.d.ts +2 -2
  28. package/dist/data_table/lib/DataColumn.d.ts +7 -1
  29. package/dist/data_table/lib/RowAction.d.ts +5 -5
  30. package/dist/data_table/lib/clickOutSide.js +6 -5
  31. package/dist/data_table/parts/FixedHeaderPanel.svelte +18 -3
  32. package/dist/data_table/parts/FixedRow.svelte +10 -1
  33. package/dist/data_table/parts/HrefCell.svelte +1 -1
  34. package/dist/data_table/parts/TableHeaderPanel.svelte +18 -2
  35. package/dist/data_table/parts/TextCell.svelte +2 -2
  36. package/dist/form/attachment_files/AttachmentEditor.svelte +20 -15
  37. package/dist/form/attachment_files/FileRender.svelte +1 -1
  38. package/dist/form/attachment_files/FileUploadBar.svelte +5 -2
  39. package/dist/form/attachment_files/FileUploadPanel.svelte +11 -73
  40. package/dist/form/cascade_options_select/CascadeOptionSelect.svelte +10 -2
  41. package/dist/form/cascade_options_select/OptionsBox.svelte +48 -2
  42. package/dist/form/checkbox/CheckBox.svelte +2 -7
  43. package/dist/form/color_picker/ColorPicker.svelte +150 -35
  44. package/dist/form/color_picker/ColorPicker.svelte.d.ts +7 -25
  45. package/dist/form/color_picker/ColorPickerPanel.svelte +23 -20
  46. package/dist/form/color_picker/ColorPickerPanel.svelte.d.ts +5 -18
  47. package/dist/form/color_picker/README.md +14 -7
  48. package/dist/form/color_picker/README_CN.md +14 -7
  49. package/dist/form/common_editor/CommonEditor.svelte +18 -4
  50. package/dist/form/common_editor/CommonPicker.svelte +14 -10
  51. package/dist/form/common_editor/CommonPopupEditor.svelte +8 -1
  52. package/dist/form/common_range_editor/CommonRangeEditor.svelte +11 -2
  53. package/dist/form/date_picker/DatePicker.svelte +1 -1
  54. package/dist/form/date_picker/DateTimePicker.svelte +1 -1
  55. package/dist/form/date_picker/ScrollBar.svelte +20 -12
  56. package/dist/form/date_picker/ScrollBar.svelte.d.ts +4 -18
  57. package/dist/form/date_range/DateRangeEditor.svelte +11 -3
  58. package/dist/form/group_box/group-check-box/GroupCheckBox.svelte +6 -1
  59. package/dist/form/group_box/group-radio-box/GroupRadioBox.svelte +6 -1
  60. package/dist/form/image-files/ImageFilesField.svelte +51 -7
  61. package/dist/form/image-files/ImagePreview.svelte +23 -9
  62. package/dist/form/image-files/ImageRender.svelte +69 -11
  63. package/dist/form/input_options_select/InputOptionsSelect.svelte +10 -2
  64. package/dist/form/lookup_editor/LookupEditor.svelte +9 -2
  65. package/dist/form/memo_editor/MemoEditor.svelte +2 -2
  66. package/dist/form/number_editor/NumberEditor.svelte +2 -2
  67. package/dist/form/options_multi_select/OptionsMultiSelect.svelte +20 -12
  68. package/dist/form/options_select/OptionsSelect.svelte +15 -6
  69. package/dist/form/options_select/OptionsSelect.svelte.d.ts +39 -17
  70. package/dist/form/prompts_text_editor/PromptsTextEditor.svelte +10 -2
  71. package/dist/form/radio_button/RadioButton.svelte +2 -8
  72. package/dist/form/switch/Switch.svelte +4 -4
  73. package/dist/form/text_editor/TextEditor.svelte +2 -2
  74. package/dist/form/unit-number-editor/UnitNumberEditor.svelte +10 -2
  75. package/dist/general/button/Button.svelte +5 -0
  76. package/dist/general/button/Button.svelte.d.ts +1 -0
  77. package/dist/general/button/IconButton.svelte +3 -1
  78. package/dist/general/button/IconButton.svelte.d.ts +1 -0
  79. package/dist/general/button/TextButton.svelte +3 -0
  80. package/dist/general/button/TextButton.svelte.d.ts +1 -0
  81. package/dist/general/icon/Icon.svelte +18 -1
  82. package/dist/general/split/Split.svelte +24 -4
  83. package/dist/general/tag/Tag.svelte +9 -1
  84. package/dist/navigation/nav_menu/MenuItem.d.ts +4 -2
  85. package/dist/navigation/nav_menu/NavigatorMenu.svelte +157 -34
  86. package/dist/navigation/nav_menu/NavigatorMenu.svelte.d.ts +2 -3
  87. package/dist/navigation/nav_menu/NavigatorMenuItem.svelte +25 -13
  88. package/dist/navigation/nav_menu/NavigatorMenuItem.svelte.d.ts +3 -3
  89. package/dist/navigation/navigator/Navigator.svelte +17 -17
  90. package/dist/navigation/page-stack/PageStack.svelte +160 -0
  91. package/dist/navigation/page-stack/PageStack.svelte.d.ts +24 -0
  92. package/dist/navigation/page-stack/PageStackContext.d.ts +25 -0
  93. package/dist/navigation/page-stack/PageStackContext.js +12 -0
  94. package/dist/navigation/page-stack/PageStackFrame.svelte +24 -0
  95. package/dist/navigation/page-stack/PageStackFrame.svelte.d.ts +11 -0
  96. package/dist/navigation/page-stack/README.md +154 -0
  97. package/dist/navigation/page-stack/README_CN.md +154 -0
  98. package/dist/navigation/page-stack/index.d.ts +6 -0
  99. package/dist/navigation/page-stack/index.js +4 -0
  100. package/dist/navigation/pagination/Pagination.svelte +114 -14
  101. package/dist/navigation/progress_step_bar/ProgressStepBlock.svelte +1 -5
  102. package/dist/navigation/tabs/Tabs.svelte +42 -10
  103. package/dist/navigation/tabs/Tabs.svelte.d.ts +2 -2
  104. package/dist/overlay/common/FloatingPanel.svelte +3 -17
  105. package/dist/overlay/common/FullscreenOverlay.svelte +27 -3
  106. package/dist/overlay/common/FullscreenOverlay.svelte.d.ts +6 -27
  107. package/dist/overlay/common/ModalPopover.svelte +18 -2
  108. package/dist/overlay/common/Popover.svelte +61 -57
  109. package/dist/overlay/common/Popover.svelte.d.ts +1 -5
  110. package/dist/overlay/common/escapeClose.d.ts +28 -0
  111. package/dist/overlay/common/escapeClose.js +47 -0
  112. package/dist/overlay/common/focusTrap.d.ts +8 -0
  113. package/dist/overlay/common/focusTrap.js +83 -0
  114. package/dist/overlay/common/mountSingleton.d.ts +27 -0
  115. package/dist/overlay/common/mountSingleton.js +45 -0
  116. package/dist/overlay/common/outsideClick.d.ts +28 -0
  117. package/dist/overlay/common/outsideClick.js +20 -0
  118. package/dist/overlay/common/scrollLock.d.ts +8 -0
  119. package/dist/overlay/common/scrollLock.js +49 -0
  120. package/dist/overlay/common/uniface-utils.js +0 -1
  121. package/dist/overlay/context-menu/ContextMenu.svelte.js +2 -15
  122. package/dist/overlay/context-menu/ContextMenuPanel.svelte +27 -3
  123. package/dist/overlay/dialog/Dialog.svelte +48 -32
  124. package/dist/overlay/dialog/DialogManager.svelte.js +7 -9
  125. package/dist/overlay/dialog/DialogWrapper.svelte +5 -2
  126. package/dist/overlay/drawer/Drawer.svelte +30 -3
  127. package/dist/overlay/indicator/Indicator.svelte.js +2 -15
  128. package/dist/overlay/indicator/IndicatorPanel.svelte +4 -1
  129. package/dist/overlay/message-box/MessageBox.svelte.js +2 -15
  130. package/dist/overlay/message-box/MessageBoxPanel.svelte +19 -3
  131. package/dist/overlay/toast/Toast.svelte.js +2 -15
  132. package/dist/overlay/toast/ToastPanel.svelte +1 -1
  133. package/dist/overlay/tooltip/Tooltip.svelte +1 -1
  134. package/dist/ticatec-uniface-web.css +128 -13
  135. package/dist/types.d.ts +4 -3
  136. package/dist/utils/prefixFilter.d.ts +3 -3
  137. package/dist/utils/prefixFilter.js +3 -5
  138. package/docs/components/README.md +133 -0
  139. package/docs/components/accordion/README.md +60 -0
  140. package/docs/components/accordion/example.svelte +7 -0
  141. package/docs/components/action-bar/README.md +114 -0
  142. package/docs/components/action-bar/example.svelte +7 -0
  143. package/docs/components/app-top-bar/README.md +60 -0
  144. package/docs/components/app-top-bar/example.svelte +9 -0
  145. package/docs/components/attachment-files/README.md +332 -0
  146. package/docs/components/attachment-files/example.svelte +16 -0
  147. package/docs/components/box/README.md +63 -0
  148. package/docs/components/box/example.svelte +10 -0
  149. package/docs/components/breadcrumbs/README.md +86 -0
  150. package/docs/components/breadcrumbs/example.svelte +11 -0
  151. package/docs/components/button/README.md +103 -0
  152. package/docs/components/button/example.svelte +10 -0
  153. package/docs/components/card/README.md +113 -0
  154. package/docs/components/card/example.svelte +10 -0
  155. package/docs/components/cascade-options-select/README.md +162 -0
  156. package/docs/components/cascade-options-select/example.svelte +18 -0
  157. package/docs/components/checkbox/README.md +103 -0
  158. package/docs/components/checkbox/example.svelte +15 -0
  159. package/docs/components/classic-layout/README.md +76 -0
  160. package/docs/components/classic-layout/example.svelte +16 -0
  161. package/docs/components/color-picker/README.md +132 -0
  162. package/docs/components/color-picker/example.svelte +16 -0
  163. package/docs/components/columns-layout/README.md +70 -0
  164. package/docs/components/columns-layout/example.svelte +12 -0
  165. package/docs/components/common-dialog/README.md +109 -0
  166. package/docs/components/common-dialog/example.svelte +12 -0
  167. package/docs/components/concise-data-table/README.md +307 -0
  168. package/docs/components/concise-data-table/example.svelte +16 -0
  169. package/docs/components/context-menu/README.md +99 -0
  170. package/docs/components/context-menu/example.svelte +10 -0
  171. package/docs/components/criteria-field/README.md +69 -0
  172. package/docs/components/criteria-field/example.svelte +9 -0
  173. package/docs/components/data-table/README.md +365 -0
  174. package/docs/components/data-table/example.svelte +23 -0
  175. package/docs/components/date-picker/README.md +136 -0
  176. package/docs/components/date-picker/example.svelte +16 -0
  177. package/docs/components/date-range/README.md +122 -0
  178. package/docs/components/date-range/example.svelte +15 -0
  179. package/docs/components/date-time-picker/README.md +142 -0
  180. package/docs/components/date-time-picker/example.svelte +16 -0
  181. package/docs/components/dialog/README.md +174 -0
  182. package/docs/components/dialog/example.svelte +13 -0
  183. package/docs/components/dialog-board/README.md +41 -0
  184. package/docs/components/dialog-board/example.svelte +5 -0
  185. package/docs/components/drawer/README.md +70 -0
  186. package/docs/components/drawer/example.svelte +12 -0
  187. package/docs/components/flex-form/README.md +55 -0
  188. package/docs/components/flex-form/example.svelte +7 -0
  189. package/docs/components/flex-row-form/README.md +56 -0
  190. package/docs/components/flex-row-form/example.svelte +7 -0
  191. package/docs/components/form-field/README.md +84 -0
  192. package/docs/components/form-field/example.svelte +10 -0
  193. package/docs/components/full-screen-overlay/README.md +66 -0
  194. package/docs/components/full-screen-overlay/example.svelte +11 -0
  195. package/docs/components/grid-form/README.md +75 -0
  196. package/docs/components/grid-form/example.svelte +9 -0
  197. package/docs/components/group-check-box/README.md +147 -0
  198. package/docs/components/group-check-box/example.svelte +21 -0
  199. package/docs/components/group-radio-box/README.md +144 -0
  200. package/docs/components/group-radio-box/example.svelte +21 -0
  201. package/docs/components/header-layout/README.md +65 -0
  202. package/docs/components/header-layout/example.svelte +12 -0
  203. package/docs/components/icon/README.md +87 -0
  204. package/docs/components/icon/example.svelte +9 -0
  205. package/docs/components/icon-button/README.md +91 -0
  206. package/docs/components/icon-button/example.svelte +10 -0
  207. package/docs/components/image-files/README.md +174 -0
  208. package/docs/components/image-files/example.svelte +19 -0
  209. package/docs/components/indicator/README.md +53 -0
  210. package/docs/components/indicator/example.svelte +14 -0
  211. package/docs/components/input-options-select/README.md +163 -0
  212. package/docs/components/input-options-select/example.svelte +16 -0
  213. package/docs/components/list-box/ListItem.svelte +14 -0
  214. package/docs/components/list-box/README.md +221 -0
  215. package/docs/components/list-box/example.svelte +61 -0
  216. package/docs/components/lookup-editor/README.md +137 -0
  217. package/docs/components/lookup-editor/example.svelte +16 -0
  218. package/docs/components/memo-editor/README.md +143 -0
  219. package/docs/components/memo-editor/example.svelte +16 -0
  220. package/docs/components/message-box/README.md +68 -0
  221. package/docs/components/message-box/example.svelte +10 -0
  222. package/docs/components/navigator/README.md +75 -0
  223. package/docs/components/navigator/example.svelte +13 -0
  224. package/docs/components/navigator-menu/README.md +113 -0
  225. package/docs/components/navigator-menu/example.svelte +10 -0
  226. package/docs/components/number-editor/README.md +144 -0
  227. package/docs/components/number-editor/example.svelte +16 -0
  228. package/docs/components/number-range/README.md +116 -0
  229. package/docs/components/number-range/example.svelte +15 -0
  230. package/docs/components/options-multi-select/README.md +161 -0
  231. package/docs/components/options-multi-select/example.svelte +20 -0
  232. package/docs/components/options-select/README.md +160 -0
  233. package/docs/components/options-select/example.svelte +21 -0
  234. package/docs/components/page/README.md +77 -0
  235. package/docs/components/page/example.svelte +10 -0
  236. package/docs/components/pagination/README.md +88 -0
  237. package/docs/components/pagination/example.svelte +10 -0
  238. package/docs/components/pagination-panel/README.md +120 -0
  239. package/docs/components/pagination-panel/example.svelte +16 -0
  240. package/docs/components/popup-hint/README.md +44 -0
  241. package/docs/components/popup-hint/example.svelte +5 -0
  242. package/docs/components/progress-bar/README.md +64 -0
  243. package/docs/components/progress-bar/example.svelte +8 -0
  244. package/docs/components/progress-step-bar/README.md +93 -0
  245. package/docs/components/progress-step-bar/example.svelte +7 -0
  246. package/docs/components/prompts-text-editor/README.md +146 -0
  247. package/docs/components/prompts-text-editor/example.svelte +17 -0
  248. package/docs/components/radio-button/README.md +121 -0
  249. package/docs/components/radio-button/example.svelte +18 -0
  250. package/docs/components/rows-layout/README.md +70 -0
  251. package/docs/components/rows-layout/example.svelte +12 -0
  252. package/docs/components/search-box/README.md +136 -0
  253. package/docs/components/search-box/example.svelte +16 -0
  254. package/docs/components/separator/README.md +44 -0
  255. package/docs/components/separator/example.svelte +7 -0
  256. package/docs/components/sidebar-layout/README.md +65 -0
  257. package/docs/components/sidebar-layout/example.svelte +12 -0
  258. package/docs/components/split/README.md +48 -0
  259. package/docs/components/split/example.svelte +8 -0
  260. package/docs/components/switch/README.md +77 -0
  261. package/docs/components/switch/example.svelte +11 -0
  262. package/docs/components/tabs/README.md +127 -0
  263. package/docs/components/tabs/example.svelte +22 -0
  264. package/docs/components/tag/README.md +63 -0
  265. package/docs/components/tag/example.svelte +8 -0
  266. package/docs/components/text-button/README.md +90 -0
  267. package/docs/components/text-button/example.svelte +9 -0
  268. package/docs/components/text-editor/README.md +147 -0
  269. package/docs/components/text-editor/example.svelte +16 -0
  270. package/docs/components/time-editor/README.md +130 -0
  271. package/docs/components/time-editor/example.svelte +16 -0
  272. package/docs/components/toast/README.md +52 -0
  273. package/docs/components/toast/example.svelte +9 -0
  274. package/docs/components/tooltip/README.md +44 -0
  275. package/docs/components/tooltip/example.svelte +5 -0
  276. package/docs/components/transfer/README.md +109 -0
  277. package/docs/components/transfer/example.svelte +13 -0
  278. package/docs/components/tree-view/README.md +163 -0
  279. package/docs/components/tree-view/example.svelte +26 -0
  280. package/docs/components/unit-number-editor/README.md +192 -0
  281. package/docs/components/unit-number-editor/example.svelte +18 -0
  282. package/package.json +15 -7
@@ -40,6 +40,13 @@
40
40
  toChild,
41
41
  actionIcon
42
42
  }: Props = $props();
43
+
44
+ const handleCleanKeyDown = (handler: () => void) => (e: KeyboardEvent) => {
45
+ if (e.key === 'Enter' || e.key === ' ') {
46
+ e.preventDefault();
47
+ handler();
48
+ }
49
+ };
43
50
  </script>
44
51
 
45
52
  <FormEditor {variant} {compact} {disabled} {readonly} {error} {tooltip} {theme} {style} {className}>
@@ -48,14 +55,16 @@
48
55
  <div class="range-cell">
49
56
  {@render fromChild()}
50
57
  <div class="clean-icon" class:visible={showFromClean}>
51
- <i class="icon_google_clear" aria-hidden="true" onclick={cleanFrom}></i>
58
+ <i class="icon_google_clear" role="button" tabindex={showFromClean ? 0 : -1} aria-label="Clear"
59
+ onclick={cleanFrom} onkeydown={handleCleanKeyDown(cleanFrom)}></i>
52
60
  </div>
53
61
  </div>
54
62
  <div class="divider"></div>
55
63
  <div class="range-cell">
56
64
  {@render toChild()}
57
65
  <div class="clean-icon" class:visible={showToClean}>
58
- <i class="icon_google_clear" aria-hidden="true" onclick={cleanTo}></i>
66
+ <i class="icon_google_clear" role="button" tabindex={showToClean ? 0 : -1} aria-label="Clear"
67
+ onclick={cleanTo} onkeydown={handleCleanKeyDown(cleanTo)}></i>
59
68
  </div>
60
69
  </div>
61
70
  </div>
@@ -59,7 +59,7 @@
59
59
  bind:isOpen autoFit={false} {textValue} {readonly} {disabled}>
60
60
  {#snippet popupLayer()}
61
61
  <div class="date-popover">
62
- <Calendar value={value} {min} {max} onselect={handleCalendarSelect}/>
62
+ <Calendar value={value} {min} {max} onchange={handleCalendarSelect}/>
63
63
  </div>
64
64
  {/snippet}
65
65
  </CommonPicker>
@@ -123,7 +123,7 @@
123
123
  <Calendar
124
124
  style="border-right: 1px solid var(--uniface-inside-border-color, #f0f0f0)"
125
125
  value={currentValue}
126
- onselect={handleCalendarSelect}
126
+ onchange={handleCalendarSelect}
127
127
  {min} {max}/>
128
128
  <TimePanel style="width: 120px" value={currentValue} {precision} onchange={handleTimeChange}/>
129
129
  </div>
@@ -2,12 +2,16 @@
2
2
 
3
3
  import type {OnChangeHandler} from "../../types";
4
4
 
5
- export let value: number;
6
- export let mode: 24 | 60 = 60;
7
- export let enable: boolean = true;
8
- export let onchange: OnChangeHandler<number> = null as unknown as OnChangeHandler<number>;
5
+ interface Props {
6
+ value: number;
7
+ mode?: 24 | 60;
8
+ enable?: boolean;
9
+ onchange?: OnChangeHandler<number>;
10
+ }
11
+
12
+ let {value = $bindable(), mode = 60, enable = true, onchange}: Props = $props();
9
13
 
10
- let list: Array<any> = [];
14
+ let list: Array<any> = $state([]);
11
15
 
12
16
  const decValue = () => {
13
17
  if (enable) {
@@ -75,25 +79,29 @@
75
79
 
76
80
  let timer: any;
77
81
 
78
- $:resetList();
82
+ $effect(() => {
83
+ void value;
84
+ void mode;
85
+ resetList();
86
+ });
79
87
 
80
88
  </script>
81
- <div class="scroll-bar" on:wheel={handleMouseWheel}>
89
+ <div class="scroll-bar" onwheel={handleMouseWheel}>
82
90
  <div class="action-bar">
83
91
  <div class="arrow-up" class:disabled={!enable}>
84
- <i class="icon_google_keyboard_arrow_up" on:click={decValue} on:keydown={handleKeyDown(decValue)} on:dragstart={(e)=>{e.preventDefault()}}
85
- on:mousedown={handleMouseDown(-1)} on:mouseup={handleMouseUp} on:mouseleave={handleMouseUp}
92
+ <i class="icon_google_keyboard_arrow_up" onclick={decValue} onkeydown={handleKeyDown(decValue)} ondragstart={(e)=>{e.preventDefault()}}
93
+ onmousedown={handleMouseDown(-1)} onmouseup={handleMouseUp} onmouseleave={handleMouseUp}
86
94
  role="button" tabindex="0" aria-label="Decrease value"></i>
87
95
  </div>
88
96
  </div>
89
97
  {#each list as v}
90
- <div style={!enable && v!= value ? "visibility: hidden; " : ""} class="digital-block" on:click={()=>{handleDigitalClick(v)}} on:keydown={handleKeyDown(() => handleDigitalClick(v))} class:inactive={v!=value}
98
+ <div style={!enable && v!= value ? "visibility: hidden; " : ""} class="digital-block" onclick={()=>{handleDigitalClick(v)}} onkeydown={handleKeyDown(() => handleDigitalClick(v))} class:inactive={v!=value}
91
99
  role="button" tabindex="0" aria-label="Select {v}"><span>{v}</span></div>
92
100
  {/each}
93
101
  <div class="action-bar">
94
102
  <div class="arrow-down" class:disabled={!enable}>
95
- <i class="icon_google_keyboard_arrow_down" on:click={incValue} on:keydown={handleKeyDown(incValue)} on:dragstart={(e)=>{e.preventDefault()}}
96
- on:mousedown={handleMouseDown(1)} on:mouseup={handleMouseUp} on:mouseleave={handleMouseUp}
103
+ <i class="icon_google_keyboard_arrow_down" onclick={incValue} onkeydown={handleKeyDown(incValue)} ondragstart={(e)=>{e.preventDefault()}}
104
+ onmousedown={handleMouseDown(1)} onmouseup={handleMouseUp} onmouseleave={handleMouseUp}
97
105
  role="button" tabindex="0" aria-label="Increase value"></i>
98
106
  </div>
99
107
  </div>
@@ -1,24 +1,10 @@
1
1
  import type { OnChangeHandler } from "../../types";
2
- interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
- $$bindings?: Bindings;
5
- } & Exports;
6
- (internal: unknown, props: Props & {
7
- $$events?: Events;
8
- $$slots?: Slots;
9
- }): Exports & {
10
- $set?: any;
11
- $on?: any;
12
- };
13
- z_$$bindings?: Bindings;
14
- }
15
- declare const ScrollBar: $$__sveltets_2_IsomorphicComponent<{
2
+ interface Props {
16
3
  value: number;
17
4
  mode?: 24 | 60;
18
5
  enable?: boolean;
19
6
  onchange?: OnChangeHandler<number>;
20
- }, {
21
- [evt: string]: CustomEvent<any>;
22
- }, {}, {}, string>;
23
- type ScrollBar = InstanceType<typeof ScrollBar>;
7
+ }
8
+ declare const ScrollBar: import("svelte").Component<Props, {}, "value">;
9
+ type ScrollBar = ReturnType<typeof ScrollBar>;
24
10
  export default ScrollBar;
@@ -80,6 +80,13 @@
80
80
  toValue = normalizeValue(value.toDate(), false);
81
81
  isOpen = false;
82
82
  };
83
+
84
+ const handleIconKeyDown = (e: KeyboardEvent) => {
85
+ if (e.key === 'Enter' || e.key === ' ') {
86
+ e.preventDefault();
87
+ showPopover();
88
+ }
89
+ };
83
90
  </script>
84
91
 
85
92
  <div bind:this={rootElement}>
@@ -91,7 +98,8 @@
91
98
  <input style="width: 100%; text-align: center" readonly onclick={showPopover} value={textTo}/>
92
99
  {/snippet}
93
100
  {#snippet actionIcon()}
94
- <i class="icon_google_event_note action-icon" aria-hidden="true" onclick={showPopover}></i>
101
+ <i class="icon_google_event_note action-icon" role="button" tabindex="0" aria-label="Open date range picker"
102
+ onclick={showPopover} onkeydown={handleIconKeyDown}></i>
95
103
  {/snippet}
96
104
  </CommonRangeEditor>
97
105
 
@@ -101,12 +109,12 @@
101
109
  <Calendar
102
110
  style="border-right: 1px solid #f0f0f0"
103
111
  value={fromValue}
104
- onselect={handleFormCalendarSelect}
112
+ onchange={handleFormCalendarSelect}
105
113
  {min}
106
114
  max={maxFrom}/>
107
115
  <Calendar
108
116
  value={toValue}
109
- onselect={handleToCalendarSelect}
117
+ onchange={handleToCalendarSelect}
110
118
  min={minTo}
111
119
  {max}/>
112
120
  </div>
@@ -168,8 +168,13 @@
168
168
  {style}
169
169
  className={className}
170
170
  >
171
+ <!-- onclick only forwards focus to the first checkbox when the container's
172
+ own background is clicked; each CheckBox inside is independently
173
+ focusable/keyboard-operable, so this isn't an additional action. -->
174
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
175
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
171
176
  <div bind:this={groupContainer} class="group-check-box" class:compact onfocusout={handleContainerBlur} onclick={handleContainerClick}
172
- aria-hidden="true">
177
+ role="group">
173
178
  {#each options as op}
174
179
  {#if (hideOptions ?? []).indexOf(op[keyField]) === -1}
175
180
  <CheckBox
@@ -118,7 +118,12 @@
118
118
  {style}
119
119
  className={className}
120
120
  >
121
- <div bind:this={groupContainer} class="group-radio-box" class:compact onfocusout={handleContainerBlur} onclick={handleContainerClick} aria-hidden="true">
121
+ <!-- onclick only forwards focus to the first radio when the container's own
122
+ background is clicked; each RadioButton inside is independently
123
+ focusable/keyboard-operable, so this isn't an additional action. -->
124
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
125
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
126
+ <div bind:this={groupContainer} class="group-radio-box" class:compact onfocusout={handleContainerBlur} onclick={handleContainerClick} role="group">
122
127
  {#each options as op}
123
128
  <RadioButton
124
129
  {compact}
@@ -6,6 +6,7 @@
6
6
  import FileUploadPanel from "../attachment_files/FileUploadPanel.svelte";
7
7
  import ImageRender from "./ImageRender.svelte";
8
8
  import ImagePreview from "./ImagePreview.svelte";
9
+ import FormEditor from "../FormEditor.svelte";
9
10
  import {getEditorVariant} from "../../unifaceContext";
10
11
  import type {EditorVariant} from "../types";
11
12
 
@@ -61,24 +62,67 @@
61
62
  $effect(() => {
62
63
  text = '<div>' + files.map(item => (item.name)).join("</div><div>") + '</div>';
63
64
  });
65
+
66
+ const handleUploadKeyDown = (e: KeyboardEvent) => {
67
+ if (e.key === 'Enter' || e.key === ' ') {
68
+ e.preventDefault();
69
+ showDialog();
70
+ }
71
+ };
64
72
  </script>
65
73
 
66
74
  <div class="uniface-images-field" {style}>
67
- <div class="uniface-common-editor {variant}" tabindex="-1">
75
+ <FormEditor {variant} {readonly} {disabled}>
68
76
  <div class="files-field">
69
77
  {#each files as file}
70
78
  <ImageRender {file} {readonly} onRemove={removeFile}
71
79
  onPreview={(file: ImageFile) => {showPreview = true; previewImgSrc = file.uri}}/>
72
80
  {/each}
81
+ {#if !disabled && !readonly}
82
+ <div class="editor-action-icon">
83
+ <i class="icon_google_file_upload" role="button" tabindex="0" aria-label="Upload image"
84
+ onclick={showDialog} onkeydown={handleUploadKeyDown}></i>
85
+ </div>
86
+ {/if}
73
87
  </div>
74
- {#if !disabled && !readonly}
75
- <div class="editor-action-icon">
76
- <i class="icon_google_file_upload" aria-hidden="true" onclick={showDialog}></i>
77
- </div>
78
- {/if}
79
- </div>
88
+ </FormEditor>
80
89
  {#if showUpload}
81
90
  <FileUploadPanel bind:visible={showUpload} accept="image/*" {maxFiles} onFileUploaded={appendNewFile} {uploadFile}/>
82
91
  {/if}
83
92
  <ImagePreview bind:visible={showPreview} src={previewImgSrc}/>
84
93
  </div>
94
+
95
+ <style>
96
+ .uniface-images-field {
97
+ width: 100%;
98
+ }
99
+
100
+ .files-field {
101
+ display: flex;
102
+ align-items: center;
103
+ width: 100%;
104
+ height: 52px;
105
+ min-width: 0;
106
+ overflow-x: auto;
107
+ overflow-y: hidden;
108
+ box-sizing: border-box;
109
+ }
110
+
111
+ .editor-action-icon {
112
+ flex: 0 0 auto;
113
+ cursor: pointer;
114
+ padding: 4px;
115
+ border-radius: 4px;
116
+ display: flex;
117
+ align-items: center;
118
+ color: inherit;
119
+ }
120
+
121
+ .editor-action-icon:hover {
122
+ background-color: rgba(0, 0, 0, 0.05);
123
+ }
124
+
125
+ .editor-action-icon i {
126
+ font-size: 22px;
127
+ }
128
+ </style>
@@ -60,20 +60,27 @@
60
60
  </script>
61
61
 
62
62
  {#if visible}
63
- <div class="uniface-image-preview-overlay" onclick={() => visible = false} aria-hidden="true">
63
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
64
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
65
+ <div class="uniface-image-preview-overlay" onclick={() => visible = false}>
64
66
  <div>
65
67
  <div style="width: 100%; height: 100%; overflow: auto">
66
68
  <div class="image-container"
67
69
  style="width: {containerWidth}px; height: {containerHeight}px; {imgStyle}">
68
- <img onclick={(e: Event) => e.stopPropagation()}
69
- src={src}
70
- alt="Preview"
71
- onload={handleImageLoad}
72
- style="width: {imgPanelWidth}px; height: {imgPanelHeight}px;"
73
- />
70
+ <button type="button" class="image-content" aria-label="Preview image" onclick={(e: Event) => e.stopPropagation()}>
71
+ <img src={src}
72
+ alt="Preview"
73
+ onload={handleImageLoad}
74
+ style="width: {imgPanelWidth}px; height: {imgPanelHeight}px;"
75
+ />
76
+ </button>
74
77
  </div>
75
78
  </div>
76
- <div class="toolbar" onclick={(e: Event) => e.stopPropagation()} aria-hidden="true">
79
+ <!-- onclick here only stops propagation to the backdrop's close handler;
80
+ the real controls are the IconButtons inside. -->
81
+ <!-- svelte-ignore a11y_click_events_have_key_events -->
82
+ <!-- svelte-ignore a11y_no_static_element_interactions -->
83
+ <div class="toolbar" onclick={(e: Event) => e.stopPropagation()}>
77
84
  <IconButton icon="icon_google_zoom_in" type="default" onclick={zoomIn}></IconButton>
78
85
  <IconButton icon="icon_google_zoom_out" type="default" onclick={zoomOut}></IconButton>
79
86
  <IconButton icon="icon_google_cancel" type="default" onclick={() => visible = false}></IconButton>
@@ -120,10 +127,17 @@
120
127
  img {
121
128
  transition: transform 0.3s ease;
122
129
  }
130
+
131
+ .image-content {
132
+ display: inline-flex;
133
+ padding: 0;
134
+ border: 0;
135
+ background: transparent;
136
+ }
123
137
  }
124
138
 
125
139
  &:hover .toolbar {
126
140
  display: flex;
127
141
  }
128
142
  }
129
- </style>
143
+ </style>
@@ -16,22 +16,80 @@
16
16
  const removeFile = () => {
17
17
  onRemove?.(file);
18
18
  }
19
+
20
+ const handleActionKeyDown = (handler: () => void) => (e: KeyboardEvent) => {
21
+ if (e.key === 'Enter' || e.key === ' ') {
22
+ e.preventDefault();
23
+ handler();
24
+ }
25
+ };
19
26
  </script>
20
27
 
21
- <div style="width: 80px; box-sizing: border-box; padding: 6px 8px;">
28
+ <div class="uniface-image-render">
22
29
  <div class="file-icon">
23
30
  <img src={file.thumbnail ?? file.uri} alt="" width="40px" height="40px"/>
24
31
  <div class="img-overlay">
25
- <div>
26
- <div class="action-icon" style="top: 15px;">
27
- <i class="icon_google_remove_red_eye" aria-hidden="true" onclick={() => onPreview?.(file)}></i>
28
- </div>
29
- {#if !readonly}
30
- <div class="action-icon" style="top: 35px;">
31
- <i class="icon_google_delete" aria-hidden="true" onclick={removeFile}></i>
32
- </div>
33
- {/if}
32
+ <div class="action-icon">
33
+ <i class="icon_google_remove_red_eye" role="button" tabindex="0" aria-label="Preview image"
34
+ onclick={() => onPreview?.(file)} onkeydown={handleActionKeyDown(() => onPreview?.(file))}></i>
34
35
  </div>
36
+ {#if !readonly}
37
+ <div class="action-icon">
38
+ <i class="icon_google_delete" role="button" tabindex="0" aria-label="Remove image"
39
+ onclick={removeFile} onkeydown={handleActionKeyDown(removeFile)}></i>
40
+ </div>
41
+ {/if}
35
42
  </div>
36
43
  </div>
37
- </div>
44
+ </div>
45
+
46
+ <style>
47
+ .uniface-image-render {
48
+ width: 80px;
49
+ box-sizing: border-box;
50
+ padding: 6px 8px;
51
+ }
52
+
53
+ .file-icon {
54
+ position: relative;
55
+ width: 40px;
56
+ height: 40px;
57
+ border-radius: 4px;
58
+ overflow: hidden;
59
+ background-color: rgba(0, 0, 0, 0.04);
60
+ }
61
+
62
+ .file-icon img {
63
+ display: block;
64
+ width: 100%;
65
+ height: 100%;
66
+ object-fit: cover;
67
+ }
68
+
69
+ .img-overlay {
70
+ position: absolute;
71
+ inset: 0;
72
+ display: flex;
73
+ align-items: center;
74
+ justify-content: center;
75
+ gap: 6px;
76
+ background-color: rgba(0, 0, 0, 0.45);
77
+ opacity: 0;
78
+ transition: opacity 0.15s ease;
79
+ }
80
+
81
+ .file-icon:hover .img-overlay,
82
+ .file-icon:focus-within .img-overlay {
83
+ opacity: 1;
84
+ }
85
+
86
+ .action-icon {
87
+ display: flex;
88
+ cursor: pointer;
89
+ color: #fff;
90
+ }
91
+
92
+ .action-icon i {
93
+ font-size: 16px;
94
+ }
95
+ </style>
@@ -163,6 +163,13 @@
163
163
  isOpen = false;
164
164
  };
165
165
 
166
+ const handleItemKeyDown = (data: any) => (e: KeyboardEvent) => {
167
+ if (e.key === 'Enter' || e.key === ' ') {
168
+ e.preventDefault();
169
+ handleItemClick(data)();
170
+ }
171
+ };
172
+
166
173
  const oninput = (event: Event) => {
167
174
  isUserTyping = true;
168
175
  if (!composing) {
@@ -211,9 +218,10 @@
211
218
  {/if}
212
219
  </div>
213
220
  {#snippet popupLayer()}
214
- <div class="options-popover" bind:this={scrollElement} style={mh} onscroll={handleScroll}>
221
+ <div class="options-popover" bind:this={scrollElement} style={mh} onscroll={handleScroll} role="listbox">
215
222
  {#each options as op (op[keyField])}
216
- <div class="option-item" onclick={handleItemClick(op)} aria-hidden="true">
223
+ <div class="option-item" onclick={handleItemClick(op)} onkeydown={handleItemKeyDown(op)}
224
+ role="option" tabindex="0" aria-selected={op[keyField] === value}>
217
225
  {#if ItemRender}
218
226
  <ItemRender item={op}/>
219
227
  {:else}
@@ -50,15 +50,22 @@
50
50
  }
51
51
  };
52
52
 
53
+ const handleActionKeyDown = (e: KeyboardEvent) => {
54
+ if (e.key === 'Enter' || e.key === ' ') {
55
+ e.preventDefault();
56
+ handleActionClick();
57
+ }
58
+ };
59
+
53
60
  </script>
54
61
 
55
62
  <CommonEditor {theme} {clear} {style} {tooltip} {error} {readonly} {disabled} {compact} {variant} textValue={text??''} canClean={!mandatory}>
56
63
  <input bind:this={editor} {placeholder} readonly value={text ?? ''} {onfocus} {onblur}/>
57
64
  {#snippet trailingIcon()}
58
65
  {#if !disabled && !readonly}
59
- <i class="icon_google_arrow_drop_down action_icon" role="list" aria-hidden="true"
66
+ <i class="icon_google_arrow_drop_down action_icon" role="button" tabindex="0" aria-label="Lookup"
60
67
  onmousedown={(event: MouseEvent)=> {event.preventDefault()}}
61
- onclick={handleActionClick}></i>
68
+ onclick={handleActionClick} onkeydown={handleActionKeyDown}></i>
62
69
  {/if}
63
70
  {/snippet}
64
71
  </CommonEditor>
@@ -78,7 +78,7 @@
78
78
  {disabled}
79
79
  rows={autoHeight ? undefined : rows}
80
80
  {wrap}
81
- {maxLength}
81
+ maxlength={maxLength}
82
82
  bind:value
83
83
  {...events}
84
84
  {...input$}
@@ -168,4 +168,4 @@
168
168
  z-index: 10;
169
169
  }
170
170
 
171
- </style>
171
+ </style>
@@ -45,7 +45,7 @@
45
45
  ...restProps
46
46
  }: Props = $props();
47
47
 
48
- let numberInput: NumberInput;
48
+ let numberInput = $state<NumberInput>();
49
49
 
50
50
  export function focus() {
51
51
  numberInput?.focus();
@@ -94,4 +94,4 @@
94
94
  {...input$}
95
95
  />
96
96
  {/if}
97
- </CommonEditor>
97
+ </CommonEditor>
@@ -138,6 +138,20 @@
138
138
  }
139
139
  }
140
140
 
141
+ const handleEditorKeyDown = (e: KeyboardEvent) => {
142
+ if (e.key === 'Enter' || e.key === ' ') {
143
+ e.preventDefault();
144
+ openPopupLayer();
145
+ }
146
+ };
147
+
148
+ const handleOptionKeyDown = (key: string, itemDisabled: boolean) => (e: KeyboardEvent) => {
149
+ if (!itemDisabled && (e.key === 'Enter' || e.key === ' ')) {
150
+ e.preventDefault();
151
+ toggleOption(key)(e as unknown as MouseEvent);
152
+ }
153
+ };
154
+
141
155
  const input$style = "position: absolute; left: 0; top: 0; width: 1px; height: 1px; opacity: 0; pointer-events: none";
142
156
 
143
157
  </script>
@@ -145,7 +159,7 @@
145
159
  <CommonPicker {variant} {style} {compact} {tooltip} {error} {readonly} {disabled} {theme} {placeholder} {value} {mandatory} {clear}
146
160
  bind:isOpen {onblur} {onfocus} autoFit {input$style}>
147
161
  <div class="option-field">
148
- <div class="options-editor" onclick={openPopupLayer} aria-hidden="true" tabindex={-1} role="textbox">
162
+ <div class="options-editor" onclick={openPopupLayer} onkeydown={handleEditorKeyDown} tabindex="0" role="button" aria-haspopup="listbox" aria-expanded={isOpen}>
149
163
  {#if selectedList.length > 0 }
150
164
  {#each selectedList as code}
151
165
  <Tag style="flex-shrink: 0" size={compact ? 'small' : 'middle'} color={tagColor} variant={tagVariant}
@@ -164,12 +178,14 @@
164
178
  </div>
165
179
  </div>
166
180
  {#snippet popupLayer()}
167
- <div class="options-popover" style={mh}>
181
+ <div class="options-popover" style={mh} role="listbox" aria-multiselectable="true">
168
182
  {#each options as op}
169
183
  {#if hideOptions.indexOf(op[keyField]) < 0}
170
184
  {@const itemDisabled = disableOptions.indexOf(op[keyField]) > -1}
171
185
  <div class="option-item" class:disabled={itemDisabled} onclick={itemDisabled ? null : toggleOption(op[keyField])}
172
- aria-hidden="true">
186
+ onkeydown={handleOptionKeyDown(op[keyField], itemDisabled)}
187
+ role="option" tabindex={itemDisabled ? -1 : 0}
188
+ aria-selected={selectedList.indexOf(op[keyField])>-1} aria-disabled={itemDisabled}>
173
189
  <CheckBox style="width: 100%; pointer-events: none" {theme} value={selectedList.indexOf(op[keyField])>-1} disabled={itemDisabled}
174
190
  label={op[textField]}/>
175
191
  </div>
@@ -214,16 +230,8 @@
214
230
  outline: none;
215
231
  }
216
232
 
217
- .options-editor.disabled {
218
- filter: grayscale(1);
219
- }
220
-
221
- .options-editor.disabled * {
222
- cursor: not-allowed;
223
- }
224
-
225
233
  .options-editor .placeholder {
226
234
  color: var(--uniface-editor-color-placeholder);
227
235
  }
228
236
 
229
- </style>
237
+ </style>
@@ -1,4 +1,4 @@
1
- <script lang="ts">
1
+ <script lang="ts" generics="Option extends Record<string, any> = any">
2
2
 
3
3
  import CommonPicker from "../common_editor/CommonPicker.svelte";
4
4
  import SearchBox from "../search_box/SearchBox.svelte";
@@ -8,7 +8,7 @@
8
8
  interface Props extends CommonPickerProps {
9
9
  emptyText?: string;
10
10
  value: any;
11
- options: Array<any>;
11
+ options: Array<Option>;
12
12
  keyField?: string;
13
13
  textField?: string;
14
14
  menu$height?: number;
@@ -16,7 +16,7 @@
16
16
  hideOptions?: Array<string>;
17
17
  itemRender?: any;
18
18
  filterPlaceholder?: string;
19
- filterFunction?: (option: any, keyword: string) => boolean;
19
+ filterFunction?: (option: Option, keyword: string) => boolean;
20
20
  noResultsText?: string;
21
21
  }
22
22
 
@@ -130,6 +130,13 @@
130
130
  }
131
131
  }
132
132
 
133
+ const handleItemKeyDown = (data: any) => (e: KeyboardEvent) => {
134
+ if (e.key === 'Enter' || e.key === ' ') {
135
+ e.preventDefault();
136
+ handleItemClick(data)();
137
+ }
138
+ };
139
+
133
140
 
134
141
  let picker: CommonPicker;
135
142
 
@@ -138,7 +145,7 @@
138
145
  <CommonPicker bind:this={picker} {error} {tooltip} {variant} {style} {compact} {textValue} {readonly} {placeholder} {disabled} bind:isOpen
139
146
  {theme} {value} clear={()=> {value = undefined}} {mandatory} {onfocus} {onblur}>
140
147
  {#snippet popupLayer()}
141
- <div class="uniface-options-popover" style={mh}>
148
+ <div class="uniface-options-popover" style={mh} role="listbox">
142
149
  {#if filterFunction != null}
143
150
  <div class="quick-filter-box">
144
151
  <SearchBox
@@ -163,8 +170,10 @@
163
170
  disabled={disableOptions.indexOf(op[keyField])>-1}
164
171
  onclick={handleItemClick(op)}/>
165
172
  {:else}
166
- <div class="option-item" class:disabled={disableOptions.indexOf(op[keyField])>-1} aria-hidden="true"
167
- onclick={handleItemClick(op)}>
173
+ <div class="option-item" class:disabled={disableOptions.indexOf(op[keyField])>-1}
174
+ role="option" tabindex={disableOptions.indexOf(op[keyField])>-1 ? -1 : 0}
175
+ aria-selected={String(op[keyField]) === String(value)}
176
+ onclick={handleItemClick(op)} onkeydown={handleItemKeyDown(op)}>
168
177
  <span>{op[textField]}</span>
169
178
  </div>
170
179
  {/if}