kempo-ui 0.1.6 → 0.2.1

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 (119) hide show
  1. package/.github/skills/highlight-code/SKILL.md +22 -6
  2. package/.github/skills/new-component/SKILL.md +68 -4
  3. package/AGENTS.md +11 -0
  4. package/bin/highlight_code.js +7 -15
  5. package/dist/components/Aside.js +326 -0
  6. package/dist/components/Dialog.js +1 -1
  7. package/dist/components/Dropdown.js +1 -1
  8. package/dist/components/Main.js +2 -2
  9. package/dist/components/Nav.js +27 -0
  10. package/dist/components/PhotoViewer.js +1 -1
  11. package/dist/components/ShadowComponent.js +1 -1
  12. package/dist/components/ThemeSwitcher.js +1 -0
  13. package/dist/components/Toast.js +1 -1
  14. package/docs/components/accordion.html +4 -3
  15. package/docs/components/aside-items.html +43 -0
  16. package/docs/components/aside-menu.html +43 -0
  17. package/docs/components/aside-push.html +26 -0
  18. package/docs/components/aside.html +567 -0
  19. package/docs/components/card.html +4 -3
  20. package/docs/components/color-picker.html +4 -3
  21. package/docs/components/content-slider.html +4 -3
  22. package/docs/components/dialog.html +4 -3
  23. package/docs/components/dropdown.html +4 -3
  24. package/docs/components/filter-list.html +4 -3
  25. package/docs/components/focus-capture.html +6 -5
  26. package/docs/components/html-editor.html +5 -4
  27. package/docs/components/hybrid-component.html +5 -4
  28. package/docs/components/icon.html +4 -3
  29. package/docs/components/import.html +5 -4
  30. package/docs/components/light-component.html +4 -3
  31. package/docs/components/nav.html +117 -0
  32. package/docs/components/photo-viewer.html +5 -4
  33. package/docs/components/resize.html +5 -4
  34. package/docs/components/shadow-component.html +4 -3
  35. package/docs/components/show-more.html +5 -4
  36. package/docs/components/sortable.html +4 -3
  37. package/docs/components/spinner.html +4 -3
  38. package/docs/components/split.html +5 -4
  39. package/docs/components/table.html +4 -3
  40. package/docs/components/tableControls.html +4 -3
  41. package/docs/components/tableCustomFields.html +4 -3
  42. package/docs/components/tableFetchRecords.html +5 -4
  43. package/docs/components/tableFieldSortHide.html +5 -4
  44. package/docs/components/tablePagination.html +4 -3
  45. package/docs/components/tableRecordEditing.html +4 -3
  46. package/docs/components/tableRecordFiltering.html +5 -4
  47. package/docs/components/tableRecordHiding.html +4 -3
  48. package/docs/components/tableRecordSearching.html +5 -4
  49. package/docs/components/tableRecordSelection.html +4 -3
  50. package/docs/components/tableRowControls.html +4 -3
  51. package/docs/components/tableServerSync.html +5 -4
  52. package/docs/components/tableSorting.html +5 -4
  53. package/docs/components/tabs.html +4 -3
  54. package/docs/components/tags.html +4 -3
  55. package/docs/components/theme-select.html +4 -3
  56. package/docs/components/theme-switcher.html +5 -4
  57. package/docs/components/timestamp.html +4 -3
  58. package/docs/components/toast.html +4 -3
  59. package/docs/components/toggle.html +5 -4
  60. package/docs/components/tree.html +5 -4
  61. package/docs/index.html +22 -21
  62. package/docs/nav-1.inc.html +18 -12
  63. package/docs/nav.inc.html +20 -13
  64. package/docs/nav.inc.js +1 -1
  65. package/docs/src/components/Aside.js +326 -0
  66. package/docs/src/components/Dialog.js +1 -1
  67. package/docs/src/components/Dropdown.js +1 -1
  68. package/docs/src/components/Main.js +2 -2
  69. package/docs/src/components/Nav.js +27 -0
  70. package/docs/src/components/PhotoViewer.js +1 -1
  71. package/docs/src/components/ShadowComponent.js +1 -1
  72. package/docs/src/components/ThemeSwitcher.js +1 -0
  73. package/docs/src/components/Toast.js +1 -1
  74. package/docs/utils/context.html +4 -3
  75. package/docs/utils/cookie.html +4 -3
  76. package/docs/utils/debounce.html +4 -3
  77. package/docs/utils/drag.html +4 -3
  78. package/docs/utils/elevation.html +156 -0
  79. package/docs/utils/formatTimestamp.html +4 -3
  80. package/docs/utils/object.html +4 -3
  81. package/docs/utils/propConverters.html +4 -3
  82. package/docs/utils/string.html +4 -3
  83. package/docs/utils/theme.html +4 -3
  84. package/docs/utils/toTitleCase.html +4 -3
  85. package/docs/utils/type.html +4 -3
  86. package/docs/utils/wait.html +4 -3
  87. package/llm.txt.md +247 -0
  88. package/package.json +3 -4
  89. package/src/components/Aside.js +726 -0
  90. package/src/components/Dialog.js +1 -1
  91. package/src/components/Dropdown.js +1 -1
  92. package/src/components/Main.js +34 -30
  93. package/src/components/Nav.js +53 -0
  94. package/src/components/PhotoViewer.js +1 -1
  95. package/src/components/ShadowComponent.js +1 -1
  96. package/src/components/ThemeSwitcher.js +1 -0
  97. package/src/components/Toast.js +1 -1
  98. package/tests/bin/get_icon.node-test.js +26 -0
  99. package/tests/bin/highlight_code.node-test.js +108 -0
  100. package/tests/bin/list_icons.node-test.js +26 -0
  101. package/tests/components/Aside.browser-test.js +778 -0
  102. package/tests/components/Main.browser-test.js +115 -283
  103. package/dist/components/SideMenu.js +0 -97
  104. package/dist/components/SidePanel.js +0 -236
  105. package/docs/components/side-menu.html +0 -189
  106. package/docs/components/side-panel-basic.html +0 -44
  107. package/docs/components/side-panel-dual.html +0 -70
  108. package/docs/components/side-panel-menu.html +0 -50
  109. package/docs/components/side-panel-persistent.html +0 -90
  110. package/docs/components/side-panel-scroll.html +0 -176
  111. package/docs/components/side-panel.html +0 -245
  112. package/docs/src/components/SideMenu.js +0 -97
  113. package/docs/src/components/SidePanel.js +0 -236
  114. package/scripts/update-kempo-css.js +0 -53
  115. package/src/components/SideMenu.js +0 -178
  116. package/src/components/SidePanel.js +0 -513
  117. package/tests/components/SideMenu.browser-test.js +0 -667
  118. package/tests/components/SidePanel.browser-test.js +0 -520
  119. package/tools/highlight.js +0 -51
