kempo-ui 0.3.5 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/AGENTS.md +2 -1
  2. package/dist/components/Aside.js +1 -1
  3. package/dist/components/Main.js +1 -1
  4. package/docs/components/accordion.html +240 -8
  5. package/docs/components/aside-items.html +13 -9
  6. package/docs/components/aside-menu.html +13 -9
  7. package/docs/components/aside-push.html +11 -6
  8. package/docs/components/aside.html +289 -115
  9. package/docs/components/card.html +238 -7
  10. package/docs/components/color-picker.html +245 -14
  11. package/docs/components/content-slider.html +240 -8
  12. package/docs/components/context.html +241 -7
  13. package/docs/components/dialog.html +238 -7
  14. package/docs/components/dropdown.html +238 -7
  15. package/docs/components/filter-list.html +239 -10
  16. package/docs/components/focus-capture.html +241 -10
  17. package/docs/components/html-editor.html +266 -35
  18. package/docs/components/hybrid-component.html +238 -6
  19. package/docs/components/icon.html +239 -9
  20. package/docs/components/import.html +239 -8
  21. package/docs/components/light-component.html +239 -7
  22. package/docs/components/nav.html +240 -8
  23. package/docs/components/photo-viewer.html +239 -9
  24. package/docs/components/resize.html +240 -9
  25. package/docs/components/shadow-component.html +239 -7
  26. package/docs/components/show-more.html +237 -8
  27. package/docs/components/sortable.html +239 -8
  28. package/docs/components/spinner.html +237 -6
  29. package/docs/components/split.html +241 -10
  30. package/docs/components/table.html +241 -11
  31. package/docs/components/tableControls.html +240 -7
  32. package/docs/components/tableCustomFields.html +241 -8
  33. package/docs/components/tableFetchRecords.html +239 -7
  34. package/docs/components/tableFieldSortHide.html +239 -7
  35. package/docs/components/tablePagination.html +246 -13
  36. package/docs/components/tablePlaceholder.html +241 -8
  37. package/docs/components/tableRecordEditing.html +241 -8
  38. package/docs/components/tableRecordFiltering.html +239 -7
  39. package/docs/components/tableRecordHiding.html +241 -9
  40. package/docs/components/tableRecordSearching.html +239 -7
  41. package/docs/components/tableRecordSelection.html +240 -7
  42. package/docs/components/tableRowControls.html +241 -8
  43. package/docs/components/tableServerSync.html +245 -11
  44. package/docs/components/tableSorting.html +239 -7
  45. package/docs/components/tabs.html +240 -7
  46. package/docs/components/tags.html +239 -7
  47. package/docs/components/theme-select.html +239 -7
  48. package/docs/components/theme-switcher.html +240 -8
  49. package/docs/components/timestamp.html +239 -8
  50. package/docs/components/toast.html +240 -8
  51. package/docs/components/toggle.html +240 -9
  52. package/docs/components/tree.html +239 -8
  53. package/docs/index.html +244 -6
  54. package/docs/prod.config.json +0 -4
  55. package/docs/src/components/Aside.js +1 -1
  56. package/docs/src/components/Main.js +1 -1
  57. package/docs/utils/context.html +237 -6
  58. package/docs/utils/cookie.html +251 -21
  59. package/docs/utils/debounce.html +236 -5
  60. package/docs/utils/drag.html +236 -5
  61. package/docs/utils/elevation.html +238 -6
  62. package/docs/utils/formatTimestamp.html +239 -9
  63. package/docs/utils/object.html +236 -5
  64. package/docs/utils/propConverters.html +233 -3
  65. package/docs/utils/string.html +236 -5
  66. package/docs/utils/theme.html +237 -6
  67. package/docs/utils/toTitleCase.html +239 -9
  68. package/docs/utils/type.html +236 -5
  69. package/docs/utils/wait.html +236 -5
  70. package/docs-src/.config.js +16 -0
  71. package/docs-src/bare.template.html +16 -0
  72. package/docs-src/components/accordion.page.html +201 -0
  73. package/docs-src/components/aside-items.page.html +36 -0
  74. package/docs-src/components/aside-menu.page.html +36 -0
  75. package/docs-src/components/aside-push.page.html +20 -0
  76. package/docs-src/components/aside.page.html +494 -0
  77. package/docs-src/components/card.page.html +78 -0
  78. package/docs-src/components/color-picker.page.html +559 -0
  79. package/docs-src/components/content-slider.page.html +266 -0
  80. package/docs-src/components/context.page.html +214 -0
  81. package/docs-src/components/dialog.page.html +365 -0
  82. package/docs-src/components/dropdown.page.html +300 -0
  83. package/docs-src/components/filter-list.page.html +117 -0
  84. package/docs-src/components/focus-capture.page.html +97 -0
  85. package/docs-src/components/html-editor.page.html +423 -0
  86. package/docs-src/components/hybrid-component.page.html +96 -0
  87. package/docs-src/components/icon.page.html +208 -0
  88. package/docs-src/components/import.page.html +76 -0
  89. package/docs-src/components/light-component.page.html +99 -0
  90. package/docs-src/components/nav.page.html +106 -0
  91. package/docs-src/components/photo-viewer.page.html +253 -0
  92. package/docs-src/components/resize.page.html +161 -0
  93. package/docs-src/components/shadow-component.page.html +84 -0
  94. package/docs-src/components/show-more.page.html +113 -0
  95. package/docs-src/components/sortable.page.html +117 -0
  96. package/docs-src/components/spinner.page.html +197 -0
  97. package/docs-src/components/split.page.html +195 -0
  98. package/docs-src/components/table.page.html +283 -0
  99. package/docs-src/components/tableControls.page.html +64 -0
  100. package/docs-src/components/tableCustomFields.page.html +124 -0
  101. package/docs-src/components/tableFetchRecords.page.html +95 -0
  102. package/docs-src/components/tableFieldSortHide.page.html +56 -0
  103. package/docs-src/components/tablePagination.page.html +85 -0
  104. package/docs-src/components/tablePlaceholder.page.html +73 -0
  105. package/docs-src/components/tableRecordEditing.page.html +161 -0
  106. package/docs-src/components/tableRecordFiltering.page.html +69 -0
  107. package/docs-src/components/tableRecordHiding.page.html +65 -0
  108. package/docs-src/components/tableRecordSearching.page.html +56 -0
  109. package/docs-src/components/tableRecordSelection.page.html +60 -0
  110. package/docs-src/components/tableRowControls.page.html +62 -0
  111. package/docs-src/components/tableServerSync.page.html +129 -0
  112. package/docs-src/components/tableSorting.page.html +54 -0
  113. package/docs-src/components/tabs.page.html +201 -0
  114. package/docs-src/components/tags.page.html +157 -0
  115. package/docs-src/components/theme-select.page.html +106 -0
  116. package/docs-src/components/theme-switcher.page.html +122 -0
  117. package/docs-src/components/timestamp.page.html +109 -0
  118. package/docs-src/components/toast.page.html +338 -0
  119. package/docs-src/components/toggle.page.html +177 -0
  120. package/docs-src/components/tree.page.html +356 -0
  121. package/docs-src/default.template.html +28 -0
  122. package/docs-src/index.page.html +312 -0
  123. package/docs-src/nav.fragment.html +228 -0
  124. package/docs-src/utils/context.page.html +143 -0
  125. package/docs-src/utils/cookie.page.html +128 -0
  126. package/docs-src/utils/debounce.page.html +42 -0
  127. package/docs-src/utils/drag.page.html +64 -0
  128. package/docs-src/utils/elevation.page.html +144 -0
  129. package/docs-src/utils/formatTimestamp.page.html +76 -0
  130. package/docs-src/utils/object.page.html +76 -0
  131. package/docs-src/utils/propConverters.page.html +73 -0
  132. package/docs-src/utils/string.page.html +66 -0
  133. package/docs-src/utils/theme.page.html +136 -0
  134. package/docs-src/utils/toTitleCase.page.html +52 -0
  135. package/docs-src/utils/type.page.html +31 -0
  136. package/docs-src/utils/wait.page.html +31 -0
  137. package/package.json +4 -4
  138. package/scripts/build.js +5 -0
  139. package/scripts/docs.js +5 -52
  140. package/src/components/Aside.js +12 -1
  141. package/src/components/Main.js +1 -1
  142. package/tests/components/Aside.browser-test.js +75 -0
  143. package/docs/dev.config.json +0 -20
  144. package/docs/nav-1.inc.html +0 -168
  145. package/docs/nav.inc.html +0 -168
  146. package/docs/nav.inc.js +0 -70
