kempo-ui 0.0.16 → 0.0.18

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 (241) hide show
  1. package/dist/components/LightComponent.js +1 -0
  2. package/dist/components/ShadowComponent.js +1 -0
  3. package/{docs/kempo-ui/src → dist}/components/SideMenu.js +2 -2
  4. package/dist/components/Split.js +84 -0
  5. package/dist/components/Table.js +151 -0
  6. package/dist/{src/components → components}/Tree.js +0 -3
  7. package/{docs/kempo-ui/src → dist}/components/tableControls/FieldSortHide.js +1 -2
  8. package/dist/{src/components → components}/tableControls/Filters.js +2 -3
  9. package/docs/{kempo-ui/components → components}/accordion.html +35 -52
  10. package/docs/{kempo-ui/components → components}/card.html +31 -23
  11. package/docs/components/content-slider.html +283 -0
  12. package/docs/{kempo-ui/components → components}/dialog.html +44 -40
  13. package/docs/{kempo-ui/components → components}/focus-capture.html +28 -23
  14. package/docs/{kempo-ui/components → components}/hybrid-component.html +20 -17
  15. package/docs/{kempo-ui/components → components}/icon.html +43 -35
  16. package/docs/components/import.html +80 -0
  17. package/docs/{kempo-ui/components → components}/light-component.html +51 -32
  18. package/docs/components/photo-viewer.html +269 -0
  19. package/docs/{kempo-ui/components → components}/resize.html +34 -29
  20. package/docs/{kempo-ui/components → components}/shadow-component.html +44 -29
  21. package/docs/{kempo-ui/components → components}/show-more.html +31 -26
  22. package/docs/{kempo-ui/components → components}/side-menu.html +9 -9
  23. package/docs/{kempo-ui/components → components}/sortable.html +28 -23
  24. package/docs/{kempo-ui/components → components}/split.html +68 -41
  25. package/docs/{kempo-ui/components → components}/table.html +89 -118
  26. package/docs/{kempo-ui/components → components}/tableControls.html +16 -12
  27. package/docs/{kempo-ui/components → components}/tableCustomFields.html +13 -10
  28. package/docs/{kempo-ui/components → components}/tableFetchRecords.html +16 -16
  29. package/docs/{kempo-ui/components → components}/tableFieldSortHide.html +11 -11
  30. package/docs/components/tablePagination.html +99 -0
  31. package/docs/{kempo-ui/components → components}/tableRecordEditing.html +15 -12
  32. package/docs/{kempo-ui/components → components}/tableRecordFiltering.html +12 -12
  33. package/docs/{kempo-ui/components → components}/tableRecordHiding.html +16 -13
  34. package/docs/{kempo-ui/components → components}/tableRecordSearching.html +11 -11
  35. package/docs/{kempo-ui/components → components}/tableRecordSelection.html +13 -11
  36. package/docs/{kempo-ui/components → components}/tableRowControls.html +14 -13
  37. package/docs/{kempo-ui/components → components}/tableSorting.html +9 -9
  38. package/docs/components/tabs.html +126 -0
  39. package/docs/components/tags.html +153 -0
  40. package/docs/{kempo-ui/components → components}/theme-switcher.html +20 -15
  41. package/docs/components/timestamp.html +127 -0
  42. package/docs/components/toast.html +355 -0
  43. package/docs/{kempo-ui/components → components}/toggle.html +20 -15
  44. package/docs/components/tree.html +187 -0
  45. package/docs/dev.config.json +3 -4
  46. package/docs/{kempo-ui/index.html → index.html} +0 -7
  47. package/docs/init-1.js +4 -0
  48. package/docs/nav-1.inc.html +66 -0
  49. package/docs/nav.inc.html +66 -0
  50. package/docs/nav.inc.js +16 -0
  51. package/docs/src/components/LightComponent.js +1 -0
  52. package/docs/src/components/ShadowComponent.js +1 -0
  53. package/{dist → docs}/src/components/SideMenu.js +2 -2
  54. package/docs/src/components/Split.js +84 -0
  55. package/docs/src/components/Table.js +151 -0
  56. package/docs/{kempo-ui/src → src}/components/Tree.js +0 -3
  57. package/{dist → docs}/src/components/tableControls/FieldSortHide.js +1 -2
  58. package/docs/{kempo-ui/src → src}/components/tableControls/Filters.js +2 -3
  59. package/docs/src/kempo-vars.css +1 -0
  60. package/docs/{kempo-ui/utils → utils}/debounce.html +23 -22
  61. package/docs/{kempo-ui/utils → utils}/drag.html +29 -26
  62. package/docs/{kempo-ui/utils → utils}/formatTimestamp.html +7 -7
  63. package/docs/{kempo-ui/utils → utils}/propConverters.html +11 -11
  64. package/docs/{kempo-ui/utils → utils}/toTitleCase.html +7 -7
  65. package/package.json +3 -3
  66. package/scripts/build.js +10 -17
  67. package/scripts/docs.js +0 -3
  68. package/src/components/LightComponent.js +22 -0
  69. package/src/components/ShadowComponent.js +23 -0
  70. package/src/components/SideMenu.js +2 -1
  71. package/src/components/Split.js +16 -8
  72. package/src/components/Table.js +112 -95
  73. package/src/components/Tree.js +0 -3
  74. package/src/components/tableControls/FieldSortHide.js +1 -1
  75. package/src/components/tableControls/Filters.js +2 -3
  76. package/tests/components/HybridComponent.browser-test.js +1 -1
  77. package/tests/components/ShadowComponent.browser-test.js +3 -3
  78. package/dist/kempo-hljs.css +0 -1
  79. package/dist/src/components/LightComponent.js +0 -1
  80. package/dist/src/components/ShadowComponent.js +0 -1
  81. package/dist/src/components/Split.js +0 -84
  82. package/dist/src/components/Table.js +0 -151
  83. package/dist/src/utils/watchWindowSize.js +0 -1
  84. package/docs/kempo-ui/components/content-slider.html +0 -219
  85. package/docs/kempo-ui/components/import.html +0 -70
  86. package/docs/kempo-ui/components/photo-viewer.html +0 -221
  87. package/docs/kempo-ui/components/tablePagination.html +0 -97
  88. package/docs/kempo-ui/components/tabs.html +0 -176
  89. package/docs/kempo-ui/components/tags.html +0 -106
  90. package/docs/kempo-ui/components/timestamp.html +0 -78
  91. package/docs/kempo-ui/components/toast.html +0 -315
  92. package/docs/kempo-ui/components/tree.html +0 -179
  93. package/docs/kempo-ui/nav.inc.html +0 -67
  94. package/docs/kempo-ui/nav.inc.js +0 -4
  95. package/docs/kempo-ui/src/components/LightComponent.js +0 -1
  96. package/docs/kempo-ui/src/components/ShadowComponent.js +0 -1
  97. package/docs/kempo-ui/src/components/Split.js +0 -84
  98. package/docs/kempo-ui/src/components/Table.js +0 -151
  99. package/docs/kempo-ui/src/utils/watchWindowSize.js +0 -1
  100. package/docs/kempo-ui/utils/watchWindowSize.html +0 -72
  101. package/src/kempo-hljs.css +0 -146
  102. package/src/utils/watchWindowSize.js +0 -16
  103. /package/{docs/kempo-ui/src → dist}/components/Accordion.js +0 -0
  104. /package/{docs/kempo-ui/src → dist}/components/Card.js +0 -0
  105. /package/{docs/kempo-ui/src → dist}/components/ContentSlider.js +0 -0
  106. /package/{docs/kempo-ui/src → dist}/components/Dialog.js +0 -0
  107. /package/{docs/kempo-ui/src → dist}/components/FocusCapture.js +0 -0
  108. /package/{docs/kempo-ui/src → dist}/components/HybridComponent.js +0 -0
  109. /package/{docs/kempo-ui/src → dist}/components/Icon.js +0 -0
  110. /package/{docs/kempo-ui/src → dist}/components/Import.js +0 -0
  111. /package/{docs/kempo-ui/src → dist}/components/PhotoViewer.js +0 -0
  112. /package/{docs/kempo-ui/src → dist}/components/Resize.js +0 -0
  113. /package/{docs/kempo-ui/src → dist}/components/ShowMore.js +0 -0
  114. /package/{docs/kempo-ui/src → dist}/components/Sortable.js +0 -0
  115. /package/{docs/kempo-ui/src → dist}/components/Tabs.js +0 -0
  116. /package/{docs/kempo-ui/src → dist}/components/Tags.js +0 -0
  117. /package/{docs/kempo-ui/src → dist}/components/ThemeSwitcher.js +0 -0
  118. /package/{docs/kempo-ui/src → dist}/components/Timestamp.js +0 -0
  119. /package/{docs/kempo-ui/src → dist}/components/Toast.js +0 -0
  120. /package/{docs/kempo-ui/src → dist}/components/Toggle.js +0 -0
  121. /package/{docs/kempo-ui/src → dist}/components/tableControls/DeleteRecord.js +0 -0
  122. /package/{docs/kempo-ui/src → dist}/components/tableControls/Edit.js +0 -0
  123. /package/{docs/kempo-ui/src → dist}/components/tableControls/ExportCSV.js +0 -0
  124. /package/{docs/kempo-ui/src → dist}/components/tableControls/ExportJson.js +0 -0
  125. /package/{docs/kempo-ui/src → dist}/components/tableControls/FirstPage.js +0 -0
  126. /package/{docs/kempo-ui/src → dist}/components/tableControls/HiddenCount.js +0 -0
  127. /package/{docs/kempo-ui/src → dist}/components/tableControls/Hide.js +0 -0
  128. /package/{docs/kempo-ui/src → dist}/components/tableControls/LastPage.js +0 -0
  129. /package/{docs/kempo-ui/src → dist}/components/tableControls/NextPage.js +0 -0
  130. /package/{docs/kempo-ui/src → dist}/components/tableControls/PageSelect.js +0 -0
  131. /package/{docs/kempo-ui/src → dist}/components/tableControls/PageSize.js +0 -0
  132. /package/{docs/kempo-ui/src → dist}/components/tableControls/PrevPage.js +0 -0
  133. /package/{docs/kempo-ui/src → dist}/components/tableControls/Search.js +0 -0
  134. /package/{docs/kempo-ui/src → dist}/components/tableControls/ShowAll.js +0 -0
  135. /package/{docs/kempo-ui/src → dist}/components/tableControls/TableControl.js +0 -0
  136. /package/{docs/kempo-ui/src → dist}/lit-all.min.js +0 -0
  137. /package/{docs/kempo-ui/src → dist}/utils/debounce.js +0 -0
  138. /package/{docs/kempo-ui/src → dist}/utils/drag.js +0 -0
  139. /package/{docs/kempo-ui/src → dist}/utils/formatTimestamp.js +0 -0
  140. /package/{docs/kempo-ui/src → dist}/utils/propConverters.js +0 -0
  141. /package/{docs/kempo-ui/src → dist}/utils/toTitleCase.js +0 -0
  142. /package/docs/{kempo-ui/icons → icons}/add.svg +0 -0
  143. /package/docs/{kempo-ui/icons → icons}/arrow-back.svg +0 -0
  144. /package/docs/{kempo-ui/icons → icons}/arrow-down-double.svg +0 -0
  145. /package/docs/{kempo-ui/icons → icons}/arrow-down.svg +0 -0
  146. /package/docs/{kempo-ui/icons → icons}/arrow-forward.svg +0 -0
  147. /package/docs/{kempo-ui/icons → icons}/arrow-up-double.svg +0 -0
  148. /package/docs/{kempo-ui/icons → icons}/arrow-up.svg +0 -0
  149. /package/docs/{kempo-ui/icons → icons}/cards.svg +0 -0
  150. /package/docs/{kempo-ui/icons → icons}/check.svg +0 -0
  151. /package/docs/{kempo-ui/icons → icons}/chevron-left.svg +0 -0
  152. /package/docs/{kempo-ui/icons → icons}/chevron-right.svg +0 -0
  153. /package/docs/{kempo-ui/icons → icons}/close.svg +0 -0
  154. /package/docs/{kempo-ui/icons → icons}/compare.svg +0 -0
  155. /package/docs/{kempo-ui/icons → icons}/delete.svg +0 -0
  156. /package/docs/{kempo-ui/icons → icons}/drag-handle.svg +0 -0
  157. /package/docs/{kempo-ui/icons → icons}/drawing2.svg +0 -0
  158. /package/docs/{kempo-ui/icons → icons}/edit.svg +0 -0
  159. /package/docs/{kempo-ui/icons → icons}/error.svg +0 -0
  160. /package/docs/{kempo-ui/icons → icons}/export-file.svg +0 -0
  161. /package/docs/{kempo-ui/icons → icons}/file-text.svg +0 -0
  162. /package/docs/{kempo-ui/icons → icons}/file.svg +0 -0
  163. /package/docs/{kempo-ui/icons → icons}/filter-off.svg +0 -0
  164. /package/docs/{kempo-ui/icons → icons}/filter.svg +0 -0
  165. /package/docs/{kempo-ui/icons → icons}/first.svg +0 -0
  166. /package/docs/{kempo-ui/icons → icons}/folder-clear.svg +0 -0
  167. /package/docs/{kempo-ui/icons → icons}/folder-create.svg +0 -0
  168. /package/docs/{kempo-ui/icons → icons}/folder-open.svg +0 -0
  169. /package/docs/{kempo-ui/icons → icons}/folder.svg +0 -0
  170. /package/docs/{kempo-ui/icons → icons}/hide.svg +0 -0
  171. /package/docs/{kempo-ui/icons → icons}/image.svg +0 -0
  172. /package/docs/{kempo-ui/icons → icons}/label-add.svg +0 -0
  173. /package/docs/{kempo-ui/icons → icons}/label.svg +0 -0
  174. /package/docs/{kempo-ui/icons → icons}/last.svg +0 -0
  175. /package/docs/{kempo-ui/icons → icons}/menu.svg +0 -0
  176. /package/docs/{kempo-ui/icons → icons}/mode-auto.svg +0 -0
  177. /package/docs/{kempo-ui/icons → icons}/mode-dark.svg +0 -0
  178. /package/docs/{kempo-ui/icons → icons}/mode-light.svg +0 -0
  179. /package/docs/{kempo-ui/icons → icons}/open-in-browser.svg +0 -0
  180. /package/docs/{kempo-ui/icons → icons}/pause.svg +0 -0
  181. /package/docs/{kempo-ui/icons → icons}/play.svg +0 -0
  182. /package/docs/{kempo-ui/icons → icons}/refresh.svg +0 -0
  183. /package/docs/{kempo-ui/icons → icons}/remove.svg +0 -0
  184. /package/docs/{kempo-ui/icons → icons}/save.svg +0 -0
  185. /package/docs/{kempo-ui/icons → icons}/search.svg +0 -0
  186. /package/docs/{kempo-ui/icons → icons}/settings.svg +0 -0
  187. /package/docs/{kempo-ui/icons → icons}/show.svg +0 -0
  188. /package/docs/{kempo-ui/icons → icons}/storage.svg +0 -0
  189. /package/docs/{kempo-ui/icons → icons}/table-visibility.svg +0 -0
  190. /package/docs/{kempo-ui/icons → icons}/tag.svg +0 -0
  191. /package/docs/{kempo-ui/icons → icons}/tools.svg +0 -0
  192. /package/docs/{kempo-ui/icons → icons}/trash-x.svg +0 -0
  193. /package/docs/{kempo-ui/icons → icons}/warning.svg +0 -0
  194. /package/docs/{kempo-ui/kempo-hljs.css → kempo-hljs.css} +0 -0
  195. /package/docs/{kempo-ui/kempo-vars.css → kempo-vars.css} +0 -0
  196. /package/docs/{kempo-ui/kempo.min.css → kempo.min.css} +0 -0
  197. /package/docs/{kempo-ui/media → media}/civic.jpg +0 -0
  198. /package/docs/{kempo-ui/media → media}/corvette.jpg +0 -0
  199. /package/docs/{kempo-ui/media → media}/evo.jpg +0 -0
  200. /package/docs/{kempo-ui/media → media}/gtr.jpg +0 -0
  201. /package/docs/{kempo-ui/media → media}/nsx.jpg +0 -0
  202. /package/{dist → docs}/src/components/Accordion.js +0 -0
  203. /package/{dist → docs}/src/components/Card.js +0 -0
  204. /package/{dist → docs}/src/components/ContentSlider.js +0 -0
  205. /package/{dist → docs}/src/components/Dialog.js +0 -0
  206. /package/{dist → docs}/src/components/FocusCapture.js +0 -0
  207. /package/{dist → docs}/src/components/HybridComponent.js +0 -0
  208. /package/{dist → docs}/src/components/Icon.js +0 -0
  209. /package/{dist → docs}/src/components/Import.js +0 -0
  210. /package/{dist → docs}/src/components/PhotoViewer.js +0 -0
  211. /package/{dist → docs}/src/components/Resize.js +0 -0
  212. /package/{dist → docs}/src/components/ShowMore.js +0 -0
  213. /package/{dist → docs}/src/components/Sortable.js +0 -0
  214. /package/{dist → docs}/src/components/Tabs.js +0 -0
  215. /package/{dist → docs}/src/components/Tags.js +0 -0
  216. /package/{dist → docs}/src/components/ThemeSwitcher.js +0 -0
  217. /package/{dist → docs}/src/components/Timestamp.js +0 -0
  218. /package/{dist → docs}/src/components/Toast.js +0 -0
  219. /package/{dist → docs}/src/components/Toggle.js +0 -0
  220. /package/{dist → docs}/src/components/tableControls/DeleteRecord.js +0 -0
  221. /package/{dist → docs}/src/components/tableControls/Edit.js +0 -0
  222. /package/{dist → docs}/src/components/tableControls/ExportCSV.js +0 -0
  223. /package/{dist → docs}/src/components/tableControls/ExportJson.js +0 -0
  224. /package/{dist → docs}/src/components/tableControls/FirstPage.js +0 -0
  225. /package/{dist → docs}/src/components/tableControls/HiddenCount.js +0 -0
  226. /package/{dist → docs}/src/components/tableControls/Hide.js +0 -0
  227. /package/{dist → docs}/src/components/tableControls/LastPage.js +0 -0
  228. /package/{dist → docs}/src/components/tableControls/NextPage.js +0 -0
  229. /package/{dist → docs}/src/components/tableControls/PageSelect.js +0 -0
  230. /package/{dist → docs}/src/components/tableControls/PageSize.js +0 -0
  231. /package/{dist → docs}/src/components/tableControls/PrevPage.js +0 -0
  232. /package/{dist → docs}/src/components/tableControls/Search.js +0 -0
  233. /package/{dist → docs}/src/components/tableControls/ShowAll.js +0 -0
  234. /package/{dist → docs}/src/components/tableControls/TableControl.js +0 -0
  235. /package/{dist → docs}/src/lit-all.min.js +0 -0
  236. /package/{dist → docs}/src/utils/debounce.js +0 -0
  237. /package/{dist → docs}/src/utils/drag.js +0 -0
  238. /package/{dist → docs}/src/utils/formatTimestamp.js +0 -0
  239. /package/{dist → docs}/src/utils/propConverters.js +0 -0
  240. /package/{dist → docs}/src/utils/toTitleCase.js +0 -0
  241. /package/docs/{kempo-ui/styles.css → styles.css} +0 -0
