kempo-ui 0.0.4 → 0.0.5
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/src/components/Dialog.js +35 -28
- package/dist/src/components/ShadowComponent.js +1 -1
- package/dist/src/components/Sortable.js +45 -0
- package/dist/src/components/Table.js +151 -0
- package/dist/src/components/Toast.js +141 -0
- package/dist/src/components/Toggle.js +74 -0
- package/dist/src/components/tableControls/DeleteRecord.js +7 -0
- package/dist/src/components/tableControls/Edit.js +18 -0
- package/dist/src/components/tableControls/ExportCSV.js +8 -0
- package/dist/src/components/tableControls/ExportJson.js +8 -0
- package/dist/src/components/tableControls/FieldSortHide.js +26 -0
- package/dist/src/components/tableControls/Filters.js +47 -0
- package/dist/src/components/tableControls/FirstPage.js +9 -0
- package/dist/src/components/tableControls/HiddenCount.js +3 -0
- package/dist/src/components/tableControls/Hide.js +5 -0
- package/dist/src/components/tableControls/LastPage.js +9 -0
- package/dist/src/components/tableControls/NextPage.js +9 -0
- package/dist/src/components/tableControls/PageSelect.js +22 -0
- package/dist/src/components/tableControls/PageSize.js +5 -0
- package/dist/src/components/tableControls/PrevPage.js +9 -0
- package/dist/src/components/tableControls/Search.js +9 -0
- package/dist/src/components/tableControls/ShowAll.js +5 -0
- package/dist/src/components/tableControls/TableControl.js +16 -0
- package/dist/src/utils/toTitleCase.js +1 -0
- package/docs/components/focus-capture.html +58 -13
- package/docs/components/hybrid-component.html +112 -0
- package/docs/components/icon.html +0 -2
- package/docs/components/light-component.html +99 -0
- package/docs/components/shadow-component.html +88 -0
- package/docs/components/sortable.html +132 -0
- package/docs/icons/error.svg +1 -1
- package/docs/icons/warning.svg +1 -1
- package/docs/index.html +197 -5
- package/docs/kempo.min.css +1 -1
- package/docs/nav.inc.html +11 -10
- package/docs/src/components/Dialog.js +35 -28
- package/docs/src/components/ShadowComponent.js +1 -1
- package/docs/src/components/Sortable.js +45 -0
- package/docs/src/components/Table.js +151 -0
- package/docs/src/components/Toast.js +141 -0
- package/docs/src/components/Toggle.js +74 -0
- package/docs/src/components/tableControls/DeleteRecord.js +7 -0
- package/docs/src/components/tableControls/Edit.js +18 -0
- package/docs/src/components/tableControls/ExportCSV.js +8 -0
- package/docs/src/components/tableControls/ExportJson.js +8 -0
- package/docs/src/components/tableControls/FieldSortHide.js +26 -0
- package/docs/src/components/tableControls/Filters.js +47 -0
- package/docs/src/components/tableControls/FirstPage.js +9 -0
- package/docs/src/components/tableControls/HiddenCount.js +3 -0
- package/docs/src/components/tableControls/Hide.js +5 -0
- package/docs/src/components/tableControls/LastPage.js +9 -0
- package/docs/src/components/tableControls/NextPage.js +9 -0
- package/docs/src/components/tableControls/PageSelect.js +22 -0
- package/docs/src/components/tableControls/PageSize.js +5 -0
- package/docs/src/components/tableControls/PrevPage.js +9 -0
- package/docs/src/components/tableControls/Search.js +9 -0
- package/docs/src/components/tableControls/ShowAll.js +5 -0
- package/docs/src/components/tableControls/TableControl.js +16 -0
- package/docs/src/utils/toTitleCase.js +1 -0
- package/docs/utils/drag.html +13 -28
- package/docs/utils/toTitleCase.html +71 -0
- package/package.json +1 -1
- package/scripts/build.js +3 -0
- package/src/components/Dialog.js +35 -27
- package/docs/src/utils/cli.js +0 -1
- package/docs/src/utils/fs-utils.js +0 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html,render}from"../../lit-all.min.js";import"../Icon.js";import Dialog from"../Dialog.js";export default class Filters extends TableControl{constructor(){super({maxWidth:40})}handleFilter=()=>{this.openDialog()};openDialog=()=>{const t={equals:"equals","not-equals":"does not equal",contains:"contains","not-contains":"does not contain","greater-than":"is greater than","greater-than-or-equal":"is greater than or equal to","less-than":"is less than","less-than-or-equal":"is less than or equal to"},e=document.createElement("div");render(html`
|
|
2
|
+
<h3 slot="title" class="m0 pyh px">Filters</h3>
|
|
3
|
+
<div class="p">
|
|
4
|
+
${0===this.table.filters.length?html`
|
|
5
|
+
<p>No Current Filters.</p>
|
|
6
|
+
`:html`
|
|
7
|
+
<h5>Current Filters</h5>
|
|
8
|
+
<ul id="currentFilters">
|
|
9
|
+
${this.table.filters.map(({field:e,condition:i,value:o})=>html`
|
|
10
|
+
<li
|
|
11
|
+
data-field="${e}"
|
|
12
|
+
data-condition="${i}"
|
|
13
|
+
data-value="${o}"
|
|
14
|
+
>
|
|
15
|
+
${e} ${t[i]} ${o}
|
|
16
|
+
<button class="remove-filter no-btn pq" @click="${t=>{this.table.removeFilter(e,i,o),l.close(),this.openDialog()}}">
|
|
17
|
+
<k-icon name="close"></k-icon>
|
|
18
|
+
</button>
|
|
19
|
+
</li>
|
|
20
|
+
`)}
|
|
21
|
+
</ul>
|
|
22
|
+
`}
|
|
23
|
+
<hr />
|
|
24
|
+
<h5>Add A Filter</h5>
|
|
25
|
+
<form id="addFilter" @submit="${t=>{t.preventDefault();const e=t.target;this.table.addFilter(e.filterField.value,e.filterCondition.value,e.filterValue.value),l.close(),this.openDialog()}}">
|
|
26
|
+
<select id="filterField" class="mb">
|
|
27
|
+
${this.table.fields.map(({name:t,label:e})=>html`
|
|
28
|
+
<option value="${t}">${e}</option>
|
|
29
|
+
`)}
|
|
30
|
+
</select>
|
|
31
|
+
<select id="filterCondition" class="mb">
|
|
32
|
+
${Object.entries(t).map(([t,e])=>html`
|
|
33
|
+
<option value="${t}" ?selected="${"contains"===t}">${e}</option>
|
|
34
|
+
`)}
|
|
35
|
+
</select>
|
|
36
|
+
<input id="filterValue" type="text" class="mb" />
|
|
37
|
+
<button type="submit" class="btn primary mb mr">Add Filter</button>
|
|
38
|
+
${0===this.table.filters.length?"":html`
|
|
39
|
+
<button type="button" class="btn danger mb mr" @click="${()=>{this.table.removeAllFilters(),l.close()}}">Clear All Filters</button>
|
|
40
|
+
`}
|
|
41
|
+
</form>
|
|
42
|
+
</div>
|
|
43
|
+
`,e);const l=Dialog.create(e,{width:"600px"})};render(){return html`
|
|
44
|
+
<button class="no-btn icon-btn" @click="${this.handleFilter}">
|
|
45
|
+
<k-icon name="filter"></k-icon>
|
|
46
|
+
</button>
|
|
47
|
+
`}}customElements.define("k-tc-filters",Filters);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class FirstPage extends TableControl{constructor(){super(),this.pageChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.table&&this.table.addEventListener("pageChange",this.pageChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&this.table.removeEventListener("pageChange",this.pageChangeHandler)}handleClick=()=>{this.table&&this.table.firstPage()};get isDisabled(){return!this.table||1===this.table.getCurrentPage()}render(){return html`
|
|
2
|
+
<button
|
|
3
|
+
class="no-btn icon-btn"
|
|
4
|
+
?disabled="${this.isDisabled}"
|
|
5
|
+
@click="${this.handleClick}"
|
|
6
|
+
>
|
|
7
|
+
<k-icon name="first"></k-icon>
|
|
8
|
+
</button>
|
|
9
|
+
`}}customElements.define("k-tc-first-page",FirstPage);
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";export default class HiddenCount extends TableControl{static properties={hiddenCount:{type:Number}};connectedCallback(){super.connectedCallback(),this.updateHiddenCount(),this.onTableEvent("recordHidden recordShown",this.handleHiddenChange)}handleHiddenChange=()=>{this.updateHiddenCount()};updateHiddenCount=()=>{this.hiddenCount=this.table?.getHiddenRecords().length||0};render(){return html`
|
|
2
|
+
<div class="pyq pxh"><span>${this.hiddenCount}</span> Hidden Records</div>
|
|
3
|
+
`}}customElements.define("k-tc-hidden-count",HiddenCount);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class Hide extends TableControl{constructor(){super({maxWidth:40})}handleHide=()=>{this.record&&this.table.hideRecord(this.record)};render(){return html`
|
|
2
|
+
<button class="no-btn icon-btn" @click="${this.handleHide}">
|
|
3
|
+
<k-icon name="hide"></k-icon>
|
|
4
|
+
</button>
|
|
5
|
+
`}}customElements.define("k-tc-hide",Hide);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class LastPage extends TableControl{constructor(){super(),this.pageChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.table&&this.table.addEventListener("pageChange",this.pageChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&this.table.removeEventListener("pageChange",this.pageChangeHandler)}handleClick=()=>{this.table&&this.table.lastPage()};get isDisabled(){return!this.table||this.table.getCurrentPage()===this.table.getTotalPages()}render(){return html`
|
|
2
|
+
<button
|
|
3
|
+
class="no-btn icon-btn"
|
|
4
|
+
?disabled="${this.isDisabled}"
|
|
5
|
+
@click="${this.handleClick}"
|
|
6
|
+
>
|
|
7
|
+
<k-icon name="last"></k-icon>
|
|
8
|
+
</button>
|
|
9
|
+
`}}customElements.define("k-tc-last-page",LastPage);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class NextPage extends TableControl{constructor(){super(),this.pageChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.table&&this.table.addEventListener("pageChange",this.pageChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&this.table.removeEventListener("pageChange",this.pageChangeHandler)}handleClick=()=>{this.table&&this.table.nextPage()};get isDisabled(){return!this.table||this.table.getCurrentPage()===this.table.getTotalPages()}render(){return html`
|
|
2
|
+
<button
|
|
3
|
+
class="no-btn icon-btn"
|
|
4
|
+
?disabled="${this.isDisabled}"
|
|
5
|
+
@click="${this.handleClick}"
|
|
6
|
+
>
|
|
7
|
+
<k-icon name="chevron-right"></k-icon>
|
|
8
|
+
</button>
|
|
9
|
+
`}}customElements.define("k-tc-next-page",NextPage);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html,css}from"../../lit-all.min.js";export default class PageSelect extends TableControl{static properties={...TableControl.properties,currentPage:{type:Number,state:!0},totalPages:{type:Number,state:!0}};constructor(){super({maxWidth:null}),this.currentPage=1,this.totalPages=1}connectedCallback(){super.connectedCallback(),this.onTableEvent("pageChange",this.handlePageChange),this.onTableEvent("pageSizeChange",this.handlePageSizeChange),this.onTableEvent("pageCountChanged",this.handlePageCountChange)}disconnectedCallback(){super.disconnectedCallback(),this.table&&(this.table.removeEventListener("pageChange",this.handlePageChange),this.table.removeEventListener("pageSizeChange",this.handlePageSizeChange),this.table.removeEventListener("pageCountChanged",this.handlePageCountChange))}handlePageChange=()=>{this.table&&(this.currentPage=this.table.getCurrentPage())};handlePageSizeChange=()=>{this.table&&(this.currentPage=this.table.getCurrentPage(),this.totalPages=this.table.getTotalPages())};handlePageCountChange=()=>{this.table&&(this.totalPages=this.table.getTotalPages())};handleSelectChange=e=>{this.table&&this.table.setPage(parseInt(e.target.value))};render(){if(!this.table)return html`<div>No table found</div>`;const e=[];for(let t=1;t<=this.totalPages;t++)e.push(html`<option value="${t}" ?selected="${t===this.currentPage}">Page ${t}</option>`);return html`
|
|
2
|
+
<div class="page-select">
|
|
3
|
+
<select class="no-btn ph b r" @change="${this.handleSelectChange}" ?disabled="${this.totalPages<=1}">
|
|
4
|
+
${e}
|
|
5
|
+
</select>
|
|
6
|
+
<label> out of ${this.totalPages}</label>
|
|
7
|
+
</div>
|
|
8
|
+
`}static styles=css`
|
|
9
|
+
${TableControl.styles}
|
|
10
|
+
|
|
11
|
+
.page-select {
|
|
12
|
+
display: flex;
|
|
13
|
+
align-items: center;
|
|
14
|
+
gap: 0.25rem;
|
|
15
|
+
white-space: nowrap;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
label {
|
|
19
|
+
padding: 0;
|
|
20
|
+
margin: 0;
|
|
21
|
+
}
|
|
22
|
+
`}customElements.define("k-tc-page-select",PageSelect);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";export default class PageSize extends TableControl{constructor(){super({maxWidth:null}),this.pageChangeHandler=()=>this.requestUpdate(),this.pageSizeChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.onTableEvent("pageChange",this.pageChangeHandler),this.onTableEvent("pageSizeChange",this.pageSizeChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&(this.table.removeEventListener("pageChange",this.pageChangeHandler),this.table.removeEventListener("pageSizeChange",this.pageSizeChangeHandler))}handleChange=e=>{this.table&&this.table.setPageSize(parseInt(e.target.value))};get currentPageSize(){return this.table?this.table.getPageSize():10}get pageSizeOptions(){return this.table?this.table.pageSizeOptions:[10,25,50,100,500]}render(){return html`
|
|
2
|
+
<select class="no-btn ph b r" @change="${this.handleChange}">
|
|
3
|
+
${this.pageSizeOptions.map(e=>html`<option value="${e}" ?selected="${e===this.currentPageSize}">${e} per page</option>`)}
|
|
4
|
+
</select>
|
|
5
|
+
`}}customElements.define("k-tc-page-size",PageSize);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class PrevPage extends TableControl{constructor(){super(),this.pageChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.table&&this.table.addEventListener("pageChange",this.pageChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&this.table.removeEventListener("pageChange",this.pageChangeHandler)}handleClick=()=>{this.table&&this.table.prevPage()};get isDisabled(){return!this.table||1===this.table.getCurrentPage()}render(){return html`
|
|
2
|
+
<button
|
|
3
|
+
class="no-btn icon-btn"
|
|
4
|
+
?disabled="${this.isDisabled}"
|
|
5
|
+
@click="${this.handleClick}"
|
|
6
|
+
>
|
|
7
|
+
<k-icon name="chevron-left"></k-icon>
|
|
8
|
+
</button>
|
|
9
|
+
`}}customElements.define("k-tc-prev-page",PrevPage);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import debounce from"../../utils/debounce.js";export default class Search extends TableControl{static properties={searchTerm:{type:String}};constructor(){super({maxWidth:200}),this.debouncedSearch=debounce(this.performSearch,200)}handleInput=e=>{this.searchTerm=e.target.value,this.debouncedSearch()};performSearch=()=>{this.table&&(!this.searchTerm||this.searchTerm.length<3?this.table.showAllRecords():this.table.search(this.searchTerm))};render(){return html`
|
|
2
|
+
<input
|
|
3
|
+
type="search"
|
|
4
|
+
placeholder="Search"
|
|
5
|
+
class="px pyh"
|
|
6
|
+
.value="${this.searchTerm||""}"
|
|
7
|
+
@input="${this.handleInput}"
|
|
8
|
+
/>
|
|
9
|
+
`}}customElements.define("k-tc-search",Search);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class ShowAll extends TableControl{constructor(){super({maxWidth:40})}handleShowAll=()=>{this.table&&this.table.showAllRecords()};render(){return html`
|
|
2
|
+
<button class="no-btn icon-btn" @click="${this.handleShowAll}">
|
|
3
|
+
<k-icon name="show"></k-icon>
|
|
4
|
+
</button>
|
|
5
|
+
`}}customElements.define("k-tc-show-all",ShowAll);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import ShadowComponent from"../ShadowComponent.js";import{html,css}from"../../lit-all.min.js";export default class TableControl extends ShadowComponent{static properties={maxWidth:{type:Number,reflect:!0,attribute:"max-width"}};constructor({maxWidth:t=40}={}){super(),this.maxWidth=t}updated(t){super.updated(t),t.has("maxWidth")&&(this.maxWidth?this.style.setProperty("--max-width",`${this.maxWidth}px`):this.style.removeProperty("--max-width"))}firstUpdated(){this.maxWidth?this.style.setProperty("--max-width",`${this.maxWidth}px`):this.style.removeProperty("--max-width")}get table(){return this.getRootNode()instanceof ShadowRoot?this.getRootNode().host.closest("k-table"):this.closest("k-table")}get record(){if(this.getRootNode()instanceof ShadowRoot){const t=this.closest(".record");if(t){const e=t.dataset.index;if(void 0!==e)return this.table.records[e]}}return!1}async onTableEvent(t,e){if(await customElements.whenDefined("k-table"),this.table){t.split(" ").forEach(t=>{this.table.addEventListener(t,e)}),this.requestUpdate()}}static styles=css`
|
|
2
|
+
:host {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.icon-btn {
|
|
7
|
+
display: inline-flex !important;
|
|
8
|
+
align-items: center;
|
|
9
|
+
justify-content: center;
|
|
10
|
+
width: 40px;
|
|
11
|
+
height: 40px;
|
|
12
|
+
}
|
|
13
|
+
.icon-btn:disabled {
|
|
14
|
+
opacity: 0.6;
|
|
15
|
+
}
|
|
16
|
+
`}customElements.define("k-table-control",TableControl);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const toTitleCase=e=>e.replace(/([A-Z])/g," $1").split(/[\s_-]+/).filter(e=>e.length>0).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ");export default toTitleCase;
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
<div class="m mt0 pl">
|
|
23
23
|
<h6>Examples</h6>
|
|
24
24
|
<a href="#basicUsage">Basic Usage</a><br />
|
|
25
|
+
<a href="#dialogExample">Dialog Example</a><br />
|
|
25
26
|
|
|
26
27
|
<h6 class="mt">JavaScript Reference</h6>
|
|
27
28
|
<a href="#constructor">Constructor</a><br />
|
|
@@ -31,37 +32,81 @@
|
|
|
31
32
|
</div>
|
|
32
33
|
</details>
|
|
33
34
|
|
|
34
|
-
<h3>Description</h3>
|
|
35
|
-
<p>The <code>FocusCapture</code> class extends the <a href="./lazy-component.html">LazyComponent</a> class and provides functionality to capture focus within the component.</p>
|
|
36
|
-
|
|
37
35
|
<h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
|
|
38
|
-
<p>
|
|
39
|
-
<
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
<p>The <code>k-focus-capture</code> component traps focus within its children. When focus reaches the end of the focusable elements, it cycles back to the first focusable element. This is useful for modal dialogs, side menus, or any UI where you want to keep focus contained within a specific area.</p>
|
|
37
|
+
<div class="row -mx">
|
|
38
|
+
<div class="col m-span-12 px">
|
|
39
|
+
<k-card label="HTML">
|
|
40
|
+
<pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">k-focus-capture</span>></span><br /> <span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"card"</span>></span><br /> <span class="hljs-tag"><<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span>></span>First Button<span class="hljs-tag"></<span class="hljs-name">button</span>></span><br /> <span class="hljs-tag"><<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Input field"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span> /></span><br /> <span class="hljs-tag"><<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span>></span>Second Button<span class="hljs-tag"></<span class="hljs-name">button</span>></span><br /> <span class="hljs-tag"><<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"d-b mb"</span>></span>Link<span class="hljs-tag"></<span class="hljs-name">a</span>></span><br /> <span class="hljs-tag"></<span class="hljs-name">div</span>></span><br /><span class="hljs-tag"></<span class="hljs-name">k-focus-capture</span>></span></code></pre>
|
|
41
|
+
</k-card>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="col m-span-12 px">
|
|
44
|
+
<k-card label="Output">
|
|
45
|
+
<p class="mb"><em>Tab through the elements below. Focus will cycle back to the first element after the last one.</em></p>
|
|
46
|
+
<k-focus-capture>
|
|
47
|
+
<div class="card">
|
|
48
|
+
<button class="mb">First Button</button>
|
|
49
|
+
<input type="text" placeholder="Input field" class="mb" />
|
|
50
|
+
<button class="mb">Second Button</button>
|
|
51
|
+
<a href="#" class="d-b mb">Link</a>
|
|
52
|
+
</div>
|
|
53
|
+
</k-focus-capture>
|
|
54
|
+
</k-card>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<h3 id="dialogExample"><a href="#dialogExample" class="no-link">Dialog Example</a></h3>
|
|
59
|
+
<p>FocusCapture is used internally by the <a href="dialog.html">Dialog</a> and <a href="side-menu.html">SideMenu</a> components. You do not need to add it yourself. Open the dialog below and tab through the elements to see how focus is trapped within the dialog.</p>
|
|
60
|
+
<div class="row -mx">
|
|
61
|
+
<div class="col m-span-12 px">
|
|
62
|
+
<k-card label="HTML">
|
|
63
|
+
<pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">k-dialog</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"focusDialog"</span> <span class="hljs-attr">cancel-text</span>=<span class="hljs-string">"Close"</span> <span class="hljs-attr">confirm-text</span>=<span class="hljs-string">"Submit"</span>></span><br /> <span class="hljs-tag"><<span class="hljs-name">h6</span> <span class="hljs-attr">slot</span>=<span class="hljs-string">"title"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"m0 px"</span>></span>Focus Capture Dialog<span class="hljs-tag"></<span class="hljs-name">h6</span>></span><br /> <span class="hljs-tag"><<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p"</span>></span><br /> <span class="hljs-tag"><<span class="hljs-name">p</span>></span>Tab through the elements. Focus stays trapped in the dialog.<span class="hljs-tag"></<span class="hljs-name">p</span>></span><br /> <span class="hljs-tag"><<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Name"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span> /></span><br /> <span class="hljs-tag"><<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"email"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Email"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span> /></span><br /> <span class="hljs-tag"></<span class="hljs-name">div</span>></span><br /><span class="hljs-tag"></<span class="hljs-name">k-dialog</span>></span><br /><span class="hljs-tag"><<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">"document.getElementById('focusDialog').open()"</span>></span>Open Dialog<span class="hljs-tag"></<span class="hljs-name">button</span>></span></code></pre>
|
|
64
|
+
</k-card>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="col m-span-12 px">
|
|
67
|
+
<k-card label="Output">
|
|
68
|
+
<button onclick="document.getElementById('focusDialog').open()">Open Dialog</button>
|
|
69
|
+
<k-dialog
|
|
70
|
+
id="focusDialog"
|
|
71
|
+
cancel-text="Close"
|
|
72
|
+
confirm-text="Submit"
|
|
73
|
+
>
|
|
74
|
+
<h6 slot="title" class="m0 px">Focus Capture Dialog</h6>
|
|
75
|
+
<div class="p">
|
|
76
|
+
<p>Tab through the elements. Focus stays trapped in the dialog.</p>
|
|
77
|
+
<input type="text" placeholder="Name" class="mb" />
|
|
78
|
+
<input type="email" placeholder="Email" class="mb" />
|
|
79
|
+
</div>
|
|
80
|
+
</k-dialog>
|
|
81
|
+
</k-card>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
44
84
|
|
|
45
85
|
<h2 id="jsRef">JavaScript Reference</h2>
|
|
46
86
|
|
|
47
87
|
<h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
|
|
48
|
-
<h6>Extends
|
|
88
|
+
<h6>Extends LitElement</h6>
|
|
49
89
|
<h5>
|
|
50
90
|
<code>new FocusCapture()</code>
|
|
51
91
|
</h5>
|
|
52
92
|
|
|
53
93
|
<h3 id="requirements"><a href="#requirements" class="no-link">Requirements</a></h3>
|
|
54
94
|
<ul>
|
|
55
|
-
<li
|
|
95
|
+
<li>Lit</li>
|
|
56
96
|
</ul>
|
|
57
97
|
|
|
58
98
|
<h3 id="properties"><a href="#properties" class="no-link">Properties</a></h3>
|
|
59
|
-
<
|
|
99
|
+
<h5><code>afterFocus<i>: function</i></code></h5>
|
|
100
|
+
<p>A method that is called when focus reaches the end capture element. By default, it finds the first focusable element within the component and focuses it. Focusable elements include: <code>button</code>, <code>[href]</code>, <code>input</code>, <code>select</code>, <code>textarea</code>, and <code>[tabindex]:not([tabindex="-1"])</code>.</p>
|
|
60
101
|
|
|
61
102
|
<h3 id="methods"><a href="#methods" class="no-link">Methods</a></h3>
|
|
62
|
-
<
|
|
103
|
+
<h5><code>render()<i>: TemplateResult</i></code></h5>
|
|
104
|
+
<p>Renders the component with a slot for children and an invisible div with <code>tabindex="0"</code> that captures focus and cycles it back to the beginning.</p>
|
|
63
105
|
|
|
64
106
|
</main>
|
|
107
|
+
<div style="height:33vh"></div>
|
|
65
108
|
<script type="module" src="../src/components/Import.js"></script>
|
|
109
|
+
<script type="module" src="../src/components/FocusCapture.js"></script>
|
|
110
|
+
<script type="module" src="../src/components/Dialog.js"></script>
|
|
66
111
|
</body>
|
|
67
112
|
</html>
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>HybridComponent - Base Components - Kempo Docs - A Web Components Solution</title>
|
|
7
|
+
<link rel="stylesheet" href="../src/kempo-vars.css" /><link rel="stylesheet" href="../kempo.min.css" />
|
|
8
|
+
<link rel="stylesheet" href="../src/kempo-hljs.css" />`n <link rel="stylesheet" href="../styles.css" />
|
|
9
|
+
<script type="module">
|
|
10
|
+
import Import from '../src/components/Import.js';
|
|
11
|
+
import Icon from '../src/components/Icon.js';
|
|
12
|
+
Import.replacements.root = '../';
|
|
13
|
+
Icon.pathToIcons = ['../icons'];
|
|
14
|
+
</script>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<k-import src="../nav.inc.html"></k-import>
|
|
18
|
+
<h1 class="ta-center">HybridComponent</h1>
|
|
19
|
+
<main>
|
|
20
|
+
<details class="b r mb">
|
|
21
|
+
<summary class="p">Table of Contents</summary>
|
|
22
|
+
<div class="m mt0 pl">
|
|
23
|
+
<h6>Guide</h6>
|
|
24
|
+
<a href="#overview">Overview</a><br />
|
|
25
|
+
<a href="#basicUsage">Basic Usage</a><br />
|
|
26
|
+
<a href="#whenToUse">When to Use</a><br />
|
|
27
|
+
|
|
28
|
+
<h6 class="mt">JavaScript Reference</h6>
|
|
29
|
+
<a href="#constructor">Constructor</a><br />
|
|
30
|
+
<a href="#requirements">Requirements</a><br />
|
|
31
|
+
<a href="#properties">Properties</a><br />
|
|
32
|
+
<a href="#methods">Methods</a><br />
|
|
33
|
+
</div>
|
|
34
|
+
</details>
|
|
35
|
+
|
|
36
|
+
<h3 id="overview"><a href="#overview" class="no-link">Overview</a></h3>
|
|
37
|
+
<p>HybridComponent is a base class that extends <a href="shadow-component.html">ShadowComponent</a> and provides both shadow DOM rendering with Kempo CSS styles AND light DOM rendering. Use this when you want your component to:</p>
|
|
38
|
+
<ul>
|
|
39
|
+
<li>Have shadow DOM with Kempo CSS for internal UI elements</li>
|
|
40
|
+
<li>Also render content to the light DOM alongside natural children</li>
|
|
41
|
+
<li>Combine the benefits of both shadow and light DOM</li>
|
|
42
|
+
</ul>
|
|
43
|
+
<p>Components like <a href="collapsible.html">Collapsible</a>, <a href="dialog.html">Dialog</a>, and <a href="side-menu.html">SideMenu</a> extend HybridComponent.</p>
|
|
44
|
+
|
|
45
|
+
<h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
|
|
46
|
+
<p>Create a custom component by extending HybridComponent and implementing both <code>render()</code> for shadow DOM and <code>renderLightDom()</code> for light DOM:</p>
|
|
47
|
+
<pre><code class="hljs javascript"><span class="hljs-keyword">import</span> HybridComponent <span class="hljs-keyword">from</span> <span class="hljs-string">'./HybridComponent.js'</span>;<br /><span class="hljs-keyword">import</span> { html, css } <span class="hljs-keyword">from</span> <span class="hljs-string">'../lit-all.min.js'</span>;<br /><br /><span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">MyHybridComponent</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">HybridComponent</span> {<br /> <span class="hljs-keyword">static</span> properties = {<br /> <span class="hljs-attr">title</span>: { <span class="hljs-attr">type</span>: <span class="hljs-title class_">String</span> }<br /> };<br /><br /> <span class="hljs-keyword">static</span> styles = css<span class="hljs-string">`<br /> :host {<br /> display: block;<br /> }<br /> .shadow-content {<br /> background: var(--c_primary);<br /> color: var(--tc_on_primary);<br /> padding: var(--spacer);<br /> }<br /> `</span>;<br /><br /> <span class="hljs-title function_">constructor</span>() {<br /> <span class="hljs-variable language_">super</span>();<br /> <span class="hljs-variable language_">this</span>.title = <span class="hljs-string">'Hybrid'</span>;<br /> }<br /><br /> <span class="hljs-comment">// Shadow DOM content with Kempo CSS styles</span><br /> <span class="hljs-title function_">render</span>() {<br /> <span class="hljs-keyword">return</span> html<span class="hljs-string">`<br /> <div class="shadow-content"><br /> <h3><span class="hljs-subst">${<span class="hljs-variable language_">this</span>.title}</span> Component</h3><br /> <slot name="lightRoot"></slot><br /> </div><br /> `</span>;<br /> }<br /><br /> <span class="hljs-comment">// Light DOM content alongside natural children</span><br /> <span class="hljs-title function_">renderLightDom</span>() {<br /> <span class="hljs-keyword">return</span> html<span class="hljs-string">`<br /> <p class="p">This is rendered to light DOM</p><br /> <slot></slot><br /> `</span>;<br /> }<br />}<br /><br /><span class="hljs-variable language_">customElements</span>.<span class="hljs-title function_">define</span>(<span class="hljs-string">'my-hybrid-component'</span>, MyHybridComponent);</code></pre>
|
|
48
|
+
|
|
49
|
+
<p><strong>Important:</strong> The default <code>render()</code> method includes <code><slot name="lightRoot"></slot></code> which is where the light DOM content appears. If you override <code>render()</code>, make sure to include this slot.</p>
|
|
50
|
+
|
|
51
|
+
<p><strong>Also Important:</strong> Always call <code>super.updated()</code> when overriding the <code>updated()</code> lifecycle method:</p>
|
|
52
|
+
<pre><code class="hljs javascript"><span class="hljs-title function_">updated</span>(changedProperties) {<br /> <span class="hljs-variable language_">super</span>.<span class="hljs-title function_">updated</span>(); <span class="hljs-comment">// Required!</span><br /> <br /> <span class="hljs-comment">// Your custom logic here</span><br />}</code></pre>
|
|
53
|
+
|
|
54
|
+
<h3 id="whenToUse"><a href="#whenToUse" class="no-link">When to Use</a></h3>
|
|
55
|
+
<p>Use HybridComponent when:</p>
|
|
56
|
+
<ul>
|
|
57
|
+
<li>You need styled internal UI elements (buttons, headers, etc.) in shadow DOM</li>
|
|
58
|
+
<li>You also need to render content to light DOM alongside natural children</li>
|
|
59
|
+
<li>You want Kempo CSS styles for your component UI but need flexibility for user content</li>
|
|
60
|
+
</ul>
|
|
61
|
+
|
|
62
|
+
<p><strong>Example use cases:</strong></p>
|
|
63
|
+
<ul>
|
|
64
|
+
<li><strong>Dialog:</strong> Shadow DOM for styled dialog chrome (header, footer, overlay), light DOM for user content</li>
|
|
65
|
+
<li><strong>Collapsible:</strong> Shadow DOM for toggle button, light DOM for collapsible content</li>
|
|
66
|
+
<li><strong>SideMenu:</strong> Shadow DOM for menu structure and styling, light DOM for menu items</li>
|
|
67
|
+
</ul>
|
|
68
|
+
|
|
69
|
+
<p>Use <a href="shadow-component.html">ShadowComponent</a> instead when you only need shadow DOM.</p>
|
|
70
|
+
<p>Use <a href="light-component.html">LightComponent</a> instead when you only need light DOM.</p>
|
|
71
|
+
|
|
72
|
+
<h2 id="jsRef">JavaScript Reference</h2>
|
|
73
|
+
|
|
74
|
+
<h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
|
|
75
|
+
<h6>Extends ShadowComponent</h6>
|
|
76
|
+
<h5><code>new HybridComponent()</code></h5>
|
|
77
|
+
<p>Creates a new HybridComponent instance with both shadow DOM (with Kempo CSS) and light DOM rendering.</p>
|
|
78
|
+
|
|
79
|
+
<h3 id="requirements"><a href="#requirements" class="no-link">Requirements</a></h3>
|
|
80
|
+
<ul>
|
|
81
|
+
<li>Lit (html, render)</li>
|
|
82
|
+
<li><a href="shadow-component.html">ShadowComponent</a></li>
|
|
83
|
+
</ul>
|
|
84
|
+
|
|
85
|
+
<h3 id="properties"><a href="#properties" class="no-link">Properties</a></h3>
|
|
86
|
+
<h5><code>lightRoot<i>: HTMLElement</i></code></h5>
|
|
87
|
+
<p>A container element with <code>display: contents</code> that holds the rendered light DOM content. It has <code>slot="lightRoot"</code> to connect it to the shadow DOM slot. Created automatically by <code>createRenderRoot()</code>.</p>
|
|
88
|
+
|
|
89
|
+
<h3 id="methods"><a href="#methods" class="no-link">Methods</a></h3>
|
|
90
|
+
<h5><code>createRenderRoot()<i>: Element</i></code></h5>
|
|
91
|
+
<p>Creates both shadow DOM (via <code>super.createRenderRoot()</code>) and light DOM render containers. This method:</p>
|
|
92
|
+
<ul>
|
|
93
|
+
<li>Calls the parent ShadowComponent's <code>createRenderRoot()</code> to set up shadow DOM with Kempo CSS</li>
|
|
94
|
+
<li>Creates a <code>lightRoot</code> div with <code>display: contents</code> and <code>slot="lightRoot"</code></li>
|
|
95
|
+
<li>Appends <code>lightRoot</code> to the component element</li>
|
|
96
|
+
<li>Returns the shadow render container</li>
|
|
97
|
+
</ul>
|
|
98
|
+
|
|
99
|
+
<h5><code>updated()<i>: void</i></code></h5>
|
|
100
|
+
<p>Called automatically by Lit when the component updates. Renders the result of <code>renderLightDom()</code> into <code>lightRoot</code>. Override this method if needed, but always call <code>super.updated()</code>.</p>
|
|
101
|
+
|
|
102
|
+
<h5><code>renderLightDom()<i>: TemplateResult</i></code></h5>
|
|
103
|
+
<p>Override this method to define what should be rendered to the light DOM. Returns an empty template by default. Use Lit's <code>html</code> tagged template literal to return your content. Typically includes a <code><slot></slot></code> for natural children.</p>
|
|
104
|
+
|
|
105
|
+
<h5><code>render()<i>: TemplateResult</i></code></h5>
|
|
106
|
+
<p>Override this method to define what should be rendered to the shadow DOM. The default implementation returns <code>html`<slot name="lightRoot"></slot>`</code> which displays the light DOM content. When overriding, make sure to include this slot where you want the light DOM content to appear.</p>
|
|
107
|
+
|
|
108
|
+
</main>
|
|
109
|
+
<div style="height:33vh"></div>
|
|
110
|
+
<script type="module" src="../src/components/Import.js"></script>
|
|
111
|
+
</body>
|
|
112
|
+
</html>
|
|
@@ -10,10 +10,8 @@
|
|
|
10
10
|
<script type="module">
|
|
11
11
|
import Import from '../src/components/Import.js';
|
|
12
12
|
import Icon from '../src/components/Icon.js';
|
|
13
|
-
// import Search from '../src/components/Search.js';
|
|
14
13
|
Import.replacements.root = '../';
|
|
15
14
|
Icon.pathToIcons = ['../icons'];
|
|
16
|
-
// Search.searchDataUrl = '../search.json';
|
|
17
15
|
</script>
|
|
18
16
|
</head>
|
|
19
17
|
<body>
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>LightComponent - Base Components - Kempo Docs - A Web Components Solution</title>
|
|
7
|
+
<link rel="stylesheet" href="../src/kempo-vars.css" /><link rel="stylesheet" href="../kempo.min.css" />
|
|
8
|
+
<link rel="stylesheet" href="../src/kempo-hljs.css" />`n <link rel="stylesheet" href="../styles.css" />
|
|
9
|
+
<script type="module">
|
|
10
|
+
import Import from '../src/components/Import.js';
|
|
11
|
+
import Icon from '../src/components/Icon.js';
|
|
12
|
+
Import.replacements.root = '../';
|
|
13
|
+
Icon.pathToIcons = ['../icons'];
|
|
14
|
+
</script>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<k-import src="../nav.inc.html"></k-import>
|
|
18
|
+
<h1 class="ta-center">LightComponent</h1>
|
|
19
|
+
<main>
|
|
20
|
+
<details class="b r mb">
|
|
21
|
+
<summary class="p">Table of Contents</summary>
|
|
22
|
+
<div class="m mt0 pl">
|
|
23
|
+
<h6>Guide</h6>
|
|
24
|
+
<a href="#overview">Overview</a><br />
|
|
25
|
+
<a href="#basicUsage">Basic Usage</a><br />
|
|
26
|
+
<a href="#whenToUse">When to Use</a><br />
|
|
27
|
+
|
|
28
|
+
<h6 class="mt">JavaScript Reference</h6>
|
|
29
|
+
<a href="#constructor">Constructor</a><br />
|
|
30
|
+
<a href="#requirements">Requirements</a><br />
|
|
31
|
+
<a href="#properties">Properties</a><br />
|
|
32
|
+
<a href="#methods">Methods</a><br />
|
|
33
|
+
</div>
|
|
34
|
+
</details>
|
|
35
|
+
|
|
36
|
+
<h3 id="overview"><a href="#overview" class="no-link">Overview</a></h3>
|
|
37
|
+
<p>LightComponent is a base class that extends LitElement and renders directly to the light DOM instead of shadow DOM. Use this when you want your component to:</p>
|
|
38
|
+
<ul>
|
|
39
|
+
<li>Render content in the light DOM (no shadow DOM encapsulation)</li>
|
|
40
|
+
<li>Allow global CSS to style component content</li>
|
|
41
|
+
<li>Interact naturally with parent page styles</li>
|
|
42
|
+
<li>Support natural children alongside rendered content</li>
|
|
43
|
+
</ul>
|
|
44
|
+
<p>Components like <a href="persistant-collapsible.html">PersistantCollapsible</a> and <a href="theme-switcher.html">ThemeSwitcher</a> extend LightComponent.</p>
|
|
45
|
+
|
|
46
|
+
<h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
|
|
47
|
+
<p>Create a custom component by extending LightComponent and implementing <code>renderLightDom()</code>:</p>
|
|
48
|
+
<pre><code class="hljs javascript"><span class="hljs-keyword">import</span> LightComponent <span class="hljs-keyword">from</span> <span class="hljs-string">'./LightComponent.js'</span>;<br /><span class="hljs-keyword">import</span> { html } <span class="hljs-keyword">from</span> <span class="hljs-string">'../lit-all.min.js'</span>;<br /><br /><span class="hljs-keyword">export</span> <span class="hljs-keyword">default</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">MyLightComponent</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">LightComponent</span> {<br /> <span class="hljs-keyword">static</span> properties = {<br /> <span class="hljs-attr">message</span>: { <span class="hljs-attr">type</span>: <span class="hljs-title class_">String</span> }<br /> };<br /><br /> <span class="hljs-title function_">constructor</span>() {<br /> <span class="hljs-variable language_">super</span>();<br /> <span class="hljs-variable language_">this</span>.message = <span class="hljs-string">'Hello'</span>;<br /> }<br /><br /> <span class="hljs-title function_">renderLightDom</span>() {<br /> <span class="hljs-keyword">return</span> html<span class="hljs-string">`<br /> <div class="card p"><br /> <p><span class="hljs-subst">${<span class="hljs-variable language_">this</span>.message}</span> from Light DOM!</p><br /> </div><br /> `</span>;<br /> }<br />}<br /><br /><span class="hljs-variable language_">customElements</span>.<span class="hljs-title function_">define</span>(<span class="hljs-string">'my-light-component'</span>, MyLightComponent);</code></pre>
|
|
49
|
+
|
|
50
|
+
<p><strong>Important:</strong> Always call <code>super.updated()</code> when overriding the <code>updated()</code> lifecycle method:</p>
|
|
51
|
+
<pre><code class="hljs javascript"><span class="hljs-title function_">updated</span>(changedProperties) {<br /> <span class="hljs-variable language_">super</span>.<span class="hljs-title function_">updated</span>(); <span class="hljs-comment">// Required!</span><br /> <br /> <span class="hljs-comment">// Your custom logic here</span><br /> <span class="hljs-keyword">if</span>(changedProperties.<span class="hljs-title function_">has</span>(<span class="hljs-string">'message'</span>)) {<br /> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'Message changed'</span>);<br /> }<br />}</code></pre>
|
|
52
|
+
|
|
53
|
+
<h3 id="whenToUse"><a href="#whenToUse" class="no-link">When to Use</a></h3>
|
|
54
|
+
<p>Use LightComponent when:</p>
|
|
55
|
+
<ul>
|
|
56
|
+
<li>You want global page styles to apply to your component</li>
|
|
57
|
+
<li>You need to render alongside natural children</li>
|
|
58
|
+
<li>Shadow DOM encapsulation would interfere with your component's purpose</li>
|
|
59
|
+
<li>You're working with third-party libraries that expect light DOM</li>
|
|
60
|
+
</ul>
|
|
61
|
+
<p>Use <a href="shadow-component.html">ShadowComponent</a> instead when you need style encapsulation and scoped CSS.</p>
|
|
62
|
+
<p>Use <a href="hybrid-component.html">HybridComponent</a> when you need both shadow DOM styles and light DOM rendering.</p>
|
|
63
|
+
|
|
64
|
+
<h2 id="jsRef">JavaScript Reference</h2>
|
|
65
|
+
|
|
66
|
+
<h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
|
|
67
|
+
<h6>Extends LitElement</h6>
|
|
68
|
+
<h5><code>new LightComponent()</code></h5>
|
|
69
|
+
<p>Creates a new LightComponent instance that renders to the light DOM.</p>
|
|
70
|
+
|
|
71
|
+
<h3 id="requirements"><a href="#requirements" class="no-link">Requirements</a></h3>
|
|
72
|
+
<ul>
|
|
73
|
+
<li>Lit (LitElement, html, render)</li>
|
|
74
|
+
</ul>
|
|
75
|
+
|
|
76
|
+
<h3 id="properties"><a href="#properties" class="no-link">Properties</a></h3>
|
|
77
|
+
<h5><code>lightRoot<i>: HTMLElement</i></code></h5>
|
|
78
|
+
<p>A container element with <code>display: contents</code> that holds the rendered light DOM content. Created automatically by <code>createRenderRoot()</code>.</p>
|
|
79
|
+
|
|
80
|
+
<h3 id="methods"><a href="#methods" class="no-link">Methods</a></h3>
|
|
81
|
+
<h5><code>createRenderRoot()<i>: Element</i></code></h5>
|
|
82
|
+
<p>Creates the light DOM render container instead of shadow DOM. This method:</p>
|
|
83
|
+
<ul>
|
|
84
|
+
<li>Creates a <code>div</code> with <code>display: contents</code> for layout transparency</li>
|
|
85
|
+
<li>Appends it to the component as <code>lightRoot</code></li>
|
|
86
|
+
<li>Returns <code>this</code> instead of a shadow root</li>
|
|
87
|
+
</ul>
|
|
88
|
+
|
|
89
|
+
<h5><code>updated()<i>: void</i></code></h5>
|
|
90
|
+
<p>Called automatically by Lit when the component updates. Renders the result of <code>renderLightDom()</code> into <code>lightRoot</code>. Override this method if needed, but always call <code>super.updated()</code>.</p>
|
|
91
|
+
|
|
92
|
+
<h5><code>renderLightDom()<i>: TemplateResult</i></code></h5>
|
|
93
|
+
<p>Override this method to define what should be rendered to the light DOM. Returns an empty template by default. Use Lit's <code>html</code> tagged template literal to return your content.</p>
|
|
94
|
+
|
|
95
|
+
</main>
|
|
96
|
+
<div style="height:33vh"></div>
|
|
97
|
+
<script type="module" src="../src/components/Import.js"></script>
|
|
98
|
+
</body>
|
|
99
|
+
</html>
|