@@ -0,0 +1,326 @@
1
+ import ShadowComponent from"./ShadowComponent.js";import{html,css,nothing}from"../lit-all.min.js";import{boolTrueFalse}from"../utils/propConverters.js";import"./FocusCapture.js";import"./Icon.js";export default class Aside extends ShadowComponent{static properties={state:{type:String,reflect:!0},side:{type:String,reflect:!0},main:{type:String,reflect:!0},overlayClose:{type:Boolean,reflect:!0,attribute:"overlay-close",converter:boolTrueFalse},escClose:{type:Boolean,reflect:!0,attribute:"esc-close",converter:boolTrueFalse}};constructor(){super(),this.state="offscreen",this.side="left",this.main="overlay",this.overlayClose=!0,this.escClose=!0}overlayClick=()=>{this.overlayClose&&this.hide()};handleKeyDown=e=>{this.escClose&&"Escape"===e.key&&this.hide()};updated(e){if(super.updated(e),e.has("state")){const t=e.get("state");"offscreen"===this.state||"offscreen"!==t&&void 0!==t?"offscreen"===this.state&&void 0!==t&&"offscreen"!==t&&document.removeEventListener("keydown",this.handleKeyDown):document.addEventListener("keydown",this.handleKeyDown),"overlay"===this.main&&("expanded"===this.state?document.body.classList.add("no-scroll"):document.body.classList.remove("no-scroll"));const s="offscreen"===this.state?0:this.getTargetWidth(this.state),a={aside:this,state:this.state,main:this.main,width:s};this.dispatchEvent(new CustomEvent("aside_state_change",{detail:a})),window.dispatchEvent(new CustomEvent("aside_state_change",{detail:a})),this.inert="offscreen"===this.state}}disconnectedCallback(){super.disconnectedCallback(),document.removeEventListener("keydown",this.handleKeyDown),document.body.classList.remove("no-scroll");const e={aside:this,state:"offscreen",main:this.main,width:0};this.dispatchEvent(new CustomEvent("aside_state_change",{detail:e})),window.dispatchEvent(new CustomEvent("aside_state_change",{detail:e}))}expand=()=>this.state="expanded";collapse=()=>this.state="collapsed";hide=()=>this.state="offscreen";toggle=()=>{this.state="expanded"===this.state?"offscreen":"expanded"};getTargetWidth(e){const t=parseFloat(getComputedStyle(document.documentElement).fontSize),s="collapsed"===e?"--collapsed-width":"--width",a=getComputedStyle(this).getPropertyValue(s).trim();return(a?parseFloat(a):"collapsed"===e?3.5:20)*t}render(){const e=html`<aside><slot></slot></aside>`;return"overlay"===this.main?html`
2
+ <k-focus-capture>
3
+ <div id="container">
4
+ <button id="overlay-btn" @click=${this.overlayClick}>
5
+ <div id="overlay-x"><k-icon name="close"></k-icon></div>
6
+ </button>
7
+ ${e}
8
+ </div>
9
+ </k-focus-capture>
10
+ `:e}static styles=css`
11
+ :host {
12
+ --bg: var(--c_bg);
13
+ --border: var(--c_border);
14
+ --width: 20rem;
15
+ --collapsed-width: 3.5rem;
16
+ position: fixed;
17
+ top: 0;
18
+ height: 100vh;
19
+ pointer-events: none;
20
+ }
21
+ :host([main="push"]) {
22
+ left: 0;
23
+ z-index: 30;
24
+ transition: width var(--animation_ms, 256ms);
25
+ }
26
+ :host([main="push"][side="right"]) {
27
+ left: auto;
28
+ right: 0;
29
+ }
30
+ :host([main="push"][state="collapsed"]) {
31
+ width: var(--collapsed-width);
32
+ pointer-events: auto;
33
+ }
34
+ :host([main="push"][state="expanded"]) {
35
+ width: var(--width);
36
+ pointer-events: auto;
37
+ }
38
+ :host([main="overlay"]) {
39
+ left: 0;
40
+ width: 100vw;
41
+ max-width: 100%;
42
+ z-index: 60;
43
+ overflow: hidden;
44
+ }
45
+ :host([main="overlay"][state="expanded"]) {
46
+ pointer-events: auto;
47
+ }
48
+ k-focus-capture {
49
+ width: 100%;
50
+ height: 100%;
51
+ }
52
+ #container {
53
+ position: relative;
54
+ width: 100%;
55
+ height: 100%;
56
+ }
57
+ #overlay-btn {
58
+ position: absolute;
59
+ width: 100%;
60
+ height: 100%;
61
+ left: 0;
62
+ top: 0;
63
+ background: var(--overlay, rgba(0, 0, 0, 0.5));
64
+ border: none;
65
+ padding: 0;
66
+ cursor: pointer;
67
+ z-index: 1;
68
+ opacity: 0;
69
+ transition: opacity var(--animation_ms, 256ms);
70
+ }
71
+ :host([state="expanded"]) #overlay-btn {
72
+ opacity: 1;
73
+ }
74
+ #overlay-x {
75
+ position: absolute;
76
+ top: var(--spacer_h);
77
+ right: var(--spacer_h);
78
+ font-size: 1.75rem;
79
+ cursor: pointer;
80
+ color: var(--tc_light);
81
+ }
82
+ :host([overlay-close="false"]) #overlay-x {
83
+ display: none;
84
+ }
85
+ :host([overlay-close="false"]) #overlay-btn {
86
+ cursor: default;
87
+ }
88
+ :host([side="right"]) #overlay-x {
89
+ right: auto;
90
+ left: var(--spacer_h);
91
+ }
92
+ aside {
93
+ position: fixed;
94
+ top: 0;
95
+ left: 0;
96
+ height: 100vh;
97
+ overflow-y: auto;
98
+ overflow-x: hidden;
99
+ background: var(--bg);
100
+ padding: var(--aside_padding, var(--spacer));
101
+ z-index: 2;
102
+ box-sizing: border-box;
103
+ border-right: 1px solid var(--border);
104
+ transition: width var(--animation_ms, 256ms), transform var(--animation_ms, 256ms);
105
+ }
106
+ :host([side="right"]) aside {
107
+ left: auto;
108
+ right: 0;
109
+ border-right: none;
110
+ border-left: 1px solid var(--border);
111
+ }
112
+ :host([main="push"]) aside {
113
+ position: absolute;
114
+ width: var(--width);
115
+ transform: translateX(-100%);
116
+ }
117
+ :host([main="push"][side="right"]) aside {
118
+ transform: translateX(100%);
119
+ }
120
+ :host([main="push"][state="collapsed"]) aside {
121
+ width: var(--collapsed-width);
122
+ transform: translateX(0);
123
+ }
124
+ :host([main="push"][state="expanded"]) aside {
125
+ transform: translateX(0);
126
+ }
127
+ :host([main="overlay"]) aside {
128
+ width: var(--width);
129
+ max-width: calc(100vw - 6rem);
130
+ border: none;
131
+ transform: translateX(-100%);
132
+ }
133
+ :host([main="overlay"][state="expanded"]) aside {
134
+ transform: translateX(0);
135
+ }
136
+ :host([main="overlay"][side="right"]) aside {
137
+ transform: translateX(100%);
138
+ }
139
+ :host([main="overlay"][side="right"][state="expanded"]) aside {
140
+ transform: translateX(0);
141
+ }
142
+ `}customElements.define("k-aside",Aside);class AsideItem extends ShadowComponent{static properties={icon:{type:String},href:{type:String},active:{type:Boolean,reflect:!0},collapsed:{type:Boolean,reflect:!0},"no-expand":{type:Boolean,attribute:"no-expand"},"hide-when-collapsed":{type:Boolean,attribute:"hide-when-collapsed"}};constructor(){super(),this.icon="",this.href="#",this.active=!1,this.collapsed=!1,this["no-expand"]=!1,this["hide-when-collapsed"]=!1}connectedCallback(){super.connectedCallback(),this.aside=this.closest("k-aside"),this.aside&&(this.collapsed="collapsed"===this.aside.state,this.aside.addEventListener("aside_state_change",this.handleStateChange))}disconnectedCallback(){super.disconnectedCallback(),this.aside&&this.aside.removeEventListener("aside_state_change",this.handleStateChange)}handleStateChange=e=>{const{state:t}=e.detail;"collapsed"===t?this.collapsed=!0:"expanded"===t&&(this.collapsed=!1)};handleClick=e=>{this.collapsed&&!this["no-expand"]&&this.aside&&(e.preventDefault(),this.aside.expand())};render(){return html`
143
+ <a href="${this.href}" class="item ${this.active?"active bg-primary":""}" @click=${this.handleClick}>
144
+ ${this.icon?html`<k-icon name="${this.icon}"></k-icon>`:this.collapsed?html`<k-icon name="dot"></k-icon>`:nothing}
145
+ ${this.collapsed?nothing:html`<span class="label"><slot></slot></span>`}
146
+ </a>
147
+ `}static styles=css`
148
+ :host {
149
+ display: block;
150
+ }
151
+ :host([collapsed][hide-when-collapsed]) {
152
+ display: none;
153
+ }
154
+ .item {
155
+ display: flex;
156
+ align-items: center;
157
+ gap: var(--spacer_h);
158
+ padding: var(--spacer_h);
159
+ color: var(--tc);
160
+ text-decoration: none;
161
+ border-radius: var(--radius);
162
+ margin: 0 var(--spacer_h);
163
+ transition: background var(--animation_ms), color var(--animation_ms);
164
+ white-space: nowrap;
165
+ }
166
+ .item:hover {
167
+ background: var(--c_bg_hover);
168
+ }
169
+ .item.active {
170
+ color: var(--tc_on_primary);
171
+ }
172
+ .item.active:hover {
173
+ background: var(--c_primary);
174
+ filter: brightness(1.1);
175
+ }
176
+ k-icon {
177
+ flex-shrink: 0;
178
+ }
179
+ .label {
180
+ min-width: 0;
181
+ overflow: hidden;
182
+ text-overflow: ellipsis;
183
+ }
184
+ `}class AsideLabel extends ShadowComponent{static properties={collapsed:{type:Boolean,reflect:!0}};constructor(){super(),this.collapsed=!1}connectedCallback(){super.connectedCallback(),this.aside=this.closest("k-aside"),this.aside&&(this.collapsed="collapsed"===this.aside.state,this.aside.addEventListener("aside_state_change",this.handleStateChange))}disconnectedCallback(){super.disconnectedCallback(),this.aside&&this.aside.removeEventListener("aside_state_change",this.handleStateChange)}handleStateChange=e=>{const{state:t}=e.detail;"collapsed"===t?this.collapsed=!0:"expanded"===t&&(this.collapsed=!1)};render(){return this.collapsed?html`<hr>`:html`<div class="label"><slot></slot></div>`}static styles=css`
185
+ :host {
186
+ display: block;
187
+ margin: var(--spacer_h) 0;
188
+ }
189
+ :host([collapsed]) {
190
+ margin: 0 var(--spacer_h);
191
+ align-self: stretch;
192
+ }
193
+ .label {
194
+ padding: 0 var(--spacer);
195
+ font-size: 0.75rem;
196
+ font-weight: 600;
197
+ text-transform: uppercase;
198
+ color: var(--c_text_muted);
199
+ letter-spacing: 0.05em;
200
+ }
201
+ hr {
202
+ border: none;
203
+ border-top: 1px solid var(--c_border);
204
+ margin: var(--spacer_h) var(--spacer);
205
+ }
206
+ :host([collapsed]) hr {
207
+ margin: var(--spacer_h) 0;
208
+ }
209
+ `}class AsideMenu extends ShadowComponent{static properties={icon:{type:String},label:{type:String},open:{type:Boolean,reflect:!0},collapsed:{type:Boolean,reflect:!0},"no-expand":{type:Boolean,attribute:"no-expand"},"hide-when-collapsed":{type:Boolean,attribute:"hide-when-collapsed"}};constructor(){super(),this.icon="",this.label="",this.open=!1,this.collapsed=!1,this["no-expand"]=!1,this["hide-when-collapsed"]=!1}connectedCallback(){super.connectedCallback(),this.aside=this.closest("k-aside"),this.aside&&(this.collapsed="collapsed"===this.aside.state,this.aside.addEventListener("aside_state_change",this.handleStateChange))}disconnectedCallback(){super.disconnectedCallback(),this.aside&&this.aside.removeEventListener("aside_state_change",this.handleStateChange)}handleStateChange=e=>{const{state:t}=e.detail;"collapsed"===t?(this.collapsed=!0,this.open=!1):"expanded"===t&&(this.collapsed=!1)};toggleMenu=()=>{this.collapsed&&!this["no-expand"]&&this.aside?this.aside.expand():this.collapsed||(this.open=!this.open)};render(){return html`
210
+ <div class="menu-container">
211
+ <button class="no-btn menu-header ${this.open?"open":""}" @click=${this.toggleMenu}>
212
+ ${this.icon?html`<k-icon name="${this.icon}"></k-icon>`:this.collapsed?html`<k-icon name="dot"></k-icon>`:nothing}
213
+ ${this.collapsed?nothing:html`<span class="label">${this.label}</span>`}
214
+ ${this.collapsed?nothing:html`<k-icon class="chevron" name="chevron" direction="${this.open?"down":"right"}"></k-icon>`}
215
+ </button>
216
+ <div class="menu-content ${this.open&&!this.collapsed?"open":""}">
217
+ <slot></slot>
218
+ </div>
219
+ </div>
220
+ `}static styles=css`
221
+ :host {
222
+ display: block;
223
+ }
224
+ :host([collapsed][hide-when-collapsed]) {
225
+ display: none;
226
+ }
227
+ .menu-header {
228
+ display: flex !important;
229
+ align-items: center;
230
+ gap: var(--spacer_h);
231
+ padding: var(--spacer_h) !important;
232
+ color: var(--tc);
233
+ background: transparent;
234
+ border: none;
235
+ border-radius: var(--radius);
236
+ margin: 0 var(--spacer_h);
237
+ width: calc(100% - var(--spacer));
238
+ cursor: pointer;
239
+ text-align: left;
240
+ white-space: nowrap;
241
+ transition: background var(--animation_ms);
242
+ }
243
+ :host([collapsed]) .menu-header {
244
+ width: auto;
245
+ }
246
+ .menu-header:hover {
247
+ background: var(--c_bg_hover);
248
+ }
249
+ k-icon {
250
+ flex-shrink: 0;
251
+ }
252
+ .label {
253
+ flex: 1;
254
+ min-width: 0;
255
+ overflow: hidden;
256
+ text-overflow: ellipsis;
257
+ }
258
+ .chevron {
259
+ transition: transform var(--animation_ms);
260
+ }
261
+ .menu-content {
262
+ max-height: 0;
263
+ overflow: hidden;
264
+ transition: max-height var(--animation_ms);
265
+ padding-left: calc(var(--spacer_h) * 2);
266
+ }
267
+ :host([collapsed]) .menu-content {
268
+ padding-left: 0;
269
+ }
270
+ .menu-content.open {
271
+ max-height: 500px;
272
+ }
273
+ ::slotted(*) {
274
+ margin: 0.25rem 0;
275
+ }
276
+ `}class AsideSpacer extends ShadowComponent{render(){return html`<div></div>`}static styles=css`
277
+ :host {
278
+ display: block;
279
+ flex: 1;
280
+ }
281
+ `}class AsideToggle extends ShadowComponent{static properties={collapsed:{type:Boolean,reflect:!0},direction:{type:String}};constructor(){super(),this.collapsed=!1,this.direction="left"}connectedCallback(){super.connectedCallback(),this.aside=this.closest("k-aside"),this.aside&&(this.collapsed="collapsed"===this.aside.state,this.updateDirection(),this.aside.addEventListener("aside_state_change",this.handleStateChange))}disconnectedCallback(){super.disconnectedCallback(),this.aside&&this.aside.removeEventListener("aside_state_change",this.handleStateChange)}handleStateChange=e=>{const{state:t}=e.detail;"collapsed"===t?this.collapsed=!0:"expanded"===t&&(this.collapsed=!1),this.updateDirection()};handleClick=()=>{this.aside&&(this.aside.state="collapsed"===this.aside.state?"expanded":"collapsed")};updateDirection=()=>{const e="right"===this.aside?.side;this.direction=this.collapsed!==e?"right":"left"};render(){return html`
282
+ <div id="header">
283
+ <slot></slot>
284
+ <button id="toggle" @click=${this.handleClick}>
285
+ <k-icon name="arrow-line" direction=${this.direction}></k-icon>
286
+ </button>
287
+ </div>
288
+ `}static styles=css`
289
+ :host {
290
+ display: block;
291
+ }
292
+ #header {
293
+ display: flex;
294
+ align-items: center;
295
+ justify-content: flex-end;
296
+ gap: var(--spacer_h);
297
+ padding: var(--spacer_h);
298
+ border-bottom: 1px solid var(--c_border);
299
+ flex-shrink: 0;
300
+ }
301
+ ::slotted(*) {
302
+ margin-right: auto;
303
+ flex: 1;
304
+ min-width: 0;
305
+ }
306
+ :host([collapsed]) ::slotted(*) {
307
+ display: none;
308
+ }
309
+ #toggle {
310
+ flex-shrink: 0;
311
+ width: 2rem;
312
+ height: 2rem;
313
+ border: none;
314
+ background: transparent;
315
+ color: var(--c_text);
316
+ cursor: pointer;
317
+ display: flex;
318
+ align-items: center;
319
+ justify-content: center;
320
+ border-radius: var(--radius);
321
+ padding: 0;
322
+ }
323
+ #toggle:hover {
324
+ background: var(--c_bg_hover);
325
+ }
326
+ `}customElements.define("k-aside-item",AsideItem),customElements.define("k-aside-label",AsideLabel),customElements.define("k-aside-menu",AsideMenu),customElements.define("k-aside-spacer",AsideSpacer),customElements.define("k-aside-toggle",AsideToggle);
@@ -5,7 +5,7 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
5
5
  left: 0;
