kempo-ui 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.github/workflows/publish-major.yml +39 -0
  2. package/.github/workflows/publish-minor.yml +39 -0
  3. package/.github/workflows/{publish-npm.yml → publish-patch.yml} +1 -1
  4. package/.vscode/settings.json +2 -0
  5. package/dist/kempo-hljs.css +1 -0
  6. package/dist/src/components/Accordion.js +36 -0
  7. package/dist/src/components/Card.js +37 -0
  8. package/dist/src/components/Collapsible.js +41 -0
  9. package/dist/src/components/ContentSlider.js +44 -0
  10. package/dist/src/components/Dialog.js +120 -0
  11. package/dist/src/components/Icon.js +2 -2
  12. package/dist/src/components/PersistantCollapsible.js +1 -0
  13. package/dist/src/components/PhotoViewer.js +135 -0
  14. package/dist/src/components/Resize.js +96 -0
  15. package/dist/src/components/ShadowComponent.js +1 -1
  16. package/dist/src/components/ShowMore.js +42 -0
  17. package/dist/src/components/SideMenu.js +1 -1
  18. package/dist/src/components/Sortable.js +45 -0
  19. package/dist/src/components/Split.js +84 -0
  20. package/dist/src/components/Table.js +151 -0
  21. package/dist/src/components/Tabs.js +155 -0
  22. package/dist/src/components/Tags.js +69 -0
  23. package/dist/src/components/ThemeSwitcher.js +23 -0
  24. package/dist/src/components/Timestamp.js +1 -0
  25. package/dist/src/components/Toast.js +141 -0
  26. package/dist/src/components/Toggle.js +74 -0
  27. package/dist/src/components/tableControls/DeleteRecord.js +7 -0
  28. package/dist/src/components/tableControls/Edit.js +18 -0
  29. package/dist/src/components/tableControls/ExportCSV.js +8 -0
  30. package/dist/src/components/tableControls/ExportJson.js +8 -0
  31. package/dist/src/components/tableControls/FieldSortHide.js +26 -0
  32. package/dist/src/components/tableControls/Filters.js +47 -0
  33. package/dist/src/components/tableControls/FirstPage.js +9 -0
  34. package/dist/src/components/tableControls/HiddenCount.js +3 -0
  35. package/dist/src/components/tableControls/Hide.js +5 -0
  36. package/dist/src/components/tableControls/LastPage.js +9 -0
  37. package/dist/src/components/tableControls/NextPage.js +9 -0
  38. package/dist/src/components/tableControls/PageSelect.js +22 -0
  39. package/dist/src/components/tableControls/PageSize.js +5 -0
  40. package/dist/src/components/tableControls/PrevPage.js +9 -0
  41. package/dist/src/components/tableControls/Search.js +9 -0
  42. package/dist/src/components/tableControls/ShowAll.js +5 -0
  43. package/dist/src/components/tableControls/TableControl.js +16 -0
  44. package/dist/src/utils/debounce.js +1 -0
  45. package/dist/src/utils/drag.js +1 -0
  46. package/dist/src/utils/formatTimestamp.js +1 -0
  47. package/dist/src/utils/propConverters.js +1 -0
  48. package/dist/src/utils/toTitleCase.js +1 -0
  49. package/dist/src/utils/watchWindowSize.js +1 -0
  50. package/docs/components/accordion.html +69 -25
  51. package/docs/components/card.html +6 -5
  52. package/docs/components/collapsible.html +198 -0
  53. package/docs/components/content-slider.html +56 -26
  54. package/docs/components/dialog.html +54 -48
  55. package/docs/components/focus-capture.html +59 -15
  56. package/docs/components/hybrid-component.html +112 -0
  57. package/docs/components/icon.html +5 -10
  58. package/docs/components/import.html +1 -6
  59. package/docs/components/light-component.html +99 -0
  60. package/docs/components/persistant-collapsible.html +123 -0
  61. package/docs/components/photo-viewer.html +226 -0
  62. package/docs/components/resize.html +44 -18
  63. package/docs/components/shadow-component.html +88 -0
  64. package/docs/components/show-more.html +12 -6
  65. package/docs/components/side-menu.html +3 -12
  66. package/docs/components/sortable.html +91 -55
  67. package/docs/components/split.html +26 -5
  68. package/docs/components/tablePagination.html +4 -4
  69. package/docs/components/tableRecordFiltering.html +16 -3
  70. package/docs/components/tableRecordSelection.html +2 -2
  71. package/docs/components/tabs.html +24 -7
  72. package/docs/components/tags.html +24 -8
  73. package/docs/components/theme-switcher.html +3 -6
  74. package/docs/components/timestamp.html +20 -24
  75. package/docs/components/toast.html +23 -32
  76. package/docs/components/toggle.html +4 -3
  77. package/docs/icons/error.svg +1 -1
  78. package/docs/icons/warning.svg +1 -1
  79. package/docs/index.html +197 -5
  80. package/docs/kempo-hljs.css +1 -0
  81. package/docs/kempo.min.css +1 -1
  82. package/docs/media/civic.jpg +0 -0
  83. package/docs/media/corvette.jpg +0 -0
  84. package/docs/media/evo.jpg +0 -0
  85. package/docs/media/gtr.jpg +0 -0
  86. package/docs/media/nsx.jpg +0 -0
  87. package/docs/nav.inc.html +19 -24
  88. package/docs/src/components/Accordion.js +36 -0
  89. package/docs/src/components/Card.js +37 -0
  90. package/docs/src/components/Collapsible.js +41 -0
  91. package/docs/src/components/ContentSlider.js +44 -0
  92. package/docs/src/components/Dialog.js +120 -0
  93. package/docs/src/components/Icon.js +2 -2
  94. package/docs/src/components/PersistantCollapsible.js +1 -0
  95. package/docs/src/components/PhotoViewer.js +135 -0
  96. package/docs/src/components/Resize.js +96 -0
  97. package/docs/src/components/ShadowComponent.js +1 -1
  98. package/docs/src/components/ShowMore.js +42 -0
  99. package/docs/src/components/SideMenu.js +1 -1
  100. package/docs/src/components/Sortable.js +45 -0
  101. package/docs/src/components/Split.js +84 -0
  102. package/docs/src/components/Table.js +151 -0
  103. package/docs/src/components/Tabs.js +155 -0
  104. package/docs/src/components/Tags.js +69 -0
  105. package/docs/src/components/ThemeSwitcher.js +23 -0
  106. package/docs/src/components/Timestamp.js +1 -0
  107. package/docs/src/components/Toast.js +141 -0
  108. package/docs/src/components/Toggle.js +74 -0
  109. package/docs/src/components/tableControls/DeleteRecord.js +7 -0
  110. package/docs/src/components/tableControls/Edit.js +18 -0
  111. package/docs/src/components/tableControls/ExportCSV.js +8 -0
  112. package/docs/src/components/tableControls/ExportJson.js +8 -0
  113. package/docs/src/components/tableControls/FieldSortHide.js +26 -0
  114. package/docs/src/components/tableControls/Filters.js +47 -0
  115. package/docs/src/components/tableControls/FirstPage.js +9 -0
  116. package/docs/src/components/tableControls/HiddenCount.js +3 -0
  117. package/docs/src/components/tableControls/Hide.js +5 -0
  118. package/docs/src/components/tableControls/LastPage.js +9 -0
  119. package/docs/src/components/tableControls/NextPage.js +9 -0
  120. package/docs/src/components/tableControls/PageSelect.js +22 -0
  121. package/docs/src/components/tableControls/PageSize.js +5 -0
  122. package/docs/src/components/tableControls/PrevPage.js +9 -0
  123. package/docs/src/components/tableControls/Search.js +9 -0
  124. package/docs/src/components/tableControls/ShowAll.js +5 -0
  125. package/docs/src/components/tableControls/TableControl.js +16 -0
  126. package/docs/src/utils/debounce.js +1 -0
  127. package/docs/src/utils/drag.js +1 -0
  128. package/docs/src/utils/formatTimestamp.js +1 -0
  129. package/docs/src/utils/propConverters.js +1 -0
  130. package/docs/src/utils/toTitleCase.js +1 -0
  131. package/docs/src/utils/watchWindowSize.js +1 -0
  132. package/docs/utils/debounce.html +78 -0
  133. package/docs/utils/drag.html +89 -0
  134. package/docs/utils/formatTimestamp.html +114 -0
  135. package/docs/utils/propConverters.html +132 -0
  136. package/docs/utils/toTitleCase.html +71 -0
  137. package/docs/utils/watchWindowSize.html +166 -0
  138. package/icons/error.svg +1 -1
  139. package/icons/warning.svg +1 -1
  140. package/package.json +1 -1
  141. package/scripts/build.js +4 -1
  142. package/scripts/docs.js +4 -2
  143. package/src/components/Accordion.js +229 -0
  144. package/src/components/Collapsible.js +109 -0
  145. package/src/components/ContentSlider.js +205 -0
  146. package/src/components/Dialog.js +376 -0
  147. package/src/components/PersistantCollapsible.js +69 -0
  148. package/src/components/PhotoViewer.js +368 -0
  149. package/src/components/Resize.js +210 -0
  150. package/src/components/ShadowComponent.js +3 -1
  151. package/src/components/ShowMore.js +109 -0
  152. package/src/components/Sortable.js +193 -0
  153. package/src/components/Split.js +192 -0
  154. package/src/components/Table.js +1202 -0
  155. package/src/components/Tabs.js +428 -0
  156. package/src/components/Tags.js +253 -0
  157. package/src/components/Timestamp.js +31 -0
  158. package/src/components/Toast.js +454 -0
  159. package/src/components/Toggle.js +173 -0
  160. package/src/components/tableControls/DeleteRecord.js +29 -0
  161. package/src/components/tableControls/Edit.js +88 -0
  162. package/src/components/tableControls/ExportCSV.js +71 -0
  163. package/src/components/tableControls/ExportJson.js +55 -0
  164. package/src/components/tableControls/FieldSortHide.js +76 -0
  165. package/src/components/tableControls/Filters.js +114 -0
  166. package/src/components/tableControls/FirstPage.js +65 -0
  167. package/src/components/tableControls/HiddenCount.js +45 -0
  168. package/src/components/tableControls/Hide.js +34 -0
  169. package/src/components/tableControls/LastPage.js +65 -0
  170. package/src/components/tableControls/NextPage.js +65 -0
  171. package/src/components/tableControls/PageSelect.js +109 -0
  172. package/src/components/tableControls/PageSize.js +68 -0
  173. package/src/components/tableControls/PrevPage.js +65 -0
  174. package/src/components/tableControls/Search.js +58 -0
  175. package/src/components/tableControls/ShowAll.js +34 -0
  176. package/src/components/tableControls/TableControl.js +105 -0
  177. package/src/utils/debounce.js +9 -0
  178. package/src/utils/drag.js +80 -0
  179. package/src/utils/formatTimestamp.js +27 -0
  180. package/src/utils/toTitleCase.js +9 -0
  181. package/src/utils/watchWindowSize.js +16 -0
  182. package/dist/src/utils/cli.js +0 -1
  183. package/dist/src/utils/fs-utils.js +0 -1
  184. package/docs/components/component.html +0 -90
  185. package/docs/components/directory-viewer.html +0 -90
  186. package/docs/components/lazy-component.html +0 -84
  187. package/docs/components/reactive-component.html +0 -69
  188. package/docs/components/reactive-lazy-component.html +0 -69
  189. package/docs/components/search.html +0 -102
  190. package/docs/src/utils/cli.js +0 -1
  191. package/docs/src/utils/fs-utils.js +0 -1
  192. package/src/utils/cli.js +0 -43
  193. package/src/utils/fs-utils.js +0 -41
