@kubex/zinc 1.0.25 → 1.0.99

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 (199) hide show
  1. package/.claude/project.md +556 -0
  2. package/.github/workflows/js_build_and_deploy.yaml +9 -10
  3. package/dist/custom-elements.json +13575 -8856
  4. package/dist/vscode.html-custom-data.json +583 -48
  5. package/dist/web-types.json +1441 -181
  6. package/dist/zn.d.ts +1645 -660
  7. package/dist/zn.min.css +1 -1
  8. package/dist/zn.min.js +1412 -893
  9. package/docs/_utilities/code-previews.cjs +10 -1
  10. package/docs/assets/scripts/docs.js +42 -18
  11. package/docs/data/data-table.json +229 -66
  12. package/docs/data/empty.json +6 -0
  13. package/docs/data/products-table.json +41 -193
  14. package/docs/pages/components/action-bar.md +121 -6
  15. package/docs/pages/components/alert.md +118 -15
  16. package/docs/pages/components/animated-button.md +299 -0
  17. package/docs/pages/components/audio-select.md +534 -0
  18. package/docs/pages/components/bulk-actions.md +79 -5
  19. package/docs/pages/components/button-group.md +235 -27
  20. package/docs/pages/components/button.md +139 -1
  21. package/docs/pages/components/chart.md +365 -9
  22. package/docs/pages/components/checkbox.md +387 -58
  23. package/docs/pages/components/chip.md +253 -33
  24. package/docs/pages/components/collapsible.md +393 -46
  25. package/docs/pages/components/cols.md +152 -30
  26. package/docs/pages/components/confirm.md +182 -16
  27. package/docs/pages/components/copy-button.md +169 -6
  28. package/docs/pages/components/data-select.md +194 -15
  29. package/docs/pages/components/data-table-filter.md +96 -5
  30. package/docs/pages/components/data-table-search.md +451 -0
  31. package/docs/pages/components/data-table-sort.md +66 -5
  32. package/docs/pages/components/data-table.md +727 -66
  33. package/docs/pages/components/datepicker.md +402 -7
  34. package/docs/pages/components/defined-label.md +120 -5
  35. package/docs/pages/components/dialog.md +339 -59
  36. package/docs/pages/components/dropdown.md +366 -11
  37. package/docs/pages/components/editor.md +604 -7
  38. package/docs/pages/components/empty-state.md +315 -16
  39. package/docs/pages/components/expanding-action.md +212 -28
  40. package/docs/pages/components/file.md +421 -12
  41. package/docs/pages/components/filter-container.md +158 -5
  42. package/docs/pages/components/filter-wrapper.md +167 -6
  43. package/docs/pages/components/form-group.md +383 -6
  44. package/docs/pages/components/hover-container.md +237 -6
  45. package/docs/pages/components/icon-picker.md +121 -0
  46. package/docs/pages/components/icon.md +454 -48
  47. package/docs/pages/components/inline-edit.md +787 -19
  48. package/docs/pages/components/input-group.md +207 -13
  49. package/docs/pages/components/input.md +194 -0
  50. package/docs/pages/components/item.md +18 -0
  51. package/docs/pages/components/key-container.md +115 -0
  52. package/docs/pages/components/key.md +101 -0
  53. package/docs/pages/components/menu.md +512 -6
  54. package/docs/pages/components/note.md +239 -36
  55. package/docs/pages/components/opt-group.md +107 -0
  56. package/docs/pages/components/pagination.md +332 -6
  57. package/docs/pages/components/pane.md +222 -6
  58. package/docs/pages/components/panel.md +213 -26
  59. package/docs/pages/components/popup.md +1354 -6
  60. package/docs/pages/components/priority-list.md +233 -0
  61. package/docs/pages/components/progress-bar.md +387 -6
  62. package/docs/pages/components/radio-group.md +242 -5
  63. package/docs/pages/components/radio.md +474 -6
  64. package/docs/pages/components/rating.md +331 -7
  65. package/docs/pages/components/reveal.md +524 -6
  66. package/docs/pages/components/scroll-container.md +552 -6
  67. package/docs/pages/components/select.md +762 -160
  68. package/docs/pages/components/skeleton.md +473 -30
  69. package/docs/pages/components/slideout.md +261 -5
  70. package/docs/pages/components/sp.md +99 -41
  71. package/docs/pages/components/split-button.md +347 -9
  72. package/docs/pages/components/split-pane.md +445 -6
  73. package/docs/pages/components/stat.md +549 -9
  74. package/docs/pages/components/status-indicator.md +230 -1
  75. package/docs/pages/components/stepper.md +563 -6
  76. package/docs/pages/components/tabs.md +439 -13
  77. package/docs/pages/components/textarea.md +415 -17
  78. package/docs/pages/components/tile.md +385 -26
  79. package/docs/pages/components/toggle.md +424 -6
  80. package/docs/pages/components/tooltip.md +367 -0
  81. package/docs/pages/components/translation-group.md +210 -0
  82. package/docs/pages/components/translations.md +319 -19
  83. package/docs/pages/components/vertical-stepper.md +401 -8
  84. package/docs/pages/components/well.md +300 -3
  85. package/docs/pages/getting-started/form-controls.md +162 -0
  86. package/docs/pages/index.md +116 -15
  87. package/package.json +5 -6
  88. package/scss/_global-spacing.scss +4 -0
  89. package/scss/_root.scss +2 -2
  90. package/scss/boot.scss +19 -0
  91. package/scss/shared/layout.scss +5 -0
  92. package/scss/themes/_light.scss +3 -3
  93. package/src/components/alert/alert.scss +1 -0
  94. package/src/components/animated-button/README.md +306 -0
  95. package/src/components/animated-button/animated-button.component.ts +229 -0
  96. package/src/components/animated-button/animated-button.scss +228 -0
  97. package/src/components/animated-button/animated-button.test.ts +143 -0
  98. package/src/components/animated-button/index.ts +12 -0
  99. package/src/components/button/button.component.ts +5 -0
  100. package/src/components/button-group/button-group.component.ts +25 -13
  101. package/src/components/button-group/button-group.scss +6 -0
  102. package/src/components/checkbox/checkbox.component.ts +4 -0
  103. package/src/components/checkbox/checkbox.scss +7 -4
  104. package/src/components/checkbox-group/checkbox-group.scss +7 -0
  105. package/src/components/chip/chip.component.ts +7 -2
  106. package/src/components/chip/chip.scss +16 -2
  107. package/src/components/collapsible/collapsible.component.ts +27 -20
  108. package/src/components/cols/cols.component.ts +14 -2
  109. package/src/components/cols/cols.scss +6 -12
  110. package/src/components/confirm/confirm.component.ts +7 -0
  111. package/src/components/copy-button/copy-button.component.ts +12 -11
  112. package/src/components/data-select/data-select.component.ts +215 -44
  113. package/src/components/data-select/data-select.scss +66 -6
  114. package/src/components/data-select/providers/currency-data-provider.ts +20 -6
  115. package/src/components/data-select/providers/provider.ts +1 -0
  116. package/src/components/data-select/providers/us-state-data-provider.ts +68 -0
  117. package/src/components/data-table/data-table.component.ts +81 -22
  118. package/src/components/data-table-search/data-table-search.component.ts +184 -0
  119. package/src/components/data-table-search/data-table-search.scss +17 -0
  120. package/src/components/data-table-search/data-table-search.test.ts +11 -0
  121. package/src/components/data-table-search/index.ts +12 -0
  122. package/src/components/datepicker/datepicker.component.ts +347 -13
  123. package/src/components/dialog/dialog.component.ts +1 -1
  124. package/src/components/empty-state/empty-state.scss +6 -1
  125. package/src/components/header/header.scss +3 -3
  126. package/src/components/icon/icon.component.ts +23 -1
  127. package/src/components/icon/icon.scss +23 -0
  128. package/src/components/icon-picker/brand-icons.ts +24 -0
  129. package/src/components/icon-picker/icon-picker.component.ts +407 -0
  130. package/src/components/icon-picker/icon-picker.scss +205 -0
  131. package/src/components/icon-picker/index.ts +12 -0
  132. package/src/components/icon-picker/line-icons.ts +612 -0
  133. package/src/components/icon-picker/material-icons.ts +14543 -0
  134. package/src/components/inline-edit/inline-edit.component.ts +190 -46
  135. package/src/components/inline-edit/inline-edit.scss +29 -0
  136. package/src/components/inline-edit/inline-edit.test.ts +314 -1
  137. package/src/components/input/input.component.ts +324 -5
  138. package/src/components/input/input.scss +87 -0
  139. package/src/components/input-group/input-group.component.ts +28 -7
  140. package/src/components/input-group/input-group.scss +48 -10
  141. package/src/components/item/item.component.ts +24 -3
  142. package/src/components/item/item.scss +18 -0
  143. package/src/components/key/index.ts +12 -0
  144. package/src/components/key/key.component.ts +47 -0
  145. package/src/components/key/key.scss +38 -0
  146. package/src/components/key-container/index.ts +12 -0
  147. package/src/components/key-container/key-container.component.ts +142 -0
  148. package/src/components/key-container/key-container.scss +33 -0
  149. package/src/components/menu-item/menu-item.component.ts +20 -0
  150. package/src/components/menu-item/menu-item.scss +69 -2
  151. package/src/components/navbar/navbar.component.ts +103 -11
  152. package/src/components/navbar/navbar.scss +6 -1
  153. package/src/components/opt-group/index.ts +12 -0
  154. package/src/components/opt-group/opt-group.component.ts +74 -0
  155. package/src/components/opt-group/opt-group.scss +37 -0
  156. package/src/components/opt-group/opt-group.test.ts +27 -0
  157. package/src/components/option/option.component.ts +1 -16
  158. package/src/components/option/option.scss +4 -0
  159. package/src/components/panel/panel.component.ts +10 -8
  160. package/src/components/panel/panel.scss +20 -0
  161. package/src/components/priority-list/index.ts +12 -0
  162. package/src/components/priority-list/priority-list.component.ts +611 -0
  163. package/src/components/priority-list/priority-list.scss +185 -0
  164. package/src/components/priority-list/priority-list.test.ts +139 -0
  165. package/src/components/progress-bar/progress-bar.component.ts +22 -16
  166. package/src/components/radio/radio.scss +10 -3
  167. package/src/components/select/select.component.ts +812 -72
  168. package/src/components/select/select.scss +108 -2
  169. package/src/components/select/select.test.ts +147 -2
  170. package/src/components/settings-container/settings-container.component.ts +44 -19
  171. package/src/components/settings-container/settings-container.scss +1 -1
  172. package/src/components/skeleton/skeleton.component.ts +6 -1
  173. package/src/components/slideout/slideout.scss +8 -3
  174. package/src/components/sp/sp.component.ts +3 -1
  175. package/src/components/sp/sp.scss +19 -0
  176. package/src/components/stepper/stepper.component.ts +16 -10
  177. package/src/components/textarea/textarea.scss +0 -4
  178. package/src/components/tile/tile.component.ts +12 -3
  179. package/src/components/tile/tile.scss +1 -1
  180. package/src/components/timer/timer.component.ts +15 -2
  181. package/src/components/toggle/toggle.component.ts +29 -26
  182. package/src/components/toggle/toggle.scss +13 -1
  183. package/src/components/translation-group/index.ts +12 -0
  184. package/src/components/translation-group/translation-group.component.ts +207 -0
  185. package/src/components/translation-group/translation-group.scss +8 -0
  186. package/src/components/translations/translations.component.ts +90 -44
  187. package/src/components/translations/translations.scss +4 -0
  188. package/src/components/vertical-stepper/vertical-stepper.component.ts +14 -9
  189. package/src/events/events.ts +12 -7
  190. package/src/events/zn-language-change.ts +7 -0
  191. package/src/events/zn-purchase.ts +11 -0
  192. package/src/events/zn-redirect.ts +7 -0
  193. package/src/events/zn-reorder.ts +7 -0
  194. package/src/events/zn-search-change.ts +11 -0
  195. package/src/events/zn-submit.ts +1 -1
  196. package/src/form-control.scss +4 -0
  197. package/src/internal/form-navigation.ts +510 -0
  198. package/src/internal/form.ts +6 -0
  199. package/src/zinc.ts +91 -83
