kempo-ui 0.3.7 → 0.3.8
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.
- package/dist/components/Accordion.js +5 -5
- package/dist/components/Aside.js +16 -16
- package/dist/components/Card.js +3 -3
- package/dist/components/ColorPicker.js +4 -4
- package/dist/components/ContentSlider.js +3 -3
- package/dist/components/Context.js +1 -1
- package/dist/components/Dialog.js +7 -7
- package/dist/components/Dropdown.js +7 -4
- package/dist/components/FilterItem.js +2 -2
- package/dist/components/FilterList.js +2 -2
- package/dist/components/FocusCapture.js +2 -2
- package/dist/components/HtmlEditor.js +62 -39
- package/dist/components/HybridComponent.js +1 -1
- package/dist/components/Icon.js +2 -2
- package/dist/components/Import.js +1 -1
- package/dist/components/LightComponent.js +1 -1
- package/dist/components/Main.js +3 -3
- package/dist/components/Nav.js +2 -2
- package/dist/components/NavSpacer.js +6 -0
- package/dist/components/PhotoViewer.js +3 -3
- package/dist/components/Resize.js +3 -3
- package/dist/components/ShadowComponent.js +1 -1
- package/dist/components/ShowMore.js +3 -3
- package/dist/components/Sortable.js +3 -3
- package/dist/components/Spinner.js +2 -2
- package/dist/components/Split.js +3 -3
- package/dist/components/Table.js +27 -27
- package/dist/components/Tabs.js +7 -7
- package/dist/components/Tags.js +4 -4
- package/dist/components/ThemeSelect.js +4 -4
- package/dist/components/ThemeSwitcher.js +5 -5
- package/dist/components/Timestamp.js +1 -1
- package/dist/components/Toast.js +3 -3
- package/dist/components/Toggle.js +3 -3
- package/dist/components/Tree.js +10 -10
- package/dist/components/htmlEditorControls/AlignCenter.js +4 -4
- package/dist/components/htmlEditorControls/AlignJustify.js +4 -4
- package/dist/components/htmlEditorControls/AlignLeft.js +4 -4
- package/dist/components/htmlEditorControls/AlignRight.js +4 -4
- package/dist/components/htmlEditorControls/Bold.js +4 -4
- package/dist/components/htmlEditorControls/BulletList.js +4 -4
- package/dist/components/htmlEditorControls/CharacterCount.js +3 -3
- package/dist/components/htmlEditorControls/ClearFormatting.js +4 -4
- package/dist/components/htmlEditorControls/CodeBlock.js +3 -3
- package/dist/components/htmlEditorControls/ControlGroup.js +2 -2
- package/dist/components/htmlEditorControls/ControlSpacer.js +2 -2
- package/dist/components/htmlEditorControls/CreateLink.js +3 -3
- package/dist/components/htmlEditorControls/DropdownControl.js +3 -3
- package/dist/components/htmlEditorControls/FormatBlock.js +4 -4
- package/dist/components/htmlEditorControls/HtmlEditorControl.js +2 -2
- package/dist/components/htmlEditorControls/InlineCode.js +3 -3
- package/dist/components/htmlEditorControls/InsertTable.js +3 -3
- package/dist/components/htmlEditorControls/Italic.js +4 -4
- package/dist/components/htmlEditorControls/Mode.js +3 -3
- package/dist/components/htmlEditorControls/NumberList.js +4 -4
- package/dist/components/htmlEditorControls/Strikethrough.js +4 -4
- package/dist/components/htmlEditorControls/TextBackgroundColor.js +6 -6
- package/dist/components/htmlEditorControls/TextColor.js +7 -7
- package/dist/components/htmlEditorControls/Underline.js +4 -4
- package/dist/components/htmlEditorControls/WordCount.js +3 -3
- package/dist/components/htmlEditorNodes/HtmlComment.js +24 -0
- package/dist/components/tableControls/DeleteRecord.js +2 -2
- package/dist/components/tableControls/DeleteSelected.js +2 -2
- package/dist/components/tableControls/Edit.js +4 -4
- package/dist/components/tableControls/ExportCSV.js +2 -2
- package/dist/components/tableControls/ExportJson.js +2 -2
- package/dist/components/tableControls/FieldSortHide.js +4 -4
- package/dist/components/tableControls/Filters.js +17 -17
- package/dist/components/tableControls/FirstPage.js +2 -2
- package/dist/components/tableControls/HiddenCount.js +2 -2
- package/dist/components/tableControls/Hide.js +2 -2
- package/dist/components/tableControls/LastPage.js +2 -2
- package/dist/components/tableControls/NextPage.js +2 -2
- package/dist/components/tableControls/PageSelect.js +4 -4
- package/dist/components/tableControls/PageSize.js +3 -3
- package/dist/components/tableControls/PrevPage.js +2 -2
- package/dist/components/tableControls/Search.js +2 -2
- package/dist/components/tableControls/ShowAll.js +2 -2
- package/dist/components/tableControls/TableControl.js +2 -2
- package/dist/utils/context.js +1 -1
- package/dist/utils/debounce.js +1 -1
- package/dist/utils/object.js +1 -1
- package/dist/utils/theme.js +1 -1
- package/dist/utils/wait.js +0 -1
- package/docs/components/accordion.html +2 -0
- package/docs/components/aside.html +9 -8
- package/docs/components/card.html +2 -0
- package/docs/components/color-picker.html +2 -0
- package/docs/components/content-slider.html +2 -0
- package/docs/components/context.html +2 -0
- package/docs/components/dialog.html +2 -0
- package/docs/components/dropdown.html +2 -0
- package/docs/components/filter-list.html +2 -0
- package/docs/components/focus-capture.html +2 -0
- package/docs/components/html-editor.html +54 -6
- package/docs/components/hybrid-component.html +2 -0
- package/docs/components/icon.html +2 -0
- package/docs/components/import.html +2 -0
- package/docs/components/light-component.html +2 -0
- package/docs/components/nav-spacer.html +315 -0
- package/docs/components/nav.html +2 -0
- package/docs/components/photo-viewer.html +2 -0
- package/docs/components/resize.html +2 -0
- package/docs/components/shadow-component.html +2 -0
- package/docs/components/show-more.html +2 -0
- package/docs/components/sortable.html +2 -0
- package/docs/components/spinner.html +2 -0
- package/docs/components/split.html +2 -0
- package/docs/components/table.html +2 -0
- package/docs/components/tableControls.html +2 -0
- package/docs/components/tableCustomFields.html +2 -0
- package/docs/components/tableFetchRecords.html +2 -0
- package/docs/components/tableFieldSortHide.html +2 -0
- package/docs/components/tablePagination.html +2 -0
- package/docs/components/tablePlaceholder.html +2 -0
- package/docs/components/tableRecordEditing.html +2 -0
- package/docs/components/tableRecordFiltering.html +2 -0
- package/docs/components/tableRecordHiding.html +2 -0
- package/docs/components/tableRecordSearching.html +2 -0
- package/docs/components/tableRecordSelection.html +2 -0
- package/docs/components/tableRowControls.html +2 -0
- package/docs/components/tableServerSync.html +2 -0
- package/docs/components/tableSorting.html +2 -0
- package/docs/components/tabs.html +2 -0
- package/docs/components/tags.html +2 -0
- package/docs/components/theme-select.html +2 -0
- package/docs/components/theme-switcher.html +2 -0
- package/docs/components/timestamp.html +2 -0
- package/docs/components/toast.html +2 -0
- package/docs/components/toggle.html +2 -0
- package/docs/components/tree.html +2 -0
- package/docs/icons/comment.svg +1 -0
- package/docs/index.html +8 -0
- package/docs/src/components/Accordion.js +5 -5
- package/docs/src/components/Aside.js +16 -16
- package/docs/src/components/Card.js +3 -3
- package/docs/src/components/ColorPicker.js +4 -4
- package/docs/src/components/ContentSlider.js +3 -3
- package/docs/src/components/Context.js +1 -1
- package/docs/src/components/Dialog.js +7 -7
- package/docs/src/components/Dropdown.js +7 -4
- package/docs/src/components/FilterItem.js +2 -2
- package/docs/src/components/FilterList.js +2 -2
- package/docs/src/components/FocusCapture.js +2 -2
- package/docs/src/components/HtmlEditor.js +62 -39
- package/docs/src/components/HybridComponent.js +1 -1
- package/docs/src/components/Icon.js +2 -2
- package/docs/src/components/Import.js +1 -1
- package/docs/src/components/LightComponent.js +1 -1
- package/docs/src/components/Main.js +3 -3
- package/docs/src/components/Nav.js +2 -2
- package/docs/src/components/NavSpacer.js +6 -0
- package/docs/src/components/PhotoViewer.js +3 -3
- package/docs/src/components/Resize.js +3 -3
- package/docs/src/components/ShadowComponent.js +1 -1
- package/docs/src/components/ShowMore.js +3 -3
- package/docs/src/components/Sortable.js +3 -3
- package/docs/src/components/Spinner.js +2 -2
- package/docs/src/components/Split.js +3 -3
- package/docs/src/components/Table.js +27 -27
- package/docs/src/components/Tabs.js +7 -7
- package/docs/src/components/Tags.js +4 -4
- package/docs/src/components/ThemeSelect.js +4 -4
- package/docs/src/components/ThemeSwitcher.js +5 -5
- package/docs/src/components/Timestamp.js +1 -1
- package/docs/src/components/Toast.js +3 -3
- package/docs/src/components/Toggle.js +3 -3
- package/docs/src/components/Tree.js +10 -10
- package/docs/src/components/htmlEditorControls/AlignCenter.js +4 -4
- package/docs/src/components/htmlEditorControls/AlignJustify.js +4 -4
- package/docs/src/components/htmlEditorControls/AlignLeft.js +4 -4
- package/docs/src/components/htmlEditorControls/AlignRight.js +4 -4
- package/docs/src/components/htmlEditorControls/Bold.js +4 -4
- package/docs/src/components/htmlEditorControls/BulletList.js +4 -4
- package/docs/src/components/htmlEditorControls/CharacterCount.js +3 -3
- package/docs/src/components/htmlEditorControls/ClearFormatting.js +4 -4
- package/docs/src/components/htmlEditorControls/CodeBlock.js +3 -3
- package/docs/src/components/htmlEditorControls/ControlGroup.js +2 -2
- package/docs/src/components/htmlEditorControls/ControlSpacer.js +2 -2
- package/docs/src/components/htmlEditorControls/CreateLink.js +3 -3
- package/docs/src/components/htmlEditorControls/DropdownControl.js +3 -3
- package/docs/src/components/htmlEditorControls/FormatBlock.js +4 -4
- package/docs/src/components/htmlEditorControls/HtmlEditorControl.js +2 -2
- package/docs/src/components/htmlEditorControls/InlineCode.js +3 -3
- package/docs/src/components/htmlEditorControls/InsertTable.js +3 -3
- package/docs/src/components/htmlEditorControls/Italic.js +4 -4
- package/docs/src/components/htmlEditorControls/Mode.js +3 -3
- package/docs/src/components/htmlEditorControls/NumberList.js +4 -4
- package/docs/src/components/htmlEditorControls/Strikethrough.js +4 -4
- package/docs/src/components/htmlEditorControls/TextBackgroundColor.js +6 -6
- package/docs/src/components/htmlEditorControls/TextColor.js +7 -7
- package/docs/src/components/htmlEditorControls/Underline.js +4 -4
- package/docs/src/components/htmlEditorControls/WordCount.js +3 -3
- package/docs/src/components/htmlEditorNodes/HtmlComment.js +24 -0
- package/docs/src/components/tableControls/DeleteRecord.js +2 -2
- package/docs/src/components/tableControls/DeleteSelected.js +2 -2
- package/docs/src/components/tableControls/Edit.js +4 -4
- package/docs/src/components/tableControls/ExportCSV.js +2 -2
- package/docs/src/components/tableControls/ExportJson.js +2 -2
- package/docs/src/components/tableControls/FieldSortHide.js +4 -4
- package/docs/src/components/tableControls/Filters.js +17 -17
- package/docs/src/components/tableControls/FirstPage.js +2 -2
- package/docs/src/components/tableControls/HiddenCount.js +2 -2
- package/docs/src/components/tableControls/Hide.js +2 -2
- package/docs/src/components/tableControls/LastPage.js +2 -2
- package/docs/src/components/tableControls/NextPage.js +2 -2
- package/docs/src/components/tableControls/PageSelect.js +4 -4
- package/docs/src/components/tableControls/PageSize.js +3 -3
- package/docs/src/components/tableControls/PrevPage.js +2 -2
- package/docs/src/components/tableControls/Search.js +2 -2
- package/docs/src/components/tableControls/ShowAll.js +2 -2
- package/docs/src/components/tableControls/TableControl.js +2 -2
- package/docs/src/utils/context.js +1 -1
- package/docs/src/utils/debounce.js +1 -1
- package/docs/src/utils/object.js +1 -1
- package/docs/src/utils/theme.js +1 -1
- package/docs/src/utils/wait.js +0 -1
- package/docs/utils/context.html +2 -0
- package/docs/utils/cookie.html +2 -0
- package/docs/utils/debounce.html +2 -0
- package/docs/utils/drag.html +2 -0
- package/docs/utils/elevation.html +2 -0
- package/docs/utils/formatTimestamp.html +2 -0
- package/docs/utils/object.html +2 -0
- package/docs/utils/propConverters.html +2 -0
- package/docs/utils/string.html +2 -0
- package/docs/utils/theme.html +2 -0
- package/docs/utils/toTitleCase.html +2 -0
- package/docs/utils/type.html +2 -0
- package/docs/utils/wait.html +2 -0
- package/docs-src/components/aside.page.html +7 -8
- package/docs-src/components/html-editor.page.html +52 -6
- package/docs-src/components/nav-spacer.page.html +65 -0
- package/docs-src/index.page.html +6 -0
- package/docs-src/nav.fragment.html +2 -0
- package/icons/comment.svg +1 -0
- package/llm.txt +1 -0
- package/package.json +1 -1
- package/scripts/build.js +1 -1
- package/src/components/Accordion.js +1 -1
- package/src/components/Dropdown.js +7 -3
- package/src/components/HtmlEditor.js +699 -1206
- package/src/components/NavSpacer.js +55 -0
- package/src/components/htmlEditorControls/AlignCenter.js +5 -5
- package/src/components/htmlEditorControls/AlignJustify.js +5 -5
- package/src/components/htmlEditorControls/AlignLeft.js +5 -5
- package/src/components/htmlEditorControls/AlignRight.js +5 -5
- package/src/components/htmlEditorControls/Bold.js +5 -5
- package/src/components/htmlEditorControls/BulletList.js +5 -5
- package/src/components/htmlEditorControls/ClearFormatting.js +5 -5
- package/src/components/htmlEditorControls/CodeBlock.js +16 -8
- package/src/components/htmlEditorControls/CreateLink.js +3 -7
- package/src/components/htmlEditorControls/FormatBlock.js +5 -5
- package/src/components/htmlEditorControls/InlineCode.js +1 -13
- package/src/components/htmlEditorControls/InsertTable.js +43 -44
- package/src/components/htmlEditorControls/Italic.js +5 -5
- package/src/components/htmlEditorControls/Mode.js +1 -1
- package/src/components/htmlEditorControls/NumberList.js +5 -5
- package/src/components/htmlEditorControls/Strikethrough.js +5 -5
- package/src/components/htmlEditorControls/Underline.js +5 -5
- package/src/components/htmlEditorNodes/HtmlComment.js +118 -0
- package/tests/components/Accordion.browser-test.js +154 -0
- package/tests/components/Dropdown.browser-test.js +85 -0
- package/tests/components/HtmlComment.browser-test.js +115 -0
- package/tests/components/HtmlEditor.browser-test.js +379 -0
- package/tests/components/NavSpacer.browser-test.js +81 -0
|
@@ -466,5 +466,159 @@ export default {
|
|
|
466
466
|
|
|
467
467
|
cleanup(container);
|
|
468
468
|
pass('AccordionPanel active attribute reflects state');
|
|
469
|
+
},
|
|
470
|
+
|
|
471
|
+
/*
|
|
472
|
+
Persistent ID Tests
|
|
473
|
+
*/
|
|
474
|
+
'persistent-id: should save open panel state to localStorage': async ({pass, fail}) => {
|
|
475
|
+
const id = 'test-save-' + Date.now();
|
|
476
|
+
const key = `accordion-persistent-id-${id}`;
|
|
477
|
+
window.localStorage.removeItem(key);
|
|
478
|
+
|
|
479
|
+
const { container, accordion } = await createAccordion({ persistentId: id });
|
|
480
|
+
|
|
481
|
+
accordion.openPanel('panel1');
|
|
482
|
+
await accordion.updateComplete;
|
|
483
|
+
await new Promise(r => setTimeout(r, 300));
|
|
484
|
+
|
|
485
|
+
const stored = window.localStorage.getItem(key);
|
|
486
|
+
window.localStorage.removeItem(key);
|
|
487
|
+
cleanup(container);
|
|
488
|
+
|
|
489
|
+
if(stored !== 'panel1'){
|
|
490
|
+
fail(`Expected localStorage to contain "panel1", got "${stored}"`);
|
|
491
|
+
return;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
pass('Open panel state saved to localStorage');
|
|
495
|
+
},
|
|
496
|
+
|
|
497
|
+
'persistent-id: should restore open panel state from localStorage': async ({pass, fail}) => {
|
|
498
|
+
const id = 'test-restore-' + Date.now();
|
|
499
|
+
const key = `accordion-persistent-id-${id}`;
|
|
500
|
+
window.localStorage.setItem(key, 'panel2');
|
|
501
|
+
|
|
502
|
+
const { container, accordion } = await createAccordion({ persistentId: id });
|
|
503
|
+
await new Promise(r => setTimeout(r, 50));
|
|
504
|
+
|
|
505
|
+
const panel1 = accordion.getPanel('panel1');
|
|
506
|
+
const panel2 = accordion.getPanel('panel2');
|
|
507
|
+
const panel3 = accordion.getPanel('panel3');
|
|
508
|
+
|
|
509
|
+
window.localStorage.removeItem(key);
|
|
510
|
+
cleanup(container);
|
|
511
|
+
|
|
512
|
+
if(panel1.active){
|
|
513
|
+
fail('panel1 should not be active');
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
if(!panel2.active){
|
|
517
|
+
fail('panel2 should be active (restored from localStorage)');
|
|
518
|
+
return;
|
|
519
|
+
}
|
|
520
|
+
if(panel3.active){
|
|
521
|
+
fail('panel3 should not be active');
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
pass('Open panel state restored from localStorage');
|
|
526
|
+
},
|
|
527
|
+
|
|
528
|
+
'persistent-id: should restore all-panels-closed state from localStorage': async ({pass, fail}) => {
|
|
529
|
+
const id = 'test-allclosed-' + Date.now();
|
|
530
|
+
const key = `accordion-persistent-id-${id}`;
|
|
531
|
+
window.localStorage.setItem(key, '');
|
|
532
|
+
|
|
533
|
+
const container = document.createElement('div');
|
|
534
|
+
container.innerHTML = `
|
|
535
|
+
<k-accordion persistent-id="${id}">
|
|
536
|
+
<k-accordion-header for-panel="p1">H1</k-accordion-header>
|
|
537
|
+
<k-accordion-panel name="p1" active>Content 1</k-accordion-panel>
|
|
538
|
+
<k-accordion-header for-panel="p2">H2</k-accordion-header>
|
|
539
|
+
<k-accordion-panel name="p2">Content 2</k-accordion-panel>
|
|
540
|
+
</k-accordion>
|
|
541
|
+
`;
|
|
542
|
+
document.body.appendChild(container);
|
|
543
|
+
|
|
544
|
+
const accordion = container.querySelector('k-accordion');
|
|
545
|
+
await accordion.updateComplete;
|
|
546
|
+
await new Promise(r => setTimeout(r, 50));
|
|
547
|
+
|
|
548
|
+
const p1 = accordion.getPanel('p1');
|
|
549
|
+
const p2 = accordion.getPanel('p2');
|
|
550
|
+
|
|
551
|
+
window.localStorage.removeItem(key);
|
|
552
|
+
cleanup(container);
|
|
553
|
+
|
|
554
|
+
if(p1.active){
|
|
555
|
+
fail('panel p1 should be closed (all-closed state restored), but it is active');
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
if(p2.active){
|
|
559
|
+
fail('panel p2 should be closed');
|
|
560
|
+
return;
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
pass('All-panels-closed state correctly restored from localStorage');
|
|
564
|
+
},
|
|
565
|
+
|
|
566
|
+
'persistent-id: should not restore when no localStorage entry exists': async ({pass, fail}) => {
|
|
567
|
+
const id = 'test-noentry-' + Date.now();
|
|
568
|
+
const key = `accordion-persistent-id-${id}`;
|
|
569
|
+
window.localStorage.removeItem(key);
|
|
570
|
+
|
|
571
|
+
const container = document.createElement('div');
|
|
572
|
+
container.innerHTML = `
|
|
573
|
+
<k-accordion persistent-id="${id}">
|
|
574
|
+
<k-accordion-header for-panel="p1">H1</k-accordion-header>
|
|
575
|
+
<k-accordion-panel name="p1" active>Content 1</k-accordion-panel>
|
|
576
|
+
<k-accordion-header for-panel="p2">H2</k-accordion-header>
|
|
577
|
+
<k-accordion-panel name="p2">Content 2</k-accordion-panel>
|
|
578
|
+
</k-accordion>
|
|
579
|
+
`;
|
|
580
|
+
document.body.appendChild(container);
|
|
581
|
+
|
|
582
|
+
const accordion = container.querySelector('k-accordion');
|
|
583
|
+
await accordion.updateComplete;
|
|
584
|
+
await new Promise(r => setTimeout(r, 50));
|
|
585
|
+
|
|
586
|
+
const p1 = accordion.getPanel('p1');
|
|
587
|
+
|
|
588
|
+
cleanup(container);
|
|
589
|
+
|
|
590
|
+
if(!p1.active){
|
|
591
|
+
fail('panel p1 should remain active when no localStorage entry exists');
|
|
592
|
+
return;
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
pass('HTML active attributes preserved when no localStorage entry exists');
|
|
596
|
+
},
|
|
597
|
+
|
|
598
|
+
'persistent-id: should save all-closed state to localStorage': async ({pass, fail}) => {
|
|
599
|
+
const id = 'test-saveclosed-' + Date.now();
|
|
600
|
+
const key = `accordion-persistent-id-${id}`;
|
|
601
|
+
window.localStorage.removeItem(key);
|
|
602
|
+
|
|
603
|
+
const { container, accordion } = await createAccordion({ persistentId: id });
|
|
604
|
+
|
|
605
|
+
accordion.openPanel('panel1');
|
|
606
|
+
await accordion.updateComplete;
|
|
607
|
+
await new Promise(r => setTimeout(r, 300));
|
|
608
|
+
|
|
609
|
+
accordion.closePanel('panel1');
|
|
610
|
+
await accordion.updateComplete;
|
|
611
|
+
await new Promise(r => setTimeout(r, 300));
|
|
612
|
+
|
|
613
|
+
const stored = window.localStorage.getItem(key);
|
|
614
|
+
window.localStorage.removeItem(key);
|
|
615
|
+
cleanup(container);
|
|
616
|
+
|
|
617
|
+
if(stored !== ''){
|
|
618
|
+
fail(`Expected localStorage to contain "" (empty string), got ${JSON.stringify(stored)}`);
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
pass('All-closed state saved as empty string in localStorage');
|
|
469
623
|
}
|
|
470
624
|
};
|
|
@@ -576,5 +576,90 @@ export default {
|
|
|
576
576
|
}
|
|
577
577
|
cleanup(container);
|
|
578
578
|
pass('Disabled items skipped in navigation');
|
|
579
|
+
},
|
|
580
|
+
|
|
581
|
+
/*
|
|
582
|
+
Shadow DOM Compatibility (composedPath)
|
|
583
|
+
*/
|
|
584
|
+
'should close when clicking outside via composedPath': async ({pass, fail}) => {
|
|
585
|
+
const { container, dropdown } = await createDropdown();
|
|
586
|
+
dropdown.open();
|
|
587
|
+
await dropdown.updateComplete;
|
|
588
|
+
const outside = document.createElement('div');
|
|
589
|
+
outside.textContent = 'outside';
|
|
590
|
+
document.body.appendChild(outside);
|
|
591
|
+
outside.click();
|
|
592
|
+
await dropdown.updateComplete;
|
|
593
|
+
if(dropdown.opened) {
|
|
594
|
+
cleanup(container);
|
|
595
|
+
outside.remove();
|
|
596
|
+
return fail('Dropdown should close on outside click');
|
|
597
|
+
}
|
|
598
|
+
cleanup(container);
|
|
599
|
+
outside.remove();
|
|
600
|
+
pass('Dropdown closes on outside click via composedPath');
|
|
601
|
+
},
|
|
602
|
+
|
|
603
|
+
'should not close when clicking inside menu with close-on-select false': async ({pass, fail}) => {
|
|
604
|
+
const { container, dropdown } = await createDropdown({ closeOnSelect: false });
|
|
605
|
+
dropdown.open();
|
|
606
|
+
await dropdown.updateComplete;
|
|
607
|
+
const item = dropdown.querySelector('[data-value="item1"]');
|
|
608
|
+
item.click();
|
|
609
|
+
await dropdown.updateComplete;
|
|
610
|
+
if(!dropdown.opened) {
|
|
611
|
+
cleanup(container);
|
|
612
|
+
return fail('Dropdown should stay open with close-on-select="false"');
|
|
613
|
+
}
|
|
614
|
+
cleanup(container);
|
|
615
|
+
pass('Dropdown stays open with close-on-select="false"');
|
|
616
|
+
},
|
|
617
|
+
|
|
618
|
+
/*
|
|
619
|
+
Host Styles
|
|
620
|
+
*/
|
|
621
|
+
'host should have white-space normal': async ({pass, fail}) => {
|
|
622
|
+
const { container, dropdown } = await createDropdown();
|
|
623
|
+
const style = getComputedStyle(dropdown);
|
|
624
|
+
if(style.whiteSpace !== 'normal') {
|
|
625
|
+
cleanup(container);
|
|
626
|
+
return fail(`Expected white-space: normal, got ${style.whiteSpace}`);
|
|
627
|
+
}
|
|
628
|
+
cleanup(container);
|
|
629
|
+
pass('Host has white-space: normal');
|
|
630
|
+
},
|
|
631
|
+
|
|
632
|
+
'trigger should have inline-flex display': async ({pass, fail}) => {
|
|
633
|
+
const { container, dropdown } = await createDropdown();
|
|
634
|
+
await dropdown.updateComplete;
|
|
635
|
+
const trigger = dropdown.shadowRoot.querySelector('#trigger');
|
|
636
|
+
const style = getComputedStyle(trigger);
|
|
637
|
+
if(style.display !== 'inline-flex') {
|
|
638
|
+
cleanup(container);
|
|
639
|
+
return fail(`Expected trigger display: inline-flex, got ${style.display}`);
|
|
640
|
+
}
|
|
641
|
+
cleanup(container);
|
|
642
|
+
pass('Trigger has inline-flex display');
|
|
643
|
+
},
|
|
644
|
+
|
|
645
|
+
'dropdown should not inflate height in pre-wrap context': async ({pass, fail}) => {
|
|
646
|
+
const container = document.createElement('div');
|
|
647
|
+
container.style.whiteSpace = 'pre-wrap';
|
|
648
|
+
container.innerHTML = `
|
|
649
|
+
<k-dropdown>
|
|
650
|
+
<button slot="trigger">T</button>
|
|
651
|
+
<button>Item</button>
|
|
652
|
+
</k-dropdown>
|
|
653
|
+
`;
|
|
654
|
+
document.body.appendChild(container);
|
|
655
|
+
const dropdown = container.querySelector('k-dropdown');
|
|
656
|
+
await dropdown.updateComplete;
|
|
657
|
+
const height = dropdown.getBoundingClientRect().height;
|
|
658
|
+
if(height > 60) {
|
|
659
|
+
cleanup(container);
|
|
660
|
+
return fail(`Dropdown height should not inflate in pre-wrap context, got ${height}px`);
|
|
661
|
+
}
|
|
662
|
+
cleanup(container);
|
|
663
|
+
pass('Dropdown does not inflate in pre-wrap context');
|
|
579
664
|
}
|
|
580
665
|
};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import '../../../src/components/htmlEditorNodes/HtmlComment.js';
|
|
2
|
+
|
|
3
|
+
const HenHtmlComment = customElements.get('k-hen-html-comment');
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
/*
|
|
7
|
+
Custom Element Registration
|
|
8
|
+
*/
|
|
9
|
+
'should register k-hen-html-comment element': async ({pass, fail}) => {
|
|
10
|
+
if(!HenHtmlComment) return fail('k-hen-html-comment should be registered');
|
|
11
|
+
pass('k-hen-html-comment is registered');
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
'should have static lexicalNode property': async ({pass, fail}) => {
|
|
15
|
+
if(!HenHtmlComment.lexicalNode) return fail('HenHtmlComment should have static lexicalNode');
|
|
16
|
+
if(HenHtmlComment.lexicalNode.getType() !== 'html-comment') return fail(`Expected type 'html-comment', got '${HenHtmlComment.lexicalNode.getType()}'`);
|
|
17
|
+
pass('lexicalNode property exists with correct type');
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
isVisualCompatible
|
|
22
|
+
*/
|
|
23
|
+
'isVisualCompatible should return true for comment nodes': async ({pass, fail}) => {
|
|
24
|
+
const commentNode = document.createComment('test');
|
|
25
|
+
if(!HenHtmlComment.lexicalNode.isVisualCompatible(commentNode)) return fail('Should return true for comment nodes');
|
|
26
|
+
pass('Returns true for comment nodes');
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
'isVisualCompatible should return false for element nodes': async ({pass, fail}) => {
|
|
30
|
+
const el = document.createElement('div');
|
|
31
|
+
if(HenHtmlComment.lexicalNode.isVisualCompatible(el)) return fail('Should return false for element nodes');
|
|
32
|
+
pass('Returns false for element nodes');
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
'isVisualCompatible should return false for text nodes': async ({pass, fail}) => {
|
|
36
|
+
const textNode = document.createTextNode('hello');
|
|
37
|
+
if(HenHtmlComment.lexicalNode.isVisualCompatible(textNode)) return fail('Should return false for text nodes');
|
|
38
|
+
pass('Returns false for text nodes');
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
preprocessHtml
|
|
43
|
+
*/
|
|
44
|
+
'preprocessHtml should convert comments to spans': async ({pass, fail}) => {
|
|
45
|
+
const result = HenHtmlComment.lexicalNode.preprocessHtml('<p>text <!-- hello --> more</p>');
|
|
46
|
+
if(result.includes('<!--')) return fail('Comment should be replaced');
|
|
47
|
+
if(!result.includes('data-html-comment=')) return fail(`Expected data-html-comment attribute, got '${result}'`);
|
|
48
|
+
if(!result.includes('<span')) return fail('Should convert to span element');
|
|
49
|
+
pass('Converts comments to spans');
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
'preprocessHtml should handle multiple comments': async ({pass, fail}) => {
|
|
53
|
+
const result = HenHtmlComment.lexicalNode.preprocessHtml('<!-- a --><!-- b -->');
|
|
54
|
+
const count = (result.match(/data-html-comment/g) || []).length;
|
|
55
|
+
if(count !== 2) return fail(`Expected 2 spans, got ${count}`);
|
|
56
|
+
pass('Handles multiple comments');
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
'preprocessHtml should handle multiline comments': async ({pass, fail}) => {
|
|
60
|
+
const result = HenHtmlComment.lexicalNode.preprocessHtml('<!-- line1\nline2 -->');
|
|
61
|
+
if(result.includes('<!--')) return fail('Multiline comment should be replaced');
|
|
62
|
+
if(!result.includes('data-html-comment')) return fail('Should produce data-html-comment attribute');
|
|
63
|
+
pass('Handles multiline comments');
|
|
64
|
+
},
|
|
65
|
+
|
|
66
|
+
'preprocessHtml should leave non-comment HTML untouched': async ({pass, fail}) => {
|
|
67
|
+
const html = '<p>No comments here</p>';
|
|
68
|
+
const result = HenHtmlComment.lexicalNode.preprocessHtml(html);
|
|
69
|
+
if(result !== html) return fail(`Should not modify non-comment HTML, got '${result}'`);
|
|
70
|
+
pass('Leaves non-comment HTML untouched');
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
'preprocessHtml should escape quotes in comment text': async ({pass, fail}) => {
|
|
74
|
+
const result = HenHtmlComment.lexicalNode.preprocessHtml('<!-- say "hello" -->');
|
|
75
|
+
if(result.includes('<!--')) return fail('Comment should be replaced');
|
|
76
|
+
if(!result.includes('"')) return fail('Quotes should be escaped in attribute');
|
|
77
|
+
pass('Escapes quotes in comment text');
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
/*
|
|
81
|
+
importDOM
|
|
82
|
+
*/
|
|
83
|
+
'importDOM should return span handler': async ({pass, fail}) => {
|
|
84
|
+
const domConfig = HenHtmlComment.lexicalNode.importDOM();
|
|
85
|
+
if(!domConfig || !domConfig.span) return fail('importDOM should return config with span key');
|
|
86
|
+
pass('importDOM returns span handler');
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
'importDOM span handler should return null for non-comment spans': async ({pass, fail}) => {
|
|
90
|
+
const domConfig = HenHtmlComment.lexicalNode.importDOM();
|
|
91
|
+
const span = document.createElement('span');
|
|
92
|
+
const result = domConfig.span(span);
|
|
93
|
+
if(result !== null) return fail('Should return null for spans without data-html-comment');
|
|
94
|
+
pass('Returns null for non-comment spans');
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
'importDOM span handler should return conversion for comment spans': async ({pass, fail}) => {
|
|
98
|
+
const domConfig = HenHtmlComment.lexicalNode.importDOM();
|
|
99
|
+
const span = document.createElement('span');
|
|
100
|
+
span.setAttribute('data-html-comment', 'test comment');
|
|
101
|
+
const result = domConfig.span(span);
|
|
102
|
+
if(!result) return fail('Should return conversion for comment spans');
|
|
103
|
+
if(!result.conversion) return fail('Result should have conversion function');
|
|
104
|
+
if(result.priority !== 2) return fail(`Expected priority 2, got ${result.priority}`);
|
|
105
|
+
pass('Returns conversion for comment spans');
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
/*
|
|
109
|
+
Lexical Node (static only - instance methods require active Lexical editor)
|
|
110
|
+
*/
|
|
111
|
+
'lexical node should have correct type': async ({pass, fail}) => {
|
|
112
|
+
if(HenHtmlComment.lexicalNode.getType() !== 'html-comment') return fail('Type should be html-comment');
|
|
113
|
+
pass('Type is html-comment');
|
|
114
|
+
}
|
|
115
|
+
};
|