kempo-ui 0.0.35 → 0.0.37

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 (60) hide show
  1. package/dist/components/ThemeSwitcher.js +2 -2
  2. package/dist/utils/context.js +1 -0
  3. package/dist/utils/theme.js +1 -0
  4. package/docs/components/theme-switcher.html +18 -6
  5. package/docs/index.html +18 -6
  6. package/docs/nav-1.inc.html +2 -0
  7. package/docs/nav.inc.html +2 -0
  8. package/docs/src/components/ThemeSwitcher.js +2 -2
  9. package/docs/src/utils/context.js +1 -0
  10. package/docs/src/utils/theme.js +1 -0
  11. package/docs/utils/context.html +160 -0
  12. package/docs/utils/theme.html +153 -0
  13. package/package.json +2 -2
  14. package/src/components/Table.js +2 -1
  15. package/src/components/ThemeSwitcher.js +17 -30
  16. package/src/components/tableControls/PageSelect.js +20 -28
  17. package/src/utils/context.js +40 -0
  18. package/src/utils/theme.js +50 -0
  19. package/tests/components/Accordion.browser-test.js +470 -0
  20. package/tests/components/Card.browser-test.js +286 -0
  21. package/tests/components/ColorPicker.browser-test.js +658 -0
  22. package/tests/components/ContentSlider.browser-test.js +495 -0
  23. package/tests/components/Dialog.browser-test.js +677 -0
  24. package/tests/components/FocusCapture.browser-test.js +187 -0
  25. package/tests/components/HybridComponent.browser-test.js +1 -1
  26. package/tests/components/Icon.browser-test.js +355 -0
  27. package/tests/components/Import.browser-test.js +312 -0
  28. package/tests/components/PhotoViewer.browser-test.js +640 -0
  29. package/tests/components/Resize.browser-test.js +553 -0
  30. package/tests/components/ShadowComponent.browser-test.js +3 -3
  31. package/tests/components/ShowMore.browser-test.js +618 -0
  32. package/tests/components/SideMenu.browser-test.js +667 -0
  33. package/tests/components/Sortable.browser-test.js +650 -0
  34. package/tests/components/Split.browser-test.js +629 -0
  35. package/tests/components/Table.browser-test.js +1119 -0
  36. package/tests/components/Tabs.browser-test.js +847 -0
  37. package/tests/components/Tags.browser-test.js +604 -0
  38. package/tests/components/ThemeSwitcher.browser-test.js +413 -0
  39. package/tests/components/Timestamp.browser-test.js +509 -0
  40. package/tests/components/Toast.browser-test.js +616 -0
  41. package/tests/components/Toggle.browser-test.js +557 -0
  42. package/tests/components/Tree.browser-test.js +790 -0
  43. package/tests/components/tableControls/ExportControls.browser-test.js +307 -0
  44. package/tests/components/tableControls/FieldSortHide.browser-test.js +347 -0
  45. package/tests/components/tableControls/Filters.browser-test.js +376 -0
  46. package/tests/components/tableControls/HiddenCount.browser-test.js +263 -0
  47. package/tests/components/tableControls/PaginationControls.browser-test.js +514 -0
  48. package/tests/components/tableControls/RecordControls.browser-test.js +360 -0
  49. package/tests/components/tableControls/Search.browser-test.js +283 -0
  50. package/tests/components/tableControls/TableControl.browser-test.js +300 -0
  51. package/tests/utils/context.test.js +224 -0
  52. package/tests/utils/cookie.browser-test.js +146 -0
  53. package/tests/utils/drag.browser-test.js +285 -0
  54. package/tests/utils/formatTimestamp.test.js +224 -0
  55. package/tests/utils/object.browser-test.js +378 -0
  56. package/tests/utils/propConverters.test.js +207 -0
  57. package/tests/utils/string.test.js +379 -0
  58. package/tests/utils/theme.browser-test.js +177 -0
  59. package/tests/utils/type.test.js +211 -0
  60. package/tests/utils/wait.browser-test.js +19 -0