@@ -0,0 +1,141 @@
1
+ import{html,css}from"../lit-all.min.js";import ShadowComponent from"./ShadowComponent.js";import"./Icon.js";export default class Toast extends ShadowComponent{static properties={actionHtml:{type:String,reflect:!0,attribute:"action-html"},closeHtml:{type:String,reflect:!0,attribute:"close-html"},timeout:{type:Number,reflect:!0},opened:{type:Boolean,reflect:!0},hasAction:{type:Boolean,reflect:!0,attribute:"has-action"},hasClose:{type:Boolean,reflect:!0,attribute:"has-close"},hasIcon:{type:Boolean,reflect:!0,attribute:"has-icon"},position:{type:String,reflect:!0},animating:{type:String,reflect:!0}};static styles=css`
2
+ @keyframes toast-show-bottom {
3
+ from { opacity: 0; transform: translateY(20px); }
4
+ to { opacity: 1; transform: translateY(0); }
5
+ }
6
+ @keyframes toast-hide-bottom {
7
+ from { opacity: 1; transform: translateY(0); }
8
+ to { opacity: 0; transform: translateY(20px); }
9
+ }
10
+ @keyframes toast-show-top {
11
+ from { opacity: 0; transform: translateY(-20px); }
12
+ to { opacity: 1; transform: translateY(0); }
13
+ }
14
+ @keyframes toast-hide-top {
15
+ from { opacity: 1; transform: translateY(0); }
16
+ to { opacity: 0; transform: translateY(-20px); }
17
+ }
18
+ @keyframes toast-show-left {
19
+ from { opacity: 0; transform: translateX(-20px); }
20
+ to { opacity: 1; transform: translateX(0); }
21
+ }
22
+ @keyframes toast-hide-left {
23
+ from { opacity: 1; transform: translateX(0); }
24
+ to { opacity: 0; transform: translateX(-20px); }
25
+ }
26
+ @keyframes toast-show-right {
27
+ from { opacity: 0; transform: translateX(20px); }
28
+ to { opacity: 1; transform: translateX(0); }
29
+ }
30
+ @keyframes toast-hide-right {
31
+ from { opacity: 1; transform: translateX(0); }
32
+ to { opacity: 0; transform: translateX(20px); }
33
+ }
34
+
35
+ :host {
36
+ display: none;
37
+ min-width: 16rem;
38
+ max-width: calc(100% - (2 * var(--spacer, 1rem)));
39
+ background-color: var(--c_bg, #ffffff);
40
+ border-radius: var(--radius, 0.375rem);
41
+ }
42
+
43
+ :host([opened]) {
44
+ display: flex;
45
+ }
46
+
47
+ :host([animating="in"][position*="bottom"]) {
48
+ animation: toast-show-bottom var(--animation_ms, 300ms) ease forwards;
49
+ }
50
+ :host([animating="out"][position*="bottom"]) {
51
+ animation: toast-hide-bottom var(--animation_ms, 300ms) ease forwards;
52
+ }
53
+ :host([animating="in"][position*="top"]) {
54
+ animation: toast-show-top var(--animation_ms, 300ms) ease forwards;
55
+ }
56
+ :host([animating="out"][position*="top"]) {
57
+ animation: toast-hide-top var(--animation_ms, 300ms) ease forwards;
58
+ }
59
+ :host([animating="in"][position*="left"]:not([position*="top"]):not([position*="bottom"])) {
60
+ animation: toast-show-left var(--animation_ms, 300ms) ease forwards;
61
+ }
62
+ :host([animating="out"][position*="left"]:not([position*="top"]):not([position*="bottom"])) {
63
+ animation: toast-hide-left var(--animation_ms, 300ms) ease forwards;
64
+ }
65
+ :host([animating="in"][position*="right"]:not([position*="top"]):not([position*="bottom"])) {
66
+ animation: toast-show-right var(--animation_ms, 300ms) ease forwards;
67
+ }
68
+ :host([animating="out"][position*="right"]:not([position*="top"]):not([position*="bottom"])) {
69
+ animation: toast-hide-right var(--animation_ms, 300ms) ease forwards;
70
+ }
71
+
72
+ #icon {
73
+ padding: var(--spacer, 1rem);
74
+ padding-right: 0;
75
+ }
76
+
77
+ #message {
78
+ padding: var(--spacer, 1rem);
79
+ flex: 1 1 auto;
80
+ }
81
+
82
+ :host(:not([has-close])) #close,
83
+ :host(:not([has-action])) #action,
84
+ :host(:not([has-icon])) #icon {
85
+ display: none;
86
+ }
87
+
88
+ #action {
89
+ background: transparent;
90
+ border: none;
91
+ color: var(--tc_primary, blue);
92
+ cursor: pointer;
93
+ padding: var(--spacer, 1rem);
94
+ }
95
+
96
+ #action:hover {
97
+ color: var(--tc_primary__hover, lightblue);
98
+ }
99
+
100
+ #close {
101
+ background: transparent;
102
+ border: none;
103
+ cursor: pointer;
104
+ padding: var(--spacer, 1rem);
105
+ opacity: 0.7;
106
+ transition: opacity var(--animation_ms, 300ms);
107
+ }
108
+
109
+ #close:hover {
110
+ opacity: 1;
111
+ }
112
+
113
+ /* Theme classes */
114
+ :host(.bg-success) {
115
+ background-color: var(--c_success, #dcfce7);
116
+ color: var(--tc_on_success, #166534);
117
+ }
118
+
119
+ :host(.bg-warning) {
120
+ background-color: var(--c_warning, #fef3c7);
121
+ color: var(--tc_on_warning, #92400e);
122
+ }
123
+
124
+ :host(.bg-danger) {
125
+ background-color: var(--c_danger, #fee2e2);
126
+ color: var(--tc_on_danger, #991b1b);
127
+ }
128
+ `;constructor(){super(),this.actionHtml="",this.closeHtml="",this.timeout=0,this.opened=!1,this.hasAction=!1,this.hasClose=!1,this.hasIcon=!1,this.position="bottom center",this.animating="",this.actionCallback=()=>{},this.closeCallback=()=>{},this.timeoutId=null,this.closing=!1}updated(t){super.updated(t),t.has("opened")&&this.opened&&(this.hasAction=!!this.querySelector('[slot="action"]'),this.hasClose=!!this.querySelector('[slot="close"]'),this.hasIcon=!!this.querySelector('[slot="icon"]'))}connectedCallback(){super.connectedCallback(),this.addEventListener("animationend",this.handleAnimationEnd)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("animationend",this.handleAnimationEnd),clearTimeout(this.timeoutId)}handleActionClick=()=>{!1!==this.actionCallback()&&this.close()};handleCloseClick=()=>{this.close()};handleAnimationEnd=t=>{t.animationName.includes("toast-hide")?(this.animating="",this.opened=!1,this.dispatchEvent(new CustomEvent("close")),this.dispatchEvent(new CustomEvent("openchange")),this.closeCallback(),this.closing=!1):t.animationName.includes("toast-show")&&(this.animating="")};open(){this.closing=!1,this.animating="in",this.opened=!0,this.timeout&&(clearTimeout(this.timeoutId),this.timeoutId=setTimeout(()=>{this.close()},this.timeout)),this.dispatchEvent(new CustomEvent("open")),this.dispatchEvent(new CustomEvent("openchange"))}close(){clearTimeout(this.timeoutId),this.opened&&!this.closing&&(this.closing=!0,this.animating="out")}render(){return html`
129
+ <div id="icon">
130
+ <slot name="icon"></slot>
131
+ </div>
132
+ <div id="message">
133
+ <slot></slot>
134
+ </div>
135
+ <button id="action" class="no-style" @click="${this.handleActionClick}">
136
+ <slot name="action"></slot>
137
+ </button>
138
+ <button id="close" class="no-style" @click="${this.handleCloseClick}">
139
+ <slot name="close"></slot>
140
+ </button>
141
+ `}static create(t,o={}){let{position:e="auto",removeOnClose:n=!0,closeCallback:s=()=>{},action:a=!1,close:i=!1,icon:r=!1,timeout:c=5e3}=o;"auto"===e&&(e=window.innerWidth<=768?"bottom center":"top right");let l=document.querySelector(`k-toast-container[position="${e}"]`);l||(l=new ToastContainer(e),document.body.appendChild(l));const m=new Toast;m.position=e,m.timeout=c,m.innerHTML=t,m.actionCallback=o.actionCallback||(()=>{});const h=s;if(m.closeCallback=(...t)=>{n&&(m.remove(),0===l.children.length&&l.remove()),h(...t)},r){const t=document.createElement("span");t.slot="icon",r instanceof HTMLElement?t.appendChild(r):t.innerHTML=r,m.appendChild(t)}if(a){const t=document.createElement("span");t.slot="action",a instanceof HTMLElement?t.appendChild(a):t.innerHTML=a,m.appendChild(t)}if(i){const t=document.createElement("span");t.slot="close",i instanceof HTMLElement?t.appendChild(i):t.innerHTML=i,m.appendChild(t)}return l.appendChild(m),m.open(),m}static success(t,o={}){const e=Toast.create(t,{icon:'<k-icon name="check"></k-icon>',...o});return e.classList.add("bg-success"),e}static warning(t,o={}){const e=Toast.create(t,{icon:'<k-icon name="warning"></k-icon>',...o});return e.classList.add("bg-warning"),e}static error(t,o={}){const e=Toast.create(t,{icon:'<k-icon name="error"></k-icon>',...o});return e.classList.add("bg-danger"),e}}class ToastContainer extends HTMLElement{constructor(t="bottom center"){super(),this.position=t.toLowerCase(),this.setAttribute("position",this.position),this.applyStyles()}applyStyles(){this.style.cssText="\n position: fixed;\n display: flex;\n flex-direction: column;\n gap: 8px;\n z-index: 1000;\n pointer-events: auto;\n padding: 32px;\n box-sizing: border-box;\n max-width: 100%;\n max-height: 100%;\n overflow: visible;\n ";new MutationObserver(()=>{Array.from(this.children).forEach(t=>{"K-TOAST"===t.tagName&&(t.style.filter="drop-shadow(0 10px 15px rgba(0, 0, 0, 0.1)) drop-shadow(0 4px 6px rgba(0, 0, 0, 0.05))")})}).observe(this,{childList:!0}),Array.from(this.children).forEach(t=>{"K-TOAST"===t.tagName&&(t.style.filter="drop-shadow(0 10px 15px rgba(0, 0, 0, 0.1)) drop-shadow(0 4px 6px rgba(0, 0, 0, 0.05))")});const[t,o]=this.position.split(" ");"top"===t?this.style.top="0":this.style.bottom="0","left"===o?(this.style.left="0",this.style.alignItems="flex-start"):"right"===o?(this.style.right="0",this.style.alignItems="flex-end"):"center"===o&&("top"===t||"bottom"===t?(this.style.left="50%",this.style.transform="translateX(-50%)",this.style.alignItems="center"):(this.style.top="50%",this.style.left="50%",this.style.transform="translate(-50%, -50%)"))}static getContainer(t){let o=document.querySelector(`k-toast-container[position="${t}"]`);return o||(o=new ToastContainer(t),document.body.appendChild(o)),o}}window.customElements.define("k-toast",Toast),window.customElements.define("k-toast-container",ToastContainer);
@@ -0,0 +1,74 @@
1
+ import{html,css}from"../lit-all.min.js";import ShadowComponent from"./ShadowComponent.js";export default class Toggle extends ShadowComponent{static properties={value:{type:Boolean,reflect:!0}};static styles=css`
2
+ :host {
3
+ --switch_height: 2rem;
4
+ --switch_width: 3rem;
5
+ --switch_border: 1px solid var(--c_border);
6
+ --switch_background__off: var(--c_bg__alt);
7
+ --switch_background__on: var(--c_success);
8
+ --handle_size__off: 1rem;
9
+ --handle_size__on: 1.5rem;
10
+ --handle_border: 1px solid var(--c_border);
11
+ --handle_background__off: var(--c_border);
12
+ --handle_background__on: white;
13
+
14
+ display: flex;
15
+ align-items: center;
16
+ cursor: pointer;
17
+ margin-bottom: var(--spacer);
18
+ border-radius: 999rem;
19
+ outline: none;
20
+ }
21
+
22
+ :host(:focus) {
23
+ outline: 2px solid var(--c_primary, blue);
24
+ outline-offset: 2px;
25
+ }
26
+
27
+ #switch {
28
+ display: flex;
29
+ align-items: center;
30
+ width: var(--switch_width);
31
+ height: var(--switch_height);
32
+ border: var(--switch_border);
33
+ background: var(--switch_background__off);
34
+ border-radius: 999rem;
35
+ margin-right: var(--spacer);
36
+ }
37
+
38
+ #handle {
39
+ --margin: calc( (var(--switch_height) - var(--handle_size__off)) / 2);
40
+ width: var(--handle_size__off);
41
+ height: var(--handle_size__off);
42
+ border: var(--handle_border);
43
+ background: var(--handle_background__off);
44
+ border-radius: 999rem;
45
+ transform: translateX(var(--margin));
46
+ transition: width var(--animation_ms, 256ms), height var(--animation_ms, 256ms), transform var(--animation_ms, 256ms);
47
+ }
48
+
49
+ :host([value]) #switch {
50
+ background: var(--switch_background__on);
51
+ }
52
+
53
+ :host([value]) #handle {
54
+ --m: calc( (var(--switch_height) - var(--handle_size__on)) / 2);
55
+ --d: calc( var(--switch_width) - var(--handle_size__on) - var(--m));
56
+ width: var(--handle_size__on);
57
+ height: var(--handle_size__on);
58
+ background: var(--handle_background__on);
59
+ transform: translateX(var(--d));
60
+ }
61
+
62
+ #label {
63
+ display: block;
64
+ flex: 1 1 auto;
65
+ padding: 0;
66
+ }
67
+ `;constructor(){super(),this.value=!1,this.tabIndex=0}updated(e){super.updated(e),e.has("value")&&this.dispatchEvent(new CustomEvent("change",{detail:{value:this.value},bubbles:!0}))}connectedCallback(){super.connectedCallback(),this.addEventListener("click",this.handleClick),this.addEventListener("keydown",this.handleKeyDown)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("click",this.handleClick),this.removeEventListener("keydown",this.handleKeyDown)}handleClick=()=>{this.toggle()};handleKeyDown=e=>{["Space","Enter"].includes(e.code)&&(e.preventDefault(),this.toggle())};on(){return this.value=!0,this.dispatchEvent(new CustomEvent("on",{detail:{value:!0},bubbles:!0})),this}off(){return this.value=!1,this.dispatchEvent(new CustomEvent("off",{detail:{value:!1},bubbles:!0})),this}toggle(){return this.value?this.off():this.on(),this.dispatchEvent(new CustomEvent("toggle",{detail:{value:this.value},bubbles:!0})),this}render(){return html`
68
+ <div id="switch">
69
+ <div id="handle"></div>
70
+ </div>
71
+ <label id="label">
72
+ <slot></slot>
73
+ </label>
74
+ `}}window.customElements.define("k-toggle",Toggle);
@@ -0,0 +1,7 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class DeleteRecord extends TableControl{delete=()=>{this.record&&this.table.deleteRecord(this.record)};render(){return html`
2
+ <button class="no-btn icon-btn" @click="${this.delete}">
3
+ <slot>
4
+ <k-icon name="delete"></k-icon>
5
+ </slot>
6
+ </button>
7
+ `}}customElements.define("k-tc-delete-record",DeleteRecord);
@@ -0,0 +1,18 @@
1
+ import TableControl from"./TableControl.js";import{html,css}from"../../lit-all.min.js";import"../Icon.js";export default class Edit extends TableControl{static properties={isEditing:{type:Boolean}};static styles=[TableControl.styles,css`
2
+ :host {
3
+ display: inline-flex;
4
+ width: max-content;
5
+ align-items: baseline;
6
+ }
7
+ `];constructor(){super({maxWidth:80})}connectedCallback(){super.connectedCallback(),this.onTableEvent("editingChange",this.handleEditingChange)}handleEditingChange=t=>{t.detail.record===this.record&&(this.isEditing=t.detail.editing)};handleEdit=()=>{this.record&&this.table.editRecord(this.record)};handleSave=()=>{this.record&&this.table.saveEditedRecord(this.record)};handleCancel=()=>{this.record&&this.table.cancelEditedRecord(this.record)};render(){return this.isEditing?html`
8
+ <button class="no-btn icon-btn bg-success" @click="${this.handleSave}">
9
+ <k-icon name="check"></k-icon>
10
+ </button>
11
+ <button class="no-btn icon-btn bg-danger" @click="${this.handleCancel}">
12
+ <k-icon name="close"></k-icon>
13
+ </button>
14
+ `:html`
15
+ <button class="no-btn icon-btn" @click="${this.handleEdit}">
16
+ <k-icon name="edit"></k-icon>
17
+ </button>
18
+ `}}customElements.define("k-tc-edit",Edit);
@@ -0,0 +1,8 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class ExportCSV extends TableControl{constructor(){super(),this.maxWidth=136}getCSV(){const t=this.table;if(!t)return"";let e="";const o=[];if(t.fields.forEach(({name:t,calculator:e})=>{e||o.push(t)}),e+=o.join(",")+"\n",this.record){const t=o.map(t=>this.record[t]||"");e+=t.join(",")+"\n"}else t.records.forEach(t=>{const r=o.map(e=>t[e]||"");e+=r.join(",")+"\n"});return e}export=()=>{const t=this.getCSV(),e=new Blob([t],{type:"text/csv"}),o=URL.createObjectURL(e),r=document.createElement("a");r.href=o,r.download="data.csv",r.click(),URL.revokeObjectURL(o)};render(){return html`
2
+ <button class="no-btn ph" @click="${this.export}">
3
+ <slot>
4
+ <k-icon name="export-file"></k-icon>
5
+ Export CSV
6
+ </slot>
7
+ </button>
8
+ `}}customElements.define("k-tc-export-csv",ExportCSV);
@@ -0,0 +1,8 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class ExportJson extends TableControl{constructor(){super(),this.maxWidth=136}export=()=>{const t=this.record;if(t){const e=JSON.stringify(t),o=new Blob([e],{type:"application/json"}),n=URL.createObjectURL(o),r=document.createElement("a");r.href=n,r.download="data.json",r.click(),URL.revokeObjectURL(n)}else{const t=JSON.stringify(this.table.records),e=new Blob([t],{type:"application/json"}),o=URL.createObjectURL(e),n=document.createElement("a");n.href=o,n.download="data.json",n.click(),URL.revokeObjectURL(o)}};render(){return html`
2
+ <button class="no-btn ph" @click="${this.export}">
3
+ <slot>
4
+ <k-icon name="export-file"></k-icon>
5
+ Export JSON
6
+ </slot>
7
+ </button>
8
+ `}}customElements.define("k-tc-export-json",ExportJson);
@@ -0,0 +1,26 @@
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
+ <div class="m">
4
+ <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
+ ${this.table.fields.map(e=>html`
6
+ <k-sortable-item data-field="${e.name}">
7
+ <label class="field pb0">
8
+ <input
9
+ class="field-visibility"
10
+ data-field="${e.name}"
11
+ type="checkbox"
12
+ .checked="${!e.hidden}"
13
+ @change="${t=>{this.table.setFieldHiddenState(e.name,!t.target.checked)}}"
14
+ style="height: 1.25rem; width: 1.25rem"
15
+ />
16
+ ${e.label}
17
+ </label>
18
+ </k-sortable-item>
19
+ `)}
20
+ </k-sortable>
21
+ </div>
22
+ `,e),Dialog.create(e,{width:"400px",cancelText:"Close"})};render(){return html`
23
+ <button class="no-btn icon-btn" @click="${this.handleClick}">
24
+ <k-icon name="table-visibility"></k-icon>
25
+ </button>
26
+ `}}customElements.define("k-tc-field-sort-hide",FieldSortHide);
@@ -0,0 +1,47 @@
1
+ import TableControl from"./TableControl.js";import{html,render}from"../../lit-all.min.js";import"../Icon.js";import Dialog from"../Dialog.js";export default class Filters extends TableControl{constructor(){super({maxWidth:40})}handleFilter=()=>{this.openDialog()};openDialog=()=>{const t={equals:"equals","not-equals":"does not equal",contains:"contains","not-contains":"does not contain","greater-than":"is greater than","greater-than-or-equal":"is greater than or equal to","less-than":"is less than","less-than-or-equal":"is less than or equal to"},e=document.createElement("div");render(html`
2
+ <h3 slot="title" class="m0 pyh px">Filters</h3>
3
+ <div class="p">
4
+ ${0===this.table.filters.length?html`
5
+ <p>No Current Filters.</p>
6
+ `:html`
7
+ <h5>Current Filters</h5>
8
+ <ul id="currentFilters">
9
+ ${this.table.filters.map(({field:e,condition:i,value:o})=>html`
10
+ <li
11
+ data-field="${e}"
12
+ data-condition="${i}"
13
+ data-value="${o}"
14
+ >
15
+ ${e} ${t[i]} ${o}
16
+ <button class="remove-filter no-btn pq" @click="${t=>{this.table.removeFilter(e,i,o),l.close(),this.openDialog()}}">
17
+ <k-icon name="close"></k-icon>
18
+ </button>
19
+ </li>
20
+ `)}
21
+ </ul>
22
+ `}
23
+ <hr />
24
+ <h5>Add A Filter</h5>
25
+ <form id="addFilter" @submit="${t=>{t.preventDefault();const e=t.target;this.table.addFilter(e.filterField.value,e.filterCondition.value,e.filterValue.value),l.close(),this.openDialog()}}">
26
+ <select id="filterField" class="mb">
27
+ ${this.table.fields.map(({name:t,label:e})=>html`
28
+ <option value="${t}">${e}</option>
29
+ `)}
30
+ </select>
31
+ <select id="filterCondition" class="mb">
32
+ ${Object.entries(t).map(([t,e])=>html`
33
+ <option value="${t}" ?selected="${"contains"===t}">${e}</option>
34
+ `)}
35
+ </select>
36
+ <input id="filterValue" type="text" class="mb" />
37
+ <button type="submit" class="btn primary mb mr">Add Filter</button>
38
+ ${0===this.table.filters.length?"":html`
39
+ <button type="button" class="btn danger mb mr" @click="${()=>{this.table.removeAllFilters(),l.close()}}">Clear All Filters</button>
40
+ `}
41
+ </form>
42
+ </div>
43
+ `,e);const l=Dialog.create(e,{width:"600px"})};render(){return html`
44
+ <button class="no-btn icon-btn" @click="${this.handleFilter}">
45
+ <k-icon name="filter"></k-icon>
46
+ </button>
47
+ `}}customElements.define("k-tc-filters",Filters);
@@ -0,0 +1,9 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class FirstPage extends TableControl{constructor(){super(),this.pageChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.table&&this.table.addEventListener("pageChange",this.pageChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&this.table.removeEventListener("pageChange",this.pageChangeHandler)}handleClick=()=>{this.table&&this.table.firstPage()};get isDisabled(){return!this.table||1===this.table.getCurrentPage()}render(){return html`
2
+ <button
3
+ class="no-btn icon-btn"
4
+ ?disabled="${this.isDisabled}"
5
+ @click="${this.handleClick}"
6
+ >
7
+ <k-icon name="first"></k-icon>
8
+ </button>
9
+ `}}customElements.define("k-tc-first-page",FirstPage);
@@ -0,0 +1,3 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";export default class HiddenCount extends TableControl{static properties={hiddenCount:{type:Number}};connectedCallback(){super.connectedCallback(),this.updateHiddenCount(),this.onTableEvent("recordHidden recordShown",this.handleHiddenChange)}handleHiddenChange=()=>{this.updateHiddenCount()};updateHiddenCount=()=>{this.hiddenCount=this.table?.getHiddenRecords().length||0};render(){return html`
2
+ <div class="pyq pxh"><span>${this.hiddenCount}</span>&nbsp;Hidden Records</div>
3
+ `}}customElements.define("k-tc-hidden-count",HiddenCount);
@@ -0,0 +1,5 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class Hide extends TableControl{constructor(){super({maxWidth:40})}handleHide=()=>{this.record&&this.table.hideRecord(this.record)};render(){return html`
2
+ <button class="no-btn icon-btn" @click="${this.handleHide}">
3
+ <k-icon name="hide"></k-icon>
4
+ </button>
5
+ `}}customElements.define("k-tc-hide",Hide);
@@ -0,0 +1,9 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class LastPage extends TableControl{constructor(){super(),this.pageChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.table&&this.table.addEventListener("pageChange",this.pageChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&this.table.removeEventListener("pageChange",this.pageChangeHandler)}handleClick=()=>{this.table&&this.table.lastPage()};get isDisabled(){return!this.table||this.table.getCurrentPage()===this.table.getTotalPages()}render(){return html`
2
+ <button
3
+ class="no-btn icon-btn"
4
+ ?disabled="${this.isDisabled}"
5
+ @click="${this.handleClick}"
6
+ >
7
+ <k-icon name="last"></k-icon>
8
+ </button>
9
+ `}}customElements.define("k-tc-last-page",LastPage);
@@ -0,0 +1,9 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class NextPage extends TableControl{constructor(){super(),this.pageChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.table&&this.table.addEventListener("pageChange",this.pageChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&this.table.removeEventListener("pageChange",this.pageChangeHandler)}handleClick=()=>{this.table&&this.table.nextPage()};get isDisabled(){return!this.table||this.table.getCurrentPage()===this.table.getTotalPages()}render(){return html`
2
+ <button
3
+ class="no-btn icon-btn"
4
+ ?disabled="${this.isDisabled}"
5
+ @click="${this.handleClick}"
6
+ >
7
+ <k-icon name="chevron-right"></k-icon>
8
+ </button>
9
+ `}}customElements.define("k-tc-next-page",NextPage);
@@ -0,0 +1,22 @@
1
+ import TableControl from"./TableControl.js";import{html,css}from"../../lit-all.min.js";export default class PageSelect extends TableControl{static properties={...TableControl.properties,currentPage:{type:Number,state:!0},totalPages:{type:Number,state:!0}};constructor(){super({maxWidth:null}),this.currentPage=1,this.totalPages=1}connectedCallback(){super.connectedCallback(),this.onTableEvent("pageChange",this.handlePageChange),this.onTableEvent("pageSizeChange",this.handlePageSizeChange),this.onTableEvent("pageCountChanged",this.handlePageCountChange)}disconnectedCallback(){super.disconnectedCallback(),this.table&&(this.table.removeEventListener("pageChange",this.handlePageChange),this.table.removeEventListener("pageSizeChange",this.handlePageSizeChange),this.table.removeEventListener("pageCountChanged",this.handlePageCountChange))}handlePageChange=()=>{this.table&&(this.currentPage=this.table.getCurrentPage())};handlePageSizeChange=()=>{this.table&&(this.currentPage=this.table.getCurrentPage(),this.totalPages=this.table.getTotalPages())};handlePageCountChange=()=>{this.table&&(this.totalPages=this.table.getTotalPages())};handleSelectChange=e=>{this.table&&this.table.setPage(parseInt(e.target.value))};render(){if(!this.table)return html`<div>No table found</div>`;const e=[];for(let t=1;t<=this.totalPages;t++)e.push(html`<option value="${t}" ?selected="${t===this.currentPage}">Page ${t}</option>`);return html`
2
+ <div class="page-select">
3
+ <select class="no-btn ph b r" @change="${this.handleSelectChange}" ?disabled="${this.totalPages<=1}">
4
+ ${e}
5
+ </select>
6
+ <label> out of ${this.totalPages}</label>
7
+ </div>
8
+ `}static styles=css`
9
+ ${TableControl.styles}
10
+
11
+ .page-select {
12
+ display: flex;
13
+ align-items: center;
14
+ gap: 0.25rem;
15
+ white-space: nowrap;
16
+ }
17
+
18
+ label {
19
+ padding: 0;
20
+ margin: 0;
21
+ }
22
+ `}customElements.define("k-tc-page-select",PageSelect);
@@ -0,0 +1,5 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";export default class PageSize extends TableControl{constructor(){super({maxWidth:null}),this.pageChangeHandler=()=>this.requestUpdate(),this.pageSizeChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.onTableEvent("pageChange",this.pageChangeHandler),this.onTableEvent("pageSizeChange",this.pageSizeChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&(this.table.removeEventListener("pageChange",this.pageChangeHandler),this.table.removeEventListener("pageSizeChange",this.pageSizeChangeHandler))}handleChange=e=>{this.table&&this.table.setPageSize(parseInt(e.target.value))};get currentPageSize(){return this.table?this.table.getPageSize():10}get pageSizeOptions(){return this.table?this.table.pageSizeOptions:[10,25,50,100,500]}render(){return html`
2
+ <select class="no-btn ph b r" @change="${this.handleChange}">
3
+ ${this.pageSizeOptions.map(e=>html`<option value="${e}" ?selected="${e===this.currentPageSize}">${e} per page</option>`)}
4
+ </select>
5
+ `}}customElements.define("k-tc-page-size",PageSize);
@@ -0,0 +1,9 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class PrevPage extends TableControl{constructor(){super(),this.pageChangeHandler=()=>this.requestUpdate()}connectedCallback(){super.connectedCallback(),this.table&&this.table.addEventListener("pageChange",this.pageChangeHandler)}disconnectedCallback(){super.disconnectedCallback(),this.table&&this.table.removeEventListener("pageChange",this.pageChangeHandler)}handleClick=()=>{this.table&&this.table.prevPage()};get isDisabled(){return!this.table||1===this.table.getCurrentPage()}render(){return html`
2
+ <button
3
+ class="no-btn icon-btn"
4
+ ?disabled="${this.isDisabled}"
5
+ @click="${this.handleClick}"
6
+ >
7
+ <k-icon name="chevron-left"></k-icon>
8
+ </button>
9
+ `}}customElements.define("k-tc-prev-page",PrevPage);
@@ -0,0 +1,9 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import debounce from"../../utils/debounce.js";export default class Search extends TableControl{static properties={searchTerm:{type:String}};constructor(){super({maxWidth:200}),this.debouncedSearch=debounce(this.performSearch,200)}handleInput=e=>{this.searchTerm=e.target.value,this.debouncedSearch()};performSearch=()=>{this.table&&(!this.searchTerm||this.searchTerm.length<3?this.table.showAllRecords():this.table.search(this.searchTerm))};render(){return html`
2
+ <input
3
+ type="search"
4
+ placeholder="Search"
5
+ class="px pyh"
6
+ .value="${this.searchTerm||""}"
7
+ @input="${this.handleInput}"
8
+ />
9
+ `}}customElements.define("k-tc-search",Search);
@@ -0,0 +1,5 @@
1
+ import TableControl from"./TableControl.js";import{html}from"../../lit-all.min.js";import"../Icon.js";export default class ShowAll extends TableControl{constructor(){super({maxWidth:40})}handleShowAll=()=>{this.table&&this.table.showAllRecords()};render(){return html`
2
+ <button class="no-btn icon-btn" @click="${this.handleShowAll}">
3
+ <k-icon name="show"></k-icon>
4
+ </button>
5
+ `}}customElements.define("k-tc-show-all",ShowAll);
@@ -0,0 +1,16 @@
1
+ import ShadowComponent from"../ShadowComponent.js";import{html,css}from"../../lit-all.min.js";export default class TableControl extends ShadowComponent{static properties={maxWidth:{type:Number,reflect:!0,attribute:"max-width"}};constructor({maxWidth:t=40}={}){super(),this.maxWidth=t}updated(t){super.updated(t),t.has("maxWidth")&&(this.maxWidth?this.style.setProperty("--max-width",`${this.maxWidth}px`):this.style.removeProperty("--max-width"))}firstUpdated(){this.maxWidth?this.style.setProperty("--max-width",`${this.maxWidth}px`):this.style.removeProperty("--max-width")}get table(){return this.getRootNode()instanceof ShadowRoot?this.getRootNode().host.closest("k-table"):this.closest("k-table")}get record(){if(this.getRootNode()instanceof ShadowRoot){const t=this.closest(".record");if(t){const e=t.dataset.index;if(void 0!==e)return this.table.records[e]}}return!1}async onTableEvent(t,e){if(await customElements.whenDefined("k-table"),this.table){t.split(" ").forEach(t=>{this.table.addEventListener(t,e)}),this.requestUpdate()}}static styles=css`
2
+ :host {
3
+ display: inline-flex;
4
+ }
5
+
6
+ .icon-btn {
7
+ display: inline-flex !important;
8
+ align-items: center;
9
+ justify-content: center;
10
+ width: 40px;
11
+ height: 40px;
12
+ }
13
+ .icon-btn:disabled {
14
+ opacity: 0.6;
15
+ }
16
+ `}customElements.define("k-table-control",TableControl);
@@ -0,0 +1 @@
1
+ function debounce(e,t=300){let u;return(...o)=>{clearTimeout(u),u=setTimeout(()=>{e.apply(this,o)},t)}}export default debounce;
@@ -0,0 +1 @@
1
+ export default(e={})=>{let t,n,o;const{element:s,callback:a=()=>{},startCallback:r=()=>{},moveCallback:c=()=>{},endCallback:u=()=>{},preventScroll:v=!1}=e,d=s=>{v&&s.preventDefault(),clearTimeout(o);const r=s.pageX||s.touches[0].pageX,u=s.pageY||s.touches[0].pageY,d={x:r-t,y:u-n,...e};a(d),c(d)},i=s=>{clearTimeout(o);const r=s.pageX||s.changedTouches&&s.changedTouches[0].pageX||0,c=s.pageY||s.changedTouches&&s.changedTouches[0].pageY||0,v={x:r-t,y:c-n,...e};a(v),u(v),m()},p=s=>{if(s.button&&0!==s.button)return;clearTimeout(o),t=s.pageX||s.touches[0].pageX,n=s.pageY||s.touches[0].pageY;const a={x:0,y:0,...e};r(a),window.addEventListener("mousemove",d,{passive:!v}),window.addEventListener("mouseup",i,{passive:!v}),window.addEventListener("touchmove",d,{passive:!v}),window.addEventListener("touchend",i,{passive:!v})},m=()=>{window.removeEventListener("mousemove",d),window.removeEventListener("mouseup",i),window.removeEventListener("touchmove",d),window.removeEventListener("touchend",i)};return s.addEventListener("mousedown",p,{passive:!v}),s.addEventListener("touchstart",p,{passive:!v}),()=>{s.removeEventListener("mousedown",p),s.removeEventListener("touchstart",p),m()}};
@@ -0,0 +1 @@
1
+ export default(e,i,t)=>{const s=new Date(parseInt(e));if(i){const e=(e,i)=>("000"+e).slice(-1*i),t={YYYY:s.getFullYear(),YY:String(s.getFullYear()).slice(-2),MM:e(s.getMonth()+1,2),M:s.getMonth()+1,DD:e(s.getDate(),2),D:s.getDate(),hh:e(s.getHours(),2),h:s.getHours(),mm:e(s.getMinutes(),2),m:s.getMinutes(),ss:e(s.getSeconds(),2),s:s.getSeconds(),iiii:e(s.getMilliseconds(),3),iii:e(s.getMilliseconds(),3),ii:e(s.getMilliseconds(),2),i:s.getMilliseconds()};return i.replace(/YYYY|YY|MM|M|DD|D|hh|h|mm|m|ss|s|iiii|iii|ii|i/g,e=>t[e])}return s.toLocaleString(t||navigator.language)};
@@ -0,0 +1 @@
1
+ export const boolTrueFalse={fromAttribute:t=>null===t?void 0:"true"===t.toLowerCase(),toAttribute:t=>t?"true":"false"};export const boolExists={fromAttribute:t=>null!==t,toAttribute:t=>t?"":null};
@@ -0,0 +1 @@
1
+ const toTitleCase=e=>e.replace(/([A-Z])/g," $1").split(/[\s_-]+/).filter(e=>e.length>0).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ");export default toTitleCase;
@@ -0,0 +1 @@
1
+ import debounce from"./debounce.js";const handlers=new Set;window.addEventListener("resize",debounce(()=>{const e=window.innerWidth;handlers.forEach(n=>n(e))}));export const watchWindowSize=e=>(handlers.add(e),window.innerWidth);export const unwatchWindowSize=e=>{handlers.delete(e)};