6
6
  width: 100vw;
7
7
  height: 100vh;
8
- z-index: 100;
8
+ z-index: 80;
9
9
  display: none;
10
10
  justify-content: center;
11
11
  align-items: center;
@@ -11,7 +11,7 @@ import{html,css}from"../lit-all.min.js";import ShadowComponent from"./ShadowComp
11
11
  display: none;
12
12
  position: fixed;
13
13
  position-anchor: --dropdown-trigger;
14
- z-index: 1000;
14
+ z-index: 70;
15
15
  min-width: anchor-size(width);
16
16
  background: var(--c_bg);
17
17
  border: 1px solid var(--c_border);
@@ -1,4 +1,4 @@
1
- import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-all.min.js";export default class Main extends ShadowComponent{static properties={leftPanelWidth:{type:String,state:!0},rightPanelWidth:{type:String,state:!0}};constructor(){super(),this.leftPanelWidth="0px",this.rightPanelWidth="0px",this.handlePanelChange=this.handlePanelChange.bind(this)}connectedCallback(){super.connectedCallback(),window.addEventListener("side-panel-change",this.handlePanelChange);const t=document.querySelector('k-side-panel:not([side="right"])');t&&(this.leftPanelWidth=t.collapsed?"3.5rem":"16rem");const e=document.querySelector('k-side-panel[side="right"]');e&&(this.rightPanelWidth=e.collapsed?"3.5rem":"16rem")}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener("side-panel-change",this.handlePanelChange)}handlePanelChange(t){"right"===t.detail.side?this.rightPanelWidth=t.detail.width:this.leftPanelWidth=t.detail.width}render(){return html`
1
+ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-all.min.js";export default class Main extends ShadowComponent{constructor(){super(),this.widthMap=new Map}connectedCallback(){super.connectedCallback(),window.addEventListener("aside_state_change",this.handleAsideChange),document.querySelectorAll('k-aside[main="push"]').forEach(t=>{if("offscreen"!==t.state){const e=t.getTargetWidth(t.state);e>0&&this.widthMap.set(t,{side:t.side||"left",width:e})}}),this.recalculate()}disconnectedCallback(){super.disconnectedCallback(),window.removeEventListener("aside_state_change",this.handleAsideChange)}handleAsideChange=t=>{const{aside:e,state:a,main:i,width:s}=t.detail;"overlay"===i||"offscreen"===a?this.widthMap.delete(e):this.widthMap.set(e,{side:e.side||"left",width:s}),this.recalculate()};recalculate=()=>{let t=0,e=0;for(const[,{side:a,width:i}]of this.widthMap)"right"===a?e=Math.max(e,i):t=Math.max(t,i);this.style.setProperty("--left-panel-width",`${t}px`),this.style.setProperty("--right-panel-width",`${e}px`)};render(){return html`
2
2
  <main>
