kempo-ui 0.3.4 → 0.3.6

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 (143) hide show
  1. package/AGENTS.md +2 -1
  2. package/dist/components/Aside.js +2 -0
  3. package/docs/components/accordion.html +240 -8
  4. package/docs/components/aside-items.html +13 -9
  5. package/docs/components/aside-menu.html +13 -9
  6. package/docs/components/aside-push.html +11 -6
  7. package/docs/components/aside.html +239 -8
  8. package/docs/components/card.html +238 -7
  9. package/docs/components/color-picker.html +245 -14
  10. package/docs/components/content-slider.html +240 -8
  11. package/docs/components/context.html +241 -7
  12. package/docs/components/dialog.html +238 -7
  13. package/docs/components/dropdown.html +238 -7
  14. package/docs/components/filter-list.html +239 -10
  15. package/docs/components/focus-capture.html +241 -10
  16. package/docs/components/html-editor.html +266 -35
  17. package/docs/components/hybrid-component.html +238 -6
  18. package/docs/components/icon.html +239 -9
  19. package/docs/components/import.html +239 -8
  20. package/docs/components/light-component.html +239 -7
  21. package/docs/components/nav.html +240 -8
  22. package/docs/components/photo-viewer.html +239 -9
  23. package/docs/components/resize.html +240 -9
  24. package/docs/components/shadow-component.html +239 -7
  25. package/docs/components/show-more.html +237 -8
  26. package/docs/components/sortable.html +239 -8
  27. package/docs/components/spinner.html +237 -6
  28. package/docs/components/split.html +241 -10
  29. package/docs/components/table.html +241 -11
  30. package/docs/components/tableControls.html +240 -7
  31. package/docs/components/tableCustomFields.html +241 -8
  32. package/docs/components/tableFetchRecords.html +239 -7
  33. package/docs/components/tableFieldSortHide.html +239 -7
  34. package/docs/components/tablePagination.html +246 -13
  35. package/docs/components/tablePlaceholder.html +241 -8
  36. package/docs/components/tableRecordEditing.html +241 -8
  37. package/docs/components/tableRecordFiltering.html +239 -7
  38. package/docs/components/tableRecordHiding.html +241 -9
  39. package/docs/components/tableRecordSearching.html +239 -7
  40. package/docs/components/tableRecordSelection.html +240 -7
  41. package/docs/components/tableRowControls.html +241 -8
  42. package/docs/components/tableServerSync.html +245 -11
  43. package/docs/components/tableSorting.html +239 -7
  44. package/docs/components/tabs.html +240 -7
  45. package/docs/components/tags.html +239 -7
  46. package/docs/components/theme-select.html +239 -7
  47. package/docs/components/theme-switcher.html +240 -8
  48. package/docs/components/timestamp.html +239 -8
  49. package/docs/components/toast.html +240 -8
  50. package/docs/components/toggle.html +240 -9
  51. package/docs/components/tree.html +239 -8
  52. package/docs/index.html +244 -6
  53. package/docs/prod.config.json +0 -4
  54. package/docs/src/components/Aside.js +2 -0
  55. package/docs/utils/context.html +237 -6
  56. package/docs/utils/cookie.html +251 -21
  57. package/docs/utils/debounce.html +236 -5
  58. package/docs/utils/drag.html +236 -5
  59. package/docs/utils/elevation.html +238 -6
  60. package/docs/utils/formatTimestamp.html +233 -3
  61. package/docs/utils/object.html +236 -5
  62. package/docs/utils/propConverters.html +233 -3
  63. package/docs/utils/string.html +236 -5
  64. package/docs/utils/theme.html +237 -6
  65. package/docs/utils/toTitleCase.html +233 -3
  66. package/docs/utils/type.html +236 -5
  67. package/docs/utils/wait.html +236 -5
  68. package/docs-src/.config.js +16 -0
  69. package/docs-src/bare.template.html +16 -0
  70. package/docs-src/components/accordion.page.html +201 -0
  71. package/docs-src/components/aside-items.page.html +36 -0
  72. package/docs-src/components/aside-menu.page.html +36 -0
  73. package/docs-src/components/aside-push.page.html +20 -0
  74. package/docs-src/components/aside.page.html +551 -0
  75. package/docs-src/components/card.page.html +78 -0
  76. package/docs-src/components/color-picker.page.html +559 -0
  77. package/docs-src/components/content-slider.page.html +266 -0
  78. package/docs-src/components/context.page.html +214 -0
  79. package/docs-src/components/dialog.page.html +365 -0
  80. package/docs-src/components/dropdown.page.html +300 -0
  81. package/docs-src/components/filter-list.page.html +117 -0
  82. package/docs-src/components/focus-capture.page.html +97 -0
  83. package/docs-src/components/html-editor.page.html +423 -0
  84. package/docs-src/components/hybrid-component.page.html +96 -0
  85. package/docs-src/components/icon.page.html +208 -0
  86. package/docs-src/components/import.page.html +76 -0
  87. package/docs-src/components/light-component.page.html +99 -0
  88. package/docs-src/components/nav.page.html +106 -0
  89. package/docs-src/components/photo-viewer.page.html +253 -0
  90. package/docs-src/components/resize.page.html +161 -0
  91. package/docs-src/components/shadow-component.page.html +84 -0
  92. package/docs-src/components/show-more.page.html +113 -0
  93. package/docs-src/components/sortable.page.html +117 -0
  94. package/docs-src/components/spinner.page.html +197 -0
  95. package/docs-src/components/split.page.html +195 -0
  96. package/docs-src/components/table.page.html +283 -0
  97. package/docs-src/components/tableControls.page.html +64 -0
  98. package/docs-src/components/tableCustomFields.page.html +124 -0
  99. package/docs-src/components/tableFetchRecords.page.html +95 -0
  100. package/docs-src/components/tableFieldSortHide.page.html +56 -0
  101. package/docs-src/components/tablePagination.page.html +85 -0
  102. package/docs-src/components/tablePlaceholder.page.html +73 -0
  103. package/docs-src/components/tableRecordEditing.page.html +161 -0
  104. package/docs-src/components/tableRecordFiltering.page.html +69 -0
  105. package/docs-src/components/tableRecordHiding.page.html +65 -0
  106. package/docs-src/components/tableRecordSearching.page.html +56 -0
  107. package/docs-src/components/tableRecordSelection.page.html +60 -0
  108. package/docs-src/components/tableRowControls.page.html +62 -0
  109. package/docs-src/components/tableServerSync.page.html +129 -0
  110. package/docs-src/components/tableSorting.page.html +54 -0
  111. package/docs-src/components/tabs.page.html +201 -0
  112. package/docs-src/components/tags.page.html +157 -0
  113. package/docs-src/components/theme-select.page.html +106 -0
  114. package/docs-src/components/theme-switcher.page.html +122 -0
  115. package/docs-src/components/timestamp.page.html +109 -0
  116. package/docs-src/components/toast.page.html +338 -0
  117. package/docs-src/components/toggle.page.html +177 -0
  118. package/docs-src/components/tree.page.html +356 -0
  119. package/docs-src/default.template.html +28 -0
  120. package/docs-src/index.page.html +312 -0
  121. package/docs-src/nav.fragment.html +228 -0
  122. package/docs-src/utils/context.page.html +143 -0
  123. package/docs-src/utils/cookie.page.html +128 -0
  124. package/docs-src/utils/debounce.page.html +42 -0
  125. package/docs-src/utils/drag.page.html +64 -0
  126. package/docs-src/utils/elevation.page.html +144 -0
  127. package/docs-src/utils/formatTimestamp.page.html +76 -0
  128. package/docs-src/utils/object.page.html +76 -0
  129. package/docs-src/utils/propConverters.page.html +73 -0
  130. package/docs-src/utils/string.page.html +66 -0
  131. package/docs-src/utils/theme.page.html +136 -0
  132. package/docs-src/utils/toTitleCase.page.html +52 -0
  133. package/docs-src/utils/type.page.html +31 -0
  134. package/docs-src/utils/wait.page.html +31 -0
  135. package/package.json +4 -4
  136. package/scripts/build.js +5 -0
  137. package/scripts/docs.js +5 -52
  138. package/src/components/Aside.js +2 -0
  139. package/tests/components/Aside.browser-test.js +35 -0
  140. package/docs/dev.config.json +0 -20
  141. package/docs/nav-1.inc.html +0 -168
  142. package/docs/nav.inc.html +0 -168
  143. package/docs/nav.inc.js +0 -70