@@ -1,10 +1,323 @@
1
1
  import '../../../dist/zn.min.js';
2
2
  import { expect, fixture, html } from '@open-wc/testing';
3
+ import type ZnInlineEdit from './inline-edit.component';
4
+ import type ZnSelect from '../select/select.component';
3
5
 
4
6
  describe('<zn-inline-edit>', () => {
5
7
  it('should render a component', async () => {
6
8
  const el = await fixture(html` <zn-inline-edit></zn-inline-edit> `);
7
-
8
9
  expect(el).to.exist;
9
10
  });
11
+
12
+ // -- Text input (default) --
13
+
14
+ it('should render a text input by default', async () => {
15
+ const el = await fixture<ZnInlineEdit>(
16
+ html`<zn-inline-edit value="hello"></zn-inline-edit>`
17
+ );
18
+ await el.updateComplete;
19
+
20
+ const input = el.shadowRoot?.querySelector('zn-input');
21
+ expect(input).to.exist;
22
+ expect(el.value).to.equal('hello');
23
+ });
24
+
25
+ it('should update value on text input', async () => {
26
+ const el = await fixture<ZnInlineEdit>(
27
+ html`<zn-inline-edit value="hello"></zn-inline-edit>`
28
+ );
29
+ await el.updateComplete;
30
+
31
+ el.value = 'world';
32
+ await el.updateComplete;
33
+
34
+ expect(el.value).to.equal('world');
35
+ });
36
+
37
+ // -- Number input --
38
+
39
+ it('should render a number input when input-type is number', async () => {
40
+ const el = await fixture<ZnInlineEdit>(
41
+ html`<zn-inline-edit input-type="number" value="42"></zn-inline-edit>`
42
+ );
43
+ await el.updateComplete;
44
+
45
+ const input = el.shadowRoot?.querySelector('zn-input');
46
+ expect(input).to.exist;
47
+ expect(el.value).to.equal('42');
48
+ });
49
+
50
+ // -- Textarea --
51
+
52
+ it('should render a textarea when input-type is textarea', async () => {
53
+ const el = await fixture<ZnInlineEdit>(
54
+ html`<zn-inline-edit input-type="textarea" value="long text"></zn-inline-edit>`
55
+ );
56
+ await el.updateComplete;
57
+
58
+ const textarea = el.shadowRoot?.querySelector('zn-textarea');
59
+ expect(textarea).to.exist;
60
+ expect(el.value).to.equal('long text');
61
+ });
62
+
63
+ // -- Single select --
64
+
65
+ it('should render a select when input-type is select', async () => {
66
+ const el = await fixture<ZnInlineEdit>(html`
67
+ <zn-inline-edit input-type="select" value="a">
68
+ <zn-option value="a">Option A</zn-option>
69
+ <zn-option value="b">Option B</zn-option>
70
+ </zn-inline-edit>
71
+ `);
72
+ await el.updateComplete;
73
+
74
+ const select = el.shadowRoot?.querySelector('zn-select') as ZnSelect;
75
+ expect(select).to.exist;
76
+ expect(el.value).to.equal('a');
77
+ });
78
+
79
+ it('should render a select from options property', async () => {
80
+ const el = await fixture<ZnInlineEdit>(html`
81
+ <zn-inline-edit value="x" .options=${{ x: 'X Label', y: 'Y Label' }}></zn-inline-edit>
82
+ `);
83
+ await el.updateComplete;
84
+
85
+ const select = el.shadowRoot?.querySelector('zn-select') as ZnSelect;
86
+ expect(select).to.exist;
87
+ expect(el.value).to.equal('x');
88
+ });
89
+
90
+ // -- Multiple select --
91
+
92
+ it('should accept a space-delimited value attribute for multi-select', async () => {
93
+ const el = await fixture<ZnInlineEdit>(html`
94
+ <zn-inline-edit input-type="select" value="a b" multiple>
95
+ <zn-option value="a">A</zn-option>
96
+ <zn-option value="b">B</zn-option>
97
+ <zn-option value="c">C</zn-option>
98
+ </zn-inline-edit>
99
+ `);
100
+ await el.updateComplete;
101
+
102
+ expect(el.value).to.deep.equal(['a', 'b']);
103
+ });
104
+
105
+ it('should accept an array value programmatically for multi-select', async () => {
106
+ const el = await fixture<ZnInlineEdit>(html`
107
+ <zn-inline-edit input-type="select" multiple>
108
+ <zn-option value="a">A</zn-option>
109
+ <zn-option value="b">B</zn-option>
110
+ <zn-option value="c">C</zn-option>
111
+ </zn-inline-edit>
112
+ `);
113
+ await el.updateComplete;
114
+
115
+ el.value = ['a', 'c'];
116
+ await el.updateComplete;
117
+
118
+ expect(el.value).to.deep.equal(['a', 'c']);
119
+ });
120
+
121
+ it('should convert string value to array when multiple is set', async () => {
122
+ const el = await fixture<ZnInlineEdit>(html`
123
+ <zn-inline-edit input-type="select" multiple>
124
+ <zn-option value="a">A</zn-option>
125
+ <zn-option value="b">B</zn-option>
126
+ </zn-inline-edit>
127
+ `);
128
+ await el.updateComplete;
129
+
130
+ el.value = 'a b';
131
+ await el.updateComplete;
132
+
133
+ expect(el.value).to.deep.equal(['a', 'b']);
134
+ });
135
+
136
+ it('should pass multiple attribute to inner zn-select', async () => {
137
+ const el = await fixture<ZnInlineEdit>(html`
138
+ <zn-inline-edit input-type="select" multiple>
139
+ <zn-option value="a">A</zn-option>
140
+ <zn-option value="b">B</zn-option>
141
+ </zn-inline-edit>
142
+ `);
143
+ await el.updateComplete;
144
+
145
+ const select = el.shadowRoot?.querySelector('zn-select') as ZnSelect;
146
+ expect(select).to.exist;
147
+ expect(select.multiple).to.be.true;
148
+ });
149
+
150
+ it('should keep value as string when multiple is not set', async () => {
151
+ const el = await fixture<ZnInlineEdit>(
152
+ html`<zn-inline-edit value="hello"></zn-inline-edit>`
153
+ );
154
+ await el.updateComplete;
155
+
156
+ expect(el.value).to.be.a('string');
157
+ expect(el.value).to.equal('hello');
158
+ });
159
+
160
+ it('should parse multiple space-delimited IDs and pass them to the inner select', async () => {
161
+ const el = await fixture<ZnInlineEdit>(html`
162
+ <zn-inline-edit
163
+ name="exit_offers"
164
+ input-type="select"
165
+ multiple
166
+ value="1VGpJhp7pI62wSY04a6 6Yxa9ap7pI62wSAFFYf 8cwLe7p7pI62wSptw6C"
167
+ size="medium">
168
+ <zn-option value="1VGpJhp7pI62wSY04a6">Offer A</zn-option>
169
+ <zn-option value="6Yxa9ap7pI62wSAFFYf">Offer B</zn-option>
170
+ <zn-option value="8cwLe7p7pI62wSptw6C">Offer C</zn-option>
171
+ <zn-option value="otherValue">Offer D</zn-option>
172
+ </zn-inline-edit>
173
+ `);
174
+ await el.updateComplete;
175
+
176
+ // Value should be an array of the 3 IDs
177
+ expect(el.value).to.deep.equal([
178
+ '1VGpJhp7pI62wSY04a6',
179
+ '6Yxa9ap7pI62wSAFFYf',
180
+ '8cwLe7p7pI62wSptw6C'
181
+ ]);
182
+
183
+ // Inner select should exist with multiple enabled
184
+ const select = el.shadowRoot?.querySelector('zn-select') as ZnSelect;
185
+ expect(select).to.exist;
186
+ expect(select.multiple).to.be.true;
187
+
188
+ // Inner select value should match
189
+ await select.updateComplete;
190
+ const selectValue = Array.isArray(select.value) ? select.value : [select.value];
191
+ expect(selectValue).to.deep.equal([
192
+ '1VGpJhp7pI62wSY04a6',
193
+ '6Yxa9ap7pI62wSAFFYf',
194
+ '8cwLe7p7pI62wSptw6C'
195
+ ]);
196
+
197
+ // The 3 matching options should be selected, the 4th should not
198
+ const selectedOptions = select.selectedOptions;
199
+ expect(selectedOptions.length).to.equal(3);
200
+ expect(selectedOptions.map((o: any) => o.value)).to.deep.equal([
201
+ '1VGpJhp7pI62wSY04a6',
202
+ '6Yxa9ap7pI62wSAFFYf',
203
+ '8cwLe7p7pI62wSptw6C'
204
+ ]);
205
+ });
206
+
207
+ it('should select correct options when options are added after value is set (async load)', async () => {
208
+ // Simulates data-uri behavior: value is set before options exist
209
+ const el = await fixture<ZnInlineEdit>(html`
210
+ <zn-inline-edit
211
+ name="offers"
212
+ input-type="select"
213
+ multiple
214
+ value="1VGpJhp7pI62wSY04a6 6Yxa9ap7pI62wSAFFYf 8cwLe7p7pI62wSptw6C"
215
+ size="medium">
216
+ </zn-inline-edit>
217
+ `);
218
+ await el.updateComplete;
219
+
220
+ // Inline-edit value should be preserved as array even with no options yet
221
+ expect(el.value).to.deep.equal([
222
+ '1VGpJhp7pI62wSY04a6',
223
+ '6Yxa9ap7pI62wSAFFYf',
224
+ '8cwLe7p7pI62wSptw6C'
225
+ ]);
226
+
227
+ // Now simulate async option load by adding options to the inner select
228
+ const select = el.shadowRoot?.querySelector('zn-select') as ZnSelect;
229
+ expect(select).to.exist;
230
+
231
+ const ids = ['1VGpJhp7pI62wSY04a6', '6Yxa9ap7pI62wSAFFYf', '8cwLe7p7pI62wSptw6C', 'otherValue'];
232
+ const labels = ['40% Off', 'Ultimate Discount', '100% off', '30% Off'];
233
+ ids.forEach((id, i) => {
234
+ const opt = document.createElement('zn-option');
235
+ opt.setAttribute('value', id);
236
+ opt.textContent = labels[i];
237
+ select.appendChild(opt);
238
+ });
239
+
240
+ // Trigger the select to re-process options and re-apply the value
241
+ select.value = el.value;
242
+ await select.updateComplete;
243
+
244
+ // The 3 matching options should now be selected
245
+ const selectValue = Array.isArray(select.value) ? select.value : [select.value];
246
+ expect(selectValue).to.deep.equal([
247
+ '1VGpJhp7pI62wSY04a6',
248
+ '6Yxa9ap7pI62wSAFFYf',
249
+ '8cwLe7p7pI62wSptw6C'
250
+ ]);
251
+ });
252
+
253
+ // -- Empty value form data submission --
254
+
255
+ it('should include empty select value in form data', async () => {
256
+ const form = await fixture<HTMLFormElement>(html`
257
+ <form>
258
+ <zn-inline-edit name="myfield" input-type="select" value="">
259
+ <zn-option value="a">Option A</zn-option>
260
+ <zn-option value="b">Option B</zn-option>
261
+ </zn-inline-edit>
262
+ </form>
263
+ `);
264
+ await form.querySelector<ZnInlineEdit>('zn-inline-edit')!.updateComplete;
265
+
266
+ // new FormData(form) fires the formdata event, triggering FormControlController injection
267
+ const formData = new FormData(form);
268
+
269
+ expect(formData.has('myfield')).to.be.true;
270
+ expect(formData.get('myfield')).to.equal('');
271
+ });
272
+
273
+ it('should include empty select value in form data after clearing', async () => {
274
+ const form = await fixture<HTMLFormElement>(html`
275
+ <form>
276
+ <zn-inline-edit name="myfield" input-type="select" value="a">
277
+ <zn-option value="a">Option A</zn-option>
278
+ <zn-option value="b">Option B</zn-option>
279
+ </zn-inline-edit>
280
+ </form>
281
+ `);
282
+ const el = form.querySelector<ZnInlineEdit>('zn-inline-edit')!;
283
+ await el.updateComplete;
284
+
285
+ el.value = '';
286
+ await el.updateComplete;
287
+
288
+ const formData = new FormData(form);
289
+
290
+ expect(formData.has('myfield')).to.be.true;
291
+ expect(formData.get('myfield')).to.equal('');
292
+ });
293
+
294
+ it('should include empty multiple select value in form data', async () => {
295
+ const form = await fixture<HTMLFormElement>(html`
296
+ <form>
297
+ <zn-inline-edit name="tags" input-type="select" multiple value="">
298
+ <zn-option value="a">A</zn-option>
299
+ <zn-option value="b">B</zn-option>
300
+ </zn-inline-edit>
301
+ </form>
302
+ `);
303
+ const el = form.querySelector<ZnInlineEdit>('zn-inline-edit')!;
304
+ await el.updateComplete;
305
+
306
+ const formData = new FormData(form);
307
+
308
+ expect(formData.has('tags')).to.be.true;
309
+ expect(formData.get('tags')).to.equal('');
310
+ });
311
+
312
+ it('should flatten array to string when multiple is not set', async () => {
313
+ const el = await fixture<ZnInlineEdit>(
314
+ html`<zn-inline-edit value="hello"></zn-inline-edit>`
315
+ );
316
+ await el.updateComplete;
317
+
318
+ el.value = ['a', 'b'] as any;
319
+ await el.updateComplete;
320
+
321
+ expect(el.value).to.equal('a b');
322
+ });
10
323
  });