3
3
  <slot></slot>
4
4
  </main>
@@ -17,4 +17,4 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
17
17
  padding-left: var(--spacer);
18
18
  padding-right: var(--spacer);
19
19
  }
20
- `;updated(){super.updated(),this.style.setProperty("--left-panel-width",this.leftPanelWidth),this.style.setProperty("--right-panel-width",this.rightPanelWidth)}}window.customElements.define("k-main",Main);
20
+ `}window.customElements.define("k-main",Main);
@@ -0,0 +1,27 @@
1
+ import{html,css}from"../lit-all.min.js";import ShadowComponent from"./ShadowComponent.js";export default class Nav extends ShadowComponent{static properties={fixed:{type:Boolean,reflect:!0}};constructor(){super(),this.fixed=!1}render(){return html`<nav><slot></slot></nav>`}static styles=css`
2
+ :host {
3
+ display: block;
4
+ }
5
+ :host([fixed]) {
6
+ position: fixed;
7
+ top: 0;
8
+ left: 0;
9
+ right: 0;
10
+ z-index: 50;
11
+ }
12
+ nav {
13
+ display: flex;
14
+ align-items: center;
15
+ width: 100%;
16
+ }
17
+ ::slotted(a) {
18
+ display: inline-block;
19
+ padding: var(--spacer);
20
+ text-decoration: none !important;
21
+ }
22
+ ::slotted(.link) {
23
+ display: inline-block;
24
+ padding: var(--spacer) !important;
25
+ text-decoration: none !important;
26
+ }
27
+ `}customElements.define("k-nav",Nav);
@@ -23,7 +23,7 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
23
23
  left: 0;
