@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
@@ -1,20 +1,42 @@
1
1
  import type CommonPickerProps from "../common_editor/CommonPickerProps";
2
- interface Props extends CommonPickerProps {
3
- emptyText?: string;
4
- value: any;
5
- options: Array<any>;
6
- keyField?: string;
7
- textField?: string;
8
- menu$height?: number;
9
- disableOptions?: Array<string>;
10
- hideOptions?: Array<string>;
11
- itemRender?: any;
12
- filterPlaceholder?: string;
13
- filterFunction?: (option: any, keyword: string) => boolean;
14
- noResultsText?: string;
2
+ declare function $$render<Option extends Record<string, any> = any>(): {
3
+ props: CommonPickerProps & {
4
+ emptyText?: string;
5
+ value: any;
6
+ options: Array<Option>;
7
+ keyField?: string;
8
+ textField?: string;
9
+ menu$height?: number;
10
+ disableOptions?: Array<string>;
11
+ hideOptions?: Array<string>;
12
+ itemRender?: any;
13
+ filterPlaceholder?: string;
14
+ filterFunction?: (option: Option, keyword: string) => boolean;
15
+ noResultsText?: string;
16
+ };
17
+ exports: {
18
+ focus: () => void;
19
+ };
20
+ bindings: "value";
21
+ slots: {};
22
+ events: {};
23
+ };
24
+ declare class __sveltets_Render<Option extends Record<string, any> = any> {
25
+ props(): ReturnType<typeof $$render<Option>>['props'];
26
+ events(): ReturnType<typeof $$render<Option>>['events'];
27
+ slots(): ReturnType<typeof $$render<Option>>['slots'];
28
+ bindings(): "value";
29
+ exports(): {
30
+ focus: () => void;
31
+ };
15
32
  }
16
- declare const OptionsSelect: import("svelte").Component<Props, {
17
- focus: () => void;
18
- }, "value">;
19
- type OptionsSelect = ReturnType<typeof OptionsSelect>;
33
+ interface $$IsomorphicComponent {
34
+ new <Option extends Record<string, any> = any>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<Option>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<Option>['props']>, ReturnType<__sveltets_Render<Option>['events']>, ReturnType<__sveltets_Render<Option>['slots']>> & {
35
+ $$bindings?: ReturnType<__sveltets_Render<Option>['bindings']>;
36
+ } & ReturnType<__sveltets_Render<Option>['exports']>;
37
+ <Option extends Record<string, any> = any>(internal: unknown, props: ReturnType<__sveltets_Render<Option>['props']> & {}): ReturnType<__sveltets_Render<Option>['exports']>;
38
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
39
+ }
40
+ declare const OptionsSelect: $$IsomorphicComponent;
41
+ type OptionsSelect<Option extends Record<string, any> = any> = InstanceType<typeof OptionsSelect<Option>>;
20
42
  export default OptionsSelect;
@@ -50,6 +50,13 @@
50
50
  e.preventDefault();
51
51
  };
52
52
 
53
+ const handleHintKeyDown = (item: string) => (e: KeyboardEvent) => {
54
+ if (e.key === 'Enter' || e.key === ' ') {
55
+ e.preventDefault();
56
+ handleHintClick(item)(e as unknown as MouseEvent);
57
+ }
58
+ };
59
+
53
60
 
54
61
 
