@ticatec/uniface-element 5.0.0 → 5.0.1

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 (43) hide show
  1. package/dist/app_layout/ClassicLayout.svelte +8 -40
  2. package/dist/app_layout/ColumnsLayout.svelte +3 -3
  3. package/dist/app_layout/HeaderLayout.svelte +4 -20
  4. package/dist/app_layout/RowsLayout.svelte +3 -3
  5. package/dist/app_layout/SidebarLayout.svelte +4 -20
  6. package/dist/composite/transfer/Transfer.svelte +12 -6
  7. package/dist/data_display/accordion/Accordion.svelte +1 -4
  8. package/dist/data_display/card/CommonCardActionBar.svelte +1 -27
  9. package/dist/data_display/list_box/ListBox.svelte +6 -8
  10. package/dist/data_table/lib/clickOutSide.js +6 -5
  11. package/dist/form/attachment_files/AttachmentEditor.svelte +13 -8
  12. package/dist/form/attachment_files/FileUploadBar.svelte +5 -2
  13. package/dist/form/attachment_files/FileUploadPanel.svelte +6 -72
  14. package/dist/form/checkbox/CheckBox.svelte +2 -7
  15. package/dist/form/color_picker/ColorPicker.svelte +150 -35
  16. package/dist/form/color_picker/ColorPicker.svelte.d.ts +7 -25
  17. package/dist/form/color_picker/README.md +14 -7
  18. package/dist/form/color_picker/README_CN.md +14 -7
  19. package/dist/form/common_editor/CommonPicker.svelte +4 -7
  20. package/dist/form/image-files/ImagePreview.svelte +15 -7
  21. package/dist/form/memo_editor/MemoEditor.svelte +2 -2
  22. package/dist/form/number_editor/NumberEditor.svelte +2 -2
  23. package/dist/form/options_multi_select/OptionsMultiSelect.svelte +1 -9
  24. package/dist/form/radio_button/RadioButton.svelte +2 -8
  25. package/dist/form/text_editor/TextEditor.svelte +2 -2
  26. package/dist/general/button/Button.svelte +2 -0
  27. package/dist/general/split/Split.svelte +24 -4
  28. package/dist/navigation/nav_menu/MenuItem.d.ts +4 -2
  29. package/dist/navigation/nav_menu/NavigatorMenu.svelte +157 -34
  30. package/dist/navigation/nav_menu/NavigatorMenu.svelte.d.ts +2 -3
  31. package/dist/navigation/nav_menu/NavigatorMenuItem.svelte +15 -12
  32. package/dist/navigation/nav_menu/NavigatorMenuItem.svelte.d.ts +3 -3
  33. package/dist/navigation/progress_step_bar/ProgressStepBlock.svelte +1 -5
  34. package/dist/overlay/common/FloatingPanel.svelte +0 -6
  35. package/dist/overlay/common/Popover.svelte +8 -3
  36. package/dist/overlay/common/uniface-utils.js +0 -1
  37. package/dist/overlay/context-menu/ContextMenuPanel.svelte +14 -2
  38. package/dist/overlay/dialog/Dialog.svelte +3 -4
  39. package/dist/overlay/dialog/DialogWrapper.svelte +5 -2
  40. package/dist/ticatec-uniface-web.css +26 -6
  41. package/dist/utils/prefixFilter.d.ts +3 -3
  42. package/dist/utils/prefixFilter.js +3 -5
  43. package/package.json +1 -1
@@ -38,44 +38,12 @@
38
38
  bottom
39
39
  }: Props = $props();
40
40
 