@@ -0,0 +1,143 @@
1
+ <page pageName="Context Utility" title="Context Utility - Kempo UI">
2
+ <content location="header"></content>
3
+ <content>
4
+ <h1>Context Utility</h1>
5
+
6
+ <k-accordion persistent-id="toc" class="b r mb">
7
+ <k-accordion-header for-panel="toc-panel">Table of Contents</k-accordion-header>
8
+ <k-accordion-panel name="toc-panel">
9
+ <div class="m ">
10
+ <h6>Usage</h6>
11
+ <a href="#basicUsage">Basic Usage</a><br />
12
+ <a href="#api">API Methods</a><br />
13
+ <a href="#examples">Examples</a><br />
14
+ </div>
15
+ </k-accordion-panel>
16
+ </k-accordion>
17
+
18
+ <h3>Description</h3>
19
+ <p>The <code>createContext</code> utility provides a simple way to create global or named shared state that components can subscribe to. It enables reactive state management with automatic subscriber notifications on value changes.</p>
20
+
21
+ <h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
22
+ <p>Import and create a context to manage shared state:</p>
23
+ <pre><code class="hljs javascript"><span class="hljs-keyword">import</span> createContext <span class="hljs-keyword">from</span> <span class="hljs-string">'./utils/context.js'</span>;<br /><br /><span class="hljs-comment">// Create a named context with initial value</span><br /><span class="hljs-keyword">const</span> userContext = createContext(<span class="hljs-string">'user'</span>, { <span class="hljs-attr">name</span>: <span class="hljs-string">'Guest'</span> });<br /><br /><span class="hljs-comment">// Subscribe to changes</span><br />userContext.subscribe(<span class="hljs-function">(<span class="hljs-params">user</span>) =&gt;</span> {<br /> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'User changed:'</span>, user);<br />});<br /><br /><span class="hljs-comment">// Update the context value</span><br />userContext.set({ <span class="hljs-attr">name</span>: <span class="hljs-string">'John Doe'</span> });</code></pre>
24
+
25
+ <h3 id="api"><a href="#api" class="no-link">API Methods</a></h3>
26
+
27
+ <h4><code>createContext(name, initialValue)</code></h4>
28
+ <p>Creates or retrieves a context with the specified name.</p>
29
+ <h5><code>name<i>: string</i></code> (optional)</h5>
30
+ <p>The name of the context. Defaults to <code>'global'</code>. Using the same name returns the same context instance.</p>
31
+ <h5><code>initialValue<i>: any</i></code> (optional)</h5>
32
+ <p>The initial value for the context. Only set if the context doesn't already have a value.</p>
33
+ <h5>Returns: <code>Object</code></h5>
34
+ <p>An object with the following methods:</p>
35
+
36
+ <h4><code>get()</code></h4>
37
+ <p>Returns the current value of the context.</p>
38
+ <pre><code class="hljs javascript"><span class="hljs-keyword">const</span> currentValue = userContext.get();</code></pre>
39
+
40
+ <h4><code>set(value)</code></h4>
41
+ <p>Updates the context value and notifies all subscribers.</p>
42
+ <pre><code class="hljs javascript">userContext.set({ <span class="hljs-attr">name</span>: <span class="hljs-string">'Jane Doe'</span>, <span class="hljs-attr">role</span>: <span class="hljs-string">'admin'</span> });</code></pre>
43
+
44
+ <h4><code>subscribe(callback)</code></h4>
45
+ <p>Subscribes to context changes. The callback is immediately invoked with the current value, then called again whenever the value changes.</p>
46
+ <h5><code>callback<i>: Function</i></code></h5>
47
+ <p>Function to call when the context value changes. Receives the new value as an argument.</p>
48
+ <h5>Returns: <code>Function</code></h5>
49
+ <p>An unsubscribe function to remove the subscription.</p>
50
+ <pre><code class="hljs javascript"><span class="hljs-keyword">const</span> unsubscribe = userContext.subscribe(<span class="hljs-function">(<span class="hljs-params">value</span>) =&gt;</span> {<br /> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'New value:'</span>, value);<br />});<br /><br /><span class="hljs-comment">// Later, stop listening</span><br />unsubscribe();</code></pre>
51
+
52
+ <h4><code>unsubscribe(callback)</code></h4>
53
+ <p>Removes a subscriber callback from the context.</p>
54
+ <pre><code class="hljs javascript"><span class="hljs-keyword">const</span> handler = <span class="hljs-function">(<span class="hljs-params">value</span>) =&gt;</span> <span class="hljs-built_in">console</span>.log(value);<br />userContext.subscribe(handler);<br />userContext.unsubscribe(handler);</code></pre>
55
+
56
+ <h3 id="examples"><a href="#examples" class="no-link">Examples</a></h3>
57
+
58
+ <h4>Theme Management</h4>
59
+ <pre><code class="hljs javascript"><span class="hljs-keyword">import</span> createContext <span class="hljs-keyword">from</span> <span class="hljs-string">'./utils/context.js'</span>;<br /><br /><span class="hljs-keyword">const</span> themeContext = createContext(<span class="hljs-string">'theme'</span>, <span class="hljs-string">'light'</span>);<br /><br /><span class="hljs-comment">// Components can subscribe to theme changes</span><br />themeContext.subscribe(<span class="hljs-function">(<span class="hljs-params">theme</span>) =&gt;</span> {<br /> <span class="hljs-built_in">document</span>.body.className = theme;<br />});<br /><br /><span class="hljs-comment">// Toggle theme from anywhere</span><br /><span class="hljs-keyword">const</span> toggleTheme = <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> {<br /> <span class="hljs-keyword">const</span> current = themeContext.get();<br /> themeContext.set(current === <span class="hljs-string">'light'</span> ? <span class="hljs-string">'dark'</span> : <span class="hljs-string">'light'</span>);<br />};</code></pre>
60
+
61
+ <h4>Component State Sharing</h4>
62
+ <pre><code class="hljs javascript"><span class="hljs-keyword">import</span> createContext <span class="hljs-keyword">from</span> <span class="hljs-string">'./utils/context.js'</span>;<br /><br /><span class="hljs-keyword">const</span> cartContext = createContext(<span class="hljs-string">'cart'</span>, []);<br /><br /><span class="hljs-comment">// Add item from one component</span><br /><span class="hljs-keyword">const</span> addToCart = <span class="hljs-function">(<span class="hljs-params">item</span>) =&gt;</span> {<br /> <span class="hljs-keyword">const</span> items = cartContext.get();<br /> cartContext.set([...items, item]);<br />};<br /><br /><span class="hljs-comment">// Display cart in another component</span><br />cartContext.subscribe(<span class="hljs-function">(<span class="hljs-params">items</span>) =&gt;</span> {<br /> <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">'.cart-count'</span>).textContent = items.length;<br />});</code></pre>
63
+
64
+ <h4>Global vs Named Contexts</h4>
65
+ <pre><code class="hljs javascript"><span class="hljs-keyword">import</span> createContext <span class="hljs-keyword">from</span> <span class="hljs-string">'./utils/context.js'</span>;<br /><br /><span class="hljs-comment">// Use default global context</span><br /><span class="hljs-keyword">const</span> globalCtx = createContext();<br />globalCtx.set({ <span class="hljs-attr">appReady</span>: <span class="hljs-literal">true</span> });<br /><br /><span class="hljs-comment">// Named contexts are isolated</span><br /><span class="hljs-keyword">const</span> userCtx = createContext(<span class="hljs-string">'user'</span>);<br /><span class="hljs-keyword">const</span> settingsCtx = createContext(<span class="hljs-string">'settings'</span>);<br /><br /><span class="hljs-comment">// Same name returns the same context instance</span><br /><span class="hljs-keyword">const</span> userCtx2 = createContext(<span class="hljs-string">'user'</span>);<br /><span class="hljs-built_in">console</span>.log(userCtx === userCtx2); <span class="hljs-comment">// true</span></code></pre>
66
+
67
+ <h4>Working Example</h4>
68
+ <div class="row -mx mb">
69
+ <div class="col d-span-6 m-span-12 px">
70
+ <k-card label="HTML & JavaScript">
71
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"context-demo"</span>&gt;</span>
72
+ <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Current count: <span class="hljs-tag">&lt;<span class="hljs-name">strong</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"count-display"</span>&gt;</span>0<span class="hljs-tag">&lt;/<span class="hljs-name">strong</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
73
+ <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"increment"</span>&gt;</span>Increment<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
74
+ <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"decrement"</span>&gt;</span>Decrement<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
75
+ <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"reset"</span>&gt;</span>Reset<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
76
+ <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
77
+
78
+ <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"module"</span>&gt;</span><span class="javascript">
79
+ <span class="hljs-keyword">import</span> createContext <span class="hljs-keyword">from</span> <span class="hljs-string">'../src/utils/context.js'</span>;
80
+
81
+ <span class="hljs-keyword">const</span> counterContext = createContext(<span class="hljs-string">'counter'</span>, <span class="hljs-number">0</span>);
82
+
83
+ <span class="hljs-comment">// Subscribe to updates</span>
84
+ counterContext.subscribe(<span class="hljs-function">(<span class="hljs-params">count</span>) =&gt;</span> {
85
+ <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'count-display'</span>).textContent = count;
86
+ });
87
+
88
+ <span class="hljs-comment">// Button handlers</span>
89
+ <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'increment'</span>)
90
+ .<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'click'</span>, <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> {
91
+ counterContext.<span class="hljs-title function_">set</span>(counterContext.<span class="hljs-title function_">get</span>() + <span class="hljs-number">1</span>);
92
+ });
93
+
94
+ <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'decrement'</span>)
95
+ .<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'click'</span>, <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> {
96
+ counterContext.<span class="hljs-title function_">set</span>(counterContext.<span class="hljs-title function_">get</span>() - <span class="hljs-number">1</span>);
97
+ });
98
+
99
+ <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">'reset'</span>)
100
+ .<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">'click'</span>, <span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> {
101
+ counterContext.<span class="hljs-title function_">set</span>(<span class="hljs-number">0</span>);
102
+ });
103
+ </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre>
104
+ </k-card>
105
+ </div>
106
+ <div class="col d-span-6 m-span-12 px">
107
+ <k-card label="Results">
108
+ <div id="context-demo">
109
+ <p>Current count: <strong id="count-display">0</strong></p>
110
+ <button id="increment" class="primary">Increment</button>
111
+ <button id="decrement">Decrement</button>
112
+ <button id="reset" class="danger">Reset</button>
113
+ </div>
114
+ </k-card>
115
+ </div>
116
+ </div>
117
+ </content>
118
+ <content location="scripts">
119
+ <script type="module" src="{{pathToRoot}}src/components/Accordion.js"></script>
120
+ <script type="module" src="{{pathToRoot}}src/components/Card.js"></script>
121
+ <script type="module">
122
+ import createContext from '{{pathToRoot}}src/utils/context.js';
123
+
124
+ const counterContext = createContext('counter-demo', 0);
125
+
126
+ counterContext.subscribe(count => {
127
+ document.getElementById('count-display').textContent = count;
128
+ });
129
+
130
+ document.getElementById('increment').addEventListener('click', () => {
131
+ counterContext.set(counterContext.get() + 1);
132
+ });
133
+
134
+ document.getElementById('decrement').addEventListener('click', () => {
135
+ counterContext.set(counterContext.get() - 1);
136
+ });
137
+
138
+ document.getElementById('reset').addEventListener('click', () => {
139
+ counterContext.set(0);
140
+ });
141
+ </script>
142
+ </content>
143
+ </page>
@@ -0,0 +1,128 @@
1
+ <page pageName="Cookie Utilities" title="Cookie Utilities - Kempo UI">
2
+ <content location="header"></content>
3
+ <content>
4
+ <h1>Cookie Utilities</h1>
5
+
6
+ <k-accordion persistent-id="toc" class="b r mb">
7
+ <k-accordion-header for-panel="toc-panel">Table of Contents</k-accordion-header>
8
+ <k-accordion-panel name="toc-panel">
9
+ <div class="m ">
10
+ <h6>Functions</h6>
11
+ <a href="#saveCookie">saveCookie</a><br />
12
+ <a href="#getCookie">getCookie</a><br />
13
+ <a href="#deleteCookie">deleteCookie</a><br />
14
+ </div>
15
+ </k-accordion-panel>
16
+ </k-accordion>
17
+
18
+ <h3>Description</h3>
19
+ <p>The cookie utilities module provides functions for managing browser cookies, including saving, retrieving, and
20
+ deleting cookie values.</p>
21
+
22
+ <h3>Working Example</h3>
23
+ <div class="row -mx mb">
24
+ <div class="col d-span-6 m-span-12 px">
25
+ <k-card label="HTML & JavaScript">
26
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"cookie-example"</span>&gt;</span>
27
+ <span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"saved-message"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
28
+ <span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"cookie-form"</span>&gt;</span>
29
+ <span class="hljs-tag">&lt;<span class="hljs-name">label</span> <span class="hljs-attr">for</span>=<span class="hljs-string">"cookie-value"</span>&gt;</span>Value to save:<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span>
30
+ <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"cookie-value"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"cookie-value"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Enter a value"</span>&gt;</span>
31
+ <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"submit"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"primary"</span>&gt;</span>Save to Cookie<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
32
+ <span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span>
33
+ <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"delete-btn"</span>&gt;</span>Delete Cookie<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span>
34
+ <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
35
+
36
+ <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
37
+ <span class="hljs-keyword">import</span> { saveCookie, getCookie, deleteCookie } <span class="hljs-keyword">from</span> <span class="hljs-string">'../src/utils/cookie.js'</span>;
38
+
39
+ <span class="hljs-comment">// Load saved value on page load</span>
40
+ <span class="hljs-keyword">const</span> savedValue = getCookie(<span class="hljs-string">'example'</span>);
41
+ <span class="hljs-keyword">if</span> (savedValue) {
42
+ document.getElementById(<span class="hljs-string">'saved-message'</span>).textContent =
43
+ `Saved value from cookie: ${savedValue}`;
44
+ }
45
+
46
+ <span class="hljs-comment">// Handle form submission</span>
47
+ document.getElementById(<span class="hljs-string">'cookie-form'</span>).addEventListener(<span class="hljs-string">'submit'</span>, (e) => {
48
+ e.preventDefault();
49
+ <span class="hljs-keyword">const</span> value = document.getElementById(<span class="hljs-string">'cookie-value'</span>).value;
50
+ saveCookie(<span class="hljs-string">'example'</span>, value);
51
+ <span class="hljs-comment">// Page will refresh due to form submission</span>
52
+ window.location.reload();
53
+ });
54
+
55
+ <span class="hljs-comment">// Delete cookie when delete button is clicked</span>
56
+ document.getElementById(<span class="hljs-string">'delete-btn'</span>).addEventListener(<span class="hljs-string">'click'</span>, () => {
57
+ deleteCookie(<span class="hljs-string">'example'</span>);
58
+ window.location.reload();
59
+ });
60
+ </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre>
61
+ </k-card>
62
+ </div>
63
+ <div class="col d-span-6 m-span-12 px">
64
+ <k-card label="Results">
65
+ <div id="cookie-example">
66
+ <p id="saved-message"></p>
67
+ <form id="cookie-form">
68
+ <label for="cookie-value">"example" Cookie value:</label>
69
+ <input type="text" id="cookie-value" name="cookie-value" class="mb" placeholder="Enter a value">
70
+ <div class="d-f">
71
+ <div class="flex"></div>
72
+ <button id="delete-btn" class="danger mr" type="button">Delete Cookie</button>
73
+ <button type="submit" class="primary">Save to Cookie</button>
74
+ </div>
75
+ </form>
76
+ </div>
77
+ </k-card>
78
+ </div>
79
+ </div>
80
+
81
+ <h3 id="saveCookie"><a href="#saveCookie" class="no-link">saveCookie</a></h3>
82
+ <p>Saves a cookie with an optional expiration time and path.</p>
83
+ <pre><code class="hljs javascript"><span class="hljs-keyword">import</span> { saveCookie } <span class="hljs-keyword">from</span> <span class="hljs-string">'../src/utils/cookie.js'</span>;<br /><br /><span class="hljs-comment">// Save a cookie that expires in 30 minutes</span><br />saveCookie(<span class="hljs-string">'userId'</span>, <span class="hljs-string">'12345'</span>);<br /><br /><span class="hljs-comment">// Save a cookie that expires in 1 hour</span><br />saveCookie(<span class="hljs-string">'session'</span>, <span class="hljs-string">'abc123'</span>, <span class="hljs-number">60</span>);</code></pre>
84
+
85
+ <h3 id="getCookie"><a href="#getCookie" class="no-link">getCookie</a></h3>
86
+ <p>Retrieves the value of a cookie by name.</p>
87
+ <pre><code class="hljs javascript"><span class="hljs-keyword">import</span> { getCookie } <span class="hljs-keyword">from</span> <span class="hljs-string">'../src/utils/cookie.js'</span>;<br /><br /><span class="hljs-keyword">const</span> userId = getCookie(<span class="hljs-string">'userId'</span>); <span class="hljs-comment">// "12345" or null if not found</span></code></pre>
88
+
89
+ <h3 id="deleteCookie"><a href="#deleteCookie" class="no-link">deleteCookie</a></h3>
90
+ <p>Deletes a cookie by setting its expiration to a past date.</p>
91
+ <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>
92
+ </content>
93
+ <content location="scripts">
94
+ <script type="module" src="{{pathToRoot}}src/components/Accordion.js"></script>
95
+ <script type="module" src="{{pathToRoot}}src/components/Card.js"></script>
96
+ <script type="module">
97
+ import { saveCookie, getCookie, deleteCookie } from '{{pathToRoot}}src/utils/cookie.js';
98
+
99
+ // Load saved value on page load
100
+ const savedValue = getCookie('example');
101
+ const messageElement = document.getElementById('saved-message');
102
+ if (savedValue && messageElement) {
103
+ messageElement.textContent = `Saved value from cookie: ${savedValue}`;
104
+ }
105
+
106
+ // Handle form submission
107
+ const form = document.getElementById('cookie-form');
108
+ if (form) {
109
+ form.addEventListener('submit', (e) => {
110
+ e.preventDefault();
111
+ const value = document.getElementById('cookie-value').value;
112
+ saveCookie('example', value);
113
+ // Page will refresh due to form submission
114
+ window.location.reload();
115
+ });
116
+ }
117
+
118
+ // Delete cookie when delete button is clicked
119
+ const deleteBtn = document.getElementById('delete-btn');
120
+ if (deleteBtn) {
121
+ deleteBtn.addEventListener('click', () => {
122
+ deleteCookie('example');
123
+ window.location.reload();
124
+ });
125
+ }
126
+ </script>
127
+ </content>
128
+ </page>
@@ -0,0 +1,42 @@
1
+ <page pageName="debounce" title="debounce - Kempo UI">
2
+ <content location="header"></content>
3
+ <content>
4
+ <h1>debounce</h1>
5
+ <k-accordion persistent-id="toc" class="b r mb">
6
+ <k-accordion-header for-panel="toc-panel">Table of Contents</k-accordion-header>
7
+ <k-accordion-panel name="toc-panel">
8
+ <div class="m ">
9
+ <h6>Usage</h6>
10
+ <a href="#basicUsage">Basic Usage</a><br />
11
+ <a href="#parameters">Parameters</a><br />
12
+ <a href="#examples">Examples</a><br />
13
+ </div>
14
+ </k-accordion-panel>
15
+ </k-accordion>
16
+
17
+ <h3>Description</h3>
18
+ <p>The <code>debounce</code> utility function limits the rate at which a function can be executed. It delays the
19
+ execution of a function until after a specified timeout has passed since the last time it was invoked.</p>
20
+
21
+ <h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
22
+ <p>Import and use the debounce function to limit function execution frequency:</p>
23
+ <pre><code class="hljs javascript"><span class="hljs-keyword">import</span> debounce <span class="hljs-keyword">from</span> <span class="hljs-string">'./utils/debounce.js'</span>;<br /><br /><span class="hljs-keyword">const</span> handleSearch = debounce(<span class="hljs-function">(<span class="hljs-params">query</span>) =&gt;</span> {<br /> <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'Searching for:'</span>, query);<br />}, <span class="hljs-number">300</span>);<br /><br /><span class="hljs-comment">// Will only execute after 300ms of no calls</span><br />handleSearch(<span class="hljs-string">'test'</span>);</code></pre>
24
+
25
+ <h3 id="parameters"><a href="#parameters" class="no-link">Parameters</a></h3>
26
+ <h5><code>func<i>: Function</i></code></h5>
27
+ <p>The function to debounce.</p>
28
+ <h5><code>timeout<i>: number</i></code> (optional)</h5>
29
+ <p>The number of milliseconds to delay execution. Defaults to 300ms.</p>
30
+
31
+ <h3 id="examples"><a href="#examples" class="no-link">Examples</a></h3>
32
+
33
+ <h4>Search Input Debouncing</h4>
34
+ <pre><code class="hljs javascript"><span class="hljs-keyword">const</span> debouncedSearch = debounce(<span class="hljs-function">(<span class="hljs-params">searchTerm</span>) =&gt;</span> {<br /> <span class="hljs-comment">// API call or expensive search operation</span><br /> performSearch(searchTerm);<br />}, <span class="hljs-number">500</span>);<br /><br />searchInput.addEventListener(<span class="hljs-string">'input'</span>, (e) =&gt; {<br /> debouncedSearch(e.target.value);<br />});</code></pre>
35
+
36
+ <h4>Window Resize Handler</h4>
37
+ <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>
38
+ </content>
39
+ <content location="scripts">
40
+ <script type="module" src="{{pathToRoot}}src/components/Accordion.js"></script>
41
+ </content>
42
+ </page>
@@ -0,0 +1,64 @@
1
+ <page pageName="drag" title="drag - Kempo UI">
2
+ <content location="header"></content>
3
+ <content>
4
+ <h1>drag</h1>
5
+
6
+ <k-accordion persistent-id="toc" class="b r mb">
7
+ <k-accordion-header for-panel="toc-panel">Table of Contents</k-accordion-header>
8
+ <k-accordion-panel name="toc-panel">
9
+ <div class="m ">
10
+ <a href="#basicUsage">Basic Usage</a><br />
11
+ <a href="#options">Options</a><br />
12
+ <a href="#callbacks">Callbacks</a><br />
13
+ <a href="#returnValue">Return Value</a><br />
14
+ <a href="#examples">Examples</a><br />
15
+ </div>
16
+ </k-accordion-panel>
17
+ </k-accordion>
18
+
19
+ <h3>Description</h3>
20
+ <p>The <code>drag</code> utility function enables drag interactions on DOM elements. It handles both mouse and touch
21
+ events, providing callbacks for drag start, move, and end events.</p>
22
+
23
+ <h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
24
+ <p>Import and use the drag function to make elements draggable. The function returns a cleanup function that should
25
+ be called to remove all event listeners:</p>
26
+ <pre><code class="hljs javascript"><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">const</span> element = <span class="hljs-built_in">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'.draggable'</span>);<br /><span class="hljs-keyword">const</span> cleanup = <span class="hljs-title function_">drag</span>({<br /> element,<br /> <span class="hljs-attr">callback</span>: <span class="hljs-function">(<span class="hljs-params">diff</span>) =&gt;</span> {<br /> <span class="hljs-variable language_">console</span>.<span class="hljs-title function_">log</span>(<span class="hljs-string">'Dragged:'</span>, diff.x, diff.y);<br /> }<br />});<br /><br /><span class="hljs-comment">// Later, when you need to remove the drag functionality</span><br /><span class="hljs-title function_">cleanup</span>();</code></pre>
27
+
28
+ <h3 id="options"><a href="#options" class="no-link">Options</a></h3>
29
+ <h5><code>element<i>: HTMLElement</i></code></h5>
30
+ <p>The DOM element to make draggable.</p>
31
+ <h5><code>preventScroll<i>: boolean</i></code> (optional)</h5>
32
+ <p>Whether to prevent scroll behavior during drag. Defaults to false.</p>
33
+
34
+ <h3 id="callbacks"><a href="#callbacks" class="no-link">Callbacks</a></h3>
35
+ <h5><code>callback<i>: Function</i></code> (optional)</h5>
36
+ <p>Called on every drag move. Receives a diff object with x, y coordinates and original options.</p>
37
+ <h5><code>startCallback<i>: Function</i></code> (optional)</h5>
38
+ <p>Called when drag starts. Receives a diff object with x: 0, y: 0 and original options.</p>
39
+ <h5><code>moveCallback<i>: Function</i></code> (optional)</h5>
40
+ <p>Called on every drag move (in addition to callback). Receives a diff object.</p>
41
+ <h5><code>endCallback<i>: Function</i></code> (optional)</h5>
42
+ <p>Called when drag ends. Receives a diff object with the final position.</p>
43
+
44
+ <h3 id="returnValue"><a href="#returnValue" class="no-link">Return Value</a></h3>
45
+ <h5><code>cleanup<i>: Function</i></code></h5>
46
+ <p>The drag function returns a cleanup function. Call this function to remove all event listeners and stop the drag
47
+ functionality. This is important for preventing memory leaks when removing or destroying components.</p>
48
+ <pre><code class="hljs javascript"><span class="hljs-keyword">const</span> cleanup = <span class="hljs-title function_">drag</span>({ element, callback });<br /><br /><span class="hljs-comment">// Later, when component is destroyed or drag is no longer needed</span><br /><span class="hljs-title function_">cleanup</span>();</code></pre>
49
+
50
+ <h3 id="examples"><a href="#examples" class="no-link">Examples</a></h3>
51
+
52
+ <h4>Draggable Element</h4>
53
+ <pre><code class="hljs javascript"><span class="hljs-keyword">const</span> box = <span class="hljs-built_in">document</span>.querySelector(<span class="hljs-string">'.box'</span>);<br /><span class="hljs-keyword">let</span> position = { <span class="hljs-attr">x</span>: <span class="hljs-number">0</span>, <span class="hljs-attr">y</span>: <span class="hljs-number">0</span> };<br /><br />drag({<br /> <span class="hljs-attr">element</span>: box,<br /> <span class="hljs-attr">callback</span>: <span class="hljs-function">(<span class="hljs-params">diff</span>) =&gt;</span> {<br /> position.x += diff.x;<br /> position.y += diff.y;<br /> box.style.transform = <span class="hljs-string">`translate(<span class="hljs-subst">${position.x}</span>px, <span class="hljs-subst">${position.y}</span>px)`</span>;<br /> }<br />});</code></pre>
54
+
55
+ <h4>Resize Handle</h4>
56
+ <pre><code class="hljs javascript"><span class="hljs-keyword">const</span> resizeHandle = <span class="hljs-built_in">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'.resize-handle'</span>);<br /><span class="hljs-keyword">const</span> panel = <span class="hljs-built_in">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">'.panel'</span>);<br /><br /><span class="hljs-title function_">drag</span>({<br /> <span class="hljs-attr">element</span>: resizeHandle,<br /> <span class="hljs-attr">preventScroll</span>: <span class="hljs-literal">true</span>,<br /> <span class="hljs-attr">callback</span>: <span class="hljs-function">(<span class="hljs-params">diff</span>) =&gt;</span> {<br /> <span class="hljs-keyword">const</span> newWidth = panel.offsetWidth + diff.x;<br /> panel.style.width = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(<span class="hljs-number">100</span>, newWidth) + <span class="hljs-string">'px'</span>;<br /> },<br /> <span class="hljs-attr">startCallback</span>: <span class="hljs-function">() =&gt;</span> {<br /> panel.classList.<span class="hljs-title function_">add</span>(<span class="hljs-string">'resizing'</span>);<br /> },<br /> <span class="hljs-attr">endCallback</span>: <span class="hljs-function">() =&gt;</span> {<br /> panel.classList.<span class="hljs-title function_">remove</span>(<span class="hljs-string">'resizing'</span>);<br /> }<br />});</code></pre>
57
+
58
+ <h4>Component with Cleanup</h4>
59
+ <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>
60
+ </content>
61
+ <content location="scripts">
62
+ <script type="module" src="{{pathToRoot}}src/components/Accordion.js"></script>
63
+ </content>
64
+ </page>
@@ -0,0 +1,144 @@
1
+ <page pageName="elevation" title="elevation - Kempo UI">
2
+ <content location="header"></content>
3
+ <content>
4
+
5
+ <h1>elevation</h1>
6
+ <k-accordion persistent-id="toc" class="b r mb">
7
+ <k-accordion-header for-panel="toc-panel">Table of Contents</k-accordion-header>
8
+ <k-accordion-panel name="toc-panel">
9
+ <div class="m">
10
+ <a href="#overview">Overview</a><br />
11
+ <a href="#levels">Elevation Levels</a><br />
12
+ <a href="#components">Component Assignments</a><br />
13
+ <a href="#customizing">Customizing</a><br />
14
+ </div>
15
+ </k-accordion-panel>
16
+ </k-accordion>
17
+
18
+ <h3 id="overview"><a href="#overview" class="no-link">Overview</a></h3>
19
+ <p>
20
+ Kempo UI follows the <a href="https://dustinpoissant.github.io/kempo-css/#elevation" target="_blank">kempo-css elevation system</a>.
21
+ Elevation defines a component's position in the stacking order using a simple formula:
22
+ </p>
23
+ <p class="tc-primary fw-bold">z-index = level × 10</p>
24
+ <p>
25
+ There are 11 levels (0–10). Level 2 is the page default for normal document flow — most components do not need a
26
+ <code>z-index</code> at all. Fixed-position components that must appear above or below other layers each occupy a
27
+ dedicated level, with intentional gaps between them so user-defined elements (like a site navbar) always have a
28
+ clear, unambiguous home.
29
+ </p>
30
+ <p>
31
+ kempo-css provides three companion utilities that work alongside a component's elevation level:
32
+ </p>
33
+ <ul>
34
+ <li><code>elevation-<i>N</i></code> — sets <code>z-index: N * 10</code></li>
35
+ <li><code>shadow</code> — adds a depth shadow matching the elevation</li>
36
+ <li><code>bg-elevation</code> — adjusts the background color to the matching elevation tint</li>
37
+ </ul>
38
+
39
+ <h3 id="levels"><a href="#levels" class="no-link">Elevation Levels</a></h3>
40
+ <div class="table-wrapper mb">
41
+ <table>
42
+ <thead>
43
+ <tr>
44
+ <th>Level</th>
45
+ <th>z-index</th>
46
+ <th>Intended use</th>
47
+ </tr>
48
+ </thead>
49
+ <tbody>
50
+ <tr><td>0</td><td>0</td><td>Behind the page — sunken or background elements</td></tr>
51
+ <tr><td>1</td><td>10</td><td><em>Buffer zone — reserved for customization</em></td></tr>
52
+ <tr><td>2</td><td>20</td><td>Page default — normal document flow</td></tr>
53
+ <tr><td>3</td><td>30</td><td>Fixed panels that sit below a navbar (push drawers)</td></tr>
54
+ <tr><td>4</td><td>40</td><td><em>Buffer zone — reserved for customization</em></td></tr>
55
+ <tr><td>5</td><td>50</td><td>Fixed navbar (user-defined)</td></tr>
56
+ <tr><td>6</td><td>60</td><td>Overlay drawers — above a fixed navbar</td></tr>
57
+ <tr><td>7</td><td>70</td><td>Floating menus (dropdowns, popovers)</td></tr>
58
+ <tr><td>8</td><td>80</td><td>Full-screen modals and lightboxes</td></tr>
59
+ <tr><td>9</td><td>90</td><td>Notification toasts</td></tr>
60
+ <tr><td>10</td><td>100</td><td><em>Reserved — use only when absolutely necessary</em></td></tr>
61
+ </tbody>
62
+ </table>
63
+ </div>
64
+
65
+ <h3 id="components"><a href="#components" class="no-link">Component Assignments</a></h3>
66
+ <p>Every Kempo UI component that uses <code>position: fixed</code> is assigned an elevation level:</p>
67
+ <div class="table-wrapper mb">
68
+ <table>
69
+ <thead>
70
+ <tr>
71
+ <th>Level</th>
72
+ <th>z-index</th>
73
+ <th>Kempo UI Components</th>
74
+ </tr>
75
+ </thead>
76
+ <tbody>
77
+ <tr>
78
+ <td>3</td>
79
+ <td>30</td>
80
+ <td>
81
+ <a href="{{pathToRoot}}components/aside.html">Aside</a> (<code>main="push"</code>),
82
+ <a href="{{pathToRoot}}components/side-panel.html">Side Panel</a>
83
+ </td>
84
+ </tr>
85
+ <tr>
86
+ <td>6</td>
87
+ <td>60</td>
88
+ <td>
89
+ <a href="{{pathToRoot}}components/aside.html">Aside</a> (<code>main="overlay"</code>)
90
+ </td>
91
+ </tr>
92
+ <tr>
93
+ <td>7</td>
94
+ <td>70</td>
95
+ <td>
96
+ <a href="{{pathToRoot}}components/dropdown.html">Dropdown</a>
97
+ </td>
98
+ </tr>
99
+ <tr>
100
+ <td>8</td>
101
+ <td>80</td>
102
+ <td>
103
+ <a href="{{pathToRoot}}components/dialog.html">Dialog</a>,
104
+ <a href="{{pathToRoot}}components/photo-viewer.html">Photo Viewer</a>
105
+ </td>
106
+ </tr>
107
+ <tr>
108
+ <td>9</td>
109
+ <td>90</td>
110
+ <td>
111
+ <a href="{{pathToRoot}}components/toast.html">Toast</a>
112
+ </td>
113
+ </tr>
114
+ </tbody>
115
+ </table>
116
+ </div>
117
+ <p>
118
+ The <strong>Aside</strong> component uses two different levels depending on its <code>main</code> attribute.
119
+ When <code>main="push"</code>, it shifts the page layout and should sit <em>below</em> your site navbar (level 3).
120
+ When <code>main="overlay"</code>, it floats over the page and needs to appear <em>above</em> the navbar (level 6).
121
+ </p>
122
+
123
+ <h3 id="customizing"><a href="#customizing" class="no-link">Customizing</a></h3>
124
+ <p>
125
+ To override a component's elevation, target its host element with a CSS custom property or a direct
126
+ <code>z-index</code> rule. For example, to raise the Toast to the very top:
127
+ </p>
128
+ <pre><code class="hljs css"><span class="hljs-selector-tag">k-toast</span> {
129
+ <span class="hljs-attribute">z-index</span>: <span class="hljs-number">100</span>;
130
+ }</code></pre>
131
+ <p>
132
+ Levels 1 and 4 are intentionally empty buffer zones. Use them for custom fixed elements (e.g. a cookie banner at
133
+ level 4, or a persistent sticky bar at level 1) that need a guaranteed home relative to Kempo UI components.
134
+ </p>
135
+ <p>
136
+ Apply elevation classes from kempo-css directly to custom elements when you want them to participate in the same
137
+ system without writing raw <code>z-index</code> values:
138
+ </p>
139
+ <pre><code class="hljs html"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"elevation-5 shadow bg-elevation"</span>&gt;</span>My fixed navbar<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span></code></pre>
140
+ </content>
141
+ <content location="scripts">
142
+ <script src="{{pathToRoot}}src/components/Accordion.js" type="module"></script>
143
+ </content>
144
+ </page>