kempo-ui 0.3.5 → 0.3.7

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 (146) hide show
  1. package/AGENTS.md +2 -1
  2. package/dist/components/Aside.js +1 -1
  3. package/dist/components/Main.js +1 -1
  4. package/docs/components/accordion.html +240 -8
  5. package/docs/components/aside-items.html +13 -9
  6. package/docs/components/aside-menu.html +13 -9
  7. package/docs/components/aside-push.html +11 -6
  8. package/docs/components/aside.html +289 -115
  9. package/docs/components/card.html +238 -7
  10. package/docs/components/color-picker.html +245 -14
  11. package/docs/components/content-slider.html +240 -8
  12. package/docs/components/context.html +241 -7
  13. package/docs/components/dialog.html +238 -7
  14. package/docs/components/dropdown.html +238 -7
  15. package/docs/components/filter-list.html +239 -10
  16. package/docs/components/focus-capture.html +241 -10
  17. package/docs/components/html-editor.html +266 -35
  18. package/docs/components/hybrid-component.html +238 -6
  19. package/docs/components/icon.html +239 -9
  20. package/docs/components/import.html +239 -8
  21. package/docs/components/light-component.html +239 -7
  22. package/docs/components/nav.html +240 -8
  23. package/docs/components/photo-viewer.html +239 -9
  24. package/docs/components/resize.html +240 -9
  25. package/docs/components/shadow-component.html +239 -7
  26. package/docs/components/show-more.html +237 -8
  27. package/docs/components/sortable.html +239 -8
  28. package/docs/components/spinner.html +237 -6
  29. package/docs/components/split.html +241 -10
  30. package/docs/components/table.html +241 -11
  31. package/docs/components/tableControls.html +240 -7
  32. package/docs/components/tableCustomFields.html +241 -8
  33. package/docs/components/tableFetchRecords.html +239 -7
  34. package/docs/components/tableFieldSortHide.html +239 -7
  35. package/docs/components/tablePagination.html +246 -13
  36. package/docs/components/tablePlaceholder.html +241 -8
  37. package/docs/components/tableRecordEditing.html +241 -8
  38. package/docs/components/tableRecordFiltering.html +239 -7
  39. package/docs/components/tableRecordHiding.html +241 -9
  40. package/docs/components/tableRecordSearching.html +239 -7
  41. package/docs/components/tableRecordSelection.html +240 -7
  42. package/docs/components/tableRowControls.html +241 -8
  43. package/docs/components/tableServerSync.html +245 -11
  44. package/docs/components/tableSorting.html +239 -7
  45. package/docs/components/tabs.html +240 -7
  46. package/docs/components/tags.html +239 -7
  47. package/docs/components/theme-select.html +239 -7
  48. package/docs/components/theme-switcher.html +240 -8
  49. package/docs/components/timestamp.html +239 -8
  50. package/docs/components/toast.html +240 -8
  51. package/docs/components/toggle.html +240 -9
  52. package/docs/components/tree.html +239 -8
  53. package/docs/index.html +244 -6
  54. package/docs/prod.config.json +0 -4
  55. package/docs/src/components/Aside.js +1 -1
  56. package/docs/src/components/Main.js +1 -1
  57. package/docs/utils/context.html +237 -6
  58. package/docs/utils/cookie.html +251 -21
  59. package/docs/utils/debounce.html +236 -5
  60. package/docs/utils/drag.html +236 -5
  61. package/docs/utils/elevation.html +238 -6
  62. package/docs/utils/formatTimestamp.html +239 -9
  63. package/docs/utils/object.html +236 -5
  64. package/docs/utils/propConverters.html +233 -3
  65. package/docs/utils/string.html +236 -5
  66. package/docs/utils/theme.html +237 -6
  67. package/docs/utils/toTitleCase.html +239 -9
  68. package/docs/utils/type.html +236 -5
  69. package/docs/utils/wait.html +236 -5
  70. package/docs-src/.config.js +16 -0
  71. package/docs-src/bare.template.html +16 -0
  72. package/docs-src/components/accordion.page.html +201 -0
  73. package/docs-src/components/aside-items.page.html +36 -0
  74. package/docs-src/components/aside-menu.page.html +36 -0
  75. package/docs-src/components/aside-push.page.html +20 -0
  76. package/docs-src/components/aside.page.html +494 -0
  77. package/docs-src/components/card.page.html +78 -0
  78. package/docs-src/components/color-picker.page.html +559 -0
  79. package/docs-src/components/content-slider.page.html +266 -0
  80. package/docs-src/components/context.page.html +214 -0
  81. package/docs-src/components/dialog.page.html +365 -0
  82. package/docs-src/components/dropdown.page.html +300 -0
  83. package/docs-src/components/filter-list.page.html +117 -0
  84. package/docs-src/components/focus-capture.page.html +97 -0
  85. package/docs-src/components/html-editor.page.html +423 -0
  86. package/docs-src/components/hybrid-component.page.html +96 -0
  87. package/docs-src/components/icon.page.html +208 -0
  88. package/docs-src/components/import.page.html +76 -0
  89. package/docs-src/components/light-component.page.html +99 -0
  90. package/docs-src/components/nav.page.html +106 -0
  91. package/docs-src/components/photo-viewer.page.html +253 -0
  92. package/docs-src/components/resize.page.html +161 -0
  93. package/docs-src/components/shadow-component.page.html +84 -0
  94. package/docs-src/components/show-more.page.html +113 -0
  95. package/docs-src/components/sortable.page.html +117 -0
  96. package/docs-src/components/spinner.page.html +197 -0
  97. package/docs-src/components/split.page.html +195 -0
  98. package/docs-src/components/table.page.html +283 -0
  99. package/docs-src/components/tableControls.page.html +64 -0
  100. package/docs-src/components/tableCustomFields.page.html +124 -0
  101. package/docs-src/components/tableFetchRecords.page.html +95 -0
  102. package/docs-src/components/tableFieldSortHide.page.html +56 -0
  103. package/docs-src/components/tablePagination.page.html +85 -0
  104. package/docs-src/components/tablePlaceholder.page.html +73 -0
  105. package/docs-src/components/tableRecordEditing.page.html +161 -0
  106. package/docs-src/components/tableRecordFiltering.page.html +69 -0
  107. package/docs-src/components/tableRecordHiding.page.html +65 -0
  108. package/docs-src/components/tableRecordSearching.page.html +56 -0
  109. package/docs-src/components/tableRecordSelection.page.html +60 -0
  110. package/docs-src/components/tableRowControls.page.html +62 -0
  111. package/docs-src/components/tableServerSync.page.html +129 -0
  112. package/docs-src/components/tableSorting.page.html +54 -0
  113. package/docs-src/components/tabs.page.html +201 -0
  114. package/docs-src/components/tags.page.html +157 -0
  115. package/docs-src/components/theme-select.page.html +106 -0
  116. package/docs-src/components/theme-switcher.page.html +122 -0
  117. package/docs-src/components/timestamp.page.html +109 -0
  118. package/docs-src/components/toast.page.html +338 -0
  119. package/docs-src/components/toggle.page.html +177 -0
  120. package/docs-src/components/tree.page.html +356 -0
  121. package/docs-src/default.template.html +28 -0
  122. package/docs-src/index.page.html +312 -0
  123. package/docs-src/nav.fragment.html +228 -0
  124. package/docs-src/utils/context.page.html +143 -0
  125. package/docs-src/utils/cookie.page.html +128 -0
  126. package/docs-src/utils/debounce.page.html +42 -0
  127. package/docs-src/utils/drag.page.html +64 -0
  128. package/docs-src/utils/elevation.page.html +144 -0
  129. package/docs-src/utils/formatTimestamp.page.html +76 -0
  130. package/docs-src/utils/object.page.html +76 -0
  131. package/docs-src/utils/propConverters.page.html +73 -0
  132. package/docs-src/utils/string.page.html +66 -0
  133. package/docs-src/utils/theme.page.html +136 -0
  134. package/docs-src/utils/toTitleCase.page.html +52 -0
  135. package/docs-src/utils/type.page.html +31 -0
  136. package/docs-src/utils/wait.page.html +31 -0
  137. package/package.json +4 -4
  138. package/scripts/build.js +5 -0
  139. package/scripts/docs.js +5 -52
  140. package/src/components/Aside.js +12 -1
  141. package/src/components/Main.js +1 -1
  142. package/tests/components/Aside.browser-test.js +75 -0
  143. package/docs/dev.config.json +0 -20
  144. package/docs/nav-1.inc.html +0 -168
  145. package/docs/nav.inc.html +0 -168
  146. package/docs/nav.inc.js +0 -70