41
- let sidebarPanel: HTMLElement;
42
- let rightBarPanel: HTMLElement;
43
- let maxWidth = '';
44
- let minWidth = '';
45
- let rightMaxWidth = '';
46
- let rightMinWidth = '';
47
-
48
- $effect(() => {
49
- if (sidebarResize && sidebarMaxWidth) {
50
- maxWidth = `max-width: ${sidebarMaxWidth};`;
51
- } else {
52
- maxWidth = '';
53
- }
54
- });
55
-
56
- $effect(() => {
57
- if (sidebarResize && sidebarMinWidth) {
58
- minWidth = `min-width: ${sidebarMinWidth};`;
59
- } else {
60
- minWidth = '';
61
- }
62
- });
63
-
64
- $effect(() => {
65
- if (rightBarResize && rightBarMaxWidth) {
66
- rightMaxWidth = `max-width: ${rightBarMaxWidth};`;
67
- } else {
68
- rightMaxWidth = '';
69
- }
70
- });
71
-
72
- $effect(() => {
73
- if (rightBarResize && rightBarMinWidth) {
74
- rightMinWidth = `min-width: ${rightBarMinWidth};`;
75
- } else {
76
- rightMinWidth = '';
77
- }
78
- });
41
+ let sidebarPanel = $state<HTMLElement>();
42
+ let rightBarPanel = $state<HTMLElement>();
43
+ let maxWidth = $derived(sidebarResize && sidebarMaxWidth ? `max-width: ${sidebarMaxWidth};` : '');
44
+ let minWidth = $derived(sidebarResize && sidebarMinWidth ? `min-width: ${sidebarMinWidth};` : '');
45
+ let rightMaxWidth = $derived(rightBarResize && rightBarMaxWidth ? `max-width: ${rightBarMaxWidth};` : '');
46
+ let rightMinWidth = $derived(rightBarResize && rightBarMinWidth ? `min-width: ${rightBarMinWidth};` : '');
79
47
  </script>
80
48
 
81
49
  <div class="uniface-classic-layout">
@@ -101,7 +69,7 @@
101
69
  {/if}
102
70
  </div>
103
71
  {#if rightSidebar}
104
- {#if sidebarResize}
72
+ {#if rightBarResize}
105
73
  <Split direction="vertical" bindingPanel={rightBarPanel} reverse/>
106
74
  {/if}
107
75
  <div bind:this={rightBarPanel} class="right-sidebar" style="width: {rightBarWidth}; {rightMinWidth} {rightMaxWidth}">
@@ -169,4 +137,4 @@
169
137
  overflow: hidden;
170
138
  border-top: 1px solid var(--uniface-color-border-secondary);
171
139
  }
172
- </style>
140
+ </style>
@@ -34,8 +34,8 @@
34
34
  right
35
35
  }: Props = $props();
36
36
 
37
- let leftPanel: HTMLElement;
38
- let rightPanel: HTMLElement;
37
+ let leftPanel = $state<HTMLElement>();
38
+ let rightPanel = $state<HTMLElement>();
39
39
 
40
40
  let colWidth = $derived(right ? '25%' : '50%');
41
41
 
@@ -88,4 +88,4 @@
88
88
  flex: 1 1 auto;
89
89
  overflow: auto;
90
90
  }
91
- </style>
91
+ </style>
@@ -24,25 +24,9 @@
24
24
  children
25
25
  }: Props = $props();
26
26
 
27
- let sidebarPanel: HTMLElement;
28
- let maxWidth = '';
29
- let minWidth = '';
30
-
31
- $effect(() => {
32
- if (sidebarResize && sidebarMaxWidth) {
33
- maxWidth = `max-width: ${sidebarMaxWidth};`;
34
- } else {
35
- maxWidth = '';
36
- }
37
- });
38
-
39
- $effect(() => {
40
- if (sidebarResize && sidebarMinWidth) {
41
- minWidth = `min-width: ${sidebarMinWidth};`;
42
- } else {
43
- minWidth = '';
44
- }
45
- });
27
+ let sidebarPanel = $state<HTMLElement>();
28
+ let maxWidth = $derived(sidebarResize && sidebarMaxWidth ? `max-width: ${sidebarMaxWidth};` : '');
29
+ let minWidth = $derived(sidebarResize && sidebarMinWidth ? `min-width: ${sidebarMinWidth};` : '');
46
30
  </script>
47
31
 
48
32
  <div class="uniface-header-layout">
@@ -106,4 +90,4 @@
106
90
  flex: 1 1 auto;
107
91
  overflow: hidden;
108
92
  }
109
- </style>
93
+ </style>
@@ -34,8 +34,8 @@
34
34
  bottom
35
35
  }: Props = $props();
36
36
 