@@ -0,0 +1,494 @@
1
+ <page pageName="Aside" title="Aside - Components - Kempo Docs - A Web Components Solution">
2
+ <content>
3
+ <k-accordion persistent-id="toc" class="b r mb">
4
+ <k-accordion-header for-panel="toc-panel">Table of Contents</k-accordion-header>
5
+ <k-accordion-panel name="toc-panel">
6
+ <div class="m">
7
+ <h6>Overlay Mode</h6>
8
+ <a href="#overlayBasic">Basic Usage</a><br />
9
+ <a href="#overlayClose">Closing Options</a><br />
10
+ <a href="#overlayRight">Right Side</a><br />
11
+
12
+ <h6 class="mt">Push Mode</h6>
13
+ <a href="#pushBasic">Basic Push</a><br />
14
+ <a href="#pushCollapsed">Collapsed State</a><br />
15
+ <a href="#pushRight">Right Side Push</a><br />
16
+
17
+ <h6 class="mt">Customization</h6>
18
+ <a href="#customWidth">Custom Width</a><br />
19
+ <a href="#customBg">Custom Background</a><br />
20
+ <a href="#customCollapsed">Custom Collapsed Width</a><br />
21
+ <a href="#persistentState">Persistent State</a><br />
22
+
23
+ <h6 class="mt">Sub-Components</h6>
24
+ <a href="#subItems">Items &amp; Labels</a><br />
25
+ <a href="#subMenu">Expandable Menus</a><br />
26
+
27
+ <h6 class="mt">Events</h6>
28
+ <a href="#events">State Change Event</a><br />
29
+
30
+ <h6 class="mt">JavaScript Reference</h6>
31
+ <a href="#constructor">Constructor</a><br />
32
+ <a href="#requirements">Requirements</a><br />
33
+ <a href="#properties">Properties</a><br />
34
+ <a href="#eventRef">Events</a><br />
35
+ <a href="#methods">Methods</a><br />
36
+ <a href="#cssVars">CSS Custom Properties</a><br />
37
+ <h6 class="mt"><a href="#subRef" class="no-link">Sub-Component Reference</a></h6>
38
+ <a href="#asideItem">k-aside-item</a><br />
39
+ <a href="#asideLabel">k-aside-label</a><br />
40
+ <a href="#asideMenu">k-aside-menu</a><br />
41
+ <a href="#asideSpacer">k-aside-spacer</a><br />
42
+ <a href="#asideToggle">k-aside-toggle</a><br />
43
+ </div>
44
+ </k-accordion-panel>
45
+ </k-accordion>
46
+
47
+ <h2>Overlay Mode</h2>
48
+ <p>The default mode. Use <code>state="offscreen"</code> as the starting state; call <code>expand()</code> to open. Clicking the backdrop or pressing ESC closes it by default.</p>
49
+
50
+ <h3 id="overlayBasic"><a href="#overlayBasic" class="no-link">Basic Usage</a></h3>
51
+ <p>A simple overlay menu that opens from the left.</p>
52
+ <div class="row -mx">
53
+ <div class="col m-span-12 px">
54
+ <k-card label="HTML">
55
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Overlay Menu Content<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.previousElementSibling.expand()&#x27;</span>&gt;</span> Open Menu <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
56
+ </k-card>
57
+ </div>
58
+ <div class="col m-span-12 px">
59
+ <k-card label="Output">
60
+ <k-aside id="aside1" state="offscreen">
61
+ <p>Overlay Menu Content</p>
62
+ </k-aside>
63
+ <button id="open1">Open Menu</button>
64
+ <script>
65
+ document.getElementById('open1').addEventListener('click',()=>{
66
+ document.getElementById('aside1').expand();
67
+ });
68
+ </script>
69
+ </k-card>
70
+ </div>
71
+ </div>
72
+
73
+ <h3 id="overlayClose"><a href="#overlayClose" class="no-link">Closing Options</a></h3>
74
+ <p>By default clicking on the overlay backdrop closes the menu. Use <code>overlay-close="false"</code> to disable this. Pressing ESC also closes by default; use <code>esc-close="false"</code> to disable.</p>
75
+ <p>Use <code>hide()</code> to close the menu programmatically, or <code>toggle()</code> to switch between expanded and offscreen.</p>
76
+ <div class="row -mx">
77
+ <div class="col m-span-12 px">
78
+ <k-card label="HTML">
79
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span> <span class="hljs-attr">overlay-close</span>=<span class="hljs-string">&#x27;false&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Overlay Menu<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.closest(&quot;k-aside&quot;).hide()&#x27;</span>&gt;</span> Close <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.previousElementSibling.expand()&#x27;</span>&gt;</span> Open Menu <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
80
+ </k-card>
81
+ </div>
82
+ <div class="col m-span-12 px">
83
+ <k-card label="Output">
84
+ <k-aside id="aside2" state="offscreen" overlay-close="false">
85
+ <p>Overlay Menu</p>
86
+ <button id="close2">Close</button>
87
+ </k-aside>
88
+ <button id="open2">Open Menu</button>
89
+ <script>
90
+ const a2 = document.getElementById('aside2');
91
+ document.getElementById('open2').addEventListener('click',()=>{
92
+ a2.expand();
93
+ });
94
+ document.getElementById('close2').addEventListener('click',()=>{
95
+ a2.hide();
96
+ });
97
+ </script>
98
+ </k-card>
99
+ </div>
100
+ </div>
101
+
102
+ <h3 id="overlayRight"><a href="#overlayRight" class="no-link">Right Side</a></h3>
103
+ <p>Use <code>side="right"</code> to open the menu from the right.</p>
104
+ <div class="row -mx">
105
+ <div class="col m-span-12 px">
106
+ <k-card label="HTML">
107
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span> <span class="hljs-attr">side</span>=<span class="hljs-string">&#x27;right&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Right Side Menu<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.previousElementSibling.expand()&#x27;</span>&gt;</span> Open Right Menu <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
108
+ </k-card>
109
+ </div>
110
+ <div class="col m-span-12 px">
111
+ <k-card label="Output">
112
+ <k-aside id="aside3" state="offscreen" side="right">
113
+ <p>Right Side Menu</p>
114
+ </k-aside>
115
+ <button id="open3">Open Right Menu</button>
116
+ <script>
117
+ document.getElementById('open3').addEventListener('click',()=>{
118
+ document.getElementById('aside3').expand();
119
+ });
120
+ </script>
121
+ </k-card>
122
+ </div>
123
+ </div>
124
+
125
+ <h2>Push Mode</h2>
126
+ <p>Set <code>main="push"</code> so the aside pushes page content. It dispatches <code>aside_state_change</code> events on <code>window</code> that <code>&lt;k-main&gt;</code> listens to, adjusting its margins. The aside below will push this page's content when toggled.</p>
127
+
128
+ <h3 id="pushBasic"><a href="#pushBasic" class="no-link">Basic Push</a></h3>
129
+ <p>A push-mode sidebar that shifts the page content. Click the button to toggle it.</p>
130
+ <div class="row -mx">
131
+ <div class="col m-span-12 px">
132
+ <k-card label="HTML">
133
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">main</span>=<span class="hljs-string">&#x27;push&#x27;</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">h3</span>&gt;</span>Sidebar<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span>&gt;</span>Home<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span>&gt;</span>About<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span>&gt;</span>Contact<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.previousElementSibling.toggle()&#x27;</span>&gt;</span> Toggle Sidebar <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
134
+ </k-card>
135
+ </div>
136
+ <div class="col m-span-12 px">
137
+ <k-card label="Output">
138
+ <k-aside id="aside5" main="push" state="offscreen">
139
+ <div class="navbar-spacer"></div>
140
+ <nav>
141
+ <h3>Sidebar</h3>
142
+ <a href="#">Home</a>
143
+ <a href="#">About</a>
144
+ <a href="#">Contact</a>
145
+ </nav>
146
+ </k-aside>
147
+ <button id="toggle5">Toggle Sidebar</button>
148
+ <script>
149
+ document.getElementById('toggle5').addEventListener('click',()=>{
150
+ document.getElementById('aside5').toggle();
151
+ });
152
+ </script>
153
+ </k-card>
154
+ </div>
155
+ </div>
156
+
157
+ <h3 id="pushCollapsed"><a href="#pushCollapsed" class="no-link">Collapsed State</a></h3>
158
+ <p>Use <code>collapse()</code> to show a narrow strip (width set by <code>--collapsed-width</code>). Use <code>expand()</code> to show full width, or <code>hide()</code> to go offscreen.</p>
159
+ <div class="row -mx">
160
+ <div class="col m-span-12 px">
161
+ <k-card label="HTML">
162
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">main</span>=<span class="hljs-string">&#x27;push&#x27;</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">h3</span>&gt;</span>Menu<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span>&gt;</span>Dashboard<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span>&gt;</span>Settings<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;aside.expand()&#x27;</span>&gt;</span>Expand<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;aside.collapse()&#x27;</span>&gt;</span>Collapse<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;aside.hide()&#x27;</span>&gt;</span>Hide<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
163
+ </k-card>
164
+ </div>
165
+ <div class="col m-span-12 px">
166
+ <k-card label="Output">
167
+ <k-aside id="aside6" main="push" state="offscreen">
168
+ <div class="navbar-spacer"></div>
169
+ <nav>
170
+ <h3>Menu</h3>
171
+ <a href="#">Dashboard</a>
172
+ <a href="#">Settings</a>
173
+ </nav>
174
+ </k-aside>
175
+ <button id="btn6expand">Expand</button>
176
+ <button id="btn6collapse">Collapse</button>
177
+ <button id="btn6hide">Hide</button>
178
+ <script>
179
+ const a6 = document.getElementById('aside6');
180
+ document.getElementById('btn6expand').addEventListener('click',()=> a6.expand());
181
+ document.getElementById('btn6collapse').addEventListener('click',()=> a6.collapse());
182
+ document.getElementById('btn6hide').addEventListener('click',()=> a6.hide());
183
+ </script>
184
+ </k-card>
185
+ </div>
186
+ </div>
187
+
188
+ <h3 id="pushRight"><a href="#pushRight" class="no-link">Right Side Push</a></h3>
189
+ <p>Use <code>side="right"</code> with push mode to have the sidebar on the right side of the viewport.</p>
190
+ <div class="row -mx">
191
+ <div class="col m-span-12 px">
192
+ <k-card label="HTML">
193
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">main</span>=<span class="hljs-string">&#x27;push&#x27;</span> <span class="hljs-attr">side</span>=<span class="hljs-string">&#x27;right&#x27;</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">h3</span>&gt;</span>Right Panel<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span>&gt;</span>Item 1<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span>&gt;</span>Item 2<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.previousElementSibling.toggle()&#x27;</span>&gt;</span> Toggle Right Sidebar <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
194
+ </k-card>
195
+ </div>
196
+ <div class="col m-span-12 px">
197
+ <k-card label="Output">
198
+ <k-aside id="aside7" main="push" side="right" state="offscreen">
199
+ <div class="navbar-spacer"></div>
200
+ <nav>
201
+ <h3>Right Panel</h3>
202
+ <a href="#">Item 1</a>
203
+ <a href="#">Item 2</a>
204
+ </nav>
205
+ </k-aside>
206
+ <button id="toggle7">Toggle Right Sidebar</button>
207
+ <script>
208
+ document.getElementById('toggle7').addEventListener('click',()=>{
209
+ document.getElementById('aside7').toggle();
210
+ });
211
+ </script>
212
+ </k-card>
213
+ </div>
214
+ </div>
215
+
216
+ <h2>Customization</h2>
217
+
218
+ <h3 id="customWidth"><a href="#customWidth" class="no-link">Custom Width</a></h3>
219
+ <p>Override <code>--width</code> to change the expanded width. Default is <code>20rem</code>.</p>
220
+ <div class="row -mx">
221
+ <div class="col m-span-12 px">
222
+ <k-card label="HTML">
223
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="language-css"><br> k-<span class="hljs-selector-tag">aside</span> {<br> <span class="hljs-attr">--width</span>: <span class="hljs-number">30rem</span>;<br> }<br></span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>This menu is 30rem wide.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.previousElementSibling.expand()&#x27;</span>&gt;</span> Open Wide Menu <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
224
+ </k-card>
225
+ </div>
226
+ <div class="col m-span-12 px">
227
+ <k-card label="Output">
228
+ <style>k-aside#aside8 { --width: 30rem; }</style>
229
+ <k-aside id="aside8" state="offscreen">
230
+ <p>This menu is 30rem wide instead of the default 20rem.</p>
231
+ </k-aside>
232
+ <button id="open8">Open Wide Menu</button>
233
+ <script>
234
+ document.getElementById('open8').addEventListener('click',()=>{
235
+ document.getElementById('aside8').expand();
236
+ });
237
+ </script>
238
+ </k-card>
239
+ </div>
240
+ </div>
241
+
242
+ <h3 id="customBg"><a href="#customBg" class="no-link">Custom Background</a></h3>
243
+ <p>Override <code>--bg</code> to change the background color.</p>
244
+ <div class="row -mx">
245
+ <div class="col m-span-12 px">
246
+ <k-card label="HTML">
247
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="language-css"><br> k-<span class="hljs-selector-tag">aside</span> {<br> <span class="hljs-attr">--bg</span>: <span class="hljs-built_in">var</span>(--c_primary);<br> }<br></span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">nav</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&#x27;p tc-light&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">h3</span>&gt;</span>Branded Menu<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&#x27;tc-light&#x27;</span>&gt;</span>Home<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&#x27;tc-light&#x27;</span>&gt;</span>About<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.previousElementSibling.expand()&#x27;</span>&gt;</span> Open Branded Menu <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
248
+ </k-card>
249
+ </div>
250
+ <div class="col m-span-12 px">
251
+ <k-card label="Output">
252
+ <style>k-aside#aside9 { --bg: var(--c_primary); --aside_padding: 0; }</style>
253
+ <k-aside id="aside9" state="offscreen">
254
+ <nav class="p tc-light">
255
+ <h3>Branded Menu</h3>
256
+ <a href="#" class="tc-light">Home</a>
257
+ <a href="#" class="tc-light">About</a>
258
+ </nav>
259
+ </k-aside>
260
+ <button id="open9">Open Branded Menu</button>
261
+ <script>
262
+ document.getElementById('open9').addEventListener('click',()=>{
263
+ document.getElementById('aside9').expand();
264
+ });
265
+ </script>
266
+ </k-card>
267
+ </div>
268
+ </div>
269
+
270
+ <h3 id="customCollapsed"><a href="#customCollapsed" class="no-link">Custom Collapsed Width</a></h3>
271
+ <p>Override <code>--collapsed-width</code> to change the width of the narrow strip shown in collapsed state. Default is <code>3.5rem</code>.</p>
272
+ <div class="row -mx">
273
+ <div class="col m-span-12 px">
274
+ <k-card label="HTML">
275
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="language-css"><br> k-<span class="hljs-selector-tag">aside</span> {<br> <span class="hljs-attr">--collapsed-width</span>: <span class="hljs-number">5rem</span>;<br> }<br></span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">main</span>=<span class="hljs-string">&#x27;push&#x27;</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">h3</span>&gt;</span>Sidebar<span class="hljs-tag">&lt;/<span class="hljs-name">h3</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span>&gt;</span>Dashboard<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span>&gt;</span>Reports<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&#x27;#&#x27;</span>&gt;</span>Settings<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br> <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;aside.expand()&#x27;</span>&gt;</span>Expand<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;aside.collapse()&#x27;</span>&gt;</span>Collapse<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;aside.hide()&#x27;</span>&gt;</span>Hide<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
276
+ </k-card>
277
+ </div>
278
+ <div class="col m-span-12 px">
279
+ <k-card label="Output">
280
+ <style>k-aside#aside13 { --collapsed-width: 5rem; }</style>
281
+ <k-aside id="aside13" main="push" state="offscreen">
282
+ <div class="navbar-spacer"></div>
283
+ <nav>
284
+ <h3>Sidebar</h3>
285
+ <a href="#">Dashboard</a>
286
+ <a href="#">Reports</a>
287
+ <a href="#">Settings</a>
288
+ </nav>
289
+ </k-aside>
290
+ <button id="btn13expand">Expand</button>
291
+ <button id="btn13collapse">Collapse</button>
292
+ <button id="btn13hide">Hide</button>
293
+ <script>
294
+ const a13 = document.getElementById('aside13');
295
+ document.getElementById('btn13expand').addEventListener('click',()=> a13.expand());
296
+ document.getElementById('btn13collapse').addEventListener('click',()=> a13.collapse());
297
+ document.getElementById('btn13hide').addEventListener('click',()=> a13.hide());
298
+ </script>
299
+ </k-card>
300
+ </div>
301
+ </div>
302
+
303
+ <h3 id="persistentState"><a href="#persistentState" class="no-link">Persistent State</a></h3>
304
+ <p>Use <code>persistent-id</code> to remember the aside's state across page loads. The state is saved to <code>localStorage</code> under the key <code>aside-persistent-id-{id}</code> and restored when the element is connected. Works with <code>"expanded"</code>, <code>"collapsed"</code>, and <code>"offscreen"</code> states.</p>
305
+ <div class="row -mx">
306
+ <div class="col m-span-12 px">
307
+ <k-card label="HTML">
308
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">main</span>=<span class="hljs-string">&#x27;push&#x27;</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span> <span class="hljs-attr">persistent-id</span>=<span class="hljs-string">&#x27;my-nav&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">nav</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Sidebar Content<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br> <span class="hljs-tag">&lt;/<span class="hljs-name">nav</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.previousElementSibling.expand()&#x27;</span>&gt;</span>Expand<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.previousElementSibling.collapse()&#x27;</span>&gt;</span>Collapse<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;this.previousElementSibling.hide()&#x27;</span>&gt;</span>Hide<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
309
+ </k-card>
310
+ </div>
311
+ <div class="col m-span-12 px">
312
+ <k-card label="Output">
313
+ <k-aside id="aside-persist" main="push" state="offscreen" persistent-id="docs-aside-persist-demo">
314
+ <div class="navbar-spacer"></div>
315
+ <nav>
316
+ <p>Sidebar Content</p>
317
+ </nav>
318
+ </k-aside>
319
+ <button id="btn-persist-expand">Expand</button>
320
+ <button id="btn-persist-collapse">Collapse</button>
321
+ <button id="btn-persist-hide">Hide</button>
322
+ <p class="mt"><small>Toggle the state and reload the page — it will be restored.</small></p>
323
+ <script>
324
+ const aPersist = document.getElementById('aside-persist');
325
+ document.getElementById('btn-persist-expand').addEventListener('click',()=> aPersist.expand());
326
+ document.getElementById('btn-persist-collapse').addEventListener('click',()=> aPersist.collapse());
327
+ document.getElementById('btn-persist-hide').addEventListener('click',()=> aPersist.hide());
328
+ </script>
329
+ </k-card>
330
+ </div>
331
+ </div>
332
+
333
+ <h2 id="subItems"><a href="#subItems" class="no-link">Items &amp; Labels</a></h2>
334
+ <p>Use <code>k-aside-item</code>, <code>k-aside-label</code>, and <code>k-aside-spacer</code> inside a push-mode aside for a navigation panel with icons and text. Set <code>--aside_padding: 0;</code> on the aside so the sub-components control their own spacing.</p>
335
+ <p>Items and labels automatically react to the aside's collapsed/expanded state.</p>
336
+ <div class="row -mx">
337
+ <div class="col m-span-12 px">
338
+ <k-card label="HTML">
339
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">main</span>=<span class="hljs-string">&quot;push&quot;</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&quot;expanded&quot;</span> <span class="hljs-attr">style</span>=<span class="hljs-string">&quot;--aside_padding: 0;&quot;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-toggle</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">h5</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;m-0&quot;</span>&gt;</span>Kempo<span class="hljs-tag">&lt;/<span class="hljs-name">h5</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-toggle</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">&quot;cards&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span> <span class="hljs-attr">active</span>&gt;</span>Dashboard<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">&quot;check&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>Tasks<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">&quot;label&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>Email<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-label</span>&gt;</span>Projects<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-label</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">&quot;folder&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>Figma Design<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">&quot;folder&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>Static Mania<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-spacer</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-spacer</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">&quot;settings&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>Settings<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">&quot;account-circle&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>Profile<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">k-main</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">h2</span>&gt;</span>Main Content<span class="hljs-tag">&lt;/<span class="hljs-name">h2</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Content adjusts when panel opens/closes.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-main</span>&gt;</span></code></pre>
340
+ </k-card>
341
+ </div>
342
+ <div class="col m-span-12 px">
343
+ <k-card label="Output">
344
+ <iframe src="./aside-items.html" style="width: 100%; height: 600px; border: 1px solid var(--c_border); border-radius: var(--radius);"></iframe>
345
+ </k-card>
346
+ </div>
347
+ </div>
348
+
349
+ <h2 id="subMenu"><a href="#subMenu" class="no-link">Expandable Menus</a></h2>
350
+ <p>Use <code>k-aside-menu</code> for collapsible sub-menus with an icon and label. When the aside is collapsed, clicking a menu icon expands the aside (unless <code>no-expand</code> is set).</p>
351
+ <div class="row -mx">
352
+ <div class="col m-span-12 px">
353
+ <k-card label="HTML">
354
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">main</span>=<span class="hljs-string">&quot;push&quot;</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&quot;expanded&quot;</span> <span class="hljs-attr">style</span>=<span class="hljs-string">&quot;--aside_padding: 0;&quot;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-toggle</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">h5</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&quot;m-0&quot;</span>&gt;</span>Kempo<span class="hljs-tag">&lt;/<span class="hljs-name">h5</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-toggle</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">&quot;cards&quot;</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>Dashboard<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-menu</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">&quot;folder&quot;</span> <span class="hljs-attr">label</span>=<span class="hljs-string">&quot;Projects&quot;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>Website Redesign<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>Mobile App<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-menu</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-menu</span> <span class="hljs-attr">icon</span>=<span class="hljs-string">&quot;settings&quot;</span> <span class="hljs-attr">label</span>=<span class="hljs-string">&quot;Settings&quot;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>General<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-aside-item</span> <span class="hljs-attr">href</span>=<span class="hljs-string">&quot;#&quot;</span>&gt;</span>Security<span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-item</span>&gt;</span><br> <span class="hljs-tag">&lt;/<span class="hljs-name">k-aside-menu</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span></code></pre>
355
+ </k-card>
356
+ </div>
357
+ <div class="col m-span-12 px">
358
+ <k-card label="Output">
359
+ <iframe src="./aside-menu.html" style="width: 100%; height: 400px; border: 1px solid var(--c_border); border-radius: var(--radius);"></iframe>
360
+ </k-card>
361
+ </div>
362
+ </div>
363
+
364
+ <h2 id="events"><a href="#events" class="no-link">State Change Event</a></h2>
365
+ <p>The <code>aside_state_change</code> event fires on both the element and on <code>window</code> whenever the state changes. The event detail contains <code>{ aside, state, main }</code>.</p>
366
+ <div class="row -mx">
367
+ <div class="col m-span-12 px">
368
+ <k-card label="HTML">
369
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-aside</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&#x27;myAside&#x27;</span> <span class="hljs-attr">state</span>=<span class="hljs-string">&#x27;offscreen&#x27;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Open and close me to see events.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-aside</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">onclick</span>=<span class="hljs-string">&#x27;myAside.expand()&#x27;</span>&gt;</span>Open Menu<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&#x27;log&#x27;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="language-javascript"><br> myAside.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;aside_state_change&#x27;</span>, <span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> {<br> log.<span class="hljs-property">textContent</span> = <span class="hljs-string">&#x27;state: &#x27;</span> + e.<span class="hljs-property">detail</span>.<span class="hljs-property">state</span>;<br> });<br></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre>
370
+ </k-card>
371
+ </div>
372
+ <div class="col m-span-12 px">
373
+ <k-card label="Output">
374
+ <k-aside id="aside10" state="offscreen">
375
+ <p>Open and close me to see events.</p>
376
+ </k-aside>
377
+ <button id="open10">Open Menu</button>
378
+ <div id="eventLog" class="p b r mt" style="font-family:monospace;min-height:3rem;"></div>
379
+ <script>
380
+ const log10 = document.getElementById('eventLog');
381
+ document.getElementById('aside10').addEventListener('aside_state_change', e => {
382
+ const entry = document.createElement('div');
383
+ entry.textContent = 'state: ' + e.detail.state + ', main: ' + e.detail.main;
384
+ log10.prepend(entry);
385
+ });
386
+ document.getElementById('open10').addEventListener('click',()=>{
387
+ document.getElementById('aside10').expand();
388
+ });
389
+ </script>
390
+ </k-card>
391
+ </div>
392
+ </div>
393
+
394
+ <h2 id="jsRef">JavaScript Reference</h2>
395
+
396
+ <h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
397
+ <h6>Extends <a href="./shadow-component.html">ShadowComponent</a></h6>
398
+ <h5><code>new Aside()</code></h5>
399
+
400
+ <h3 id="requirements"><a href="#requirements" class="no-link">Requirements</a></h3>
401
+ <ul>
402
+ <li><a href="./shadow-component.html">ShadowComponent</a></li>
403
+ <li><a href="./focus-capture.html">FocusCapture</a> (used in overlay mode)</li>
404
+ <li><strong>k-main:</strong> Wrap your page content in <code>&lt;k-main&gt;</code> so push-mode asides can shift the layout.</li>
405
+ </ul>
406
+
407
+ <h3 id="properties"><a href="#properties" class="no-link">Properties</a></h3>
408
+ <h5><code>state<i>: string</i></code></h5>
409
+ <p>The current state. <code>"expanded"</code> (default) shows the full aside, <code>"collapsed"</code> shows a narrow strip (width set by <code>--collapsed-width</code>), <code>"offscreen"</code> hides it. Syncs to <code>state</code> attribute.</p>
410
+ <h5><code>side<i>: string</i></code></h5>
411
+ <p>Which side of the viewport to anchor to. <code>"left"</code> (default) or <code>"right"</code>. Syncs to <code>side</code> attribute.</p>
412
+ <h5><code>main<i>: string</i></code></h5>
413
+ <p>How the aside interacts with page content. <code>"overlay"</code> (default) renders a backdrop and focus trap without affecting layout. <code>"push"</code> dispatches events so <code>&lt;k-main&gt;</code> adjusts its margins. Syncs to <code>main</code> attribute.</p>
414
+ <h5><code>overlayClose<i>: boolean</i></code></h5>
415
+ <p>Whether clicking the overlay backdrop closes the aside. Defaults to <code>true</code>. Syncs to <code>overlay-close</code> attribute.</p>
416
+ <h5><code>escClose<i>: boolean</i></code></h5>
417
+ <p>Whether pressing the ESC key closes the aside. Defaults to <code>true</code>. Syncs to <code>esc-close</code> attribute.</p>
418
+ <h5><code>persistentId<i>: string | null</i></code></h5>
419
+ <p>When set, the aside's <code>state</code> is saved to <code>localStorage</code> under <code>aside-persistent-id-{id}</code> on every change, and restored when the element connects. Defaults to <code>null</code>. Syncs to <code>persistent-id</code> attribute.</p>
420
+
421
+ <h3 id="eventRef"><a href="#eventRef" class="no-link">Events</a></h3>
422
+ <h5><code>aside_state_change</code></h5>
423
+ <p>Dispatched on the element and on <code>window</code> whenever <code>state</code> changes. Detail: <code>{ aside, state, main }</code>.</p>
424
+
425
+ <h3 id="methods"><a href="#methods" class="no-link">Methods</a></h3>
426
+ <h5><code>expand()<i>: void</i></code></h5>
427
+ <p>Sets state to <code>"expanded"</code>.</p>
428
+ <h5><code>collapse()<i>: void</i></code></h5>
429
+ <p>Sets state to <code>"collapsed"</code>.</p>
430
+ <h5><code>hide()<i>: void</i></code></h5>
431
+ <p>Sets state to <code>"offscreen"</code>.</p>
432
+ <h5><code>toggle()<i>: void</i></code></h5>
433
+ <p>Toggles between <code>"expanded"</code> and <code>"offscreen"</code>.</p>
434
+
435
+ <h3 id="cssVars"><a href="#cssVars" class="no-link">CSS Custom Properties</a></h3>
436
+ <h5><code>--width</code></h5>
437
+ <p>Width of the aside when expanded. Default <code>20rem</code>.</p>
438
+ <h5><code>--collapsed-width</code></h5>
439
+ <p>Width of the aside when collapsed. Default <code>3.5rem</code>.</p>
440
+ <h5><code>--bg</code></h5>
441
+ <p>Background color. Default <code>var(--c_bg)</code>.</p>
442
+ <h5><code>--border</code></h5>
443
+ <p>Color of the inner border. Default <code>var(--c_border)</code>.</p>
444
+
445
+ <h2 id="subRef">Sub-Component Reference</h2>
446
+
447
+ <h3 id="asideItem"><a href="#asideItem" class="no-link">k-aside-item</a></h3>
448
+ <p>A navigation link that reacts to the parent aside's collapsed/expanded state. Shows icon + text when expanded, icon-only when collapsed.</p>
449
+ <div class="table-wrapper mb">
450
+ <table>
451
+ <thead><tr><th>Attribute</th><th>Type</th><th>Default</th><th>Description</th></tr></thead>
452
+ <tbody>
453
+ <tr><td><code>icon</code></td><td>string</td><td><code>""</code></td><td>Icon name (renders <code>k-icon</code>). Shows a dot when collapsed if no icon set.</td></tr>
454
+ <tr><td><code>href</code></td><td>string</td><td><code>"#"</code></td><td>Link URL.</td></tr>
455
+ <tr><td><code>active</code></td><td>boolean</td><td><code>false</code></td><td>Highlights the item with the primary color.</td></tr>
456
+ <tr><td><code>no-expand</code></td><td>boolean</td><td><code>false</code></td><td>Prevents clicking a collapsed item from expanding the aside.</td></tr>
457
+ <tr><td><code>hide-when-collapsed</code></td><td>boolean</td><td><code>false</code></td><td>Hides the item entirely when collapsed.</td></tr>
458
+ </tbody>
459
+ </table>
460
+ </div>
461
+
462
+ <h3 id="asideLabel"><a href="#asideLabel" class="no-link">k-aside-label</a></h3>
463
+ <p>A section label. Displays text when expanded, an <code>&lt;hr&gt;</code> divider when collapsed.</p>
464
+ <p>No additional attributes beyond automatic collapsed state syncing.</p>
465
+
466
+ <h3 id="asideMenu"><a href="#asideMenu" class="no-link">k-aside-menu</a></h3>
467
+ <p>An expandable sub-menu that toggles open/closed. When the aside is collapsed, clicking the menu icon expands the aside.</p>
468
+ <div class="table-wrapper mb">
469
+ <table>
470
+ <thead><tr><th>Attribute</th><th>Type</th><th>Default</th><th>Description</th></tr></thead>
471
+ <tbody>
472
+ <tr><td><code>icon</code></td><td>string</td><td><code>""</code></td><td>Icon name for the menu header.</td></tr>
473
+ <tr><td><code>label</code></td><td>string</td><td><code>""</code></td><td>Text label for the menu header.</td></tr>
474
+ <tr><td><code>open</code></td><td>boolean</td><td><code>false</code></td><td>Whether the sub-menu is expanded.</td></tr>
475
+ <tr><td><code>no-expand</code></td><td>boolean</td><td><code>false</code></td><td>Prevents clicking a collapsed menu from expanding the aside.</td></tr>
476
+ <tr><td><code>hide-when-collapsed</code></td><td>boolean</td><td><code>false</code></td><td>Hides the menu entirely when collapsed.</td></tr>
477
+ </tbody>
478
+ </table>
479
+ </div>
480
+ <p>Slot: Place <code>k-aside-item</code> elements inside for sub-menu links.</p>
481
+
482
+ <h3 id="asideSpacer"><a href="#asideSpacer" class="no-link">k-aside-spacer</a></h3>
483
+ <p>A flexible spacer (<code>flex: 1</code>) that pushes subsequent items to the bottom of the aside. No attributes.</p>
484
+
485
+ <h3 id="asideToggle"><a href="#asideToggle" class="no-link">k-aside-toggle</a></h3>
486
+ <p>A header with a collapse/expand toggle button. Renders an arrow icon that flips direction based on state. Place content (e.g. a logo) in the default slot; it hides when collapsed.</p>
487
+ <p>No additional attributes. Automatically syncs with the parent aside's state.</p>
488
+ </content>
489
+ <content location="scripts">
490
+ <script type="module" src="{{pathToRoot}}src/components/Accordion.js"></script>
491
+ <script type="module" src="{{pathToRoot}}src/components/Aside.js"></script>
492
+ <script type="module" src="{{pathToRoot}}src/components/Card.js"></script>
493
+ </content>
494
+ </page>