55
62
  const clear = () => {
@@ -67,13 +74,14 @@
67
74
  <input bind:this={editor} bind:value {disabled} {readonly} {placeholder} {...eventHandlers}/>
68
75
 
69
76
  {#snippet popupLayer()}
70
- <div class="options-popover" style={mh}>
77
+ <div class="options-popover" style={mh} role="listbox">
71
78
  {#each words as word}
72
79
  <div
73
80
  class="option-item"
74
81
  style="padding-left: 12px; padding-right: 12px"
75
82
  onclick={handleHintClick(word)}
76
- aria-hidden="true"
83
+ onkeydown={handleHintKeyDown(word)}
84
+ role="option" tabindex="0" aria-selected={word === value}
77
85
  >
78
86
  <span>{word}</span>
79
87
  </div>
@@ -72,13 +72,6 @@
72
72
  text-overflow: ellipsis;
73
73
  color: var(--uniface-checkbox-text-color);
74
74
  }
75
- .uniface-radio-button label {
76
- display: inline-block;
77
- width: 100%;
78
- text-overflow: ellipsis;
79
- overflow: hidden;
80
- cursor: pointer;
81
- }
82
75
  .uniface-radio-button > span {
83
76
  line-height: var(--uniface-checkbox-size);
84
77
  padding-left: var(--uniface-checkbox-label-padding-left);
@@ -107,6 +100,7 @@
107
100
  --disabled-inner: var(--uniface-checkbox-checkmark-color-disabled);
108
101
  -webkit-appearance: none;
109
102
  -moz-appearance: none;
103
+ appearance: none;
110
104
  height: var(--uniface-checkbox-size);
111
105
  width: var(--uniface-checkbox-size);
112
106
  outline: none;
@@ -180,4 +174,4 @@
180
174
  .uniface-radio-button *::before,
181
175
  .uniface-radio-button *::after {
182
176
  box-sizing: inherit;
183
- }</style>
177
+ }</style>
@@ -24,10 +24,10 @@
24
24
  </script>
25
25
 
26
26
  <div class="switch-box">
27
- <label class="switch" class:readonly class:disabled aria-hidden="true" onclick={toggleSwitch}>
28
- <input type="checkbox" bind:checked={value}>
29
- <span class="slider"></span>
30
- <span class="text">{value ? uncheckLabel : checkLabel}</span>
27
+ <label class="switch" class:readonly class:disabled>
28
+ <input type="checkbox" bind:checked={value} disabled={disabled} aria-readonly={readonly} onclick={toggleSwitch}>
29
+ <span class="slider" aria-hidden="true"></span>
30
+ <span class="text" aria-hidden="true">{value ? uncheckLabel : checkLabel}</span>
31
31
  </label>
32
32
  </div>
33
33
 
@@ -69,7 +69,7 @@
69
69
  }
70
70
 
71
71
  let input$ = $derived(prefixFilter(restProps, 'input$', excludeAttrs));
72
- let eventHandlers = filterProps(restProps, keyboardAttrs);
72
+ let eventHandlers = $derived(filterProps(restProps, keyboardAttrs));
73
73
 
74
74
  const clear = () => {
75
75
  value = undefined;
@@ -83,4 +83,4 @@
83
83
  {error}>
84
84
  <input bind:this={editor} {...input$} {placeholder} {...eventHandlers}
85
85
  oninput={handleInput} onchange={handleChange} bind:value/>
86
- </CommonEditor>
86
+ </CommonEditor>
@@ -100,6 +100,13 @@
100
100
  e.preventDefault();
101
101
  };
102
102
 
103
+ const handleUnitKeyDown = (item: UnitOption) => (e: KeyboardEvent) => {
104
+ if (e.key === 'Enter' || e.key === ' ') {
105
+ e.preventDefault();
106
+ handleUnitClick(item)(e as unknown as MouseEvent);
107
+ }
108
+ };
109
+
103
110
  //
104
111
  // const handlePopupClose = () => {
105
112
  // showPopup = false;
@@ -180,10 +187,11 @@
180
187
  />
181
188
 
182
189
  {#snippet popupLayer()}
183
- <div class="options-popover" style={mh}>
190
+ <div class="options-popover" style={mh} role="listbox">
184
191
  {#each units as op}
185
192
  <div class="option-item"
186
- onclick={handleUnitClick(op)} aria-hidden="true">
193
+ onclick={handleUnitClick(op)} onkeydown={handleUnitKeyDown(op)}
194
+ role="option" tabindex="0" aria-selected={op.code === unitCode}>
187
195
  <span>{op.text ?? op.code}</span>
188
196
  </div>
189
197
  {/each}
@@ -4,6 +4,7 @@
4
4
 
5
5
  interface Props {
6
6
  type?: ButtonType;
7
+ htmlType?: 'button' | 'submit' | 'reset';
7
8
  label?: string;
8
9
  variant?: 'plain' | 'round' | '';
9
10
  disabled?: boolean;
@@ -20,6 +21,7 @@
20
21
 
21
22
  let {
22
23
  type = 'default',
24
+ htmlType = 'button',
23
25
  label = '',
24
26
  variant = '',
25
27
  disabled = false,
@@ -44,7 +46,10 @@
44
46
 
45
47
  </script>
46
48
 
49
+ <!-- autofocus is an explicit opt-in component API; consumers decide when initial focus is appropriate. -->
50
+ <!-- svelte-ignore a11y_autofocus -->
47
51
  <button
52
+ type={htmlType}
48
53
  {style}
49
54
  class="uniface-button common-button {variant} {size} {type} {theme}"
50
55
  class:disabled={disabled}
@@ -2,6 +2,7 @@ import type { Snippet } from 'svelte';
2
2
  import type { ButtonType } from '../../types';
3
3
  interface Props {
4
4
  type?: ButtonType;
5
+ htmlType?: 'button' | 'submit' | 'reset';
5
6
  label?: string;
6
7
  variant?: 'plain' | 'round' | '';
7
8
  disabled?: boolean;
@@ -6,6 +6,7 @@
6
6
 
7
7
  interface Props {
8
8
  type?: ButtonType;
9
+ htmlType?: 'button' | 'submit' | 'reset';
9
10
  disabled?: boolean;
10
11
  size?: ButtonSize;
11
12
  style?: string;
@@ -18,6 +19,7 @@
18
19
 
19
20
  let {
20
21
  type = 'default',
22
+ htmlType = 'button',
21
23
  disabled = false,
22
24
  size = 'medium',
23
25
  style,
@@ -40,7 +42,7 @@
40
42
 
41
43
  </script>
42
44
 
43
- <button class="uniface-button icon-button {size} {type} {theme}" {style} class:disabled {disabled}
45
+ <button type={htmlType} class="uniface-button icon-button {size} {type} {theme}" {style} class:disabled {disabled}
44
46
  tabindex={disabled ? -1 : 0} data-tip={disabled ? null : tooltip} onclick={handleClick}>
45
47
  {#if children}
46
48
  {@render children()}
@@ -3,6 +3,7 @@ type ButtonType = 'default' | 'primary' | 'secondary' | 'third' | 'forth';
3
3
  type ButtonSize = 'big' | 'medium' | 'small';
4
4
  interface Props {
5
5
  type?: ButtonType;
6
+ htmlType?: 'button' | 'submit' | 'reset';
6
7
  disabled?: boolean;
7
8
  size?: ButtonSize;
8
9
  style?: string;
@@ -9,6 +9,7 @@
9
9
  size?: ButtonSize;
10
10
  label?: string;
11
11
  type?: ButtonType;
12
+ htmlType?: 'button' | 'submit' | 'reset';
12
13
  onclick?: (event: MouseEvent) => void;
13
14
  style?: string;
14
15
  theme?: string;
@@ -21,6 +22,7 @@
21
22
  size = 'medium',
22
23
  label = '',
23
24
  type = 'default',
25
+ htmlType = 'button',
24
26
  onclick = undefined,
25
27
  style = '',
26
28
  theme,
@@ -45,6 +47,7 @@
45
47
  </script>
46
48
 
47
49
  <button
50
+ type={htmlType}
48
51
  class="uniface-button text-button {size} {type} {theme}"
49
52
  {style}
50
53
  class:disabled
@@ -6,6 +6,7 @@ interface Props {
6
6
  size?: ButtonSize;
7
7
  label?: string;
8
8
  type?: ButtonType;
9
+ htmlType?: 'button' | 'submit' | 'reset';
9
10
  onclick?: (event: MouseEvent) => void;
10
11
  style?: string;
11
12
  theme?: string;
@@ -32,17 +32,34 @@
32
32
  respClick = true;
33
33
  }
34
34
  }
35
+
36
+ const isInteractive = $derived(onclick != null);
37
+
38
+ function handleKeyDown(e: KeyboardEvent) {
39
+ if (isInteractive && !disabled && (e.key === 'Enter' || e.key === ' ')) {
40
+ e.preventDefault();
41
+ handleClickEvent(e as unknown as MouseEvent);
42
+ }
43
+ }
35
44
  </script>
36
45
 
46
+ <!-- role/tabindex are only ever both set together when onclick is provided
47
+ (isInteractive); svelte-check can't verify that pairing statically. -->
48
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
37
49
  <div
38
50
  class="uniface-icon {theme} {className}"
39
51
  class:clickable={onclick!=null && !disabled}
40
52
  class:disabled={disabled}
41
53
  onmousedown={(event: MouseEvent) => {event.preventDefault();}}
42
54
  {style}
43
- aria-hidden="true"
55
+ role={isInteractive ? 'button' : undefined}
56
+ tabindex={isInteractive && !disabled ? 0 : undefined}
57
+ aria-disabled={isInteractive ? disabled : undefined}
58
+ aria-hidden={isInteractive ? undefined : true}
59
+ aria-label={isInteractive ? (tooltip || undefined) : undefined}
44
60
  data-tip={disabled ? null : tooltip || null}
45
61
  onclick={handleClickEvent}
62
+ onkeydown={handleKeyDown}
46
63
  >
47
64
  <i class={name}></i>
48
65
  </div>
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { onMount, onDestroy } from 'svelte';
2
+ import {onDestroy} from 'svelte';
3
3
 
4
4
  interface Props {
5
5
  direction?: "horizontal" | "vertical";
@@ -76,6 +76,22 @@
76
76
  }
77
77
  };
78
78
 
79
+ const resizeWithKeyboard = (event: KeyboardEvent) => {
80
+ if (fixed || !bindingPanel) return;
81
+ const decreaseKey = direction === 'horizontal' ? 'ArrowUp' : 'ArrowLeft';
82
+ const increaseKey = direction === 'horizontal' ? 'ArrowDown' : 'ArrowRight';
83
+ if (event.key !== decreaseKey && event.key !== increaseKey) return;
84
+
85
+ event.preventDefault();
86
+ const directionFactor = event.key === increaseKey ? 1 : -1;
87
+ const delta = directionFactor * (reverse ? -10 : 10);
88
+ const currentSize = direction === 'horizontal' ? bindingPanel.clientHeight : bindingPanel.clientWidth;
89
+ const newSize = Math.max(5, currentSize + delta);
90
+ if (direction === 'horizontal') bindingPanel.style.height = `${newSize}px`;
91
+ else bindingPanel.style.width = `${newSize}px`;
92
+ onResizeEnd?.(newSize);
93
+ };
94
+
79
95
  // 组件销毁时清理
80
96
  onDestroy(() => {
81
97
  if (isDragging) {
@@ -85,6 +101,9 @@
85
101
 
86
102
  </script>
87
103
 
104
+ <!-- The separator is intentionally focusable because its arrow-key handler resizes the bound panel. -->
105
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
106
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
88
107
  <div
89
108
  class="uniface-divider {direction}"
90
109
  class:fixed
@@ -92,9 +111,10 @@
92
111
  role="separator"
93
112
  aria-orientation={direction}
94
113
  aria-label="Resize handle"
95
- tabindex="0"
114
+ tabindex={fixed ? -1 : 0}
96
115
  onmousedown={startDrag}
97
- />
116
+ onkeydown={resizeWithKeyboard}
117
+ ></div>
98
118
 
99
119
  <style>
100
120
  .uniface-divider {
@@ -127,4 +147,4 @@
127
147
  .uniface-divider:active {
128
148
  transition: none;
129
149
  }
130
- </style>
150
+ </style>
@@ -34,13 +34,21 @@
34
34
  event.stopPropagation();
35
35
  }
36
36
 
37
+ const handleTagKeyDown = (event: KeyboardEvent) => {
38
+ if (event.key === 'Enter' || event.key === ' ') {
39
+ event.preventDefault();
40
+ ondelete?.(data?.id);
41
+ }
42
+ }
43
+
37
44
  </script>
38
45
 
39
46
  <div class="uniface-tag" {style} data-theme="{theme}">
40
47
  <div class="{size} {variant} {colorClass}" class:removable={removable}>
41
48
  <span>{text}</span>
42
49
  {#if removable}
43
- <i class="icon_google_clear uniface-remove-icon" aria-hidden="true" onclick={handleTagClick}></i>
50
+ <i class="icon_google_clear uniface-remove-icon" role="button" tabindex="0" aria-label="Remove {text}"
51
+ onclick={handleTagClick} onkeydown={handleTagKeyDown}></i>
44
52
  {/if}
45
53
  </div>
46
54
  </div>
@@ -1,7 +1,9 @@
1
- import type { IHierarchyData } from "../../lib";
2
1
  export default interface MenuItem {
3
2
  [key: string]: any;
4
3
  }
5
- export interface MenuNode extends IHierarchyData<MenuItem> {
4
+ export interface MenuNode {
5
+ item: MenuItem;
6
+ children?: MenuNode[];
7
+ expand?: boolean;
6
8
  }
7
9
  export type OnMenuClick = (item: MenuItem) => void;
@@ -1,14 +1,14 @@
1
1
  <script lang="ts">
2
+ import {onMount} from "svelte";
2
3
  import type MenuItem from "./MenuItem";
3
- import type {OnMenuClick} from "./MenuItem";
4
- import type {IHierarchyData} from "../../lib";
4
+ import type {MenuNode, OnMenuClick} from "./MenuItem";
5
5
  import NavigatorMenuItem from "./NavigatorMenuItem.svelte";
6
6
 
7
7
  type GetText<T> = (item: T) => string;
8
8
  type Variant = 'vertical' | 'horizontal';
9
9
 
10
10
  interface Props {
11
- menuItems: Array<IHierarchyData<MenuItem>>;
11
+ menuItems: Array<MenuNode>;
12
12
  style?: string;
13
13
  textField: string | GetText<MenuItem>;
14
14
  onItemClick: OnMenuClick;
@@ -27,15 +27,46 @@
27
27
 
28
28
  // 横向模式:当前展开的 root 索引(同时只开一个 dropdown)
29
29
  let openRootIdx = $state<number | null>(null);
30
+ let scrollViewport = $state<HTMLDivElement>();
31
+ let scrollTrack = $state<HTMLDivElement>();
32
+ let horizontalMenu = $state<HTMLElement>();
33
+ let hasOverflow = $state(false);
34
+ let canScrollLeft = $state(false);
35
+ let canScrollRight = $state(false);
36
+ let dropdownLeft = $state(0);
30
37
 
31
- const rootText = (root: IHierarchyData<MenuItem>): string => {
38
+ const rootText = (root: MenuNode): string => {
32
39
  return typeof textField === 'string'
33
- ? root.data?.[textField] ?? ''
34
- : textField(root.data);
40
+ ? root.item?.[textField] ?? ''
41
+ : textField(root.item);
42
+ };
43
+
44
+ const updateDropdownPosition = () => {
45
+ if (openRootIdx === null || !horizontalMenu || !scrollTrack) return;
46
+ const item = scrollTrack.children[openRootIdx] as HTMLElement | undefined;
47
+ if (!item) return;
48
+ dropdownLeft = item.getBoundingClientRect().left - horizontalMenu.getBoundingClientRect().left;
49
+ };
50
+
51
+ const updateScrollState = () => {
52
+ if (!scrollViewport) return;
53
+ const maxScrollLeft = scrollViewport.scrollWidth - scrollViewport.clientWidth;
54
+ hasOverflow = maxScrollLeft > 1;
55
+ canScrollLeft = scrollViewport.scrollLeft > 1;
56
+ canScrollRight = scrollViewport.scrollLeft < maxScrollLeft - 1;
57
+ updateDropdownPosition();
35
58
  };
36
59
 
37
60
  const handleRootClick = (idx: number) => {
38
61
  openRootIdx = openRootIdx === idx ? null : idx;
62
+ requestAnimationFrame(updateDropdownPosition);
63
+ };
64
+
65
+ const scrollMenu = (direction: -1 | 1) => {
66
+ scrollViewport?.scrollBy({
67
+ left: direction * Math.max(scrollViewport.clientWidth * 0.7, 160),
68
+ behavior: 'smooth'
69
+ });
39
70
  };
40
71
 
41
72
  // 横向模式下点叶子:触发 onItemClick + 关闭 dropdown
@@ -59,6 +90,15 @@
59
90
  }
60
91
  };
61
92
  };
93
+
94
+ onMount(() => {
95
+ if (!scrollViewport || !scrollTrack) return;
96
+ const resizeObserver = new ResizeObserver(updateScrollState);
97
+ resizeObserver.observe(scrollViewport);
98
+ resizeObserver.observe(scrollTrack);
99
+ updateScrollState();
100
+ return () => resizeObserver.disconnect();
101
+ });
62
102
  </script>
63
103
 
64
104
  {#if variant === 'vertical'}
@@ -72,36 +112,50 @@
72
112
  {/if}
73
113
  </div>
74
114
  {:else}
75
- <nav class="uniface-navigator-menu horizontal" {style} data-theme={theme || undefined}>
76
- {#each menuItems as root, idx (idx)}
77
- <div
78
- class="root-item"
79
- class:open={openRootIdx === idx}
80
- class:leaf={root.children.length === 0}
81
- onclick={(e) => { e.stopPropagation(); handleRootClick(idx); }}
82
- onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleRootClick(idx); }}
83
- role="button"
84
- tabindex="0"
85
- >
86
- <span class="label">{rootText(root)}</span>
87
- {#if root.children.length > 0}
88
- <i class="caret" aria-hidden="true"></i>
89
- {/if}
90
- {#if openRootIdx === idx && root.children.length > 0}
115
+ <nav bind:this={horizontalMenu} class="uniface-navigator-menu horizontal" {style} data-theme={theme || undefined}>
116
+ {#if hasOverflow}
117
+ <button type="button" class="scroll-button previous" aria-label="向左滚动菜单" disabled={!canScrollLeft} onclick={() => scrollMenu(-1)}>
118
+ <i aria-hidden="true"></i>
119
+ </button>
120
+ {/if}
121
+ <div bind:this={scrollViewport} class="scroll-viewport" onscroll={updateScrollState}>
122
+ <div bind:this={scrollTrack} class="scroll-track">
123
+ {#each menuItems as root, idx (idx)}
91
124
  <div
92
- class="dropdown-panel"
93
- use:outerClick={() => { openRootIdx = null; }}
94
- onclick={(e) => e.stopPropagation()}
125
+ class="root-item"
126
+ class:open={openRootIdx === idx}
127
+ class:leaf={!root.children?.length}
128
+ onclick={(e) => { e.stopPropagation(); handleRootClick(idx); }}
129
+ onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleRootClick(idx); }}
130
+ role="button"
131
+ tabindex="0"
95
132
  >
96
- <ul class="dropdown">
97
- {#each root.children as child}
98
- <NavigatorMenuItem menu={child} onMenuItemClick={handleLeafClickInDropdown} {textField} cascade={true}/>
99
- {/each}
100
- </ul>
133
+ <span class="label">{rootText(root)}</span>
134
+ {#if root.children?.length}
135
+ <i class="caret" aria-hidden="true"></i>
136
+ {/if}
101
137
  </div>
102
- {/if}
138
+ {/each}
103
139
  </div>
104
- {/each}
140
+ </div>
141
+ {#if hasOverflow}
142
+ <button type="button" class="scroll-button next" aria-label="向右滚动菜单" disabled={!canScrollRight} onclick={() => scrollMenu(1)}>
143
+ <i aria-hidden="true"></i>
144
+ </button>
145
+ {/if}
146
+ {#if openRootIdx !== null && menuItems[openRootIdx]?.children?.length}
147
+ <div
148
+ class="dropdown-panel"
149
+ style:left="{dropdownLeft}px"
150
+ use:outerClick={() => { openRootIdx = null; }}
151
+ >
152
+ <ul class="dropdown">
153
+ {#each menuItems[openRootIdx].children ?? [] as child}
154
+ <NavigatorMenuItem menu={child} onMenuItemClick={handleLeafClickInDropdown} {textField} cascade={true}/>
155
+ {/each}
156
+ </ul>
157
+ </div>
158
+ {/if}
105
159
  </nav>
106
160
  {/if}
107
161
 
@@ -143,6 +197,76 @@
143
197
  height: 48px;
144
198
  }
145
199
 
200
+ .scroll-viewport {
201
+ flex: 1 1 auto;
202
+ min-width: 0;
203
+ height: 100%;
204
+ overflow-x: auto;
205
+ overflow-y: hidden;
206
+ scrollbar-width: none;
207
+ scroll-behavior: smooth;
208
+ }
209
+
210
+ .scroll-viewport::-webkit-scrollbar {
211
+ display: none;
212
+ }
213
+
214
+ .scroll-track {
215
+ display: flex;
216
+ align-items: center;
217
+ width: max-content;
218
+ min-width: 100%;
219
+ height: 100%;
220
+ }
221
+
222
+ .scroll-button {
223
+ flex: 0 0 32px;
224
+ width: 32px;
225
+ height: 100%;
226
+ padding: 0;
227
+ border: 0;
228
+ background: var(--uniface-nav-menu-bg);
229
+ color: inherit;
230
+ cursor: pointer;
231
+ opacity: 0;
232
+ visibility: hidden;
233
+ pointer-events: none;
234
+ transition: opacity 0.15s ease, visibility 0.15s ease;
235
+ }
236
+
237
+ .uniface-navigator-menu.horizontal:hover .scroll-button,
238
+ .uniface-navigator-menu.horizontal:focus-within .scroll-button {
239
+ opacity: 1;
240
+ visibility: visible;
241
+ pointer-events: auto;
242
+ }
243
+
244
+ .scroll-button:hover:not(:disabled) {
245
+ background-color: var(--uniface-nav-menu-hover-bg);
246
+ color: var(--uniface-nav-menu-hover-color);
247
+ }
248
+
249
+ .scroll-button:disabled {
250
+ cursor: default;
251
+ opacity: 0.35;
252
+ }
253
+
254
+ .scroll-button i {
255
+ display: inline-block;
256
+ width: 8px;
257
+ height: 8px;
258
+ border-top: 2px solid currentColor;
259
+ border-left: 2px solid currentColor;
260
+ }
261
+
262
+ .scroll-button.previous i {
263
+ transform: rotate(-45deg);
264
+ }
265
+
266
+ .scroll-button.next i {
267
+ transform: rotate(135deg);
268
+ }
269
+
146
270
  .uniface-navigator-menu.horizontal .root-item {
147
271
  position: relative;
148
272
  padding: 0 16px;
@@ -176,7 +300,6 @@
176
300
  .dropdown-panel {
177
301
  position: absolute;
178
302
  top: 100%;
179
- left: 0;
180
303
  z-index: 1000;
181
304
  }
182
305
 
@@ -190,4 +313,4 @@
190
313
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
191
314
  min-width: 180px;
192
315
  }
193
- </style>
316
+ </style>