37
- let topPanel: HTMLElement;
38
- let bottomPanel: HTMLElement;
37
+ let topPanel = $state<HTMLElement>();
38
+ let bottomPanel = $state<HTMLElement>();
39
39
 
40
40
  let rowHeight = $derived(bottom ? '25%' : '50%');
41
41
 
@@ -88,4 +88,4 @@
88
88
  flex: 1 1 auto;
89
89
  overflow: auto;
90
90
  }
91
- </style>
91
+ </style>
@@ -24,25 +24,9 @@
24
24
  children
25
25
  }: Props = $props();
26
26
 
27
- let sidebarPanel: HTMLElement;
28
- let maxWidth = '';
29
- let minWidth = '';
30
-
31
- $effect(() => {
32
- if (sidebarResize && sidebarMaxWidth) {
33
- maxWidth = `max-width: ${sidebarMaxWidth};`;
34
- } else {
35
- maxWidth = '';
36
- }
37
- });
38
-
39
- $effect(() => {
40
- if (sidebarResize && sidebarMinWidth) {
41
- minWidth = `min-width: ${sidebarMinWidth};`;
42
- } else {
43
- minWidth = '';
44
- }
45
- });
27
+ let sidebarPanel = $state<HTMLElement>();
28
+ let maxWidth = $derived(sidebarResize && sidebarMaxWidth ? `max-width: ${sidebarMaxWidth};` : '');
29
+ let minWidth = $derived(sidebarResize && sidebarMinWidth ? `min-width: ${sidebarMinWidth};` : '');
46
30
  </script>
47
31
 
48
32
  <div class="uniface-sidebar-layout">
@@ -106,4 +90,4 @@
106
90
  flex: 1 1 auto;
107
91
  overflow: auto;
108
92
  }
109
- </style>
93
+ </style>
@@ -38,6 +38,15 @@
38
38
 
39
39
  let sourceSelectedList: Array<any> = $state([]);
40
40
  let targetSelectedList: Array<any> = $state([]);
41
+ let transferContainer = $state<HTMLDivElement>();
42
+
43
+ const handleFocusIn = (event: FocusEvent) => {
44
+ if (!transferContainer?.contains(event.relatedTarget as Node | null)) onfocus?.(event);
45
+ };
46
+
47
+ const handleFocusOut = (event: FocusEvent) => {
48
+ if (!transferContainer?.contains(event.relatedTarget as Node | null)) onblur?.(event);
49
+ };
41
50
 
42
51
  const moveToTarget = async () => {
43
52
  if (sourceSelectedList.length > 0 && await onchange?.(sourceSelectedList, "right")) {
@@ -56,7 +65,7 @@
56
65
  }
57
66
  </script>
58
67
 
59
- <div class="uniface-transfer-container" {onfocus} {onblur} tabindex="0">
68
+ <div bind:this={transferContainer} class="uniface-transfer-container" onfocusin={handleFocusIn} onfocusout={handleFocusOut}>
60
69
  <ListBox class="list-container" title={sourceTitle} {filter} style="{style}; grid-column: 1/2" list={sourceList} selectMode="multiple"
61
70
  bind:selectedList={sourceSelectedList} {itemRender}>
62
71
  {#snippet footer()}
@@ -96,10 +105,7 @@
96
105
  grid-auto-columns: 1fr 60px 1fr;
97
106
  column-gap: 16px;
98
107
  }
99
- .uniface-transfer-container .header-container {
100
- margin: 10px auto 10px 10px;
101
- }
102
- .uniface-transfer-container .list-container {
108
+ .uniface-transfer-container :global(.list-container) {
103
109
  height: 100%;
104
110
  flex: 1 1 auto;
105
111
  overflow: hidden;
@@ -113,4 +119,4 @@
113
119
  flex-direction: column;
114
120
  justify-content: center;
115
121
  align-items: center;
116
- }</style>
122
+ }</style>
@@ -72,7 +72,4 @@
72
72
  overflow-y: auto;
73
73
  }
74
74
 
75
- .uniface-accordion-panel.compact {
76
- /* Compact mode handled by passing prop to AccordionItemView */
77
- }
78
- </style>
75
+ </style>
@@ -95,9 +95,6 @@
95
95
  cursor: pointer;