@@ -0,0 +1,658 @@
1
+ import ColorPicker from '../../src/components/ColorPicker.js';
2
+
3
+ const createColorPicker = async (options = {}) => {
4
+ const picker = document.createElement('k-color-picker');
5
+ if(options.value){
6
+ picker.setAttribute('value', options.value);
7
+ }
8
+ if(options.format){
9
+ picker.setAttribute('format', options.format);
10
+ }
11
+ if(options.name){
12
+ picker.setAttribute('name', options.name);
13
+ }
14
+ document.body.appendChild(picker);
15
+ await picker.updateComplete;
16
+ return picker;
17
+ };
18
+
19
+ const cleanup = (element) => {
20
+ if(element && element.parentNode){
21
+ element.parentNode.removeChild(element);
22
+ }
23
+ };
24
+
25
+ export default {
26
+ /*
27
+ ColorPicker Element Tests
28
+ */
29
+ 'should create color picker element': async ({pass, fail}) => {
30
+ const picker = await createColorPicker();
31
+
32
+ if(!picker){
33
+ cleanup(picker);
34
+ fail('ColorPicker element should be created');
35
+ return;
36
+ }
37
+
38
+ if(!(picker instanceof ColorPicker)){
39
+ cleanup(picker);
40
+ fail('Element should be instance of ColorPicker');
41
+ return;
42
+ }
43
+
44
+ cleanup(picker);
45
+ pass('ColorPicker element created correctly');
46
+ },
47
+
48
+ 'should have shadow root': async ({pass, fail}) => {
49
+ const picker = await createColorPicker();
50
+
51
+ if(!picker.shadowRoot){
52
+ cleanup(picker);
53
+ fail('ColorPicker should have shadow root');
54
+ return;
55
+ }
56
+
57
+ cleanup(picker);
58
+ pass('ColorPicker has shadow root');
59
+ },
60
+
61
+ 'should have default format as hex': async ({pass, fail}) => {
62
+ const picker = await createColorPicker();
63
+
64
+ if(picker.format !== 'hex'){
65
+ cleanup(picker);
66
+ fail(`Expected format "hex", got "${picker.format}"`);
67
+ return;
68
+ }
69
+
70
+ cleanup(picker);
71
+ pass('Default format is hex');
72
+ },
73
+
74
+ 'should have default RGB values as 0': async ({pass, fail}) => {
75
+ const picker = await createColorPicker();
76
+
77
+ if(picker.red !== 0 || picker.green !== 0 || picker.blue !== 0){
78
+ cleanup(picker);
79
+ fail(`Expected RGB (0, 0, 0), got (${picker.red}, ${picker.green}, ${picker.blue})`);
80
+ return;
81
+ }
82
+
83
+ cleanup(picker);
84
+ pass('Default RGB values are 0');
85
+ },
86
+
87
+ 'should have default alpha as 1': async ({pass, fail}) => {
88
+ const picker = await createColorPicker();
89
+
90
+ if(picker.alpha !== 1){
91
+ cleanup(picker);
92
+ fail(`Expected alpha 1, got ${picker.alpha}`);
93
+ return;
94
+ }
95
+
96
+ cleanup(picker);
97
+ pass('Default alpha is 1');
98
+ },
99
+
100
+ /*
101
+ Value Parsing Tests
102
+ */
103
+ 'should parse hex value': async ({pass, fail}) => {
104
+ const picker = await createColorPicker({ value: '#ff0000' });
105
+
106
+ if(picker.red !== 255 || picker.green !== 0 || picker.blue !== 0){
107
+ cleanup(picker);
108
+ fail(`Expected RGB (255, 0, 0), got (${picker.red}, ${picker.green}, ${picker.blue})`);
109
+ return;
110
+ }
111
+
112
+ cleanup(picker);
113
+ pass('Parses hex value correctly');
114
+ },
115
+
116
+ 'should parse short hex value': async ({pass, fail}) => {
117
+ const picker = await createColorPicker({ value: '#f00' });
118
+
119
+ if(picker.red !== 255 || picker.green !== 0 || picker.blue !== 0){
120
+ cleanup(picker);
121
+ fail(`Expected RGB (255, 0, 0), got (${picker.red}, ${picker.green}, ${picker.blue})`);
122
+ return;
123
+ }
124
+
125
+ cleanup(picker);
126
+ pass('Parses short hex value correctly');
127
+ },
128
+
129
+ 'should parse hex value with alpha': async ({pass, fail}) => {
130
+ const picker = await createColorPicker({ value: '#ff000080' });
131
+
132
+ if(picker.red !== 255){
133
+ cleanup(picker);
134
+ fail(`Expected red 255, got ${picker.red}`);
135
+ return;
136
+ }
137
+
138
+ // Alpha should be approximately 0.5 (128/255)
139
+ if(Math.abs(picker.alpha - 0.5) > 0.01){
140
+ cleanup(picker);
141
+ fail(`Expected alpha ~0.5, got ${picker.alpha}`);
142
+ return;
143
+ }
144
+
145
+ cleanup(picker);
146
+ pass('Parses hex value with alpha correctly');
147
+ },
148
+
149
+ 'should parse rgb value': async ({pass, fail}) => {
150
+ const picker = await createColorPicker({ value: 'rgb(0, 255, 0)' });
151
+
152
+ if(picker.red !== 0 || picker.green !== 255 || picker.blue !== 0){
153
+ cleanup(picker);
154
+ fail(`Expected RGB (0, 255, 0), got (${picker.red}, ${picker.green}, ${picker.blue})`);
155
+ return;
156
+ }
157
+
158
+ cleanup(picker);
159
+ pass('Parses rgb value correctly');
160
+ },
161
+
162
+ 'should parse rgba value': async ({pass, fail}) => {
163
+ const picker = await createColorPicker({ value: 'rgba(0, 0, 255, 0.5)' });
164
+
165
+ if(picker.blue !== 255){
166
+ cleanup(picker);
167
+ fail(`Expected blue 255, got ${picker.blue}`);
168
+ return;
169
+ }
170
+
171
+ if(picker.alpha !== 0.5){
172
+ cleanup(picker);
173
+ fail(`Expected alpha 0.5, got ${picker.alpha}`);
174
+ return;
175
+ }
176
+
177
+ cleanup(picker);
178
+ pass('Parses rgba value correctly');
179
+ },
180
+
181
+ 'should parse hsl value': async ({pass, fail}) => {
182
+ const picker = await createColorPicker({ value: 'hsl(0, 100%, 50%)' });
183
+
184
+ // HSL (0, 100%, 50%) is pure red
185
+ if(picker.red !== 255){
186
+ cleanup(picker);
187
+ fail(`Expected red 255, got ${picker.red}`);
188
+ return;
189
+ }
190
+
191
+ cleanup(picker);
192
+ pass('Parses hsl value correctly');
193
+ },
194
+
195
+ /*
196
+ Value Output Tests
197
+ */
198
+ 'should output hex format': async ({pass, fail}) => {
199
+ const picker = await createColorPicker({ format: 'hex' });
200
+ picker.red = 255;
201
+ picker.green = 0;
202
+ picker.blue = 0;
203
+ await picker.updateComplete;
204
+
205
+ if(picker.value !== '#ff0000'){
206
+ cleanup(picker);
207
+ fail(`Expected "#ff0000", got "${picker.value}"`);
208
+ return;
209
+ }
210
+
211
+ cleanup(picker);
212
+ pass('Outputs hex format correctly');
213
+ },
214
+
215
+ 'should output rgb format': async ({pass, fail}) => {
216
+ const picker = await createColorPicker({ format: 'rgb' });
217
+ picker.red = 0;
218
+ picker.green = 255;
219
+ picker.blue = 0;
220
+ await picker.updateComplete;
221
+
222
+ if(picker.value !== 'rgb(0, 255, 0)'){
223
+ cleanup(picker);
224
+ fail(`Expected "rgb(0, 255, 0)", got "${picker.value}"`);
225
+ return;
226
+ }
227
+
228
+ cleanup(picker);
229
+ pass('Outputs rgb format correctly');
230
+ },
231
+
232
+ 'should output rgba format when alpha < 1': async ({pass, fail}) => {
233
+ const picker = await createColorPicker({ format: 'rgb' });
234
+ picker.red = 0;
235
+ picker.green = 0;
236
+ picker.blue = 255;
237
+ picker.alpha = 0.5;
238
+ await picker.updateComplete;
239
+
240
+ if(!picker.value.startsWith('rgba(')){
241
+ cleanup(picker);
242
+ fail(`Expected rgba format, got "${picker.value}"`);
243
+ return;
244
+ }
245
+
246
+ cleanup(picker);
247
+ pass('Outputs rgba format when alpha < 1');
248
+ },
249
+
250
+ 'should output hsl format': async ({pass, fail}) => {
251
+ const picker = await createColorPicker({ format: 'hsl' });
252
+ picker.red = 255;
253
+ picker.green = 0;
254
+ picker.blue = 0;
255
+ await picker.updateComplete;
256
+
257
+ if(!picker.value.startsWith('hsl(')){
258
+ cleanup(picker);
259
+ fail(`Expected hsl format, got "${picker.value}"`);
260
+ return;
261
+ }
262
+
263
+ cleanup(picker);
264
+ pass('Outputs hsl format correctly');
265
+ },
266
+
267
+ /*
268
+ Format Detection Tests
269
+ */
270
+ 'should auto-detect hex format': async ({pass, fail}) => {
271
+ const container = document.createElement('div');
272
+ container.innerHTML = '<k-color-picker value="#00ff00"></k-color-picker>';
273
+ document.body.appendChild(container);
274
+
275
+ const picker = container.querySelector('k-color-picker');
276
+ await picker.updateComplete;
277
+ await new Promise(r => setTimeout(r, 50));
278
+
279
+ if(picker.format !== 'hex'){
280
+ container.parentNode.removeChild(container);
281
+ fail(`Expected format "hex", got "${picker.format}"`);
282
+ return;
283
+ }
284
+
285
+ container.parentNode.removeChild(container);
286
+ pass('Auto-detects hex format');
287
+ },
288
+
289
+ 'should auto-detect rgb format': async ({pass, fail}) => {
290
+ const container = document.createElement('div');
291
+ container.innerHTML = '<k-color-picker value="rgb(100, 150, 200)"></k-color-picker>';
292
+ document.body.appendChild(container);
293
+
294
+ const picker = container.querySelector('k-color-picker');
295
+ await picker.updateComplete;
296
+ await new Promise(r => setTimeout(r, 50));
297
+
298
+ if(picker.format !== 'rgb'){
299
+ container.parentNode.removeChild(container);
300
+ fail(`Expected format "rgb", got "${picker.format}"`);
301
+ return;
302
+ }
303
+
304
+ container.parentNode.removeChild(container);
305
+ pass('Auto-detects rgb format');
306
+ },
307
+
308
+ /*
309
+ UI Element Tests
310
+ */
311
+ 'should render format select': async ({pass, fail}) => {
312
+ const picker = await createColorPicker();
313
+
314
+ const select = picker.shadowRoot.querySelector('#format');
315
+ if(!select){
316
+ cleanup(picker);
317
+ fail('ColorPicker should render format select');
318
+ return;
319
+ }
320
+
321
+ cleanup(picker);
322
+ pass('ColorPicker renders format select');
323
+ },
324
+
325
+ 'should render text input': async ({pass, fail}) => {
326
+ const picker = await createColorPicker();
327
+
328
+ const input = picker.shadowRoot.querySelector('#text');
329
+ if(!input){
330
+ cleanup(picker);
331
+ fail('ColorPicker should render text input');
332
+ return;
333
+ }
334
+
335
+ cleanup(picker);
336
+ pass('ColorPicker renders text input');
337
+ },
338
+
339
+ 'should render color input': async ({pass, fail}) => {
340
+ const picker = await createColorPicker();
341
+
342
+ const colorInput = picker.shadowRoot.querySelector('#color');
343
+ if(!colorInput){
344
+ cleanup(picker);
345
+ fail('ColorPicker should render color input');
346
+ return;
347
+ }
348
+
349
+ if(colorInput.type !== 'color'){
350
+ cleanup(picker);
351
+ fail(`Expected type "color", got "${colorInput.type}"`);
352
+ return;
353
+ }
354
+
355
+ cleanup(picker);
356
+ pass('ColorPicker renders color input');
357
+ },
358
+
359
+ 'should have format options': async ({pass, fail}) => {
360
+ const picker = await createColorPicker();
361
+
362
+ const options = picker.shadowRoot.querySelectorAll('#format option');
363
+ if(options.length === 0){
364
+ cleanup(picker);
365
+ fail('Format select should have options');
366
+ return;
367
+ }
368
+
369
+ // Check for common formats
370
+ const formatNames = Array.from(options).map(o => o.value);
371
+ if(!formatNames.includes('hex') || !formatNames.includes('rgb')){
372
+ cleanup(picker);
373
+ fail('Should have hex and rgb format options');
374
+ return;
375
+ }
376
+
377
+ cleanup(picker);
378
+ pass('Format select has correct options');
379
+ },
380
+
381
+ /*
382
+ Input Handling Tests
383
+ */
384
+ 'should update on text input change': async ({pass, fail}) => {
385
+ const picker = await createColorPicker();
386
+
387
+ const textInput = picker.shadowRoot.querySelector('#text');
388
+ textInput.value = '#00ff00';
389
+ textInput.dispatchEvent(new Event('input'));
390
+ await picker.updateComplete;
391
+
392
+ if(picker.green !== 255){
393
+ cleanup(picker);
394
+ fail(`Expected green 255, got ${picker.green}`);
395
+ return;
396
+ }
397
+
398
+ cleanup(picker);
399
+ pass('Updates on text input change');
400
+ },
401
+
402
+ 'should update on color input change': async ({pass, fail}) => {
403
+ const picker = await createColorPicker();
404
+
405
+ const colorInput = picker.shadowRoot.querySelector('#color');
406
+ colorInput.value = '#0000ff';
407
+ colorInput.dispatchEvent(new Event('input'));
408
+ await picker.updateComplete;
409
+
410
+ if(picker.blue !== 255){
411
+ cleanup(picker);
412
+ fail(`Expected blue 255, got ${picker.blue}`);
413
+ return;
414
+ }
415
+
416
+ cleanup(picker);
417
+ pass('Updates on color input change');
418
+ },
419
+
420
+ 'should update format on select change': async ({pass, fail}) => {
421
+ const picker = await createColorPicker({ format: 'hex' });
422
+
423
+ const formatSelect = picker.shadowRoot.querySelector('#format');
424
+ formatSelect.value = 'rgb';
425
+ formatSelect.dispatchEvent(new Event('change'));
426
+ await picker.updateComplete;
427
+
428
+ if(picker.format !== 'rgb'){
429
+ cleanup(picker);
430
+ fail(`Expected format "rgb", got "${picker.format}"`);
431
+ return;
432
+ }
433
+
434
+ cleanup(picker);
435
+ pass('Updates format on select change');
436
+ },
437
+
438
+ /*
439
+ Event Tests
440
+ */
441
+ 'should dispatch input event on text change': async ({pass, fail}) => {
442
+ const picker = await createColorPicker();
443
+
444
+ let eventFired = false;
445
+ picker.addEventListener('input', () => {
446
+ eventFired = true;
447
+ });
448
+
449
+ const textInput = picker.shadowRoot.querySelector('#text');
450
+ textInput.value = '#ff0000';
451
+ textInput.dispatchEvent(new Event('input', { bubbles: true }));
452
+
453
+ if(!eventFired){
454
+ cleanup(picker);
455
+ fail('input event should be dispatched');
456
+ return;
457
+ }
458
+
459
+ cleanup(picker);
460
+ pass('Dispatches input event on text change');
461
+ },
462
+
463
+ 'should dispatch change event on text change': async ({pass, fail}) => {
464
+ const picker = await createColorPicker();
465
+
466
+ let eventFired = false;
467
+ picker.addEventListener('change', () => {
468
+ eventFired = true;
469
+ });
470
+
471
+ const textInput = picker.shadowRoot.querySelector('#text');
472
+ textInput.value = '#ff0000';
473
+ textInput.dispatchEvent(new Event('change', { bubbles: true }));
474
+
475
+ if(!eventFired){
476
+ cleanup(picker);
477
+ fail('change event should be dispatched');
478
+ return;
479
+ }
480
+
481
+ cleanup(picker);
482
+ pass('Dispatches change event on text change');
483
+ },
484
+
485
+ /*
486
+ Form Association Tests
487
+ */
488
+ 'should be form associated': async ({pass, fail}) => {
489
+ if(!ColorPicker.formAssociated){
490
+ fail('ColorPicker should be form associated');
491
+ return;
492
+ }
493
+
494
+ pass('ColorPicker is form associated');
495
+ },
496
+
497
+ 'should have internals': async ({pass, fail}) => {
498
+ const picker = await createColorPicker();
499
+
500
+ if(!picker.internals){
501
+ cleanup(picker);
502
+ fail('ColorPicker should have internals');
503
+ return;
504
+ }
505
+
506
+ cleanup(picker);
507
+ pass('ColorPicker has internals');
508
+ },
509
+
510
+ /*
511
+ Static Formats Tests
512
+ */
513
+ 'should have static formats object': async ({pass, fail}) => {
514
+ if(!ColorPicker.formats){
515
+ fail('ColorPicker should have static formats');
516
+ return;
517
+ }
518
+
519
+ if(typeof ColorPicker.formats !== 'object'){
520
+ fail('formats should be an object');
521
+ return;
522
+ }
523
+
524
+ pass('ColorPicker has static formats object');
525
+ },
526
+
527
+ 'should have hex format with detect, parse, toString': async ({pass, fail}) => {
528
+ const hex = ColorPicker.formats.hex;
529
+
530
+ if(!hex){
531
+ fail('hex format should exist');
532
+ return;
533
+ }
534
+
535
+ if(typeof hex.detect !== 'function'){
536
+ fail('hex.detect should be a function');
537
+ return;
538
+ }
539
+
540
+ if(typeof hex.parse !== 'function'){
541
+ fail('hex.parse should be a function');
542
+ return;
543
+ }
544
+
545
+ if(typeof hex.toString !== 'function'){
546
+ fail('hex.toString should be a function');
547
+ return;
548
+ }
549
+
550
+ pass('hex format has required methods');
551
+ },
552
+
553
+ 'hex detect should work correctly': async ({pass, fail}) => {
554
+ const hex = ColorPicker.formats.hex;
555
+
556
+ if(!hex.detect('#ff0000')){
557
+ fail('Should detect #ff0000');
558
+ return;
559
+ }
560
+
561
+ if(!hex.detect('#f00')){
562
+ fail('Should detect #f00');
563
+ return;
564
+ }
565
+
566
+ if(!hex.detect('#ff000080')){
567
+ fail('Should detect #ff000080');
568
+ return;
569
+ }
570
+
571
+ if(hex.detect('rgb(255,0,0)')){
572
+ fail('Should not detect rgb format');
573
+ return;
574
+ }
575
+
576
+ pass('hex detect works correctly');
577
+ },
578
+
579
+ 'rgb detect should work correctly': async ({pass, fail}) => {
580
+ const rgb = ColorPicker.formats.rgb;
581
+
582
+ if(!rgb.detect('rgb(255, 0, 0)')){
583
+ fail('Should detect rgb(255, 0, 0)');
584
+ return;
585
+ }
586
+
587
+ if(!rgb.detect('rgba(255, 0, 0, 0.5)')){
588
+ fail('Should detect rgba(255, 0, 0, 0.5)');
589
+ return;
590
+ }
591
+
592
+ if(rgb.detect('#ff0000')){
593
+ fail('Should not detect hex format');
594
+ return;
595
+ }
596
+
597
+ pass('rgb detect works correctly');
598
+ },
599
+
600
+ 'hsl detect should work correctly': async ({pass, fail}) => {
601
+ const hsl = ColorPicker.formats.hsl;
602
+
603
+ if(!hsl.detect('hsl(0, 100%, 50%)')){
604
+ fail('Should detect hsl(0, 100%, 50%)');
605
+ return;
606
+ }
607
+
608
+ if(!hsl.detect('hsla(0, 100%, 50%, 0.5)')){
609
+ fail('Should detect hsla(0, 100%, 50%, 0.5)');
610
+ return;
611
+ }
612
+
613
+ pass('hsl detect works correctly');
614
+ },
615
+
616
+ /*
617
+ Color Conversion Tests
618
+ */
619
+ 'should round-trip hex color': async ({pass, fail}) => {
620
+ const hex = ColorPicker.formats.hex;
621
+ const original = '#3498db';
622
+ const parsed = hex.parse(original);
623
+ const output = hex.toString(parsed.r, parsed.g, parsed.b, parsed.a);
624
+
625
+ if(output !== original){
626
+ fail(`Expected "${original}", got "${output}"`);
627
+ return;
628
+ }
629
+
630
+ pass('Hex color round-trips correctly');
631
+ },
632
+
633
+ 'should convert white correctly': async ({pass, fail}) => {
634
+ const picker = await createColorPicker({ value: '#ffffff' });
635
+
636
+ if(picker.red !== 255 || picker.green !== 255 || picker.blue !== 255){
637
+ cleanup(picker);
638
+ fail(`Expected white (255, 255, 255), got (${picker.red}, ${picker.green}, ${picker.blue})`);
639
+ return;
640
+ }
641
+
642
+ cleanup(picker);
643
+ pass('White color converted correctly');
644
+ },
645
+
646
+ 'should convert black correctly': async ({pass, fail}) => {
647
+ const picker = await createColorPicker({ value: '#000000' });
648
+
649
+ if(picker.red !== 0 || picker.green !== 0 || picker.blue !== 0){
650
+ cleanup(picker);
651
+ fail(`Expected black (0, 0, 0), got (${picker.red}, ${picker.green}, ${picker.blue})`);
652
+ return;
653
+ }
654
+
655
+ cleanup(picker);
656
+ pass('Black color converted correctly');
657
+ }
658
+ };