@@ -0,0 +1 @@
1
+ import{LitElement,html,render}from"../lit-all.min.js";export default class LightComponent extends LitElement{#e;createRenderRoot(){return this.lightRoot=document.createElement("div"),this.lightRoot.style.display="contents",this.appendChild(this.lightRoot),this}connectedCallback(){super.connectedCallback(),this.#e=new MutationObserver(()=>{this.childrenUpdated(),this.requestUpdate()}),this.#e.observe(this,{childList:!0})}disconnectedCallback(){super.disconnectedCallback(),this.#e?.disconnect()}updated(){render(this.renderLightDom(),this.lightRoot)}childrenUpdated(){}renderLightDom(){return html``}}
@@ -0,0 +1 @@
1
+ import{LitElement}from"../lit-all.min.js";export default class ShadowComponent extends LitElement{static stylesheetPath="./kempo.min.css";#e;connectedCallback(){super.connectedCallback(),this.#e=new MutationObserver(()=>{console.log("MutationObserver fired for",this.constructor.name),this.childrenUpdated(),this.requestUpdate()}),this.#e.observe(this,{childList:!0})}disconnectedCallback(){super.disconnectedCallback(),this.#e?.disconnect()}childrenUpdated(){}createRenderRoot(){const e=this.attachShadow({mode:"open"}),t=document.createElement("link");t.rel="stylesheet",t.href=this.constructor.stylesheetPath,e.appendChild(t);const n=this.constructor.styles;if(n){const t=document.createElement("style");Array.isArray(n)?t.textContent=n.map(e=>e.cssText||e).join("\n"):t.textContent=n.cssText||n,e.appendChild(t)}const s=document.createElement("div");return s.style.display="contents",e.appendChild(s),s}}
@@ -1,8 +1,8 @@
1
- import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-all.min.js";import{boolTrueFalse}from"../utils/propConverters.js";import"./FocusCapture.js";export default class SideMenu extends ShadowComponent{static properties={opened:{type:Boolean,reflect:!0},overlayClose:{type:Boolean,reflect:!0,attribute:"overlay-close",converter:boolTrueFalse},side:{type:String,reflect:!0}};constructor(){super(),this.opened=!1,this.overlayClose=!0,this.side="left"}overlayClick=()=>{this.overlayClose&&this.close()};updated(e){super.updated(e),e.has("opened")&&(this.opened?(this.dispatchEvent(new CustomEvent("change",{detail:"open"})),this.dispatchEvent(new CustomEvent("open"))):(this.dispatchEvent(new CustomEvent("change",{detail:"close"})),this.dispatchEvent(new CustomEvent("close"))))}open(){this.opened=!0}close(){this.opened=!1}toggle(){this.opened?this.close():this.open(),this.dispatchEvent(new CustomEvent("toggle"))}render(){return html`
1
+ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-all.min.js";import{boolTrueFalse}from"../utils/propConverters.js";import"./FocusCapture.js";import"./Icon.js";export default class SideMenu extends ShadowComponent{static properties={opened:{type:Boolean,reflect:!0},overlayClose:{type:Boolean,reflect:!0,attribute:"overlay-close",converter:boolTrueFalse},side:{type:String,reflect:!0}};constructor(){super(),this.opened=!1,this.overlayClose=!0,this.side="left"}overlayClick=()=>{this.overlayClose&&this.close()};updated(e){super.updated(e),e.has("opened")&&(this.opened?(this.dispatchEvent(new CustomEvent("change",{detail:"open"})),this.dispatchEvent(new CustomEvent("open"))):(this.dispatchEvent(new CustomEvent("change",{detail:"close"})),this.dispatchEvent(new CustomEvent("close"))))}open(){this.opened=!0}close(){this.opened=!1}toggle(){this.opened?this.close():this.open(),this.dispatchEvent(new CustomEvent("toggle"))}render(){return html`
2
2
  <k-focus-capture>
3
3
  <div id="container">
4
4
  <button id="overlay" @click=${this.overlayClick}>
5
- <div id="overlay-x">✕</div>
5
+ <div id="overlay-x"><k-icon name="close"></k-icon></div>
6
6
  </button>
7
7
  <div id="menu">
8
8
  <slot></slot>
@@ -0,0 +1,84 @@
1
+ import{html,css}from"../lit-all.min.js";import ShadowComponent from"./ShadowComponent.js";import drag from"../utils/drag.js";export default class Split extends ShadowComponent{static properties={resizing:{type:Boolean,reflect:!0},stacked:{type:Boolean,reflect:!0},stackWidth:{type:Number,attribute:"stack-width"}};constructor(){super(),this.resizing=!1,this.stacked=!1,this.stackWidth=0,this.dragStartWidth=0,this.dragCleanup=()=>{},this.resizeObserver=null}firstUpdated(){super.firstUpdated(),this.setupDragHandler(),this.setupResizeObserver()}disconnectedCallback(){super.disconnectedCallback(),this.dragCleanup(),this.resizeObserver&&(this.resizeObserver.disconnect(),this.resizeObserver=null)}handleDragStart=()=>{this.resizing=!0,this.dragStartWidth=Math.round(this.shadowRoot.getElementById("left").getBoundingClientRect().width),this.dispatchEvent(new CustomEvent("resizestart",{detail:{startSize:this.dragStartWidth},bubbles:!0}))};handleDrag=({x:e})=>{const t=`${this.dragStartWidth+e}px`;this.setSize(t),this.dispatchEvent(new CustomEvent("resize",{detail:{size:t},bubbles:!0}))};handleDragEnd=({x:e})=>{this.resizing=!1;const t=`${this.dragStartWidth+e}px`;this.setSize(t),this.dispatchEvent(new CustomEvent("resizeend",{detail:{size:t},bubbles:!0}))};setSize(e){this.style.setProperty("--left_width",e)}setupDragHandler(){const e=this.shadowRoot.getElementById("divider-handle");e&&(this.dragCleanup=drag({element:e,callback:this.handleDrag,startCallback:this.handleDragStart,endCallback:this.handleDragEnd}))}setupResizeObserver(){this.resizeObserver=new ResizeObserver(e=>{for(const t of e){const e=t.contentRect.width;this.stacked=e<=this.stackWidth}}),this.resizeObserver.observe(this)}static styles=css`
2
+ :host {
3
+ --left_width: calc((100% - var(--handle_width)) / 2);
4
+ --handle_width: 0.5rem;
5
+ --min_pane_width: 6rem;
6
+
7
+ height: 100%;
8
+ display: flex;
9
+ align-items: stretch;
10
+ flex: 1 1 auto;
11
+ overflow: hidden;
12
+ }
13
+
14
+ .pane, #divider-handle {
15
+ display: inline-block;
16
+ }
17
+
18
+ .pane {
19
+ min-width: var(--min_pane_width);
20
+ max-width: calc(100% - var(--min_pane_width));
21
+ max-height: 100%;
22
+ overflow: hidden;
23
+ }
24
+
25
+ #left {
26
+ flex: 0 0 var(--left_width);
27
+ }
28
+
29
+ #divider-handle {
30
+ display: flex;
31
+ justify-content: center;
32
+ width: var(--handle_width);
33
+ cursor: ew-resize;
34
+ }
35
+
36
+ :host([resizing]) #divider-handle {
37
+ background-color: var(--tc_primary);
38
+ }
39
+
40
+ :host([resizing]) .pane {
41
+ pointer-events: none;
42
+ user-select: none;
43
+ }
44
+
45
+ #divider-border {
46
+ width: 1px;
47
+ height: 100%;
48
+ border-left: 1px solid var(--c_border);
49
+ }
50
+
51
+ #right {
52
+ flex: 1 1;
53
+ }
54
+
55
+ :host([stacked]) #left,
56
+ :host([stacked]) #right {
57
+ display: block;
58
+ }
59
+
60
+ :host([stacked]) #divider-handle {
61
+ display: none;
62
+ }
63
+
64
+ :host([stacked]) .pane {
65
+ min-width: 0;
66
+ max-width: 100%;
67
+ max-height: none;
68
+ overflow: auto;
69
+ }
70
+
71
+ :host([stacked]) {
72
+ display: block;
73
+ }
74
+ `;render(){return html`
75
+ <div id="left" class="pane">
76
+ <slot></slot>
77
+ </div>
78
+ <div id="divider-handle">
79
+ <div id="divider-border"></div>
80
+ </div>
81
+ <div id="right" class="pane">
82
+ <slot name="right"></slot>
83
+ </div>
84
+ `}}customElements.define("k-split",Split);
@@ -0,0 +1,151 @@
1
+ import{html,css,unsafeStatic,literal}from"../lit-all.min.js";import ShadowComponent from"./ShadowComponent.js";import toTitleCase from"../utils/toTitleCase.js";import{boolExists}from"../utils/propConverters.js";const selected=Symbol("selected"),hidden=Symbol("hidden"),index=Symbol("index"),editing=Symbol("editing");export default class Table extends ShadowComponent{static properties={enablePages:{type:Boolean,reflect:!0,converter:boolExists,attribute:"enable-pages"},pageSize:{type:Number,reflect:!0,attribute:"page-size"},currentPage:{type:Number,reflect:!0,attribute:"current-page"},pageSizeOptions:{type:Array,attribute:"page-size-options"},enableSelection:{type:Boolean,reflect:!0,converter:boolExists,attribute:"enable-selection"},enableSorting:{type:Boolean,reflect:!0,converter:boolExists,attribute:"enable-sorting"},caseSensitiveFilters:{type:Boolean,reflect:!0,converter:boolExists,attribute:"case-sensitive-filters"},fields:{type:Array},records:{type:Array},filters:{type:Array},sort:{type:Array},columnSizes:{type:Object},fetchPending:{type:Boolean}};constructor(e={}){super(),void 0===this.pageSize&&(this.pageSize=50),void 0===this.currentPage&&(this.currentPage=1),void 0===this.pageSizeOptions&&(this.pageSizeOptions=[10,25,50,100,500]),void 0===this.records&&(this.records=e.records||[]),void 0===this.fields&&(this.fields=e.fields||[]),void 0===this.filters&&(this.filters=e.filters||[]),void 0===this.sort&&(this.sort=[]),void 0===this.columnSizes&&(this.columnSizes={}),void 0===this.fetchPending&&(this.fetchPending=!1)}handleSelectAllChange=e=>{e.target.checked?this.selectAllOnPage():this.deselectAllOnPage()};handleFieldClick=e=>{const t=this.sort.find(t=>t.name===e),s=!t||!t.asc;this.sortBy(e,s)};handleRecordSelectionChange=(e,t)=>{e[selected]=!!t.target.checked,this.requestUpdate(),this.dispatchEvent(new CustomEvent("selectionChange",{bubbles:!0}))};firstUpdated(){this.setData({records:this.records,fields:this.fields,filters:this.filters})}childrenUpdated(){this.requestUpdate()}updated(e){if(super.updated(e),this.enableSelection){const e=this.shadowRoot.getElementById("select-all");e&&(e.checked=this.allOnPageSelected())}this.updateContainerWidths()}updateContainerWidths(){const e=this.columnSizes.total+"px",t=this.shadowRoot.getElementById("fields"),s=this.shadowRoot.getElementById("top"),i=this.shadowRoot.getElementById("bottom"),r=this.shadowRoot.getElementById("records");t&&(t.style.width=e),s&&(s.style.width=e),i&&(i.style.width=e),r&&(r.style.width=e)}renderFieldsTemplate(){this.calculateColumnSizes(),this.hasTopControls()?this.setAttribute("top-controls","true"):this.removeAttribute("top-controls"),this.hasBottomControls()?this.setAttribute("bottom-controls","true"):this.removeAttribute("bottom-controls");const e=[];return this.enableSelection&&e.push(html`
2
+ <div class="field controls cell field-select" style="width: 40px">
3
+ <input
4
+ type="checkbox"
5
+ id="select-all"
6
+ @change=${this.handleSelectAllChange}
7
+ />
8
+ </div>
9
+ `),this.hasBeforeControls()&&e.push(html`
10
+ <div class="field cell field-before-controls" style="width: ${this.columnSizes.beforeControls}px"></div>
11
+ `),this.fields.forEach(({name:t,label:s,hidden:i})=>{if(i)return;const r=this.sort.find(e=>e.name===t),o=this.sort.length>0&&this.sort[this.sort.length-1].name===t,l=r?r.asc?"sort-asc":"sort-desc":"";e.push(html`
12
+ <div
13
+ class="field cell ${l}"
14
+ style="width: ${this.columnSizes[t]}px; ${this.enableSorting?"cursor: pointer;":""}"
15
+ @click=${this.enableSorting?()=>this.handleFieldClick(t):null}
16
+ >
17
+ ${s}
18
+ ${o?html`<k-icon name="${r.asc?"arrow-down":"arrow-up"}" class="icon-sort"></k-icon>`:""}
19
+ </div>
20
+ `)}),this.hasAfterControls()&&e.push(html`
21
+ <div class="field cell field-after-controls" style="width: ${this.columnSizes.afterControls}px"></div>
22
+ `),e}renderRecordsTemplate(){let e=this.getDisplayedRecords(),t=0,s=this.pageSize;this.enablePages&&(t=(this.currentPage-1)*this.pageSize,s=t+this.pageSize,e=e.slice(t,s));let i=null,r=0;const o=e.map((e,s)=>null!==e?this.renderRecordTemplate(e):(null===i&&(i=t+s),r++,html`<div class="record fetching"><div class="cell">Loading...</div></div>`));return null===i||this.fetchPending||setTimeout(()=>{this.fetchPending||this.dispatchEvent(new CustomEvent("fetchRecords",{detail:{start:i,count:r},bubbles:!0}))},0),o}renderRecordTemplate(e){const t=[];return this.enableSelection&&t.push(html`
23
+ <div class="cell selection controls" style="width: 40px">
24
+ <input
25
+ type="checkbox"
26
+ .checked=${e[selected]}
27
+ @change=${t=>this.handleRecordSelectionChange(e,t)}
28
+ />
29
+ </div>
30
+ `),this.hasBeforeControls()&&t.push(this.renderBeforeControlsTemplate()),this.fields.forEach(({name:s,formatter:i,calculator:r,type:o,editor:l,hidden:n})=>{if(n)return;let a=e[s]||"";t.push(html`
31
+ <div class="cell" data-field=${s} style="width: ${this.columnSizes[s]}px">
32
+ ${e[editing]?this.renderEditingCell(e,s,a,r,l,o):this.renderDisplayCell(e,s,a,r,i)}
33
+ </div>
34
+ `)}),this.hasAfterControls()&&t.push(this.renderAfterControlsTemplate()),html`
35
+ <div class="record ${e[editing]?"editing":""}" data-index=${e[index]}>
36
+ ${t}
37
+ </div>
38
+ `}renderEditingCell(e,t,s,i,r,o){if(i)return html`<input disabled .value=${i(e,this)} />`;if(r){const e=r(s);return html`${e}`}switch(o||typeof s){case"number":return html`<input type="number" .value=${s} />`;case"date":return html`<input type="date" .value=${s} />`;case"boolean":return html`
39
+ <select .value=${s}>
40
+ <option value="true" ?selected=${s}>True</option>
41
+ <option value="false" ?selected=${!s}>False</option>
42
+ </select>
43
+ `;default:return html`<input type="text" .value=${s} />`}}renderDisplayCell(e,t,s,i,r){return i?i(e,this):r?r(s):s}renderBeforeControlsTemplate(){const e=[];return this.querySelectorAll('[slot="before"]').forEach(t=>{const s=t.tagName.toLowerCase(),i=document.createElement(s);Array.from(t.attributes).forEach(e=>{"slot"!==e.name&&i.setAttribute(e.name,e.value)}),t.innerHTML&&(i.innerHTML=t.innerHTML),e.push(i)}),html`
44
+ <div class="cell controls controls-before" style="width: ${this.columnSizes.beforeControls}px">
45
+ ${e}
46
+ </div>
47
+ `}renderAfterControlsTemplate(){const e=[];return this.querySelectorAll('[slot="after"]').forEach(t=>{const s=t.tagName.toLowerCase(),i=document.createElement(s);Array.from(t.attributes).forEach(e=>{"slot"!==e.name&&i.setAttribute(e.name,e.value)}),t.innerHTML&&(i.innerHTML=t.innerHTML),e.push(i)}),html`
48
+ <div class="cell controls controls-after" style="width: ${this.columnSizes.afterControls}px">
49
+ ${e}
50
+ </div>
51
+ `}hasBeforeControls(){return!!this.querySelector('[slot="before"]')}hasAfterControls(){return!!this.querySelector('[slot="after"]')}hasTopControls(){return!!this.querySelector('[slot="top"]')}hasBottomControls(){return!!this.querySelector(":scope > :not([slot])")}editRecord(e){e[editing]=!0;const t=this.shadowRoot.querySelector(`.record[data-index="${e[index]}"]`);t&&(t.classList.add("editing"),t.setAttribute("editing","true"),t.querySelectorAll(".cell[data-field]").forEach(t=>{const s=t.dataset.field,i=this.fields.find(e=>e.name===s);if(i){const r=e[s]||"";if(t.innerHTML="",i.calculator){const s=document.createElement("input");s.disabled=!0,s.value=i.calculator(e,this),t.appendChild(s)}else if(i.editor)t.appendChild(i.editor(r));else{const e=i.type||typeof r,s=Table.editors[e]||Table.editors.string;t.appendChild(s(r))}}})),this.dispatchEvent(new CustomEvent("editingChange",{detail:{record:e,editing:!0},bubbles:!0}))}saveEditedRecord(e){const t=this.shadowRoot.querySelector(`.record[data-index="${e[index]}"]`);t&&(t.querySelectorAll(".cell[data-field]").forEach(t=>{const s=t.dataset.field,i=this.fields.find(e=>e.name===s);if(i&&!i.calculator){const i=t.querySelector("input, select");i&&(e[s]=i.value)}}),e[editing]=!1,t.classList.remove("editing"),t.removeAttribute("editing"),t.querySelectorAll(".cell[data-field]").forEach(t=>{const s=t.dataset.field,i=this.fields.find(e=>e.name===s);if(i){const r=e[s]||"";i.calculator?t.textContent=i.calculator(e,this):i.formatter?t.innerHTML=i.formatter(r):t.textContent=r}})),this.dispatchEvent(new CustomEvent("editingChange",{detail:{record:e,editing:!1},bubbles:!0}))}cancelEditedRecord(e){e[editing]=!1;const t=this.shadowRoot.querySelector(`.record[data-index="${e[index]}"]`);t&&(t.classList.remove("editing"),t.removeAttribute("editing"),t.querySelectorAll(".cell[data-field]").forEach(t=>{const s=t.dataset.field,i=this.fields.find(e=>e.name===s);if(i){const r=e[s]||"";i.calculator?t.textContent=i.calculator(e,this):i.formatter?t.innerHTML=i.formatter(r):t.textContent=r}})),this.dispatchEvent(new CustomEvent("editingChange",{detail:{record:e,editing:!1},bubbles:!0}))}recordIsEditing(e){return e[editing]}getCurrentPage(){return this.currentPage}getTotalPages(){return Math.ceil(this.getDisplayedRecords().length/this.pageSize)}setPage(e){e<1||e>this.getTotalPages()||(this.currentPage=e,this.requestUpdate(),this.dispatchEvent(new CustomEvent("pageChange",{bubbles:!0})))}firstPage(){1!==this.currentPage&&this.setPage(1)}nextPage(){this.currentPage<this.getTotalPages()&&this.setPage(this.currentPage+1)}prevPage(){this.currentPage>1&&this.setPage(this.currentPage-1)}lastPage(){this.currentPage!==this.getTotalPages()&&this.setPage(this.getTotalPages())}setPageSize(e){this.pageSize=e,this.currentPage=1,this.requestUpdate(),this.dispatchEvent(new CustomEvent("pageSizeChange",{bubbles:!0}))}getPageSize(){return this.pageSize}getPageSizeOptions(){return this.pageSizeOptions}getFieldLabel(e){const t=this.fields.find(t=>t.name===e);return t?t.label:toTitleCase(e)}setPageSizeOptions(e){this.pageSizeOptions=e,this.requestUpdate()}setData({records:e=!1,fields:t=!1,pageSize:s=!1,pageSizeOptions:i=!1,currentPage:r=!1,enableSelection:o}={}){let l=!1,n=this.getTotalPages(),a=this.currentPage;e&&(this.records=e.map(e=>({...e})),this.records.forEach((e,t)=>{e[index]=t,e[selected]=!1,e[hidden]=!1,e[editing]=!1}),this.fields=t||Table.extractFieldsFromRecords(this.records),l=!0),s&&(this.pageSize=s,l=!0),i&&(this.pageSizeOptions=i),r&&(this.currentPage=r,l=!0),void 0!==o&&(this.enableSelection=o,l=!0),l&&this.requestUpdate();const d=this.getTotalPages();d!==n&&this.dispatchEvent(new CustomEvent("pageCountChanged",{detail:{totalPages:this.getTotalPages()},bubbles:!0})),a>d&&this.setPage(d)}setRecords(e,t){let s=this.getTotalPages(),i=this.currentPage;this.records=e.map(e=>({...e})),this.records.forEach((e,t)=>{e[index]=t,e[selected]=!1,e[hidden]=!1,e[editing]=!1}),this.fields=t||Table.extractFieldsFromRecords(this.records),this.requestUpdate(),this.dispatchEvent(new CustomEvent("recordsSet",{detail:{records:e},bubbles:!0}));const r=this.getTotalPages();r!==s&&this.dispatchEvent(new CustomEvent("pageCountChanged",{detail:{totalPages:this.getTotalPages()},bubbles:!0})),i>r&&this.setPage(r)}setupFetchRecords(e,t){const s=this.records.length,i=this.getTotalPages();if(s<e){this.records.length=e,this.records.fill(null,s),this.requestUpdate();const t=this.getTotalPages();t!==i&&setTimeout(()=>{this.dispatchEvent(new CustomEvent("pageCountChanged",{detail:{totalPages:t},bubbles:!0}))},0)}this.addEventListener("fetchRecords",async e=>{if(this.fetchPending)return;this.fetchPending=!0;const{start:s,count:i}=e.detail,r=await t(s,i);r.forEach((e,t)=>{e[index]=s+t,void 0===e[selected]&&(e[selected]=!1),void 0===e[hidden]&&(e[hidden]=!1),void 0===e[editing]&&(e[editing]=!1)}),this.records.splice(s,r.length,...r),this.fetchPending=!1,this.requestUpdate()})}addRecord(e){e[selected]=!1,e[hidden]=!1,e[index]=this.records.length,this.records.push(e),this.requestUpdate(),this.dispatchEvent(new CustomEvent("recordAdded",{detail:{record:e},bubbles:!0}))}updateRecord(e,t){let s=!1,i=this.records.find(t=>t===e);if(i||void 0===e[index]||(i=this.records[e[index]]),Object.keys(t).forEach(e=>{i.hasOwnProperty(e)&&(i[e]=t[e],s=!0)}),s){const e=(this.currentPage-1)*this.pageSize,t=e+this.pageSize;(!this.enablePages||i[index]>=e&&i[index]<t)&&this.requestUpdate()}}deleteRecord(e){let t=this.records.find(t=>t===e),s=this.getTotalPages();if(t||void 0===e[index]||(t=this.records[e[index]]),t){const e=this.records.indexOf(t);this.records.splice(e,1),this.records.forEach((e,t)=>{e[index]=t}),this.requestUpdate(),this.dispatchEvent(new CustomEvent("selectionChange",{bubbles:!0})),this.dispatchEvent(new CustomEvent("recordDeleted",{detail:{index:e},bubbles:!0}));const i=this.getTotalPages();this.currentPage>i&&this.setPage(i),i!==s&&this.dispatchEvent(new CustomEvent("pageCountChanged",{detail:{totalPages:i},bubbles:!0}))}}deleteSelected(){let e=this.getTotalPages();this.getSelectedRecords().forEach(e=>{let t=this.records.find(t=>t===e);if(t||void 0===e[index]||(t=this.records[e[index]]),t){const e=this.records.indexOf(t);this.records.splice(e,1)}}),this.records.forEach((e,t)=>{e[index]=t}),this.requestUpdate();const t=this.getTotalPages();this.currentPage>t&&this.setPage(t),t!==e&&this.dispatchEvent(new CustomEvent("pageCountChanged",{detail:{totalPages:t},bubbles:!0})),this.dispatchEvent(new CustomEvent("selectionChange",{bubbles:!0}))}getSelectedRecords(){return this.records.filter(e=>e[selected])}selectAllOnPage(){const e=(this.currentPage-1)*this.pageSize,t=Math.min(e+this.pageSize,this.records.length);for(let s=e;s<t;s++)this.records[s][selected]=!0;this.requestUpdate(),setTimeout(()=>{this.dispatchEvent(new CustomEvent("selectionChange",{bubbles:!0}))},0)}deselectAllOnPage(){const e=(this.currentPage-1)*this.pageSize,t=Math.min(e+this.pageSize,this.records.length);for(let s=e;s<t;s++)this.records[s][selected]=!1;this.requestUpdate(),setTimeout(()=>{this.dispatchEvent(new CustomEvent("selectionChange",{bubbles:!0}))},0)}allOnPageSelected(){const e=(this.currentPage-1)*this.pageSize,t=Math.min(e+this.pageSize,this.records.length);for(let s=e;s<t;s++)if(!this.records[s][selected])return!1;return!0}sortBy(e,t=!0){this.sort=this.sort.filter(t=>t.name!==e),this.sort.push({name:e,asc:t}),this.requestUpdate()}hideRecord(e){let t=this.records.find(t=>t===e);t||void 0===e[index]||(t=this.records[e[index]]),t&&(t[hidden]=!0,this.requestUpdate(),this.dispatchEvent(new CustomEvent("recordHidden",{bubbles:!0})))}showRecord(e){let t=this.records.find(t=>t===e);t||void 0===e[index]||(t=this.records[e[index]]),t&&(t[hidden]=!1,this.requestUpdate(),this.dispatchEvent(new CustomEvent("recordShown",{bubbles:!0})))}showAllRecords(){this.records.forEach(e=>{e[hidden]=!1}),this.filters.length&&(this.filters=[],this.dispatchEvent(new CustomEvent("filterRemoved",{bubbles:!0})),this.dispatchEvent(new CustomEvent("filterChange",{bubbles:!0}))),this.requestUpdate(),this.dispatchEvent(new CustomEvent("recordShown",{bubbles:!0})),this.dispatchEvent(new CustomEvent("allRecordsShown",{bubbles:!0}))}addFilter(e,t,s){this.filters.push({field:e,condition:t,value:s}),this.dispatchEvent(new CustomEvent("filterAdded",{bubbles:!0})),this.dispatchEvent(new CustomEvent("filterChange",{bubbles:!0})),this.requestUpdate()}removeFilter(e,t,s,i=!0){const r=this.filters.findIndex(i=>i.field===e&&i.condition===t&&i.value===s);-1!==r&&(this.records.forEach(i=>{this.testFilter(i,e,t,s)||(i[hidden]=!1)}),this.filters.splice(r,1),this.dispatchEvent(new CustomEvent("filterRemoved",{bubbles:!0})),this.dispatchEvent(new CustomEvent("filterChange",{bubbles:!0})),i&&this.requestUpdate())}testFilter(e,t,s,i){let r=e[t],o=i;switch(this.caseSensitiveFilters||"string"!=typeof r||"string"!=typeof i||(r=r.toLowerCase(),o=i.toLowerCase()),s){case"equals":return r===o;case"not-equals":return r!==o;case"contains":return r.includes(o);case"not-contains":return!r.includes(o);case"greater-than":return r>o;case"less-than":return r<o;case"greater-than-or-equal":return r>=o;case"less-than-or-equal":return r<=o;default:return!0}}removeAllFilters(){this.filters.length&&(this.filters.forEach(({field:e,condition:t,value:s})=>{this.removeFilter(e,t,s,!1)}),this.requestUpdate())}search(e){const t=e.trim().toLowerCase();let s=!1;this.records.forEach(e=>{if(e[hidden])return;let i=!1;this.fields.forEach(({name:s})=>{(e[s]?.toString().toLowerCase()||"").includes(t)&&(i=!0)}),e[hidden]!==!i&&(e[hidden]=!i,s=!0)}),s&&(this.dispatchEvent(new CustomEvent("recordHidden",{bubbles:!0})),this.requestUpdate()),this.dispatchEvent(new CustomEvent("search",{detail:{term:e},bubbles:!0}))}getDisplayedRecords(){this.filters.forEach(({field:e,condition:t,value:s})=>{this.records.forEach(i=>{null!==i&&(this.testFilter(i,e,t,s)||(i[hidden]=!0))})});let e=this.records.filter(e=>null===e||!e[hidden]);return this.sort.forEach(({name:t,asc:s})=>{e.sort((e,i)=>null===e||null===i?0:e[t]<i[t]?s?-1:1:e[t]>i[t]?s?1:-1:0)}),e}getHiddenRecords(){return this.records.filter(e=>e[hidden])}calculateColumnSizes(){const e={total:0};this.enableSelection&&(e.total+=40);const t=Array.from(this.querySelectorAll('[slot="before"]')),s=Array.from(this.querySelectorAll('[slot="after"]'));e.beforeControls=t.reduce((e,t)=>e+(t.maxWidth||40),0),e.afterControls=s.reduce((e,t)=>e+(t.maxWidth||40),0),this.hasBeforeControls()&&(e.total+=e.beforeControls),this.hasAfterControls()&&(e.total+=e.afterControls),this.fields.forEach(t=>{if(t.size)e[t.name]=t.size,e.total+=t.size;else{let s=0;this.records.slice(0,100).forEach(e=>{if(null===e)return;let i=e[t.name];t.calculator&&(i=t.calculator(e,this)),t.formatter&&(i=t.formatter(i)),i&&i.toString().length>s&&(s=i.toString().length)}),e[t.name]=Math.max(10*s+32,128),t.hidden||(e.total+=e[t.name])}});const i=[...t,...s].some(e=>void 0===e.maxWidth);return JSON.stringify(this.columnSizes)!==JSON.stringify(e)&&(this.columnSizes=e),i&&setTimeout(()=>this.calculateColumnSizes(),0),this.columnSizes}setFieldHiddenState(e,t){const s=this.fields.find(t=>t.name===e);s&&(s.hidden=t,this.calculateColumnSizes(),this.requestUpdate(),this.dispatchEvent(new CustomEvent("fieldVisibilityChanged",{detail:{field:s},bubbles:!0})),this.dispatchEvent(new CustomEvent(t?"fieldHidden":"fieldShown",{detail:{field:s},bubbles:!0})))}hideField(e){this.setFieldHiddenState(e,!0)}showField(e){this.setFieldHiddenState(e,!1)}reorderFields(e){const t=[];e.forEach(e=>{const s=this.fields.find(t=>t.name===e);s&&t.push(s)}),this.fields=t,this.requestUpdate()}render(){return this.records&&this.fields?(this.calculateColumnSizes(),this.hasTopControls()?this.setAttribute("top-controls","true"):this.removeAttribute("top-controls"),this.hasBottomControls()?this.setAttribute("bottom-controls","true"):this.removeAttribute("bottom-controls"),html`
52
+ <div id="wrapper">
53
+ <div id="top" style="width: ${this.columnSizes.total}px"><slot name="top"></slot></div>
54
+ <div id="table">
55
+ <div id="fields" style="width: ${this.columnSizes.total}px">
56
+ ${this.renderFieldsTemplate()}
57
+ </div>
58
+ <div id="records" style="width: ${this.columnSizes.total}px">
59
+ ${this.renderRecordsTemplate()}
60
+ </div>
61
+ </div>
62
+ <div id="bottom" style="width: ${this.columnSizes.total}px"><slot></slot></div>
63
+ </div>
64
+ <div style="display: none">
65
+ <slot name="before"></slot>
66
+ <slot name="after"></slot>
67
+ </div>
68
+ `):html`
69
+ <div id="wrapper">
70
+ <div id="top"><slot name="top"></slot></div>
71
+ <div id="table">
72
+ <div id="fields"></div>
73
+ <div id="records"></div>
74
+ </div>
75
+ <div id="bottom"><slot></slot></div>
76
+ </div>
77
+ <div style="display: none">
78
+ <slot name="before"></slot>
79
+ <slot name="after"></slot>
80
+ </div>
81
+ `}static styles=css`
82
+ :host {
83
+ display: block;
84
+ width: 100%;
85
+ overflow: auto;
86
+ margin-bottom: var(--spacer);
87
+ }
88
+ #wrapper {
89
+ width: min-content;
90
+ border: 1px solid var(--c_border);
91
+ border-radius: var(--radius);
92
+ }
93
+ #table {
94
+ width: min-content;
95
+ }
96
+ #fields,
97
+ .record {
98
+ display: flex;
99
+ }
100
+ #fields {
101
+ background-color: var(--c_bg__alt);
102
+ border-bottom: 1px solid var(--c_border);
103
+ }
104
+ .record:not([editing="true"]) .cell:not(.controls),
105
+ #fields .cell:not(.controls) {
106
+ padding: calc(0.5 * var(--spacer)) var(--spacer);
107
+ }
108
+ .cell {
109
+ display: flex;
110
+ align-items: center;
111
+ }
112
+ .cell:not(:first-child) {
113
+ border-left: 1px solid var(--c_border);
114
+ }
115
+ .record:not(:last-child) .cell {
116
+ border-bottom: 1px solid var(--c_border);
117
+ }
118
+ #top, #bottom {
119
+ display: flex;
120
+ width: 100%;
121
+ }
122
+ #top slot {
123
+ display: block;
124
+ width: 100%;
125
+ border-bottom: 1px solid var(--c_border);
126
+ }
127
+ #bottom slot {
128
+ display: block;
129
+ width: 100%;
130
+ border-top: 1px solid var(--c_border);
131
+ }
132
+ :host(:not([top-controls])) #top,
133
+ :host(:not([bottom-controls])) #bottom {
134
+ display: none;
135
+ }
136
+ .field-select,
137
+ .selection {
138
+ display: flex;
139
+ justify-content: center;
140
+ align-items: center;
141
+ }
142
+ .field-select input,
143
+ .selection input {
144
+ width: 1.25rem;
145
+ height: 1.25rem;
146
+ }
147
+ .icon-sort {
148
+ float: right;
149
+ opacity: 0.5;
150
+ }
151
+ `;static extractFieldsFromRecords(e,t=100){const s=new Set;return e.slice(0,t).forEach(e=>{Object.keys(e).forEach(e=>s.add(e))}),[...s].map(e=>({name:e,label:toTitleCase(e)}))}static format(e){return(Array.isArray(e)?Table.formatters.array:Table.formatters[typeof e])(e)}static formatters={string:e=>e,number:e=>`${e}`,date:e=>e.toLocaleDateString(),boolean:e=>e?"True":"False",array:e=>e.map(e=>Table.format(e)).join(", "),undefined:e=>"",null:e=>"<code>null</code>"};static editors={string:e=>{const t=document.createElement("input");return t.value=e,t},number:e=>{const t=document.createElement("input");return t.type="number",t.value=e,t},date:e=>{const t=document.createElement("input");return t.type="date",t.value=e,t},boolean:e=>{const t=document.createElement("select");return t.innerHTML=`\n <option value="true" ${e?"selected":""}>True</option>\n <option value="false" ${e?"":"selected"}>False</option>\n `,t.value=e,t},calculated:e=>{const t=document.createElement("input");return t.disabled=!0,t.value=e,t}}}window.customElements.define("k-table",Table);
@@ -27,9 +27,6 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css,render}from"..
27
27
  width: 100%;
28
28
  cursor: pointer;
29
29
  }