96
96
  }
97
97
 
98
- .card-action-img:hover {
99
- }
100
-
101
98
  .card-action-img:active {
102
99
  position: relative;
103
100
  top: 1px;
@@ -108,27 +105,4 @@
108
105
  filter: grayscale(100%);
109
106
  }
110
107
 
111
- .action-item.disabled .action-icon:hover {
112
- color: var(--disabled-button-text-color, var(--uniface-disabled-button-text-color, #B3BCCA));
113
- }
114
-
115
- .action-item.disabled .action-icon:active {
116
- position: relative;
117
- top: 0;
118
- }
119
-
120
- .action-item.disabled .card-action-img {
121
- filter: grayscale(100%);
122
- cursor: default;
123
- }
124
-
125
- .action-item.disabled .card-action-img:hover {
126
- width: var(--action-image-size, var(--uniface-action-image-size, 15px));
127
- height: var(--action-image-size, var(--uniface-action-image-size, 15px));
128
- }
129
-
130
- .action-item.disabled .card-action-img:active {
131
- position: relative;
132
- top: 0;
133
- }
134
- </style>
108
+ </style>
@@ -56,9 +56,11 @@
56
56
  loadMoreIndicator
57
57
  }: Props = $props();
58
58
 
59
- let localSelectedItem = $state(selectedItem ?? null);
59
+ // External values are synchronized by the effects below. Neutral initial values
60
+ // avoid implying that these props are intentionally captured only once.
61
+ let localSelectedItem = $state<any>(null);
60
62
  let localSelectedList = $state(selectedList ?? []);
61
- let localFilterText = $state(filterText ?? '');
63
+ let localFilterText = $state('');
62
64
 
63
65
  let hasMore = $state(false);
64
66
  let isBusy = $state(false);
@@ -66,7 +68,7 @@
66
68
  let filteredList = $state<Array<any>>([]);
67
69
 
68
70
  let scrollElement: HTMLElement;
69
- let searchBox: any;
71
+ let searchBox = $state<any>();
70
72
 
71
73
  // Sync external props to local state
72
74
  $effect(() => {
@@ -337,10 +339,6 @@
337
339
  border-bottom: 1px solid var(--uniface-listbox-separator-color);
338
340
  }
339
341
 
340
- .listbox-content .listview-item.no-border {
341
- border-bottom: unset;
342
- }
343
-
344
342
  .listbox-content.selectable .listview-item {
345
343
  cursor: pointer;
346
344
  }
@@ -352,4 +350,4 @@
352
350
  .listbox-content.selectable .listview-item.selected {
353
351
  background-color: var(--uniface-list-box-selected-surface);
354
352
  }
355
- </style>
353
+ </style>
@@ -1,10 +1,11 @@
1
1
  export function clickOutside(node) {
2
2
  const handleClick = (event) => {
3
- // @ts-ignore
4
- if (node && !node.contains(event.target) && !event.defaultPrevented) {
5
- node.dispatchEvent(
6
- // @ts-ignore
7
- new CustomEvent('outerClick', node));
3
+ const target = event.target;
4
+ if (target instanceof Node && !node.contains(target) && !event.defaultPrevented) {
5
+ node.dispatchEvent(new CustomEvent('outerClick', {
6
+ bubbles: true,
7
+ detail: { originalEvent: event }
8
+ }));
8
9
  }
9
10
  };
10
11
  document.addEventListener('click', handleClick, true);
@@ -48,6 +48,7 @@
48
48
  let showUpload = $state(false);
49
49
 
50
50
  const handleFocus = (event: FocusEvent) => {
51
+ if (containerElement?.contains(event.relatedTarget as Node | null)) return;
51
52
  if (!hasFocus) {
52
53
  hasFocus = true;
53
54
  onfocus?.(event);
@@ -55,6 +56,7 @@
55
56
  };
56
57
 
57
58
  const handleBlur = (event: FocusEvent) => {
59
+ if (containerElement?.contains(event.relatedTarget as Node | null)) return;
58
60
  if (hasFocus && !showUpload) {
59
61
  hasFocus = false;
60
62
  onblur?.(event);
@@ -101,7 +103,9 @@
101
103
  });
102
104
 
103
105
  export function focus() {
104
- containerElement?.focus();
106
+ containerElement
107
+ ?.querySelector<HTMLElement>('button, a[href], input:not([tabindex="-1"])')
108
+ ?.focus();
105
109
  }
106
110
 
107
111
  const canUpload = $derived(!disabled && !readonly && (onUpload != null || uploadFile != null));
@@ -111,20 +115,18 @@
111
115
  <div
112
116
  bind:this={containerElement}
113
117
  class="uniface-attachment-editor"
114
- tabindex={disabled || readonly ? -1 : 0}
115
- onfocus={handleFocus}
116
- onblur={handleBlur}
118
+ onfocusin={handleFocus}
119
+ onfocusout={handleBlur}
117
120
  >
118
- <input tabindex="-1" style="position: relative; left: -1px; width: 1px;"/>
119
121
  <div class="files-field">
120
122
  {#each files as file (file)}
121
123
  <FileRender {file} {readonly} onRemove={removeFile}/>
122
124
  {/each}
123
125
  </div>
124
126
  {#if canUpload}
125
- <div class="editor-action-icon" onclick={triggerUpload}>
127
+ <button type="button" class="editor-action-icon" aria-label="Upload file" onclick={triggerUpload}>
126
128
  <i class="icon_google_file_upload" aria-hidden="true"></i>
127
- </div>
129
+ </button>
128
130
  {/if}
129
131
  </div>
130
132
  </FormEditor>
@@ -166,9 +168,12 @@
166
168
  border-radius: 4px;
167
169
  display: flex;
168
170
  align-items: center;
171
+ border: 0;
172
+ background: transparent;
173
+ color: inherit;
169
174
  }
170
175
 
171
176
  .editor-action-icon:hover {
172
177
  background-color: rgba(0, 0, 0, 0.05);
173
178
  }
174
- </style>
179
+ </style>
@@ -12,7 +12,10 @@
12
12
  removeFile: (file: any) => void;
13
13
  } = $props();
14
14
 
15
- let status: ProgressStatus = $state(file?.status ?? ProgressStatus.progressing);
15
+ // The upload object owns subsequent status updates. This value is only the
16
+ // initial snapshot before the effect installs its update callback.
17
+ const getInitialStatus = () => file?.status ?? ProgressStatus.progressing;
18
+ let status: ProgressStatus = $state(getInitialStatus());
16
19
  let progress: number = $state(0);
17
20
 
18
21
  let cancelLabel: string = i18nRes.common.btnCancel.toString();
@@ -60,4 +63,4 @@
60
63
  <TextButton size="small" label={removeLabel} onclick={removeUploadFile}/>
61
64
  {/if}
62
65
  </div>
63
- </div>
66
+ </div>
@@ -29,10 +29,10 @@
29
29
  let btnPickup = i18nRes.upload.btnPickup.toString();
30
30
 
31
31
  let files: Array<UploadFile> = $state([]);
32
- let dropZone: any;
33
32
  let fileInput: any;
34
33
  let interval: any;
35
34
  let busy: boolean = $state(false);
35
+ let dragActive = $state(false);
36
36
  let canClose: boolean = $state(false);
37
37
 
38
38
  $effect(() => {
@@ -60,18 +60,18 @@
60
60
  const handleDragOver = (e: DragEvent) => {
61
61
  e.preventDefault();
62
62
  busy = true;
63
- dropZone.classList.add("highlight");
63
+ dragActive = true;
64
64
  }
65
65
 
66
66
  const handleDragLeave = (e: DragEvent) => {
67
67
  e.preventDefault();
68
68
  busy = false;
69
- dropZone.classList.remove("highlight");
69
+ dragActive = false;
70
70
  }
71
71
 
72
72
  const handleDrop = (e: DragEvent) => {
73
73
  e.preventDefault();
74
- dropZone.classList.remove("highlight");
74
+ dragActive = false;
75
75
  handleFiles(e.dataTransfer?.files);
76
76
  }
77
77
 
@@ -117,7 +117,7 @@
117
117
  });
118
118
  </script>
119
119
  <ModalPopover {canClose} {theme} bind:visible>
120
- <div class="uniface-file-upload-panel" bind:this={dropZone} ondragover={handleDragOver} ondragleave={handleDragLeave}
120
+ <div class="uniface-file-upload-panel" class:highlight={dragActive} ondragover={handleDragOver} ondragleave={handleDragLeave}
121
121
  ondrop={handleDrop} onclick={handleMouseClick} aria-hidden="true">
122
122
  <div class="file-upload-contents">
123
123
  <div style="position: absolute; top: 0; width: 0; overflow: hidden">
@@ -154,70 +154,4 @@
154
154
  }
155
155
  .uniface-file-upload-panel.highlight {
156
156
  background-color: var(--uniface-upload-panel-highlight-bg, #b3d8ff);
157
- }
158
-
159
- .uniface-attachment-display > div {
160
- width: 100%;
161
- box-sizing: border-box;
162
- line-height: 1.1em;
163
- overflow: hidden;
164
- text-overflow: ellipsis;
165
- }
166
-
167
- .uniface-attachment-field {
168
- display: inline-block;
169
- position: relative;
170
- width: 100%;
171
- }
172
- .uniface-attachment-field .uniface-common-editor {
173
- height: 120px;
174
- }
175
- .uniface-attachment-field > div {
176
- display: flex;
177
- flex-direction: row;
178
- justify-items: center;
179
- }
180
- .uniface-attachment-field .files-field {
181
- flex: 1 1 auto;
182
- height: 100%;
183
- overflow: hidden;
184
- text-overflow: ellipsis;
185
- display: flex;
186
- flex-direction: row;
187
- justify-items: flex-start;
188
- overflow-x: auto;
189
- }
190
- .uniface-attachment-field .files-field .file-icon {
191
- position: relative;
192
- }
193
- .uniface-attachment-field .files-field .file-icon img {
194
- width: 64px;
195
- height: 64px;
196
- }
197
- .uniface-attachment-field .files-field .file-icon .action-icon {
198
- position: absolute;
199
- display: none;
200
- left: 50%;
201
- transform: translateX(-50%);
202
- cursor: pointer;
203
- }
204
- .uniface-attachment-field .files-field .file-icon .action-icon i:active {
205
- position: relative;
206
- top: 1px;
207
- }
208
- .uniface-attachment-field .files-field .file-icon:hover .action-icon {
209
- display: inline-block;
210
- }
211
- .uniface-attachment-field .action-dropdown {
212
- box-sizing: border-box;
213
- margin-top: 4px;
214
- margin-right: 4px;
215
- line-height: 22px;
216
- margin-left: 8px;
217
- color: var(--uniface-dropdown-color, #e1e1e1);
218
- align-self: flex-start;
219
- cursor: pointer;
220
- }
221
- .uniface-attachment-field .filled .action-dropdown {
222
- color: var(--uniface-secondary-dropdown-color, #b9b9b9);
223
- }</style>
157
+ }</style>
@@ -123,6 +123,7 @@
123
123
  --disabled-inner: var(--uniface-checkbox-checkmark-color-disabled);
124
124
  -webkit-appearance: none;
125
125
  -moz-appearance: none;
126
+ appearance: none;
126
127
  height: var(--uniface-checkbox-size);
127
128
  outline: none;
128
129
  display: inline-block;
@@ -191,12 +192,6 @@
191
192
  --o: 1;
192
193
  --r: var(--uniface-checkbox-check-rotation);
193
194
  }
194
- .uniface-checkbox input[type=checkbox] + label {
195
- display: inline-block;
196
- vertical-align: middle;
197
- cursor: pointer;
198
- margin-left: 4px;
199
- }
200
195
  .uniface-checkbox.compact {
201
196
  padding: 0;
202
197
  color: var(--uniface-checkbox-text-color);
@@ -224,4 +219,4 @@
224
219
  .uniface-checkbox *::before,
225
220
  .uniface-checkbox *::after {
226
221
  box-sizing: inherit;
227
- }</style>
222
+ }</style>