package/AGENTS.md CHANGED
@@ -6,6 +6,7 @@
6
6
  - All components should be in the `src/components/` directory.
7
7
  - All utility function module files should be in the `src/utils/` directory.
8
8
  - All documnentation should be in the `docs/` directory. This directory is used by GitHub as the "GitHub Pages", so all links need to be relative, and there will be a build script which copies all code to the `docs/` directory.
9
+ - Documentation source files (templates, fragments, page files) are in the `docs-src/` directory. These use the kempo-server v3 templating system and are pre-rendered to `docs/` during build.
9
10
  - `llm.txt.md` in the root is the consumer-facing LLM reference for this library. **Keep it up to date**: when adding a new component or utility, add a row to the relevant table in `llm.txt.md`.
10
11
 
11
12
  ## Dependencies
@@ -113,4 +114,4 @@ Do not prefix identifiers with underscores.
113
114
  - **ALL tests must pass — ZERO failures are acceptable.** If a test fails after a change, fix it immediately. There are no "pre-existing failures" in this project.
114
115
 
115
116
  ### Building
116
- The docs should be running using `npm run dev` which serves the html files in the docs, but reroutes all requests to `docs/src` to use `src` so we do not need to build or "watch" files to build, if you save a file, just refresh the docs page. Same for icons, the server reroutes `docs/icons` to `icons` so we dont need to watch or build after adding an icon.
117
+ The docs use the kempo-server v3 templating system. Source files are in `docs-src/` using `.page.html`, `.template.html`, and `.fragment.html` files. For development, `npm run dev` starts kempo-server with SSR (server-side rendering) from `docs-src/`, so page changes are reflected on refresh without rebuilding. Static assets (CSS, media, manifest) live in `docs/` and are served via customRoutes during dev. For production, `npm run build` minifies JS, copies icons, and pre-renders all pages from `docs-src/` to `docs/`.
@@ -1,4 +1,4 @@
1
- import ShadowComponent from"./ShadowComponent.js";import{html,css,nothing}from"../lit-all.min.js";import{boolTrueFalse}from"../utils/propConverters.js";import"./FocusCapture.js";import"./Icon.js";export default class Aside extends ShadowComponent{static properties={state:{type:String,reflect:!0},side:{type:String,reflect:!0},main:{type:String,reflect:!0},overlayClose:{type:Boolean,reflect:!0,attribute:"overlay-close",converter:boolTrueFalse},escClose:{type:Boolean,reflect:!0,attribute:"esc-close",converter:boolTrueFalse}};constructor(){super(),this.state="offscreen",this.side="left",this.main="overlay",this.overlayClose=!0,this.escClose=!0}overlayClick=()=>{this.overlayClose&&this.hide()};handleKeyDown=e=>{this.escClose&&"Escape"===e.key&&this.hide()};updated(e){if(super.updated(e),e.has("state")){const t=e.get("state");"offscreen"===this.state||"offscreen"!==t&&void 0!==t?"offscreen"===this.state&&void 0!==t&&"offscreen"!==t&&document.removeEventListener("keydown",this.handleKeyDown):document.addEventListener("keydown",this.handleKeyDown),"overlay"===this.main&&("expanded"===this.state?document.body.classList.add("no-scroll"):document.body.classList.remove("no-scroll"));const s="offscreen"===this.state?0:this.getTargetWidth(this.state),a={aside:this,state:this.state,main:this.main,width:s};this.dispatchEvent(new CustomEvent("aside_state_change",{detail:a})),window.dispatchEvent(new CustomEvent("aside_state_change",{detail:a})),this.inert="offscreen"===this.state}}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("keydown",this.handleKeyDown),document.body.classList.remove("no-scroll");const e={aside:this,state:"offscreen",main:this.main,width:0};this.dispatchEvent(new CustomEvent("aside_state_change",{detail:e})),window.dispatchEvent(new CustomEvent("aside_state_change",{detail:e}))}expand=()=>this.state="expanded";collapse=()=>this.state="collapsed";hide=()=>this.state="offscreen";toggle=()=>{this.state="expanded"===this.state?"offscreen":"expanded"};getTargetWidth(e){const t=parseFloat(getComputedStyle(document.documentElement).fontSize),s="collapsed"===e?"--collapsed-width":"--width",a=getComputedStyle(this).getPropertyValue(s).trim();return(a?parseFloat(a):"collapsed"===e?3.5:20)*t}render(){const e=html`<aside><slot></slot></aside>`;return"overlay"===this.main?html`
1
+ import ShadowComponent from"./ShadowComponent.js";import{html,css,nothing}from"../lit-all.min.js";import{boolTrueFalse}from"../utils/propConverters.js";import"./FocusCapture.js";import"./Icon.js";export default class Aside extends ShadowComponent{static properties={state:{type:String,reflect:!0},side:{type:String,reflect:!0},main:{type:String,reflect:!0},overlayClose:{type:Boolean,reflect:!0,attribute:"overlay-close",converter:boolTrueFalse},escClose:{type:Boolean,reflect:!0,attribute:"esc-close",converter:boolTrueFalse},persistentId:{type:String,reflect:!0,attribute:"persistent-id"}};constructor(){super(),this.state="offscreen",this.side="left",this.main="overlay",this.overlayClose=!0,this.escClose=!0,this.persistentId=null}overlayClick=()=>{this.overlayClose&&this.hide()};handleKeyDown=e=>{this.escClose&&"Escape"===e.key&&this.hide()};updated(e){if(super.updated(e),e.has("persistentId")&&this.persistentId&&window?.localStorage){const e=window.localStorage.getItem(`aside-persistent-id-${this.persistentId}`);e&&(this.state=e)}if(e.has("state")){const t=e.get("state");"offscreen"===this.state||"offscreen"!==t&&void 0!==t?"offscreen"===this.state&&void 0!==t&&"offscreen"!==t&&document.removeEventListener("keydown",this.handleKeyDown):document.addEventListener("keydown",this.handleKeyDown),"overlay"===this.main&&("expanded"===this.state?document.body.classList.add("no-scroll"):document.body.classList.remove("no-scroll"));const s="offscreen"===this.state?0:this.getTargetWidth(this.state),a={aside:this,state:this.state,main:this.main,width:s};this.dispatchEvent(new CustomEvent("aside_state_change",{detail:a})),window.dispatchEvent(new CustomEvent("aside_state_change",{detail:a})),this.inert="offscreen"===this.state,this.persistentId&&window?.localStorage&&window.localStorage.setItem(`aside-persistent-id-${this.persistentId}`,this.state)}}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("keydown",this.handleKeyDown),document.body.classList.remove("no-scroll");const e={aside:this,state:"offscreen",main:this.main,width:0};this.dispatchEvent(new CustomEvent("aside_state_change",{detail:e})),window.dispatchEvent(new CustomEvent("aside_state_change",{detail:e}))}expand=()=>this.state="expanded";collapse=()=>this.state="collapsed";hide=()=>this.state="offscreen";toggle=()=>{this.state="expanded"===this.state?"offscreen":"expanded"};getTargetWidth(e){const t=parseFloat(getComputedStyle(document.documentElement).fontSize),s="collapsed"===e?"--collapsed-width":"--width",a=getComputedStyle(this).getPropertyValue(s).trim();return(a?parseFloat(a):"collapsed"===e?3.5:20)*t}render(){const e=html`<aside><slot></slot></aside>`;return"overlay"===this.main?html`
2
2
  <k-focus-capture>
3
3
  <div id="container">
4
4
  <button id="overlay-btn" @click=${this.overlayClick}>
@@ -1,4 +1,4 @@
1
- import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-all.min.js";export default class Main extends ShadowComponent{constructor(){super(),this.widthMap=new Map}connectedCallback(){super.connectedCallback(),window.addEventListener("aside_state_change",this.handleAsideChange),document.querySelectorAll('k-aside[main="push"]').forEach(t=>{if("offscreen"!==t.state){const e=t.getTargetWidth(t.state);e>0&&this.widthMap.set(t,{side:t.side||"left",width:e})}}),this.recalculate()}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener("aside_state_change",this.handleAsideChange)}handleAsideChange=t=>{const{aside:e,state:a,main:i,width:s}=t.detail;"overlay"===i||"offscreen"===a?this.widthMap.delete(e):this.widthMap.set(e,{side:e.side||"left",width:s}),this.recalculate()};recalculate=()=>{let t=0,e=0;for(const[,{side:a,width:i}]of this.widthMap)"right"===a?e=Math.max(e,i):t=Math.max(t,i);this.style.setProperty("--left-panel-width",`${t}px`),this.style.setProperty("--right-panel-width",`${e}px`)};render(){return html`
1
+ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-all.min.js";export default class Main extends ShadowComponent{constructor(){super(),this.widthMap=new Map}connectedCallback(){super.connectedCallback(),window.addEventListener("aside_state_change",this.handleAsideChange),document.querySelectorAll('k-aside[main="push"]').forEach(t=>{if("offscreen"!==t.state&&"function"==typeof t.getTargetWidth){const e=t.getTargetWidth(t.state);e>0&&this.widthMap.set(t,{side:t.side||"left",width:e})}}),this.recalculate()}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener("aside_state_change",this.handleAsideChange)}handleAsideChange=t=>{const{aside:e,state:a,main:i,width:n}=t.detail;"overlay"===i||"offscreen"===a?this.widthMap.delete(e):this.widthMap.set(e,{side:e.side||"left",width:n}),this.recalculate()};recalculate=()=>{let t=0,e=0;for(const[,{side:a,width:i}]of this.widthMap)"right"===a?e=Math.max(e,i):t=Math.max(t,i);this.style.setProperty("--left-panel-width",`${t}px`),this.style.setProperty("--right-panel-width",`${e}px`)};render(){return html`
2
2
  <main>
3
3
  <slot></slot>
4
4
  </main>
@@ -11,11 +11,242 @@
11
11
  <link rel="stylesheet" href="../kempo-hljs.css" />
12
12
  <link rel="stylesheet" href="../styles.css" />
13
13
  <script>window.litDisableBundleWarning = true;</script>
14
+
14
15
  </head>
15
16
  <body>
16
- <k-import src="../nav-1.inc.html"></k-import>
17
- <h1 class="ta-center">Accordion</h1>
17
+
18
+ <k-nav fixed class="bg-primary">
19
+ <button id="toggleNavSideMenu" class="link">
20
+ <k-icon name="menu"></k-icon>
21
+ </button>
22
+ <a href="../" class="d-if ph" style="align-items: center">
23
+ <img src="../media/icon32.png" alt="Kempo UI Icon" class="pr" />
24
+ Kempo UI
25
+ </a>
26
+ <div style="position:relative;margin:0 .25rem;align-self:center;" theme="light">
27
+ <input id="navSearchInput" type="search" placeholder="Search docs..." autocomplete="off" style="width:11rem;" />
28
+ <div id="navSearchDropdown" hidden theme="light" style="position:absolute;top:calc(100% + 4px);left:0;width:min(480px,90vw);max-height:70vh;background:var(--c_bg);border:1px solid var(--c_border);border-radius:var(--radius);overflow:auto;z-index:9999;box-shadow:0 4px 12px rgba(0,0,0,.3);">
29
+ <k-filter-list id="navSearchList" style="display:block;padding:.25rem 0;">
30
+ <k-filter-item filter-keywords="accordion components"><a href="../components/accordion.html">Accordion<br><small>Component</small></a></k-filter-item>
31
+ <k-filter-item filter-keywords="aside sidebar components"><a href="../components/aside.html">Aside<br><small>Component</small></a></k-filter-item>
32
+ <k-filter-item filter-keywords="card components"><a href="../components/card.html">Card<br><small>Component</small></a></k-filter-item>
33
+ <k-filter-item filter-keywords="color picker colorpicker components"><a href="../components/color-picker.html">Color Picker<br><small>Component</small></a></k-filter-item>
34
+ <k-filter-item filter-keywords="content slider components"><a href="../components/content-slider.html">Content Slider<br><small>Component</small></a></k-filter-item>
35
+ <k-filter-item filter-keywords="context state global components"><a href="../components/context.html">Context<br><small>Component</small></a></k-filter-item>
36
+ <k-filter-item filter-keywords="dialog modal popup components"><a href="../components/dialog.html">Dialog<br><small>Component</small></a></k-filter-item>
37
+ <k-filter-item filter-keywords="dropdown select components"><a href="../components/dropdown.html">Dropdown<br><small>Component</small></a></k-filter-item>
38
+ <k-filter-item filter-keywords="filter list filterlist components"><a href="../components/filter-list.html">Filter List<br><small>Component</small></a></k-filter-item>
39
+ <k-filter-item filter-keywords="focus capture focuscapture components"><a href="../components/focus-capture.html">Focus Capture<br><small>Component</small></a></k-filter-item>
40
+ <k-filter-item filter-keywords="html editor components"><a href="../components/html-editor.html">HTML Editor<br><small>Component</small></a></k-filter-item>
41
+ <k-filter-item filter-keywords="icon components"><a href="../components/icon.html">Icon<br><small>Component</small></a></k-filter-item>
42
+ <k-filter-item filter-keywords="import components"><a href="../components/import.html">Import<br><small>Component</small></a></k-filter-item>
43
+ <k-filter-item filter-keywords="nav navbar navigation components"><a href="../components/nav.html">Nav<br><small>Component</small></a></k-filter-item>
44
+ <k-filter-item filter-keywords="photo viewer photoviewer components"><a href="../components/photo-viewer.html">Photo Viewer<br><small>Component</small></a></k-filter-item>
45
+ <k-filter-item filter-keywords="resize components"><a href="../components/resize.html">Resize<br><small>Component</small></a></k-filter-item>
46
+ <k-filter-item filter-keywords="show more showmore components"><a href="../components/show-more.html">Show More<br><small>Component</small></a></k-filter-item>
47
+ <k-filter-item filter-keywords="sortable drag drop sort components"><a href="../components/sortable.html">Sortable<br><small>Component</small></a></k-filter-item>
48
+ <k-filter-item filter-keywords="spinner loading components"><a href="../components/spinner.html">Spinner<br><small>Component</small></a></k-filter-item>
49
+ <k-filter-item filter-keywords="split pane components"><a href="../components/split.html">Split<br><small>Component</small></a></k-filter-item>
50
+ <k-filter-item filter-keywords="table data grid components"><a href="../components/table.html">Table<br><small>Component</small></a></k-filter-item>
51
+ <k-filter-item filter-keywords="table controls advanced example"><a href="../components/tableControls.html">Table &mdash; Controls<br><small>Advanced Example</small></a></k-filter-item>
52
+ <k-filter-item filter-keywords="table custom fields advanced example"><a href="../components/tableCustomFields.html">Table &mdash; Custom Fields<br><small>Advanced Example</small></a></k-filter-item>
53
+ <k-filter-item filter-keywords="table fetch records advanced example"><a href="../components/tableFetchRecords.html">Table &mdash; Fetch Records<br><small>Advanced Example</small></a></k-filter-item>
54
+ <k-filter-item filter-keywords="table field sort hide advanced example"><a href="../components/tableFieldSortHide.html">Table &mdash; Field Sort &amp; Hide<br><small>Advanced Example</small></a></k-filter-item>
55
+ <k-filter-item filter-keywords="table pagination advanced example"><a href="../components/tablePagination.html">Table &mdash; Pagination<br><small>Advanced Example</small></a></k-filter-item>
56
+ <k-filter-item filter-keywords="table record editing advanced example"><a href="../components/tableRecordEditing.html">Table &mdash; Record Editing<br><small>Advanced Example</small></a></k-filter-item>
57
+ <k-filter-item filter-keywords="table record filtering advanced example"><a href="../components/tableRecordFiltering.html">Table &mdash; Record Filtering<br><small>Advanced Example</small></a></k-filter-item>
58
+ <k-filter-item filter-keywords="table record hiding advanced example"><a href="../components/tableRecordHiding.html">Table &mdash; Record Hiding<br><small>Advanced Example</small></a></k-filter-item>
59
+ <k-filter-item filter-keywords="table record searching advanced example"><a href="../components/tableRecordSearching.html">Table &mdash; Record Searching<br><small>Advanced Example</small></a></k-filter-item>
60
+ <k-filter-item filter-keywords="table record selection advanced example"><a href="../components/tableRecordSelection.html">Table &mdash; Record Selection<br><small>Advanced Example</small></a></k-filter-item>
61
+ <k-filter-item filter-keywords="table row controls advanced example"><a href="../components/tableRowControls.html">Table &mdash; Row Controls<br><small>Advanced Example</small></a></k-filter-item>
62
+ <k-filter-item filter-keywords="table server sync advanced example"><a href="../components/tableServerSync.html">Table &mdash; Server Sync<br><small>Advanced Example</small></a></k-filter-item>
63
+ <k-filter-item filter-keywords="table sorting advanced example"><a href="../components/tableSorting.html">Table &mdash; Sorting<br><small>Advanced Example</small></a></k-filter-item>
64
+ <k-filter-item filter-keywords="table placeholder advanced example"><a href="../components/tablePlaceholder.html">Table &mdash; Placeholder<br><small>Advanced Example</small></a></k-filter-item>
65
+ <k-filter-item filter-keywords="tabs tab panel components"><a href="../components/tabs.html">Tabs<br><small>Component</small></a></k-filter-item>
66
+ <k-filter-item filter-keywords="tags tag input components"><a href="../components/tags.html">Tags<br><small>Component</small></a></k-filter-item>
67
+ <k-filter-item filter-keywords="theme select dropdown dark light components"><a href="../components/theme-select.html">Theme Select<br><small>Component</small></a></k-filter-item>
68
+ <k-filter-item filter-keywords="theme switcher dark light components"><a href="../components/theme-switcher.html">Theme Switcher<br><small>Component</small></a></k-filter-item>
69
+ <k-filter-item filter-keywords="timestamp date time components"><a href="../components/timestamp.html">Timestamp<br><small>Component</small></a></k-filter-item>
70
+ <k-filter-item filter-keywords="toast notification alert components"><a href="../components/toast.html">Toast<br><small>Component</small></a></k-filter-item>
71
+ <k-filter-item filter-keywords="toggle switch checkbox components"><a href="../components/toggle.html">Toggle<br><small>Component</small></a></k-filter-item>
72
+ <k-filter-item filter-keywords="tree treeview components"><a href="../components/tree.html">Tree<br><small>Component</small></a></k-filter-item>
73
+ <k-filter-item filter-keywords="shadow component base"><a href="../components/shadow-component.html">Shadow Component<br><small>Base Component</small></a></k-filter-item>
74
+ <k-filter-item filter-keywords="light component base"><a href="../components/light-component.html">Light Component<br><small>Base Component</small></a></k-filter-item>
75
+ <k-filter-item filter-keywords="hybrid component base"><a href="../components/hybrid-component.html">Hybrid Component<br><small>Base Component</small></a></k-filter-item>
76
+ <k-filter-item filter-keywords="cookie utils utility"><a href="../utils/cookie.html">cookie<br><small>Utility</small></a></k-filter-item>
77
+ <k-filter-item filter-keywords="context utils utility"><a href="../utils/context.html">context<br><small>Utility</small></a></k-filter-item>
78
+ <k-filter-item filter-keywords="debounce utils utility"><a href="../utils/debounce.html">debounce<br><small>Utility</small></a></k-filter-item>
79
+ <k-filter-item filter-keywords="drag utils utility"><a href="../utils/drag.html">drag<br><small>Utility</small></a></k-filter-item>
80
+ <k-filter-item filter-keywords="elevation z-index stacking utils"><a href="../utils/elevation.html">elevation<br><small>Utility</small></a></k-filter-item>
81
+ <k-filter-item filter-keywords="formattimestamp timestamp format date time utils utility"><a href="../utils/formatTimestamp.html">formatTimestamp<br><small>Utility</small></a></k-filter-item>
82
+ <k-filter-item filter-keywords="object utils utility"><a href="../utils/object.html">object<br><small>Utility</small></a></k-filter-item>
83
+ <k-filter-item filter-keywords="propconverters prop converters utils utility"><a href="../utils/propConverters.html">propConverters<br><small>Utility</small></a></k-filter-item>
84
+ <k-filter-item filter-keywords="string utils utility"><a href="../utils/string.html">string<br><small>Utility</small></a></k-filter-item>
85
+ <k-filter-item filter-keywords="theme utils utility"><a href="../utils/theme.html">theme<br><small>Utility</small></a></k-filter-item>
86
+ <k-filter-item filter-keywords="type utils utility"><a href="../utils/type.html">type<br><small>Utility</small></a></k-filter-item>
87
+ <k-filter-item filter-keywords="wait async utils utility"><a href="../utils/wait.html">wait<br><small>Utility</small></a></k-filter-item>
88
+ </k-filter-list>
89
+ </div>
90
+ </div>
91
+ <div class="flex"></div>
92
+ <a href="https://github.com/dustinpoissant/kempo-ui?tab=License-1-ov-file#creative-commons-attribution-noncommercial-sharealike-20" target="_blank"><k-icon name="license"></k-icon></a>
93
+ <a href="https://www.npmjs.com/package/kempo-ui" target="_blank"><k-icon name="npm"></k-icon></a>
94
+ <a href="https://github.com/dustinpoissant/kempo-ui" target="_blank"><k-icon name="github-mark"></k-icon></a>
95
+ <k-theme-switcher></k-theme-switcher>
96
+ </k-nav>
97
+ <div style="width: 100%; height: 4rem;"></div>
98
+ <k-aside id="navSideMenu" main="overlay" state="offscreen">
99
+ <menu>
100
+ <a href="../" class="ta-center bb mb r0">
101
+ <h1 class="tc-primary">Kempo UI</h1>
102
+ <img src="../media/icon128.png" alt="Kempo UI Icon" />
103
+ </a>
104
+
105
+ <div class="pl mb">
106
+ <h3>Components</h3>
107
+ <a href="../components/accordion.html">Accordion</a>
108
+ <a href="../components/aside.html">Aside</a>
109
+ <a href="../components/card.html">Card</a>
110
+ <a href="../components/color-picker.html">ColorPicker</a>
111
+ <a href="../components/content-slider.html">Content Slider</a>
112
+ <a href="../components/context.html">Context</a>
113
+ <a href="../components/dialog.html">Dialog</a>
114
+ <a href="../components/dropdown.html">Dropdown</a>
115
+ <a href="../components/filter-list.html">Filter List</a>
116
+ <a href="../components/focus-capture.html">FocusCapture</a>
117
+ <a href="../components/html-editor.html">HTML Editor</a>
118
+ <a href="../components/icon.html">Icon</a>
119
+ <a href="../components/import.html">Import</a>
120
+ <a href="../components/nav.html">Nav</a>
121
+ <a href="../components/photo-viewer.html">Photo Viewer</a>
122
+ <a href="../components/resize.html">Resize</a>
123
+ <a href="../components/show-more.html">Show More</a>
124
+ <a href="../components/sortable.html">Sortable</a>
125
+ <a href="../components/spinner.html">Spinner</a>
126
+ <a href="../components/split.html">Split</a>
127
+ <a href="../components/table.html">Table</a>
128
+ <a href="../components/tabs.html">Tabs</a>
129
+ <a href="../components/tags.html">Tags</a>
130
+ <a href="../components/theme-select.html">Theme Select</a>
131
+ <a href="../components/theme-switcher.html">Theme Switcher</a>
132
+ <a href="../components/timestamp.html">Timestamp</a>
133
+ <a href="../components/toast.html">Toast</a>
134
+ <a href="../components/toggle.html">Toggle</a>
135
+ <a href="../components/tree.html">Tree</a>
136
+ </div>
137
+
138
+ <h5 class="mb0">Base Components</h5>
139
+ <div class="pl mb">
140
+ <a href="../components/shadow-component.html">Shadow Component</a>
141
+ <a href="../components/light-component.html">Light Component</a>
142
+ <a href="../components/hybrid-component.html">Hybrid Component</a>
143
+ </div>
144
+
145
+ <h5 class="mb0">Utils</h5>
146
+ <div class="pl mb">
147
+ <a href="../utils/cookie.html">cookie</a>
148
+ <a href="../utils/context.html">context</a>
149
+ <a href="../utils/debounce.html">debounce</a>
150
+ <a href="../utils/drag.html">drag</a>
151
+ <a href="../utils/elevation.html">elevation</a>
152
+ <a href="../utils/formatTimestamp.html">formatTimestamp</a>
153
+ <a href="../utils/object.html">object</a>
154
+ <a href="../utils/propConverters.html">propConverters</a>
155
+ <a href="../utils/string.html">string</a>
156
+ <a href="../utils/theme.html">theme</a>
157
+ <a href="../utils/type.html">type</a>
158
+ <a href="../utils/wait.html">wait</a>
159
+ </div>
160
+ </menu>
161
+ </k-aside>
162
+ <style>
163
+ #navSearchList a{display:block;padding:.25rem .5rem;border-radius:var(--radius);text-decoration:none;color:var(--tc);}
164
+ #navSearchList a:hover{background:rgba(128,128,128,.15);}
165
+ #navSearchList a small{display:block;color:var(--tc_muted);}
166
+ </style>
167
+ <script src="../src/components/Nav.js" type="module"></script>
168
+ <script src="../src/components/FilterList.js" type="module"></script>
169
+ <script src="../src/components/FilterItem.js" type="module"></script>
170
+ <script src="../src/components/Aside.js" type="module"></script>
171
+ <script src="../src/components/Icon.js" type="module"></script>
172
+ <script src="../src/components/ThemeSwitcher.js" type="module"></script>
173
+ <script type="module">
174
+ import debounce from '../src/utils/debounce.js';
175
+
176
+ document.getElementById('toggleNavSideMenu').addEventListener('click', async () => {
177
+ await window.customElements.whenDefined('k-aside');
178
+ document.getElementById('navSideMenu').toggle();
179
+ });
180
+
181
+ document.addEventListener('click', function(e) {
182
+ if(e.target.matches('a[href^="#"]')) {
183
+ e.preventDefault();
184
+ const targetId = e.target.getAttribute('href').replace('#', '');
185
+ const target = document.getElementById(targetId);
186
+ if(target) {
187
+ target.scrollIntoView({ behavior: 'smooth' });
188
+ const url = window.location.pathname + window.location.search + '#' + targetId;
189
+ history.replaceState(null, '', url);
190
+ }
191
+ }
192
+ });
193
+
194
+ /*
195
+ Nav Search
196
+ */
197
+ const searchInput = document.getElementById('navSearchInput');
198
+ const searchDropdown = document.getElementById('navSearchDropdown');
199
+ let navSearchList = null;
200
+
201
+ const openSearch = async () => {
202
+ await customElements.whenDefined('k-filter-list');
203
+ if(!navSearchList) navSearchList = document.getElementById('navSearchList');
204
+ navSearchList.filter(searchInput.value);
205
+ searchDropdown.hidden = false;
206
+ };
207
+
208
+ const closeSearch = () => {
209
+ searchDropdown.hidden = true;
210
+ navSearchList?.clearFocus();
211
+ };
212
+
213
+ searchInput.addEventListener('focus', openSearch);
214
+
215
+ searchInput.addEventListener('input', debounce(e => {
216
+ navSearchList?.filter(e.target.value);
217
+ }, 150));
218
+
219
+ searchInput.addEventListener('keydown', e => {
220
+ if(e.key === 'Escape') {
221
+ searchInput.value = '';
222
+ searchInput.blur();
223
+ closeSearch();
224
+ } else if(e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Enter') {
225
+ navSearchList?.handleKeydown(e);
226
+ }
227
+ });
228
+
229
+ searchInput.addEventListener('blur', () => {
230
+ setTimeout(closeSearch, 150);
231
+ });
232
+
233
+ document.addEventListener('keydown', e => {
234
+ let active = document.activeElement;
235
+ while(active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;
236
+ const tag = active?.tagName;
237
+ if(tag === 'INPUT' || tag === 'TEXTAREA' || active?.isContentEditable) return;
238
+ if(e.metaKey || e.ctrlKey || e.altKey) return;
239
+ if(e.key.length === 1) {
240
+ searchInput.focus();
241
+ }
242
+ });
243
+ </script>
244
+
245
+
246
+ <h1 class="ta-center">Accordion</h1>
247
+
18
248
  <k-main>
249
+
19
250
  <k-accordion persistent-id="toc" class="b r mb">
20
251
  <k-accordion-header for-panel="toc-panel">Table of Contents</k-accordion-header>
21
252
  <k-accordion-panel name="toc-panel">
@@ -208,13 +439,14 @@
208
439
  <h5><code>togglepanel</code></h5>
209
440
  <p>Fired when a panel is toggled. The event detail contains <code>{ panelName }</code>.</p>
210
441
  </k-card>
211
-
442
+
212
443
  </k-main>
213
444
  <div style="height:33vh"></div>
214
- <script type="module" src="../src/components/Import.js"></script>
215
445
  <script type="module" src="../src/components/Main.js"></script>
216
- <script type="module" src="../src/components/Accordion.js"></script>
217
- <script type="module" src="../src/components/Card.js"></script>
218
- <script type="module" src="../src/components/Resize.js"></script>
446
+
447
+ <script type="module" src="../src/components/Accordion.js"></script>
448
+ <script type="module" src="../src/components/Card.js"></script>
449
+ <script type="module" src="../src/components/Resize.js"></script>
450
+
219
451
  </body>
220
- </html>
452
+ </html>
@@ -7,14 +7,8 @@
7
7
  <link rel="stylesheet" href="../kempo-vars.css" />
8
8
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@2/dist/kempo.min.css" />
9
9
  <script>window.litDisableBundleWarning = true;</script>
10
- <script type="module">
11
- import theme from '../src/utils/theme.js';
12
- theme.init();
13
- </script>
14
- <script type="module" src="../src/components/Aside.js"></script>
15
- <div style="height:33vh"></div>
16
- <script type="module" src="../src/components/Main.js"></script>
17
- <style>
10
+
11
+ <style>
18
12
  body {
19
13
  margin: 0;
20
14
  padding: 0;
@@ -22,9 +16,17 @@
22
16
  overflow: hidden;
23
17
  }
24
18
  </style>
19
+ <script type="module">
20
+ import theme from '../src/utils/theme.js';
21
+ theme.init();
22
+ </script>
23
+ <script type="module" src="../src/components/Aside.js"></script>
24
+ <script type="module" src="../src/components/Main.js"></script>
25
+
25
26
  </head>
26
27
  <body>
27
- <k-aside main="push" state="expanded" style="--aside_padding: 0;">
28
+
29
+ <k-aside main="push" state="expanded" style="--aside_padding: 0;">
28
30
  <k-aside-toggle><h5 class="m0">Kempo</h5></k-aside-toggle>
29
31
  <k-aside-item icon="cards" href="#" active>Dashboard</k-aside-item>
30
32
  <k-aside-item icon="check" href="#">Tasks</k-aside-item>
@@ -40,5 +42,7 @@
40
42
  <h2>Main Content</h2>
41
43
  <p>Click the aside's collapse/expand to see items react.</p>
42
44
  </k-main>
45
+
46
+
43
47
  </body>
44
48
  </html>
@@ -7,14 +7,8 @@
7
7
  <link rel="stylesheet" href="../kempo-vars.css" />
8
8
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@2/dist/kempo.min.css" />
9
9
  <script>window.litDisableBundleWarning = true;</script>
10
- <script type="module">
11
- import theme from '../src/utils/theme.js';
12
- theme.init();
13
- </script>
14
- <script type="module" src="../src/components/Aside.js"></script>
15
- <div style="height:33vh"></div>
16
- <script type="module" src="../src/components/Main.js"></script>
17
- <style>
10
+
11
+ <style>
18
12
  body {
19
13
  margin: 0;
20
14
  padding: 0;
@@ -22,9 +16,17 @@
22
16
  overflow: hidden;
23
17
  }
24
18
  </style>
19
+ <script type="module">
20
+ import theme from '../src/utils/theme.js';
21
+ theme.init();
22
+ </script>
23
+ <script type="module" src="../src/components/Aside.js"></script>
24
+ <script type="module" src="../src/components/Main.js"></script>
25
+
25
26
  </head>
26
27
  <body>
27
- <k-aside main="push" state="expanded" style="--aside_padding: 0;">
28
+
29
+ <k-aside main="push" state="expanded" style="--aside_padding: 0;">
28
30
  <k-aside-toggle><h5 class="m0">Kempo</h5></k-aside-toggle>
29
31
  <k-aside-item icon="cards" href="#">Dashboard</k-aside-item>
30
32
  <k-aside-menu icon="folder" label="Projects">
@@ -40,5 +42,7 @@
40
42
  <h2>Main Content</h2>
41
43
  <p>Click menu headers to expand sub-items. Collapse the aside to see menus fold.</p>
42
44
  </k-main>
45
+
46
+
43
47
  </body>
44
48
  </html>
@@ -3,25 +3,30 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@2/dist/kempo.min.css" />
6
+ <title>Untitled</title>
7
7
  <link rel="stylesheet" href="../kempo-vars.css" />
8
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@2/dist/kempo.min.css" />
8
9
  <script>window.litDisableBundleWarning = true;</script>
10
+
9
11
  </head>
10
12
  <body>
11
- <k-aside id="aside4" state="offscreen">
13
+
14
+ <k-aside id="aside4" state="offscreen">
12
15
  <p>Push Sidebar Content</p>
13
16
  </k-aside>
14
17
  <k-main>
15
18
  <button id="toggle4">Toggle Sidebar</button>
16
19
  <p>This content shifts when the aside is visible.</p>
17
20
  </k-main>
18
- <script>
21
+
22
+
23
+ <script>
19
24
  document.getElementById('toggle4').addEventListener('click',()=>{
20
25
  document.getElementById('aside4').toggle();
21
26
  });
22
27
  </script>
23
- <script type="module" src="../src/components/Aside.js"></script>
24
- <div style="height:33vh"></div>
25
- <script type="module" src="../src/components/Main.js"></script>
28
+ <script type="module" src="../src/components/Aside.js"></script>
29
+ <script type="module" src="../src/components/Main.js"></script>
30
+
26
31
  </body>
27
32
  </html>