30
- .branch-label:hover{
31
- background-color: var(--c_bg__alt, #f5f5f5);
32
- }
33
30
  .branch-label:focus{
34
31
  box-shadow: none;
35
32
  }
@@ -1,5 +1,4 @@
1
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 FieldSortHide extends TableControl{constructor(){super({maxWidth:40})}handleClick=()=>{this.openDialog()};openDialog=()=>{import("../Sortable.js");const e=document.createElement("div");render(html`
2
- <h3 class="m0 ph" slot="title">Show / Hide Fields</h3>
3
2
  <div class="m">
4
3
  <k-sortable id="sorting" @sort="${e=>{const t=Array.from(e.target.querySelectorAll("k-sortable-item")).map(e=>e.getAttribute("data-field"));this.table.reorderFields(t)}}">
5
4
  ${this.table.fields.map(e=>html`
@@ -19,7 +18,7 @@ import TableControl from"./TableControl.js";import{html,render}from"../../lit-al
19
18
  `)}
20
19
  </k-sortable>
21
20
  </div>
22
- `,e),Dialog.create(e,{width:"400px",cancelText:"Close"})};render(){return html`
21
+ `,e),Dialog.create(e,{title:"Show / Hide / Order Fields",width:"400px",cancelText:"Close"})};render(){return html`
23
22
  <button class="no-btn icon-btn" @click="${this.handleClick}">
24
23
  <k-icon name="table-visibility"></k-icon>
25
24
  </button>
@@ -1,5 +1,4 @@
1
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
2
  <div class="p">
4
3
  ${0===this.table.filters.length?html`
5
4
  <p>No Current Filters.</p>
@@ -12,7 +11,7 @@ import TableControl from"./TableControl.js";import{html,render}from"../../lit-al
12
11
  data-condition="${i}"
13
12
  data-value="${o}"
14
13
  >
15
- ${e} ${t[i]} ${o}
14
+ ${this.table.getFieldLabel(e)} ${t[i]} "${o}"
16
15
  <button class="remove-filter no-btn pq" @click="${t=>{this.table.removeFilter(e,i,o),l.close(),this.openDialog()}}">
17
16
  <k-icon name="close"></k-icon>
18
17
  </button>
@@ -40,7 +39,7 @@ import TableControl from"./TableControl.js";import{html,render}from"../../lit-al
40
39
  `}
41
40
  </form>
42
41
  </div>
43
- `,e);const l=Dialog.create(e,{width:"600px"})};render(){return html`
42
+ `,e);const l=Dialog.create(e,{width:"600px",title:"Filters"})};render(){return html`
44
43
  <button class="no-btn icon-btn" @click="${this.handleFilter}">
45
44
  <k-icon name="filter"></k-icon>
46
45
  </button>
@@ -1,36 +1,34 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
-
4
3
  <head>
5
- <base href="/kempo-ui/">
6
4
  <meta charset="UTF-8">
7
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
6
  <title>Accordion - Components - Kempo Docs - A Web Components Solution</title>
9
- <link rel="stylesheet" href="kempo-vars.css" />
10
- <link rel="stylesheet" href="kempo.min.css" />
11
- <link rel="stylesheet" href="kempo-hljs.css" />
12
- <link rel="stylesheet" href="styles.css" />
7
+ <link rel="stylesheet" href="../kempo-vars.css" />
8
+ <link rel="stylesheet" href="../kempo.min.css" />
9
+ <link rel="stylesheet" href="../kempo-hljs.css" />
10
+ <link rel="stylesheet" href="../styles.css" />
13
11
  <script>window.litDisableBundleWarning = true;</script>
12
+ <script src="../init-1.js" type="module"></script>
14
13
  </head>
15
-
16
14
  <body>
17
- <k-import src="/kempo-ui/nav.inc.html"></k-import>
15
+ <k-import src="../nav-1.inc.html"></k-import>
18
16
  <h1 class="ta-center">Accordion</h1>
19
17
  <main>
20
18
  <k-accordion persistent-id="toc" class="b r mb">
21
19
  <k-accordion-header for-panel="toc-panel">Table of Contents</k-accordion-header>
22
20
  <k-accordion-panel name="toc-panel">
23
- <div class="m pl">
21
+ <div class="m ">
24
22
  <h6>Examples</h6>
25
- <a href="#basicUsage" class="scroll-link">Basic Usage</a><br />
26
- <a href="#defaultOpen" class="scroll-link">Default Open Panel</a><br />
27
- <a href="#multiple" class="scroll-link">Multiple Panels Mode</a><br />
28
- <a href="#persistent" class="scroll-link">Persistent State Example</a><br />
29
- <h6 class="mt"><a href="#jsRef" class="no-link scroll-link">JavaScript Reference</a></h6>
30
- <a href="#accordion-ref" class="scroll-link">Accordion</a><br />
31
- <a href="#accordion-header-ref" class="scroll-link">AccordionHeader</a><br />
32
- <a href="#accordion-panel-ref" class="scroll-link">AccordionPanel</a><br />
33
- <a href="#events" class="scroll-link">Events</a><br />
23
+ <a href="#basicUsage">Basic Usage</a><br />
24
+ <a href="#defaultOpen">Default Open Panel</a><br />
25
+ <a href="#multiple">Multiple Panels Mode</a><br />
26
+ <a href="#persistent">Persistent State Example</a><br />
27
+ <h6 class="mt"><a href="#jsRef" class="no-link">JavaScript Reference</a></h6>
28
+ <a href="#accordion-ref">Accordion</a><br />
29
+ <a href="#accordion-header-ref">AccordionHeader</a><br />
30
+ <a href="#accordion-panel-ref">AccordionPanel</a><br />
31
+ <a href="#events">Events</a><br />
34
32
  </div>
35
33
  </k-accordion-panel>
36
34
  </k-accordion>
@@ -38,7 +36,7 @@
38
36
  <h3>Description</h3>
39
37
  <p>A widget that allows a single panel of content to be opened and closed.</p>
40
38
 
41
- <h3 id="basicUsage"><a href="#basicUsage" class="no-link scroll-link">Basic Usage</a></h3>
39
+ <h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
42
40
  <div class="row -mx mb">
43
41
  <div class="col d-span-6 m-span-12 px">
44
42
  <k-card label="HTML">
@@ -67,10 +65,8 @@
67
65
 
68
66
 
69
67
 
70
- <h3 id="defaultOpen"><a href="#defaultOpen" class="no-link scroll-link">Default Open Panel</a></h3>
71
- <p>You can have a panel open by default by setting the <code>active</code> attribute to <code>true</code> on both
68
+ <h3 id="defaultOpen"><a href="#defaultOpen" class="no-link">Default Open Panel</a></h3>
72
69
  <p>You can have a panel open by default by adding the <code>active</code> attribute to both the header and the
73
- panel. The presence of the attribute means <code>true</code>.</p>
74
70
  <div class="row -mx mb">
75
71
  <div class="col d-span-6 m-span-12 px">
76
72
  <k-card label="HTML">
@@ -97,7 +93,7 @@
97
93
  </div>
98
94
  </div>
99
95
 
100
- <h3 id="multiple"><a href="#multiple" class="no-link scroll-link">Multiple Panels Mode</a></h3>
96
+ <h3 id="multiple"><a href="#multiple" class="no-link">Multiple Panels Mode</a></h3>
101
97
  <p>Add the <code>multiple</code> attribute to <code>k-accordion</code> to allow more than one panel to be open at a
102
98
  time.</p>
103
99
  <div class="row -mx mb">
@@ -126,7 +122,7 @@
126
122
  </div>
127
123
  </div>
128
124
 
129
- <h3 id="persistent"><a href="#persistent" class="no-link scroll-link">Persistent State Example</a></h3>
125
+ <h3 id="persistent"><a href="#persistent" class="no-link">Persistent State Example</a></h3>
130
126
  <p>Add the <code>persistent-id</code> attribute to <code>k-accordion</code> to save and restore open panels across
131
127
  page reloads. The state is stored in <code>localStorage</code> (if available) using the provided ID.</p>
132
128
  <div class="row -mx mb">
@@ -155,13 +151,13 @@
155
151
  </div>
156
152
  </div>
157
153
 
158
- <h2 id="jsRef"><a href="#jsRef" class="no-link scroll-link">JavaScript Reference</a></h2>
154
+ <h2 id="jsRef"><a href="#jsRef" class="no-link">JavaScript Reference</a></h2>
159
155
  <k-card>
160
156
  <h3 id="accordion-ref" class="bb pb">Accordion</h3>
161
157
  <h4>Properties</h4>
162
158
  <ul>
163
- <li><code>multiple: boolean</code> If present, allows multiple panels to be open.</li>
164
- <li><code>persistentId: string</code> If set, open panel state is saved/restored via localStorage.</li>
159
+ <li><code>multiple: boolean</code> — If present, allows multiple panels to be open.</li>
160
+ <li><code>persistentId: string</code> — If set, open panel state is saved/restored via localStorage.</li>
165
161
  </ul>
166
162
  <h4>Methods</h4>
167
163
  <ul>
@@ -181,9 +177,9 @@
181
177
  <h3 id="accordion-header-ref" class="bb pb">AccordionHeader</h3>
182
178
  <h4>Properties</h4>
183
179
  <ul>
184
- <li><code>forPanel: string</code> The panel name this header controls.</li>
185
- <li><code>active: boolean</code> Whether this header is active.</li>
186
- <li><code>accordion: Accordion | null</code> <i>(read only)</i> Parent accordion.</li>
180
+ <li><code>forPanel: string</code> — The panel name this header controls.</li>
181
+ <li><code>active: boolean</code> — Whether this header is active.</li>
182
+ <li><code>accordion: Accordion | null</code> <i>(read only)</i> — Parent accordion.</li>
187
183
  </ul>
188
184
  <h4>Event Handlers</h4>
189
185
  <ul>
@@ -195,16 +191,16 @@
195
191
  <h3 id="accordion-panel-ref" class="bb pb">AccordionPanel</h3>
196
192
  <h4>Properties</h4>
197
193
  <ul>
198
- <li><code>name: string</code> Unique panel identifier.</li>
199
- <li><code>active: boolean</code> Whether this panel is open.</li>
200
- <li><code>transitioning: boolean</code> Whether this panel is animating.</li>
194
+ <li><code>name: string</code> — Unique panel identifier.</li>
195
+ <li><code>active: boolean</code> — Whether this panel is open.</li>
196
+ <li><code>transitioning: boolean</code> — Whether this panel is animating.</li>
201
197
  </ul>
202
198
  <h4>Methods</h4>
203
199
  <ul>
204
- <li><code>accordion: Accordion | null</code> (getter) Returns parent accordion.</li>
200
+ <li><code>accordion: Accordion | null</code> (getter) — Returns parent accordion.</li>
205
201
  </ul>
206
202
 
207
- <h3 id="events"><a href="#events" class="no-link scroll-link">Events</a></h3>
203
+ <h3 id="events"><a href="#events" class="no-link">Events</a></h3>
208
204
  <h5><code>openpanel</code></h5>
209
205
  <p>Fired when a panel is opened. The event detail contains <code>{ panelName }</code>.</p>
210
206
  <h5><code>closepanel</code></h5>
@@ -215,22 +211,9 @@
215
211
 
216
212
  </main>
217
213
  <div style="height:33vh"></div>
218
- <script type="module" src="/kempo-ui/src/components/Import.js"></script>
219
- <script type="module" src="/kempo-ui/src/components/Accordion.js"></script>
220
- <script type="module" src="/kempo-ui/src/components/Card.js"></script>
221
- <script>
222
- document.querySelectorAll('.scroll-link').forEach(link => {
223
- link.addEventListener('click', function (e) {
224
- e.preventDefault();
225
- const targetId = this.getAttribute('href').replace('#', '');
226
- const target = document.getElementById(targetId);
227
- if (target) {
228
- target.scrollIntoView({ behavior: 'smooth' });
229
- const url = window.location.pathname + window.location.search + '#' + targetId;
230
- history.replaceState(null, '', url);
231
- }
232
- });
233
- });
234
- </script>
214
+ <script type="module" src="../src/components/Import.js"></script>
215
+ <script type="module" src="../src/components/Accordion.js"></script>
216
+ <script type="module" src="../src/components/Card.js"></script>
217
+ <script type="module" src="../src/components/Resize.js"></script>
235
218
  </body>
236
219
  </html>
@@ -1,35 +1,41 @@
1
1
  <!DOCTYPE html>
2
2
  <html lang="en">
3
3
  <head>
4
- <base href="/kempo-ui/">
5
4
  <meta charset="UTF-8">
6
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
6
  <title>Card - Components - Kempo Docs - A Web Components Solution</title>
8
- <link rel="stylesheet" href="kempo-vars.css" />
9
- <link rel="stylesheet" href="kempo.min.css" />
10
- <link rel="stylesheet" href="kempo-hljs.css" />
11
- <link rel="stylesheet" href="styles.css" />
7
+ <link rel="stylesheet" href="../kempo-vars.css" />
8
+ <link rel="stylesheet" href="../kempo.min.css" />
9
+ <link rel="stylesheet" href="../kempo-hljs.css" />
10
+ <link rel="stylesheet" href="../styles.css" />
12
11
  <script>window.litDisableBundleWarning = true;</script>
12
+ <script src="../init-1.js" type="module"></script>
13
13
  </head>
14
14
  <body>
15
- <k-import src="/kempo-ui/nav.inc.html"></k-import>
15
+ <k-import src="../nav-1.inc.html"></k-import>
16
16
  <h1 class="ta-center">Card</h1>
17
17
  <main>
18
- <details class="b r mb">
19
- <summary class="p">Table of Contents</summary>
20
- <div class="m mt0 pl">
21
- <h6>Examples</h6>
22
- <a href="#basicUsage">Basic Usage</a><br />
23
-
24
- <h6 class="mt">JavaScript Reference</h6>
25
- <a href="#constructor">Constructor</a><br />
26
- <a href="#requirements">Requirements</a><br />
27
- <a href="#properties">Properties</a><br />
28
- <a href="#methods">Methods</a><br />
29
- </div>
30
- </details>
18
+ <k-accordion persistent-id="toc" class="b r mb">
19
+ <k-accordion-header for-panel="toc-panel">Table of Contents</k-accordion-header>
20
+ <k-accordion-panel name="toc-panel">
21
+ <div class="m ">
22
+ <h6>Examples</h6>
23
+ <a href="#basicUsage">Basic Usage</a><br />
24
+ <a href="#labels">Labels</a><br />
25
+
26
+ <h6 class="mt"><a href="#jsRef" class="no-link">JavaScript Reference</a></h6>
27
+ <a href="#constructor">Constructor</a><br />
28
+ <a href="#requirements">Requirements</a><br />
29
+ <a href="#properties">Properties</a><br />
30
+ <a href="#methods">Methods</a><br />
31
+ </div>
32
+ </k-accordion-panel>
33
+ </k-accordion>
31
34
 
35
+ <h3>Description</h3>
32
36
  <p>A card is a "box" around some content with a border, padding and margins that make it stand out.</p>
37
+
38
+ <h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
33
39
  <div class="row -mx mb">
34
40
  <div class="col d-span-6 m-span-12 px">
35
41
  <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-card</span>&gt;</span><br /> This is a card<br /><span class="hljs-tag">&lt;/<span class="hljs-name">k-card</span>&gt;</span></code></pre>
@@ -54,7 +60,7 @@
54
60
  </div>
55
61
  </div>
56
62
 
57
- <h2 id="jsRef">JavaScript Reference</h2>
63
+ <h2 id="jsRef"><a href="#jsRef" class="no-link">JavaScript Reference</a></h2>
58
64
 
59
65
  <h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
60
66
  <h6>Extends <a href="./shadow-component.html">ShadowComponent</a></h6>
@@ -82,7 +88,9 @@
82
88
 
83
89
  </main>
84
90
  <div style="height:33vh"></div>
85
- <script type="module" src="/kempo-ui/src/components/Import.js"></script>
86
- <script type="module" src="/kempo-ui/src/components/Card.js"></script>
91
+ <script type="module" src="../src/components/Import.js"></script>
92
+ <script type="module" src="../src/components/Accordion.js"></script>
93
+ <script type="module" src="../src/components/Card.js"></script>
94
+
87
95
  </body>
88
- </html>
96
+ </html>