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,300 @@
1
+ <page pageName="Dropdown" title="Dropdown - Components - Kempo Docs - A Web Components Solution">
2
+ <content location="header"></content>
3
+ <content>
4
+ <h1 class="ta-center">Dropdown</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>Examples</h6>
11
+ <a href="#basicUsage">Basic Usage</a><br />
12
+ <a href="#withIcons">With Icons</a><br />
13
+ <a href="#subMenus">Sub Menus</a><br />
14
+ <a href="#openDirection">Open Direction</a><br />
15
+ <a href="#disabledItems">Disabled Items</a><br />
16
+ <a href="#links">Using Links</a><br />
17
+ <a href="#events">Events</a><br />
18
+
19
+ <h6 class="mt"><a href="#jsRef" class="no-link">JavaScript Reference</a></h6>
20
+ <a href="#constructor">Constructor</a><br />
21
+ <a href="#requirements">Requirements</a><br />
22
+ <a href="#attributes">Attributes</a><br />
23
+ <a href="#methods">Methods</a><br />
24
+ <a href="#eventsRef">Events</a><br />
25
+ <a href="#cssVars">CSS Custom Properties</a><br />
26
+ </div>
27
+ </k-accordion-panel>
28
+ </k-accordion>
29
+
30
+ <h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
31
+ <p>Create dropdown menus using the <code>k-dropdown</code> component. Use the <code>trigger</code> slot for the button that opens the menu, and place <code>&lt;button&gt;</code> or <code>&lt;a&gt;</code> elements as children for menu items.</p>
32
+ <div class="row -mx">
33
+ <div class="col m-span-12 px">
34
+ <k-card label="HTML">
35
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-dropdown</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">slot</span>=<span class="hljs-string">"trigger"</span>&gt;</span>Actions<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">data-value</span>=<span class="hljs-string">"edit"</span>&gt;</span>Edit<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">data-value</span>=<span class="hljs-string">"duplicate"</span>&gt;</span>Duplicate<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">data-value</span>=<span class="hljs-string">"delete"</span>&gt;</span>Delete<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br /><span class="hljs-tag">&lt;/<span class="hljs-name">k-dropdown</span>&gt;</span></code></pre>
36
+ </k-card>
37
+ </div>
38
+ <div class="col m-span-12 px">
39
+ <k-card label="Output">
40
+ <k-dropdown>
41
+ <button slot="trigger">Actions</button>
42
+ <button data-value="edit">Edit</button>
43
+ <button data-value="duplicate">Duplicate</button>
44
+ <button data-value="delete">Delete</button>
45
+ </k-dropdown>
46
+ </k-card>
47
+ </div>
48
+ </div>
49
+
50
+ <h3 id="withIcons"><a href="#withIcons" class="no-link">With Icons</a></h3>
51
+ <p>Add icons to your dropdown items for better visual cues.</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-dropdown</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">slot</span>=<span class="hljs-string">"trigger"</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">k-icon</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"more_vert"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-icon</span>&gt;</span><br /> <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">data-value</span>=<span class="hljs-string">"edit"</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">k-icon</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"edit"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-icon</span>&gt;</span> Edit<br /> <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">data-value</span>=<span class="hljs-string">"copy"</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">k-icon</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"copy"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-icon</span>&gt;</span> Copy<br /> <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">data-value</span>=<span class="hljs-string">"delete"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"tc-danger"</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">k-icon</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"delete"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-icon</span>&gt;</span> Delete<br /> <span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br /><span class="hljs-tag">&lt;/<span class="hljs-name">k-dropdown</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-dropdown>
61
+ <button slot="trigger">
62
+ <k-icon name="more_vert"></k-icon>
63
+ </button>
64
+ <button data-value="edit">
65
+ <k-icon name="edit"></k-icon> Edit
66
+ </button>
67
+ <button data-value="copy">
68
+ <k-icon name="copy"></k-icon> Copy
69
+ </button>
70
+ <button data-value="delete" class="tc-danger">
71
+ <k-icon name="delete"></k-icon> Delete
72
+ </button>
73
+ </k-dropdown>
74
+ </k-card>
75
+ </div>
76
+ </div>
77
+
78
+ <h3 id="subMenus"><a href="#subMenus" class="no-link">Sub Menus</a></h3>
79
+ <p>Nest a <code>k-dropdown</code> inside another <code>k-dropdown</code> to create sub menus. The nested dropdown is automatically detected as a submenu: it opens on hover or focus, displays a chevron icon, and opens to the right by default. Keyboard navigation supports <code>ArrowRight</code> to open and <code>ArrowLeft</code> to close sub menus.</p>
80
+ <div class="row -mx">
81
+ <div class="col m-span-12 px">
82
+ <k-card label="HTML">
83
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-dropdown</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">slot</span>=<span class="hljs-string">&quot;trigger&quot;</span>&gt;</span>Actions<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">data-value</span>=<span class="hljs-string">&quot;edit&quot;</span>&gt;</span>Edit<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-dropdown</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">slot</span>=<span class="hljs-string">&quot;trigger&quot;</span>&gt;</span>Share<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">data-value</span>=<span class="hljs-string">&quot;email&quot;</span>&gt;</span>Email<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">data-value</span>=<span class="hljs-string">&quot;link&quot;</span>&gt;</span>Copy Link<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br> <span class="hljs-tag">&lt;/<span class="hljs-name">k-dropdown</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">data-value</span>=<span class="hljs-string">&quot;delete&quot;</span>&gt;</span>Delete<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-dropdown</span>&gt;</span></code></pre>
84
+ </k-card>
85
+ </div>
86
+ <div class="col m-span-12 px">
87
+ <k-card label="Output">
88
+ <k-dropdown>
89
+ <button slot="trigger">Actions</button>
90
+ <button data-value="edit">Edit</button>
91
+ <k-dropdown>
92
+ <button slot="trigger">Share</button>
93
+ <button data-value="email">Email</button>
94
+ <button data-value="link">Copy Link</button>
95
+ </k-dropdown>
96
+ <button data-value="delete">Delete</button>
97
+ </k-dropdown>
98
+ </k-card>
99
+ </div>
100
+ </div>
101
+
102
+ <h3 id="openDirection"><a href="#openDirection" class="no-link">Open Direction</a></h3>
103
+ <p>Control where the menu appears using the <code>open-direction</code> attribute. Specify a direction like <code>down left</code>, <code>up right</code>, <code>left up</code>, etc. The browser automatically handles fallback positioning if the menu would overflow the viewport using CSS Anchor Positioning.</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-dropdown</span> <span class="hljs-attr">open-direction</span>=<span class="hljs-string">"down left"</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">k-dropdown</span>&gt;</span><br /><span class="hljs-tag">&lt;<span class="hljs-name">k-dropdown</span> <span class="hljs-attr">open-direction</span>=<span class="hljs-string">"down right"</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">k-dropdown</span>&gt;</span><br /><span class="hljs-tag">&lt;<span class="hljs-name">k-dropdown</span> <span class="hljs-attr">open-direction</span>=<span class="hljs-string">"up left"</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">k-dropdown</span>&gt;</span><br /><span class="hljs-tag">&lt;<span class="hljs-name">k-dropdown</span> <span class="hljs-attr">open-direction</span>=<span class="hljs-string">"right down"</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">k-dropdown</span>&gt;</span></code></pre>
108
+ </k-card>
109
+ </div>
110
+ <div class="col m-span-12 px">
111
+ <k-card label="Output">
112
+ <div class="d-f gap fw-w">
113
+ <k-dropdown open-direction="down left">
114
+ <button slot="trigger">Down Left</button>
115
+ <button data-value="1">Item 1</button>
116
+ <button data-value="2">Item 2</button>
117
+ </k-dropdown>
118
+ <k-dropdown open-direction="down right">
119
+ <button slot="trigger">Down Right</button>
120
+ <button data-value="1">Item 1</button>
121
+ <button data-value="2">Item 2</button>
122
+ </k-dropdown>
123
+ <k-dropdown open-direction="up left">
124
+ <button slot="trigger">Up Left</button>
125
+ <button data-value="1">Item 1</button>
126
+ <button data-value="2">Item 2</button>
127
+ </k-dropdown>
128
+ <k-dropdown open-direction="up right">
129
+ <button slot="trigger">Up Right</button>
130
+ <button data-value="1">Item 1</button>
131
+ <button data-value="2">Item 2</button>
132
+ </k-dropdown>
133
+ </div>
134
+ <div class="d-f gap fw-w mt">
135
+ <k-dropdown open-direction="right down">
136
+ <button slot="trigger">Right Down</button>
137
+ <button data-value="1">Item 1</button>
138
+ <button data-value="2">Item 2</button>
139
+ </k-dropdown>
140
+ <k-dropdown open-direction="right up">
141
+ <button slot="trigger">Right Up</button>
142
+ <button data-value="1">Item 1</button>
143
+ <button data-value="2">Item 2</button>
144
+ </k-dropdown>
145
+ <k-dropdown open-direction="left down">
146
+ <button slot="trigger">Left Down</button>
147
+ <button data-value="1">Item 1</button>
148
+ <button data-value="2">Item 2</button>
149
+ </k-dropdown>
150
+ <k-dropdown open-direction="left up">
151
+ <button slot="trigger">Left Up</button>
152
+ <button data-value="1">Item 1</button>
153
+ <button data-value="2">Item 2</button>
154
+ </k-dropdown>
155
+ </div>
156
+ </k-card>
157
+ </div>
158
+ </div>
159
+
160
+ <h3 id="disabledItems"><a href="#disabledItems" class="no-link">Disabled Items</a></h3>
161
+ <p>Add the <code>disabled</code> attribute to disable specific items.</p>
162
+ <div class="row -mx">
163
+ <div class="col m-span-12 px">
164
+ <k-card label="HTML">
165
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-dropdown</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">slot</span>=<span class="hljs-string">"trigger"</span>&gt;</span>Actions<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">data-value</span>=<span class="hljs-string">"edit"</span>&gt;</span>Edit<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">data-value</span>=<span class="hljs-string">"copy"</span> <span class="hljs-attr">disabled</span>&gt;</span>Copy (disabled)<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">data-value</span>=<span class="hljs-string">"delete"</span>&gt;</span>Delete<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br /><span class="hljs-tag">&lt;/<span class="hljs-name">k-dropdown</span>&gt;</span></code></pre>
166
+ </k-card>
167
+ </div>
168
+ <div class="col m-span-12 px">
169
+ <k-card label="Output">
170
+ <k-dropdown>
171
+ <button slot="trigger">Actions</button>
172
+ <button data-value="edit">Edit</button>
173
+ <button data-value="copy" disabled>Copy (disabled)</button>
174
+ <button data-value="delete">Delete</button>
175
+ </k-dropdown>
176
+ </k-card>
177
+ </div>
178
+ </div>
179
+
180
+ <h3 id="links"><a href="#links" class="no-link">Using Links</a></h3>
181
+ <p>You can use <code>&lt;a&gt;</code> elements for navigation items.</p>
182
+ <div class="row -mx">
183
+ <div class="col m-span-12 px">
184
+ <k-card label="HTML">
185
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-dropdown</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">slot</span>=<span class="hljs-string">"trigger"</span>&gt;</span>Navigate<span class="hljs-tag">&lt;/<span class="hljs-name">button</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">"#home"</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">"#about"</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">"#contact"</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">k-dropdown</span>&gt;</span></code></pre>
186
+ </k-card>
187
+ </div>
188
+ <div class="col m-span-12 px">
189
+ <k-card label="Output">
190
+ <k-dropdown>
191
+ <button slot="trigger">Navigate</button>
192
+ <a href="#home">Home</a>
193
+ <a href="#about">About</a>
194
+ <a href="#contact">Contact</a>
195
+ </k-dropdown>
196
+ </k-card>
197
+ </div>
198
+ </div>
199
+
200
+ <h3 id="events"><a href="#events" class="no-link">Events</a></h3>
201
+ <p>Listen for the <code>select</code> event to handle item selection.</p>
202
+ <div class="row -mx">
203
+ <div class="col m-span-12 px">
204
+ <k-card label="HTML">
205
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-dropdown</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"eventDropdown"</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">slot</span>=<span class="hljs-string">"trigger"</span>&gt;</span>Select an option<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">data-value</span>=<span class="hljs-string">"option1"</span>&gt;</span>Option 1<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">data-value</span>=<span class="hljs-string">"option2"</span>&gt;</span>Option 2<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">data-value</span>=<span class="hljs-string">"option3"</span>&gt;</span>Option 3<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br /><span class="hljs-tag">&lt;/<span class="hljs-name">k-dropdown</span>&gt;</span><br /><span class="hljs-tag">&lt;<span class="hljs-name">p</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"selectedValue"</span>&gt;</span>Selected: none<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br /><span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript"><br /> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'eventDropdown'</span>)<br /> .addEventListener(<span class="hljs-string">'select'</span>, <span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> {<br /> <span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">'selectedValue'</span>)<br /> .textContent = <span class="hljs-string">'Selected: '</span> + e.detail.value;<br /> });<br /></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre>
206
+ </k-card>
207
+ </div>
208
+ <div class="col m-span-12 px">
209
+ <k-card label="Output">
210
+ <k-dropdown id="eventDropdown">
211
+ <button slot="trigger">Select an option</button>
212
+ <button data-value="option1">Option 1</button>
213
+ <button data-value="option2">Option 2</button>
214
+ <button data-value="option3">Option 3</button>
215
+ </k-dropdown>
216
+ <p id="selectedValue">Selected: none</p>
217
+ <script>
218
+ document.getElementById('eventDropdown')
219
+ .addEventListener('select', e => {
220
+ document.getElementById('selectedValue')
221
+ .textContent = 'Selected: ' + e.detail.value;
222
+ });
223
+ </script>
224
+ </k-card>
225
+ </div>
226
+ </div>
227
+
228
+ <h2 id="jsRef"><a href="#jsRef" class="no-link">JavaScript Reference</a></h2>
229
+
230
+ <h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
231
+ <h6>Extends <a href="./shadow-component.html">ShadowComponent</a></h6>
232
+ <h5><code>new Dropdown()</code></h5>
233
+
234
+ <h3 id="requirements"><a href="#requirements" class="no-link">Requirements</a></h3>
235
+ <ul>
236
+ <li><a href="./shadow-component.html">ShadowComponent</a></li>
237
+ <li><a href="./icon.html">Icon</a> (required for sub menus)</li>
238
+ </ul>
239
+
240
+ <h3 id="attributes"><a href="#attributes" class="no-link">Attributes</a></h3>
241
+ <h5><code>opened<i>: boolean</i></code></h5>
242
+ <p>Whether the dropdown menu is currently open.</p>
243
+
244
+ <h5><code>open-direction<i>: string</i></code></h5>
245
+ <p>Where the menu appears relative to the trigger. Specify two directions like <code>down left</code>, <code>up right</code>, <code>left up</code>, <code>right down</code>, etc. The browser will automatically flip the position if the menu would overflow the viewport using CSS Anchor Positioning. Default is <code>down left</code>.</p>
246
+
247
+ <h5><code>close-on-select<i>: boolean</i></code></h5>
248
+ <p>Whether the dropdown closes when an item is selected. Default is <code>true</code>.</p>
249
+
250
+ <h5><code>close-on-click-outside<i>: boolean</i></code></h5>
251
+ <p>Whether the dropdown closes when clicking outside of it. Default is <code>true</code>.</p>
252
+
253
+ <h5><code>submenu<i>: boolean</i></code></h5>
254
+ <p>Automatically set to <code>true</code> when a <code>k-dropdown</code> is nested inside another <code>k-dropdown</code>. Sub menus open on hover/focus, display a chevron icon, and default to <code>open-direction="right down"</code>. Supports <code>ArrowRight</code> to open and <code>ArrowLeft</code> to close via keyboard.</p>
255
+
256
+ <h3 id="methods"><a href="#methods" class="no-link">Methods</a></h3>
257
+ <h5><code>open()<i>: this</i></code></h5>
258
+ <p>Opens the dropdown menu and focuses the first item.</p>
259
+
260
+ <h5><code>close()<i>: this</i></code></h5>
261
+ <p>Closes the dropdown menu.</p>
262
+
263
+ <h5><code>toggle()<i>: this</i></code></h5>
264
+ <p>Toggles the dropdown menu open or closed.</p>
265
+
266
+ <h3 id="eventsRef"><a href="#eventsRef" class="no-link">Events</a></h3>
267
+ <h5><code>select</code></h5>
268
+ <p>Fired when an item is selected. The event detail contains:</p>
269
+ <ul>
270
+ <li><code>value</code>: The value of the selected item (from <code>data-value</code> attribute or text content)</li>
271
+ <li><code>item</code>: The DOM element that was selected</li>
272
+ </ul>
273
+
274
+ <h5><code>opened</code></h5>
275
+ <p>Fired when the dropdown menu is opened.</p>
276
+
277
+ <h5><code>closed</code></h5>
278
+ <p>Fired when the dropdown menu is closed.</p>
279
+
280
+ <h4>Keyboard Navigation</h4>
281
+ <ul>
282
+ <li><code>Enter</code> / <code>Space</code> - Select the focused item (or open sub menu)</li>
283
+ <li><code>Arrow Down</code> - Move focus to the next item</li>
284
+ <li><code>Arrow Up</code> - Move focus to the previous item</li>
285
+ <li><code>Arrow Right</code> - Open focused sub menu</li>
286
+ <li><code>Arrow Left</code> - Close current sub menu</li>
287
+ <li><code>Escape</code> - Close the dropdown (or sub menu)</li>
288
+ </ul>
289
+
290
+ <h3 id="cssVars"><a href="#cssVars" class="no-link">CSS Custom Properties</a></h3>
291
+ <h5><code>--radius</code></h5>
292
+ <p>Controls the border radius of the dropdown menu. Defaults to the global <code>--radius</code> value.</p>
293
+ </content>
294
+ <content location="scripts">
295
+ <script type="module" src="{{pathToRoot}}src/components/Dropdown.js"></script>
296
+ <script type="module" src="{{pathToRoot}}src/components/Accordion.js"></script>
297
+ <script type="module" src="{{pathToRoot}}src/components/Card.js"></script>
298
+ <script type="module" src="{{pathToRoot}}src/components/Icon.js"></script>
299
+ </content>
300
+ </page>
@@ -0,0 +1,117 @@
1
+ <page pageName="Filter List" title="Filter List - Components - Kempo Docs - A Web Components Solution">
2
+ <content location="header"></content>
3
+ <content>
4
+ <h1 class="ta-center">Filter List</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>Examples</h6>
11
+ <a href="#basicUsage">Basic Usage</a><br />
12
+ <a href="#tagButtons">Tag Buttons</a><br />
13
+
14
+ <h6 class="mt"><a href="#jsRef" class="no-link">JavaScript Reference</a></h6>
15
+ <a href="#constructor">Constructor</a><br />
16
+ <a href="#requirements">Requirements</a><br />
17
+ <a href="#filterItem">FilterItem Attributes</a><br />
18
+ <a href="#methods">Methods</a><br />
19
+ </div>
20
+ </k-accordion-panel>
21
+ </k-accordion>
22
+
23
+ <h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
24
+ <p>Wrap items in <code>k-filter-item</code> elements with a <code>filter-keywords</code> attribute inside a <code>k-filter-list</code>. Connect an input to <code>filter()</code> using the <a href="{{pathToRoot}}utils/debounce.html">debounce</a> utility to avoid filtering on every keystroke.</p>
25
+ <div class="row -mx">
26
+ <div class="col m-span-12 px">
27
+ <k-card label="HTML">
28
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">id</span>=<span class="hljs-string">filterInput</span> <span class="hljs-attr">type</span>=<span class="hljs-string">search</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">&#x27;Filter...&#x27;</span> /&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">k-filter-list</span> <span class="hljs-attr">id</span>=<span class="hljs-string">myFilterList</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;apple fruit red&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Apple<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;banana fruit yellow&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Banana<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;cherry fruit red&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Cherry<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;grape fruit purple&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Grape<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;lemon citrus yellow fruit&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Lemon<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;orange citrus fruit&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Orange<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;strawberry fruit red&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Strawberry<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-list</span>&gt;</span><br><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="language-javascript"><br> <span class="hljs-keyword">import</span> debounce <span class="hljs-keyword">from</span> <span class="hljs-string">&#x27;../src/utils/debounce.js&#x27;</span>;<br> <span class="hljs-keyword">const</span> list = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;myFilterList&#x27;</span>);<br> <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;filterInput&#x27;</span>).<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;input&#x27;</span>, <span class="hljs-title function_">debounce</span>(<span class="hljs-function"><span class="hljs-params">e</span> =&gt;</span> list.<span class="hljs-title function_">filter</span>(e.<span class="hljs-property">target</span>.<span class="hljs-property">value</span>)));<br></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre>
29
+ </k-card>
30
+ </div>
31
+ <div class="col m-span-12 px">
32
+ <k-card label="Output">
33
+ <input id="filterInput" type="search" placeholder="Filter..." class="mb" />
34
+ <k-filter-list id="myFilterList">
35
+ <k-filter-item class="d-b" filter-keywords="apple fruit red"><a href="#">Apple</a></k-filter-item>
36
+ <k-filter-item class="d-b" filter-keywords="banana fruit yellow"><a href="#">Banana</a></k-filter-item>
37
+ <k-filter-item class="d-b" filter-keywords="cherry fruit red"><a href="#">Cherry</a></k-filter-item>
38
+ <k-filter-item class="d-b" filter-keywords="grape fruit purple"><a href="#">Grape</a></k-filter-item>
39
+ <k-filter-item class="d-b" filter-keywords="lemon citrus yellow fruit"><a href="#">Lemon</a></k-filter-item>
40
+ <k-filter-item class="d-b" filter-keywords="orange citrus fruit"><a href="#">Orange</a></k-filter-item>
41
+ <k-filter-item class="d-b" filter-keywords="strawberry fruit red"><a href="#">Strawberry</a></k-filter-item>
42
+ </k-filter-list>
43
+ <script type="module">
44
+ import debounce from '{{pathToRoot}}src/utils/debounce.js';
45
+ const list = document.getElementById('myFilterList');
46
+ document.getElementById('filterInput').addEventListener('input', debounce(e => list.filter(e.target.value)));
47
+ </script>
48
+ </k-card>
49
+ </div>
50
+ </div>
51
+
52
+ <h3 id="tagButtons"><a href="#tagButtons" class="no-link">Tag Buttons</a></h3>
53
+ <p>Use category buttons to filter the list. Each button stores its filter term in <code>data-filter</code>; clicking it activates that button and calls <code>filter()</code>. An empty string clears the filter and shows all items.</p>
54
+ <div class="row -mx">
55
+ <div class="col m-span-12 px">
56
+ <k-card label="HTML">
57
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&#x27;d-f gap mb&#x27;</span> <span class="hljs-attr">id</span>=<span class="hljs-string">tagButtons</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">&#x27;btn primary&#x27;</span> <span class="hljs-attr">data-filter</span>=<span class="hljs-string">&#x27;&#x27;</span>&gt;</span>All<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">btn</span> <span class="hljs-attr">data-filter</span>=<span class="hljs-string">red</span>&gt;</span>Red<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">btn</span> <span class="hljs-attr">data-filter</span>=<span class="hljs-string">yellow</span>&gt;</span>Yellow<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">btn</span> <span class="hljs-attr">data-filter</span>=<span class="hljs-string">citrus</span>&gt;</span>Citrus<span class="hljs-tag">&lt;/<span class="hljs-name">button</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">k-filter-list</span> <span class="hljs-attr">id</span>=<span class="hljs-string">tagFilterList</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;apple fruit red&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Apple<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;banana fruit yellow&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Banana<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;cherry fruit red&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Cherry<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;grape fruit purple&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Grape<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;lemon citrus yellow fruit&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Lemon<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;orange citrus fruit&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Orange<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-filter-item</span> <span class="hljs-attr">class</span>=<span class="hljs-string">d-b</span> <span class="hljs-attr">filter-keywords</span>=<span class="hljs-string">&#x27;strawberry fruit red&#x27;</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">#</span>&gt;</span>Strawberry<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-item</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">k-filter-list</span>&gt;</span><br><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="language-javascript"><br> <span class="hljs-keyword">const</span> list = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;tagFilterList&#x27;</span>);<br> <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelectorAll</span>(<span class="hljs-string">&#x27;#tagButtons [data-filter]&#x27;</span>).<span class="hljs-title function_">forEach</span>(<span class="hljs-function"><span class="hljs-params">btn</span> =&gt;</span> {<br> btn.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;click&#x27;</span>, <span class="hljs-function">() =&gt;</span> {<br> <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelectorAll</span>(<span class="hljs-string">&#x27;#tagButtons [data-filter]&#x27;</span>).<span class="hljs-title function_">forEach</span>(<span class="hljs-function"><span class="hljs-params">b</span> =&gt;</span> b.<span class="hljs-property">classList</span>.<span class="hljs-title function_">remove</span>(<span class="hljs-string">&#x27;primary&#x27;</span>));<br> btn.<span class="hljs-property">classList</span>.<span class="hljs-title function_">add</span>(<span class="hljs-string">&#x27;primary&#x27;</span>);<br> list.<span class="hljs-title function_">filter</span>(btn.<span class="hljs-property">dataset</span>.<span class="hljs-property">filter</span>);<br> });<br> });<br></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre>
58
+ </k-card>
59
+ </div>
60
+ <div class="col m-span-12 px">
61
+ <k-card label="Output">
62
+ <div class="d-f gap mb" id="tagButtons">
63
+ <button class="btn primary" data-filter="">All</button>
64
+ <button class="btn" data-filter="red">Red</button>
65
+ <button class="btn" data-filter="yellow">Yellow</button>
66
+ <button class="btn" data-filter="citrus">Citrus</button>
67
+ </div>
68
+ <k-filter-list id="tagFilterList">
69
+ <k-filter-item class="d-b" filter-keywords="apple fruit red"><a href="#">Apple</a></k-filter-item>
70
+ <k-filter-item class="d-b" filter-keywords="banana fruit yellow"><a href="#">Banana</a></k-filter-item>
71
+ <k-filter-item class="d-b" filter-keywords="cherry fruit red"><a href="#">Cherry</a></k-filter-item>
72
+ <k-filter-item class="d-b" filter-keywords="grape fruit purple"><a href="#">Grape</a></k-filter-item>
73
+ <k-filter-item class="d-b" filter-keywords="lemon citrus yellow fruit"><a href="#">Lemon</a></k-filter-item>
74
+ <k-filter-item class="d-b" filter-keywords="orange citrus fruit"><a href="#">Orange</a></k-filter-item>
75
+ <k-filter-item class="d-b" filter-keywords="strawberry fruit red"><a href="#">Strawberry</a></k-filter-item>
76
+ </k-filter-list>
77
+ <script type="module">
78
+ const list = document.getElementById('tagFilterList');
79
+ document.querySelectorAll('#tagButtons [data-filter]').forEach(btn => {
80
+ btn.addEventListener('click', () => {
81
+ document.querySelectorAll('#tagButtons [data-filter]').forEach(b => b.classList.remove('primary'));
82
+ btn.classList.add('primary');
83
+ list.filter(btn.dataset.filter);
84
+ });
85
+ });
86
+ </script>
87
+ </k-card>
88
+ </div>
89
+ </div>
90
+
91
+ <h2 id="jsRef"><a href="#jsRef" class="no-link">JavaScript Reference</a></h2>
92
+
93
+ <h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
94
+ <h6>Extends <a href="./shadow-component.html">ShadowComponent</a></h6>
95
+ <h5><code>new FilterList()</code></h5>
96
+ <h5><code>new FilterItem()</code></h5>
97
+
98
+ <h3 id="requirements"><a href="#requirements" class="no-link">Requirements</a></h3>
99
+ <ul>
100
+ <li><a href="./shadow-component.html">ShadowComponent</a></li>
101
+ </ul>
102
+
103
+ <h3 id="filterItem"><a href="#filterItem" class="no-link">FilterItem Attributes</a></h3>
104
+ <h5><code>filter-keywords<i>: string</i></code></h5>
105
+ <p>A string of keywords used to match against the search term. The <code>filter()</code> method checks if this value includes the lowercased search term as a substring.</p>
106
+
107
+ <h3 id="methods"><a href="#methods" class="no-link">Methods</a></h3>
108
+ <h5><code>filter(term<i>: string</i>)<i>: void</i></code></h5>
109
+ <p>Shows or hides each child <code>k-filter-item</code> based on whether its <code>filter-keywords</code> attribute includes <code>term</code> (case-insensitive). Passing an empty string reveals all items.</p>
110
+ </content>
111
+ <content location="scripts">
112
+ <script type="module" src="{{pathToRoot}}src/components/FilterList.js"></script>
113
+ <script type="module" src="{{pathToRoot}}src/components/FilterItem.js"></script>
114
+ <script type="module" src="{{pathToRoot}}src/components/Accordion.js"></script>
115
+ <script type="module" src="{{pathToRoot}}src/components/Card.js"></script>
116
+ </content>
117
+ </page>
@@ -0,0 +1,97 @@
1
+ <page pageName="FocusCapture" title="FocusCapture - 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>Examples</h6>
8
+ <a href="#basicUsage">Basic Usage</a><br />
9
+ <a href="#dialogExample">Dialog Example</a><br />
10
+
11
+ <h6 class="mt"><a href="#jsRef" class="no-link">JavaScript Reference</a></h6>
12
+ <a href="#constructor">Constructor</a><br />
13
+ <a href="#requirements">Requirements</a><br />
14
+ <a href="#properties">Properties</a><br />
15
+ <a href="#methods">Methods</a><br />
16
+ </div>
17
+ </k-accordion-panel>
18
+ </k-accordion>
19
+
20
+ <h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
21
+ <p>The <code>k-focus-capture</code> component traps focus within its children. When focus reaches the end of the focusable elements, it cycles back to the first focusable element. This is useful for modal dialogs, side menus, or any UI where you want to keep focus contained within a specific area.</p>
22
+ <div class="row -mx">
23
+ <div class="col m-span-12 px">
24
+ <k-card label="HTML">
25
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-focus-capture</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"card"</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span>&gt;</span>First Button<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br /> <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">placeholder</span>=<span class="hljs-string">"Input field"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span> /&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span>&gt;</span>Second Button<span class="hljs-tag">&lt;/<span class="hljs-name">button</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">"#"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"d-b mb"</span>&gt;</span>Link<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><br /> <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br /><span class="hljs-tag">&lt;/<span class="hljs-name">k-focus-capture</span>&gt;</span></code></pre>
26
+ </k-card>
27
+ </div>
28
+ <div class="col m-span-12 px">
29
+ <k-card label="Output">
30
+ <p class="mb"><em>Tab through the elements below. Focus will cycle back to the first element after the last one.</em></p>
31
+ <k-focus-capture>
32
+ <div class="card">
33
+ <button class="mb">First Button</button>
34
+ <input type="text" placeholder="Input field" class="mb" />
35
+ <button class="mb">Second Button</button>
36
+ <a href="#" class="d-b mb">Link</a>
37
+ </div>
38
+ </k-focus-capture>
39
+ </k-card>
40
+ </div>
41
+ </div>
42
+
43
+ <h3 id="dialogExample"><a href="#dialogExample" class="no-link">Dialog Example</a></h3>
44
+ <p>FocusCapture is used internally by the <a href="dialog.html">Dialog</a> and <a href="aside.html">Aside</a> components. You do not need to add it yourself. Open the dialog below and tab through the elements to see how focus is trapped within the dialog.</p>
45
+ <div class="row -mx">
46
+ <div class="col m-span-12 px">
47
+ <k-card label="HTML">
48
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-dialog</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"focusDialog"</span> <span class="hljs-attr">cancel-text</span>=<span class="hljs-string">"Close"</span> <span class="hljs-attr">confirm-text</span>=<span class="hljs-string">"Submit"</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">h6</span> <span class="hljs-attr">slot</span>=<span class="hljs-string">"title"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"m0 px"</span>&gt;</span>Focus Capture Dialog<span class="hljs-tag">&lt;/<span class="hljs-name">h6</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"p"</span>&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Tab through the elements. Focus stays trapped in the dialog.<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span><br /> <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">placeholder</span>=<span class="hljs-string">"Name"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span> /&gt;</span><br /> <span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"email"</span> <span class="hljs-attr">placeholder</span>=<span class="hljs-string">"Email"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"mb"</span> /&gt;</span><br /> <span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span><br /><span class="hljs-tag">&lt;/<span class="hljs-name">k-dialog</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">"document.getElementById('focusDialog').open()"</span>&gt;</span>Open Dialog<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span></code></pre>
49
+ </k-card>
50
+ </div>
51
+ <div class="col m-span-12 px">
52
+ <k-card label="Output">
53
+ <button onclick="document.getElementById('focusDialog').open()">Open Dialog</button>
54
+ <k-dialog
55
+ id="focusDialog"
56
+ cancel-text="Close"
57
+ confirm-text="Submit"
58
+ >
59
+ <h6 slot="title" class="m0 px">Focus Capture Dialog</h6>
60
+ <div class="p">
61
+ <p>Tab through the elements. Focus stays trapped in the dialog.</p>
62
+ <input type="text" placeholder="Name" class="mb" />
63
+ <input type="email" placeholder="Email" class="mb" />
64
+ </div>
65
+ </k-dialog>
66
+ </k-card>
67
+ </div>
68
+ </div>
69
+
70
+ <h2 id="jsRef">JavaScript Reference</h2>
71
+
72
+ <h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
73
+ <h6>Extends LitElement</h6>
74
+ <h5>
75
+ <code>new FocusCapture()</code>
76
+ </h5>
77
+
78
+ <h3 id="requirements"><a href="#requirements" class="no-link">Requirements</a></h3>
79
+ <ul>
80
+ <li>Lit</li>
81
+ </ul>
82
+
83
+ <h3 id="properties"><a href="#properties" class="no-link">Properties</a></h3>
84
+ <h5><code>afterFocus<i>: function</i></code></h5>
85
+ <p>A method that is called when focus reaches the end capture element. By default, it finds the first focusable element within the component and focuses it. Focusable elements include: <code>button</code>, <code>[href]</code>, <code>input</code>, <code>select</code>, <code>textarea</code>, and <code>[tabindex]:not([tabindex="-1"])</code>.</p>
86
+
87
+ <h3 id="methods"><a href="#methods" class="no-link">Methods</a></h3>
88
+ <h5><code>render()<i>: TemplateResult</i></code></h5>
89
+ <p>Renders the component with a slot for children and an invisible div with <code>tabindex="0"</code> that captures focus and cycles it back to the beginning.</p>
90
+ </content>
91
+ <content location="scripts">
92
+ <script type="module" src="{{pathToRoot}}src/components/FocusCapture.js"></script>
93
+ <script type="module" src="{{pathToRoot}}src/components/Dialog.js"></script>
94
+ <script type="module" src="{{pathToRoot}}src/components/Accordion.js"></script>
95
+ <script type="module" src="{{pathToRoot}}src/components/Card.js"></script>
96
+ </content>
97
+ </page>