24
24
  right: 0;
25
25
  bottom: 0;
26
- z-index: 9999;
26
+ z-index: 80;
27
27
  background: rgba(0,0,0,0.9);
28
28
  padding: 2rem;
29
29
  display: none;
@@ -1 +1 @@
1
- import{LitElement}from"../lit-all.min.js";export default class ShadowComponent extends LitElement{#e;connectedCallback(){super.connectedCallback(),this.#e=new MutationObserver(()=>{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=window.kempo?.pathToStylesheet||"https://cdn.jsdelivr.net/npm/kempo-css@1.3.11/dist/kempo.min.css",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
+ import{LitElement}from"../lit-all.min.js";export default class ShadowComponent extends LitElement{#e;connectedCallback(){super.connectedCallback(),this.#e=new MutationObserver(()=>{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=window.kempo?.pathToStylesheet||"https://cdn.jsdelivr.net/npm/kempo-css@2/dist/kempo.min.css",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}}
@@ -19,5 +19,6 @@ import ShadowComponent from"./ShadowComponent.js";import{html,css}from"../lit-al
19
19
  }
20
20
  button.no-btn {
21
21
  padding: var(--padding);
22
+ border-radius: var(--radius);
22
23
  }
23
24
  `;static setTheme(e){theme.set(e)}static getCurrentTheme(){return theme.get()}static getCalculatedCurrentTheme(){return theme.getCalculated()}}customElements.define("k-theme-switcher",ThemeSwitcher);
@@ -138,4 +138,4 @@ import{html,css}from"../lit-all.min.js";import ShadowComponent from"./ShadowComp
138
138
  <button id="close" class="no-style" @click="${this.handleCloseClick}">
139
139
  <slot name="close"></slot>
140
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);
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: 90;\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);
@@ -7,14 +7,14 @@
7
7
  <link rel="icon" type="image/png" sizes="48x48" href="../media/icon48.png">
8
8
  <link rel="manifest" href="../manifest.json" />
9
9
  <link rel="stylesheet" href="../kempo-vars.css" />
10
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@1.3.11/dist/kempo.min.css" />
10
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@2/dist/kempo.min.css" />
11
11
  <link rel="stylesheet" href="../kempo-hljs.css" />
12
12
  <link rel="stylesheet" href="../styles.css" />
13
13
  <script>window.litDisableBundleWarning = true;</script>
14
14
  </head>
15
15
  <body>
16
16
  <k-import src="../nav-1.inc.html"></k-import>
17
- <main>
17
+ <k-main>
18
18
  <h1>Context Utility</h1>
19
19
 
20
20
  <k-accordion persistent-id="toc" class="b r mb">
@@ -129,9 +129,10 @@ counterContext.subscribe(<span class="hljs-function">(<span class="hljs-params">
129
129
  </div>
130
130
  </div>
131
131
 
132
- </main>
132
+ </k-main>
133
133
  <div style="height:33vh"></div>
134
134
  <script type="module" src="../src/components/Import.js"></script>
135
+ <script type="module" src="../src/components/Main.js"></script>
135
136
  <script type="module" src="../src/components/Accordion.js"></script>
136
137
  <script type="module" src="../src/components/Card.js"></script>
137
138
  <script type="module">
@@ -7,7 +7,7 @@
7
7
  <link rel="icon" type="image/png" sizes="48x48" href="../media/icon48.png">
8
8
  <link rel="manifest" href="../manifest.json" />
9
9
  <link rel="stylesheet" href="../kempo-vars.css" />
10
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@1.3.11/dist/kempo.min.css" />
10
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@2/dist/kempo.min.css" />
11
11
  <link rel="stylesheet" href="../kempo-hljs.css" />
12
12
  <link rel="stylesheet" href="../styles.css" />
13
13
  <script>window.litDisableBundleWarning = true;</script>
@@ -15,7 +15,7 @@
15
15
  </head>
16
16
  <body>
17
17
  <k-import src="../nav-1.inc.html"></k-import>
18
- <main>
18
+ <k-main>
19
19
  <h1>Cookie Utilities</h1>
20
20
 
21
21
  <k-accordion persistent-id="toc" class="b r mb">
@@ -105,9 +105,10 @@ document.getElementById(<span class="hljs-string">'delete-btn'</span>).addEventL
105
105
  <p>Deletes a cookie by setting its expiration to a past date.</p>
106
106
  <pre><code class="hljs javascript"><span class="hljs-keyword">import</span> { deleteCookie } <span class="hljs-keyword">from</span> <span class="hljs-string">'../src/utils/cookie.js'</span>;<br /><br />deleteCookie(<span class="hljs-string">'userId'</span>);</code></pre>
107
107
 
108
- </main>
108
+ </k-main>
109
109
  <div style="height:33vh"></div>
110
110
  <script type="module" src="../src/components/Import.js"></script>
111
+ <script type="module" src="../src/components/Main.js"></script>
111
112
  <script type="module" src="../src/components/Accordion.js"></script>
112
113
  <script type="module" src="../src/components/Card.js"></script>
113
114
  <script type="module">
@@ -7,14 +7,14 @@
7
7
  <link rel="icon" type="image/png" sizes="48x48" href="../media/icon48.png">
8
8
  <link rel="manifest" href="../manifest.json" />
9
9
  <link rel="stylesheet" href="../kempo-vars.css" />
10
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@1.3.11/dist/kempo.min.css" />
10
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@2/dist/kempo.min.css" />
11
11
  <link rel="stylesheet" href="../kempo-hljs.css" />
12
12
  <link rel="stylesheet" href="../styles.css" />
13
13
  <script>window.litDisableBundleWarning = true;</script>
14
14
  </head>
15
15
  <body>
16
16
  <k-import src="../nav-1.inc.html"></k-import>
17
- <main>
17
+ <k-main>
18
18
  <h1>debounce</h1>
19
19
  <k-accordion persistent-id="toc" class="b r mb">
20
20
  <k-accordion-header for-panel="toc-panel">Table of Contents</k-accordion-header>
@@ -50,9 +50,10 @@
50
50
  <h4>Window Resize Handler</h4>
51
51
  <pre><code class="hljs javascript"><span class="hljs-keyword">const</span> debouncedResize = debounce(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> {<br /> <span class="hljs-comment">// Expensive layout calculations</span><br /> recalculateLayout();<br />}, <span class="hljs-number">250</span>);<br /><br /><span class="hljs-built_in">window</span>.addEventListener(<span class="hljs-string">'resize'</span>, debouncedResize);</code></pre>
52
52
 
53
- </main>
53
+ </k-main>
54
54
  <div style="height:33vh"></div>
55
55
  <script type="module" src="../src/components/Import.js"></script>
56
+ <script type="module" src="../src/components/Main.js"></script>
56
57
  <script type="module" src="../src/components/Accordion.js"></script>
57
58
  </body>
58
59
  </html>
@@ -7,14 +7,14 @@
7
7
  <link rel="icon" type="image/png" sizes="48x48" href="../media/icon48.png">
8
8
  <link rel="manifest" href="../manifest.json" />
9
9
  <link rel="stylesheet" href="../kempo-vars.css" />
10
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@1.3.11/dist/kempo.min.css" />
10
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/kempo-css@2/dist/kempo.min.css" />
11
11
  <link rel="stylesheet" href="../kempo-hljs.css" />
12
12
  <link rel="stylesheet" href="../styles.css" />
13
13
  <script>window.litDisableBundleWarning = true;</script>
14
14
  </head>
15
15
  <body>
16
16
  <k-import src="../nav-1.inc.html"></k-import>
17
- <main>
17
+ <k-main>
18
18
  <h1>drag</h1>
19
19
 
20
20
  <k-accordion persistent-id="toc" class="b r mb">
@@ -72,9 +72,10 @@
72
72
  <h4>Component with Cleanup</h4>
73
73
  <pre><code class="hljs javascript"><span class="hljs-keyword">import</span> ShadowComponent <span class="hljs-keyword">from</span> <span class="hljs-string">'./ShadowComponent.js'</span>;<br /><span class="hljs-keyword">import</span> drag <span class="hljs-keyword">from</span> <span class="hljs-string">'./utils/drag.js'</span>;<br /><br /><span class="hljs-keyword">class</span> <span class="hljs-title class_">DraggableComponent</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">ShadowComponent</span> {<br /> <span class="hljs-title function_">constructor</span>() {<br /> <span class="hljs-variable language_">super</span>();<br /> <span class="hljs-variable language_">this</span>.cleanupDrag = <span class="hljs-literal">null</span>;<br /> }<br /><br /> <span class="hljs-title function_">firstUpdated</span>() {<br /> <span class="hljs-keyword">const</span> handle = <span class="hljs-variable language_">this</span>.shadowRoot.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'.drag-handle'</span>);<br /> <span class="hljs-variable language_">this</span>.cleanupDrag = <span class="hljs-title function_">drag</span>({<br /> <span class="hljs-attr">element</span>: handle,<br /> <span class="hljs-attr">moveCallback</span>: <span class="hljs-function">(<span class="hljs-params">diff</span>) =&gt;</span> {<br /> <span class="hljs-variable language_">this</span>.style.transform = <span class="hljs-string">`translate(<span class="hljs-subst">${diff.x}</span>px, <span class="hljs-subst">${diff.y}</span>px)`</span>;<br /> }<br /> });<br /> }<br /><br /> <span class="hljs-title function_">disconnectedCallback</span>() {<br /> <span class="hljs-variable language_">super</span>.<span class="hljs-title function_">disconnectedCallback</span>();<br /> <span class="hljs-keyword">if</span>(<span class="hljs-variable language_">this</span>.cleanupDrag) {<br /> <span class="hljs-variable language_">this</span>.<span class="hljs-title function_">cleanupDrag</span>();<br /> <span class="hljs-variable language_">this</span>.cleanupDrag = <span class="hljs-literal">null</span>;<br /> }<br /> }<br />}</code></pre>
74
74
 
75
- </main>
75
+ </k-main>
76
76
  <div style="height:33vh"></div>
77
77
  <script type="module" src="../src/components/Import.js"></script>
78
+ <script type="module" src="../src/components/Main.js"></script>
78
79
  <script type="module" src="../src/components/Accordion.js"></script>
79
80
  </body>
80
81
  </html>