kempo-ui 0.4.2 → 0.4.4

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 (104) hide show
  1. package/.claude/skills/get-icon/SKILL.md +144 -0
  2. package/.claude/skills/highlight-code/SKILL.md +62 -0
  3. package/.claude/skills/new-component/SKILL.md +362 -0
  4. package/.github/skills/get-icon/SKILL.md +4 -4
  5. package/.github/skills/highlight-code/SKILL.md +51 -20
  6. package/.github/skills/new-component/SKILL.md +183 -152
  7. package/AGENTS.md +2 -2
  8. package/dist/components/Calendar.js +170 -0
  9. package/dist/components/SpeechToText.js +60 -0
  10. package/dist/components/TextToSpeech.js +56 -0
  11. package/dist/components/Time.js +37 -0
  12. package/docs/components/accordion.html +16 -0
  13. package/docs/components/aside.html +16 -0
  14. package/docs/components/calendar.html +720 -0
  15. package/docs/components/card.html +16 -0
  16. package/docs/components/code-editor.html +16 -0
  17. package/docs/components/color-picker.html +16 -0
  18. package/docs/components/combobox.html +16 -0
  19. package/docs/components/content-slider.html +16 -0
  20. package/docs/components/context.html +16 -0
  21. package/docs/components/dialog.html +16 -0
  22. package/docs/components/dropdown.html +16 -0
  23. package/docs/components/filter-list.html +16 -0
  24. package/docs/components/focus-capture.html +16 -0
  25. package/docs/components/html-editor.html +16 -0
  26. package/docs/components/hybrid-component.html +16 -0
  27. package/docs/components/icon.html +16 -0
  28. package/docs/components/import.html +16 -0
  29. package/docs/components/light-component.html +16 -0
  30. package/docs/components/nav-spacer.html +16 -0
  31. package/docs/components/nav.html +16 -0
  32. package/docs/components/photo-viewer.html +16 -0
  33. package/docs/components/progress.html +16 -0
  34. package/docs/components/resize.html +16 -0
  35. package/docs/components/shadow-component.html +16 -0
  36. package/docs/components/show-more.html +16 -0
  37. package/docs/components/slider.html +16 -0
  38. package/docs/components/sortable.html +16 -0
  39. package/docs/components/speech-to-text.html +717 -0
  40. package/docs/components/spinner.html +16 -0
  41. package/docs/components/split.html +16 -0
  42. package/docs/components/table.html +16 -0
  43. package/docs/components/tableControls.html +16 -0
  44. package/docs/components/tableCustomFields.html +16 -0
  45. package/docs/components/tableFetchRecords.html +16 -0
  46. package/docs/components/tableFieldSortHide.html +16 -0
  47. package/docs/components/tablePagination.html +16 -0
  48. package/docs/components/tablePlaceholder.html +16 -0
  49. package/docs/components/tableRecordEditing.html +16 -0
  50. package/docs/components/tableRecordFiltering.html +16 -0
  51. package/docs/components/tableRecordHiding.html +16 -0
  52. package/docs/components/tableRecordSearching.html +16 -0
  53. package/docs/components/tableRecordSelection.html +16 -0
  54. package/docs/components/tableRowControls.html +16 -0
  55. package/docs/components/tableServerSync.html +16 -0
  56. package/docs/components/tableSorting.html +16 -0
  57. package/docs/components/tabs.html +16 -0
  58. package/docs/components/tags.html +16 -0
  59. package/docs/components/text-to-speech.html +668 -0
  60. package/docs/components/theme-select.html +16 -0
  61. package/docs/components/theme-switcher.html +16 -0
  62. package/docs/components/time.html +670 -0
  63. package/docs/components/timestamp.html +16 -0
  64. package/docs/components/toast.html +16 -0
  65. package/docs/components/toggle.html +16 -0
  66. package/docs/components/tree.html +16 -0
  67. package/docs/icons/mic.svg +1 -0
  68. package/docs/icons/record_voice_over.svg +1 -0
  69. package/docs/icons/stop.svg +1 -0
  70. package/docs/index.html +40 -0
  71. package/docs/src/components/Calendar.js +170 -0
  72. package/docs/src/components/SpeechToText.js +60 -0
  73. package/docs/src/components/TextToSpeech.js +56 -0
  74. package/docs/src/components/Time.js +37 -0
  75. package/docs/utils/context.html +16 -0
  76. package/docs/utils/cookie.html +16 -0
  77. package/docs/utils/debounce.html +16 -0
  78. package/docs/utils/drag.html +16 -0
  79. package/docs/utils/elevation.html +16 -0
  80. package/docs/utils/formatTimestamp.html +16 -0
  81. package/docs/utils/object.html +16 -0
  82. package/docs/utils/propConverters.html +16 -0
  83. package/docs/utils/string.html +16 -0
  84. package/docs/utils/theme.html +16 -0
  85. package/docs/utils/toTitleCase.html +16 -0
  86. package/docs/utils/type.html +16 -0
  87. package/docs/utils/wait.html +16 -0
  88. package/docs-src/components/calendar.page.html +254 -0
  89. package/docs-src/components/speech-to-text.page.html +251 -0
  90. package/docs-src/components/text-to-speech.page.html +202 -0
  91. package/docs-src/components/time.page.html +204 -0
  92. package/docs-src/index.page.html +24 -0
  93. package/docs-src/nav.fragment.html +16 -0
  94. package/icons/mic.svg +1 -0
  95. package/icons/record_voice_over.svg +1 -0
  96. package/icons/stop.svg +1 -0
  97. package/llms.txt +4 -0
  98. package/package.json +1 -1
  99. package/src/components/Calendar.js +473 -0
  100. package/src/components/SpeechToText.js +252 -0
  101. package/src/components/TextToSpeech.js +194 -0
  102. package/src/components/Time.js +137 -0
  103. package/tests/components/SpeechToText.browser-test.js +530 -0
  104. package/tests/components/TextToSpeech.browser-test.js +432 -0
@@ -62,6 +62,9 @@
62
62
  href="../components/accordion.html">Accordion<br><small>Component</small></a></k-filter-item>
63
63
  <k-filter-item filter-keywords="aside sidebar components"><a
64
64
  href="../components/aside.html">Aside<br><small>Component</small></a></k-filter-item>
65
+ <k-filter-item filter-keywords="calendar date picker range month day components"><a
66
+ href="../components/calendar.html"
67
+ >Calendar<br><small>Component</small></a></k-filter-item>
65
68
  <k-filter-item filter-keywords="card components"><a
66
69
  href="../components/card.html">Card<br><small>Component</small></a></k-filter-item>
67
70
  <k-filter-item filter-keywords="code editor codeeditor monaco components"><a
@@ -117,6 +120,9 @@
117
120
  <k-filter-item filter-keywords="sortable drag drop sort components"><a
118
121
  href="../components/sortable.html"
119
122
  >Sortable<br><small>Component</small></a></k-filter-item>
123
+ <k-filter-item filter-keywords="speech to text speechtotext microphone voice recognition transcription components"><a
124
+ href="../components/speech-to-text.html"
125
+ >Speech To Text<br><small>Component</small></a></k-filter-item>
120
126
  <k-filter-item filter-keywords="spinner loading components"><a
121
127
  href="../components/spinner.html">Spinner<br><small>Component</small></a></k-filter-item>
122
128
  <k-filter-item filter-keywords="split pane components"><a
@@ -169,12 +175,18 @@
169
175
  href="../components/tabs.html">Tabs<br><small>Component</small></a></k-filter-item>
170
176
  <k-filter-item filter-keywords="tags tag input components"><a
171
177
  href="../components/tags.html">Tags<br><small>Component</small></a></k-filter-item>
178
+ <k-filter-item filter-keywords="text to speech texttospeech tts speak voice synthesis components"><a
179
+ href="../components/text-to-speech.html"
180
+ >Text To Speech<br><small>Component</small></a></k-filter-item>
172
181
  <k-filter-item filter-keywords="theme select dropdown dark light components"><a
173
182
  href="../components/theme-select.html"
174
183
  >Theme Select<br><small>Component</small></a></k-filter-item>
175
184
  <k-filter-item filter-keywords="theme switcher dark light components"><a
176
185
  href="../components/theme-switcher.html"
177
186
  >Theme Switcher<br><small>Component</small></a></k-filter-item>
187
+ <k-filter-item filter-keywords="time picker clock hour minute form components"><a
188
+ href="../components/time.html"
189
+ >Time<br><small>Component</small></a></k-filter-item>
178
190
  <k-filter-item filter-keywords="timestamp date time components"><a
179
191
  href="../components/timestamp.html"
180
192
  >Timestamp<br><small>Component</small></a></k-filter-item>
@@ -269,6 +281,7 @@
269
281
  <h3>Components</h3>
270
282
  <a href="../components/accordion.html">Accordion</a>
271
283
  <a href="../components/aside.html">Aside</a>
284
+ <a href="../components/calendar.html">Calendar</a>
272
285
  <a href="../components/card.html">Card</a>
273
286
  <a href="../components/code-editor.html">Code Editor</a>
274
287
  <a href="../components/combobox.html">Combobox</a>
@@ -290,13 +303,16 @@
290
303
  <a href="../components/show-more.html">Show More</a>
291
304
  <a href="../components/slider.html">Slider</a>
292
305
  <a href="../components/sortable.html">Sortable</a>
306
+ <a href="../components/speech-to-text.html">Speech To Text</a>
293
307
  <a href="../components/spinner.html">Spinner</a>
294
308
  <a href="../components/split.html">Split</a>
295
309
  <a href="../components/table.html">Table</a>
296
310
  <a href="../components/tabs.html">Tabs</a>
297
311
  <a href="../components/tags.html">Tags</a>
312
+ <a href="../components/text-to-speech.html">Text To Speech</a>
298
313
  <a href="../components/theme-select.html">Theme Select</a>
299
314
  <a href="../components/theme-switcher.html">Theme Switcher</a>
315
+ <a href="../components/time.html">Time</a>
300
316
  <a href="../components/timestamp.html">Timestamp</a>
301
317
  <a href="../components/toast.html">Toast</a>
302
318
  <a href="../components/toggle.html">Toggle</a>
@@ -62,6 +62,9 @@
62
62
  href="../components/accordion.html">Accordion<br><small>Component</small></a></k-filter-item>
63
63
  <k-filter-item filter-keywords="aside sidebar components"><a
64
64
  href="../components/aside.html">Aside<br><small>Component</small></a></k-filter-item>
65
+ <k-filter-item filter-keywords="calendar date picker range month day components"><a
66
+ href="../components/calendar.html"
67
+ >Calendar<br><small>Component</small></a></k-filter-item>
65
68
  <k-filter-item filter-keywords="card components"><a
66
69
  href="../components/card.html">Card<br><small>Component</small></a></k-filter-item>
67
70
  <k-filter-item filter-keywords="code editor codeeditor monaco components"><a
@@ -117,6 +120,9 @@
117
120
  <k-filter-item filter-keywords="sortable drag drop sort components"><a
118
121
  href="../components/sortable.html"
119
122
  >Sortable<br><small>Component</small></a></k-filter-item>
123
+ <k-filter-item filter-keywords="speech to text speechtotext microphone voice recognition transcription components"><a
124
+ href="../components/speech-to-text.html"
125
+ >Speech To Text<br><small>Component</small></a></k-filter-item>
120
126
  <k-filter-item filter-keywords="spinner loading components"><a
121
127
  href="../components/spinner.html">Spinner<br><small>Component</small></a></k-filter-item>
122
128
  <k-filter-item filter-keywords="split pane components"><a
@@ -169,12 +175,18 @@
169
175
  href="../components/tabs.html">Tabs<br><small>Component</small></a></k-filter-item>
170
176
  <k-filter-item filter-keywords="tags tag input components"><a
171
177
  href="../components/tags.html">Tags<br><small>Component</small></a></k-filter-item>
178
+ <k-filter-item filter-keywords="text to speech texttospeech tts speak voice synthesis components"><a
179
+ href="../components/text-to-speech.html"
180
+ >Text To Speech<br><small>Component</small></a></k-filter-item>
172
181
  <k-filter-item filter-keywords="theme select dropdown dark light components"><a
173
182
  href="../components/theme-select.html"
174
183
  >Theme Select<br><small>Component</small></a></k-filter-item>
175
184
  <k-filter-item filter-keywords="theme switcher dark light components"><a
176
185
  href="../components/theme-switcher.html"
177
186
  >Theme Switcher<br><small>Component</small></a></k-filter-item>
187
+ <k-filter-item filter-keywords="time picker clock hour minute form components"><a
188
+ href="../components/time.html"
189
+ >Time<br><small>Component</small></a></k-filter-item>
178
190
  <k-filter-item filter-keywords="timestamp date time components"><a
179
191
  href="../components/timestamp.html"
180
192
  >Timestamp<br><small>Component</small></a></k-filter-item>
@@ -269,6 +281,7 @@
269
281
  <h3>Components</h3>
270
282
  <a href="../components/accordion.html">Accordion</a>
271
283
  <a href="../components/aside.html">Aside</a>
284
+ <a href="../components/calendar.html">Calendar</a>
272
285
  <a href="../components/card.html">Card</a>
273
286
  <a href="../components/code-editor.html">Code Editor</a>
274
287
  <a href="../components/combobox.html">Combobox</a>
@@ -290,13 +303,16 @@
290
303
  <a href="../components/show-more.html">Show More</a>
291
304
  <a href="../components/slider.html">Slider</a>
292
305
  <a href="../components/sortable.html">Sortable</a>
306
+ <a href="../components/speech-to-text.html">Speech To Text</a>
293
307
  <a href="../components/spinner.html">Spinner</a>
294
308
  <a href="../components/split.html">Split</a>
295
309
  <a href="../components/table.html">Table</a>
296
310
  <a href="../components/tabs.html">Tabs</a>
297
311
  <a href="../components/tags.html">Tags</a>
312
+ <a href="../components/text-to-speech.html">Text To Speech</a>
298
313
  <a href="../components/theme-select.html">Theme Select</a>
299
314
  <a href="../components/theme-switcher.html">Theme Switcher</a>
315
+ <a href="../components/time.html">Time</a>
300
316
  <a href="../components/timestamp.html">Timestamp</a>
301
317
  <a href="../components/toast.html">Toast</a>
302
318
  <a href="../components/toggle.html">Toggle</a>
@@ -62,6 +62,9 @@
62
62
  href="../components/accordion.html">Accordion<br><small>Component</small></a></k-filter-item>
63
63
  <k-filter-item filter-keywords="aside sidebar components"><a
64
64
  href="../components/aside.html">Aside<br><small>Component</small></a></k-filter-item>
65
+ <k-filter-item filter-keywords="calendar date picker range month day components"><a
66
+ href="../components/calendar.html"
67
+ >Calendar<br><small>Component</small></a></k-filter-item>
65
68
  <k-filter-item filter-keywords="card components"><a
66
69
  href="../components/card.html">Card<br><small>Component</small></a></k-filter-item>
67
70
  <k-filter-item filter-keywords="code editor codeeditor monaco components"><a
@@ -117,6 +120,9 @@
117
120
  <k-filter-item filter-keywords="sortable drag drop sort components"><a
118
121
  href="../components/sortable.html"
119
122
  >Sortable<br><small>Component</small></a></k-filter-item>
123
+ <k-filter-item filter-keywords="speech to text speechtotext microphone voice recognition transcription components"><a
124
+ href="../components/speech-to-text.html"
125
+ >Speech To Text<br><small>Component</small></a></k-filter-item>
120
126
  <k-filter-item filter-keywords="spinner loading components"><a
121
127
  href="../components/spinner.html">Spinner<br><small>Component</small></a></k-filter-item>
122
128
  <k-filter-item filter-keywords="split pane components"><a
@@ -169,12 +175,18 @@
169
175
  href="../components/tabs.html">Tabs<br><small>Component</small></a></k-filter-item>
170
176
  <k-filter-item filter-keywords="tags tag input components"><a
171
177
  href="../components/tags.html">Tags<br><small>Component</small></a></k-filter-item>
178
+ <k-filter-item filter-keywords="text to speech texttospeech tts speak voice synthesis components"><a
179
+ href="../components/text-to-speech.html"
180
+ >Text To Speech<br><small>Component</small></a></k-filter-item>
172
181
  <k-filter-item filter-keywords="theme select dropdown dark light components"><a
173
182
  href="../components/theme-select.html"
174
183
  >Theme Select<br><small>Component</small></a></k-filter-item>
175
184
  <k-filter-item filter-keywords="theme switcher dark light components"><a
176
185
  href="../components/theme-switcher.html"
177
186
  >Theme Switcher<br><small>Component</small></a></k-filter-item>
187
+ <k-filter-item filter-keywords="time picker clock hour minute form components"><a
188
+ href="../components/time.html"
189
+ >Time<br><small>Component</small></a></k-filter-item>
178
190
  <k-filter-item filter-keywords="timestamp date time components"><a
179
191
  href="../components/timestamp.html"
180
192
  >Timestamp<br><small>Component</small></a></k-filter-item>
@@ -269,6 +281,7 @@
269
281
  <h3>Components</h3>
270
282
  <a href="../components/accordion.html">Accordion</a>
271
283
  <a href="../components/aside.html">Aside</a>
284
+ <a href="../components/calendar.html">Calendar</a>
272
285
  <a href="../components/card.html">Card</a>
273
286
  <a href="../components/code-editor.html">Code Editor</a>
274
287
  <a href="../components/combobox.html">Combobox</a>
@@ -290,13 +303,16 @@
290
303
  <a href="../components/show-more.html">Show More</a>
291
304
  <a href="../components/slider.html">Slider</a>
292
305
  <a href="../components/sortable.html">Sortable</a>
306
+ <a href="../components/speech-to-text.html">Speech To Text</a>
293
307
  <a href="../components/spinner.html">Spinner</a>
294
308
  <a href="../components/split.html">Split</a>
295
309
  <a href="../components/table.html">Table</a>
296
310
  <a href="../components/tabs.html">Tabs</a>
297
311
  <a href="../components/tags.html">Tags</a>
312
+ <a href="../components/text-to-speech.html">Text To Speech</a>
298
313
  <a href="../components/theme-select.html">Theme Select</a>
299
314
  <a href="../components/theme-switcher.html">Theme Switcher</a>
315
+ <a href="../components/time.html">Time</a>
300
316
  <a href="../components/timestamp.html">Timestamp</a>
301
317
  <a href="../components/toast.html">Toast</a>
302
318
  <a href="../components/toggle.html">Toggle</a>
@@ -62,6 +62,9 @@
62
62
  href="../components/accordion.html">Accordion<br><small>Component</small></a></k-filter-item>
63
63
  <k-filter-item filter-keywords="aside sidebar components"><a
64
64
  href="../components/aside.html">Aside<br><small>Component</small></a></k-filter-item>
65
+ <k-filter-item filter-keywords="calendar date picker range month day components"><a
66
+ href="../components/calendar.html"
67
+ >Calendar<br><small>Component</small></a></k-filter-item>
65
68
  <k-filter-item filter-keywords="card components"><a
66
69
  href="../components/card.html">Card<br><small>Component</small></a></k-filter-item>
67
70
  <k-filter-item filter-keywords="code editor codeeditor monaco components"><a
@@ -117,6 +120,9 @@
117
120
  <k-filter-item filter-keywords="sortable drag drop sort components"><a
118
121
  href="../components/sortable.html"
119
122
  >Sortable<br><small>Component</small></a></k-filter-item>
123
+ <k-filter-item filter-keywords="speech to text speechtotext microphone voice recognition transcription components"><a
124
+ href="../components/speech-to-text.html"
125
+ >Speech To Text<br><small>Component</small></a></k-filter-item>
120
126
  <k-filter-item filter-keywords="spinner loading components"><a
121
127
  href="../components/spinner.html">Spinner<br><small>Component</small></a></k-filter-item>
122
128
  <k-filter-item filter-keywords="split pane components"><a
@@ -169,12 +175,18 @@
169
175
  href="../components/tabs.html">Tabs<br><small>Component</small></a></k-filter-item>
170
176
  <k-filter-item filter-keywords="tags tag input components"><a
171
177
  href="../components/tags.html">Tags<br><small>Component</small></a></k-filter-item>
178
+ <k-filter-item filter-keywords="text to speech texttospeech tts speak voice synthesis components"><a
179
+ href="../components/text-to-speech.html"
180
+ >Text To Speech<br><small>Component</small></a></k-filter-item>
172
181
  <k-filter-item filter-keywords="theme select dropdown dark light components"><a
173
182
  href="../components/theme-select.html"
174
183
  >Theme Select<br><small>Component</small></a></k-filter-item>
175
184
  <k-filter-item filter-keywords="theme switcher dark light components"><a
176
185
  href="../components/theme-switcher.html"
177
186
  >Theme Switcher<br><small>Component</small></a></k-filter-item>
187
+ <k-filter-item filter-keywords="time picker clock hour minute form components"><a
188
+ href="../components/time.html"
189
+ >Time<br><small>Component</small></a></k-filter-item>
178
190
  <k-filter-item filter-keywords="timestamp date time components"><a
179
191
  href="../components/timestamp.html"
180
192
  >Timestamp<br><small>Component</small></a></k-filter-item>
@@ -269,6 +281,7 @@
269
281
  <h3>Components</h3>
270
282
  <a href="../components/accordion.html">Accordion</a>
271
283
  <a href="../components/aside.html">Aside</a>
284
+ <a href="../components/calendar.html">Calendar</a>
272
285
  <a href="../components/card.html">Card</a>
273
286
  <a href="../components/code-editor.html">Code Editor</a>
274
287
  <a href="../components/combobox.html">Combobox</a>
@@ -290,13 +303,16 @@
290
303
  <a href="../components/show-more.html">Show More</a>
291
304
  <a href="../components/slider.html">Slider</a>
292
305
  <a href="../components/sortable.html">Sortable</a>
306
+ <a href="../components/speech-to-text.html">Speech To Text</a>
293
307
  <a href="../components/spinner.html">Spinner</a>
294
308
  <a href="../components/split.html">Split</a>
295
309
  <a href="../components/table.html">Table</a>
296
310
  <a href="../components/tabs.html">Tabs</a>
297
311
  <a href="../components/tags.html">Tags</a>
312
+ <a href="../components/text-to-speech.html">Text To Speech</a>
298
313
  <a href="../components/theme-select.html">Theme Select</a>
299
314
  <a href="../components/theme-switcher.html">Theme Switcher</a>
315
+ <a href="../components/time.html">Time</a>
300
316
  <a href="../components/timestamp.html">Timestamp</a>
301
317
  <a href="../components/toast.html">Toast</a>
302
318
  <a href="../components/toggle.html">Toggle</a>
@@ -62,6 +62,9 @@
62
62
  href="../components/accordion.html">Accordion<br><small>Component</small></a></k-filter-item>
63
63
  <k-filter-item filter-keywords="aside sidebar components"><a
64
64
  href="../components/aside.html">Aside<br><small>Component</small></a></k-filter-item>
65
+ <k-filter-item filter-keywords="calendar date picker range month day components"><a
66
+ href="../components/calendar.html"
67
+ >Calendar<br><small>Component</small></a></k-filter-item>
65
68
  <k-filter-item filter-keywords="card components"><a
66
69
  href="../components/card.html">Card<br><small>Component</small></a></k-filter-item>
67
70
  <k-filter-item filter-keywords="code editor codeeditor monaco components"><a
@@ -117,6 +120,9 @@
117
120
  <k-filter-item filter-keywords="sortable drag drop sort components"><a
118
121
  href="../components/sortable.html"
119
122
  >Sortable<br><small>Component</small></a></k-filter-item>
123
+ <k-filter-item filter-keywords="speech to text speechtotext microphone voice recognition transcription components"><a
124
+ href="../components/speech-to-text.html"
125
+ >Speech To Text<br><small>Component</small></a></k-filter-item>
120
126
  <k-filter-item filter-keywords="spinner loading components"><a
121
127
  href="../components/spinner.html">Spinner<br><small>Component</small></a></k-filter-item>
122
128
  <k-filter-item filter-keywords="split pane components"><a
@@ -169,12 +175,18 @@
169
175
  href="../components/tabs.html">Tabs<br><small>Component</small></a></k-filter-item>
170
176
  <k-filter-item filter-keywords="tags tag input components"><a
171
177
  href="../components/tags.html">Tags<br><small>Component</small></a></k-filter-item>
178
+ <k-filter-item filter-keywords="text to speech texttospeech tts speak voice synthesis components"><a
179
+ href="../components/text-to-speech.html"
180
+ >Text To Speech<br><small>Component</small></a></k-filter-item>
172
181
  <k-filter-item filter-keywords="theme select dropdown dark light components"><a
173
182
  href="../components/theme-select.html"
174
183
  >Theme Select<br><small>Component</small></a></k-filter-item>
175
184
  <k-filter-item filter-keywords="theme switcher dark light components"><a
176
185
  href="../components/theme-switcher.html"
177
186
  >Theme Switcher<br><small>Component</small></a></k-filter-item>
187
+ <k-filter-item filter-keywords="time picker clock hour minute form components"><a
188
+ href="../components/time.html"
189
+ >Time<br><small>Component</small></a></k-filter-item>
178
190
  <k-filter-item filter-keywords="timestamp date time components"><a
179
191
  href="../components/timestamp.html"
180
192
  >Timestamp<br><small>Component</small></a></k-filter-item>
@@ -269,6 +281,7 @@
269
281
  <h3>Components</h3>
270
282
  <a href="../components/accordion.html">Accordion</a>
271
283
  <a href="../components/aside.html">Aside</a>
284
+ <a href="../components/calendar.html">Calendar</a>
272
285
  <a href="../components/card.html">Card</a>
273
286
  <a href="../components/code-editor.html">Code Editor</a>
274
287
  <a href="../components/combobox.html">Combobox</a>
@@ -290,13 +303,16 @@
290
303
  <a href="../components/show-more.html">Show More</a>
291
304
  <a href="../components/slider.html">Slider</a>
292
305
  <a href="../components/sortable.html">Sortable</a>
306
+ <a href="../components/speech-to-text.html">Speech To Text</a>
293
307
  <a href="../components/spinner.html">Spinner</a>
294
308
  <a href="../components/split.html">Split</a>
295
309
  <a href="../components/table.html">Table</a>
296
310
  <a href="../components/tabs.html">Tabs</a>
297
311
  <a href="../components/tags.html">Tags</a>
312
+ <a href="../components/text-to-speech.html">Text To Speech</a>
298
313
  <a href="../components/theme-select.html">Theme Select</a>
299
314
  <a href="../components/theme-switcher.html">Theme Switcher</a>
315
+ <a href="../components/time.html">Time</a>
300
316
  <a href="../components/timestamp.html">Timestamp</a>
301
317
  <a href="../components/toast.html">Toast</a>
302
318
  <a href="../components/toggle.html">Toggle</a>
@@ -0,0 +1,254 @@
1
+ <page pageName="Calendar" title="Calendar - 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 pl">
7
+ <h6>Examples</h6>
8
+ <a href="#basicUsage">Basic Usage</a><br />
9
+ <a href="#defaultValue">Default Value</a><br />
10
+ <a href="#rangeMode">Range Mode</a><br />
11
+ <a href="#rangeDefault">Range Default</a><br />
12
+ <a href="#minMax">Min / Max</a><br />
13
+ <a href="#javascriptUsage">JavaScript Usage</a><br />
14
+ <a href="#formUsage">Form Usage</a><br />
15
+ <a href="#disabled">Disabled</a><br />
16
+
17
+ <h6 class="mt"><a href="#jsRef" class="no-link">JavaScript Reference</a></h6>
18
+ <a href="#constructor">Constructor</a><br />
19
+ <a href="#requirements">Requirements</a><br />
20
+ <a href="#properties">Properties</a><br />
21
+ <a href="#methods">Methods</a><br />
22
+ <a href="#cssVariables">CSS Variables</a><br />
23
+ <a href="#events">Events</a><br />
24
+ </div>
25
+ </k-accordion-panel>
26
+ </k-accordion>
27
+
28
+ <h3 id="basicUsage"><a href="#basicUsage" class="no-link">Basic Usage</a></h3>
29
+ <p>A month-grid calendar widget for selecting a single date. The <code>value</code> is an ISO <code>YYYY-MM-DD</code> string. Use the month and year dropdowns in the header to jump around quickly.</p>
30
+ <div class="row -mx">
31
+ <div class="col m-span-12 px">
32
+ <k-card label="HTML">
33
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-calendar</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-calendar</span>&gt;</span></code></pre>
34
+ </k-card>
35
+ </div>
36
+ <div class="col m-span-12 px">
37
+ <k-card label="Output">
38
+ <k-calendar></k-calendar>
39
+ </k-card>
40
+ </div>
41
+ </div>
42
+
43
+ <h3 id="defaultValue"><a href="#defaultValue" class="no-link">Default Value</a></h3>
44
+ <p>Set an initial date with the <code>value</code> attribute. The calendar opens on that month.</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-calendar</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;2026-07-04&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-calendar</span>&gt;</span></code></pre>
49
+ </k-card>
50
+ </div>
51
+ <div class="col m-span-12 px">
52
+ <k-card label="Output">
53
+ <k-calendar value="2026-07-04"></k-calendar>
54
+ </k-card>
55
+ </div>
56
+ </div>
57
+
58
+ <h3 id="rangeMode"><a href="#rangeMode" class="no-link">Range Mode</a></h3>
59
+ <p>Set <code>mode="range"</code> to enable range selection. The first click sets the start date, the second sets the end. Hovering after the start shows a preview range. Clicking again starts a new range.</p>
60
+ <div class="row -mx">
61
+ <div class="col m-span-12 px">
62
+ <k-card label="HTML">
63
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-calendar</span> <span class="hljs-attr">mode</span>=<span class="hljs-string">&quot;range&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-calendar</span>&gt;</span></code></pre>
64
+ </k-card>
65
+ </div>
66
+ <div class="col m-span-12 px">
67
+ <k-card label="Output">
68
+ <k-calendar mode="range"></k-calendar>
69
+ </k-card>
70
+ </div>
71
+ </div>
72
+
73
+ <h3 id="rangeDefault"><a href="#rangeDefault" class="no-link">Range Default</a></h3>
74
+ <p>In range mode the <code>value</code> is two ISO dates separated by a comma. Both bounds are included in the range.</p>
75
+ <div class="row -mx">
76
+ <div class="col m-span-12 px">
77
+ <k-card label="HTML">
78
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-calendar</span> <span class="hljs-attr">mode</span>=<span class="hljs-string">&quot;range&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;2026-04-10,2026-04-20&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-calendar</span>&gt;</span></code></pre>
79
+ </k-card>
80
+ </div>
81
+ <div class="col m-span-12 px">
82
+ <k-card label="Output">
83
+ <k-calendar mode="range" value="2026-04-10,2026-04-20"></k-calendar>
84
+ </k-card>
85
+ </div>
86
+ </div>
87
+
88
+ <h3 id="minMax"><a href="#minMax" class="no-link">Min / Max</a></h3>
89
+ <p>Constrain the selectable range with the <code>min</code> and <code>max</code> attributes. Both accept an ISO date (<code>YYYY-MM-DD</code>) or one of the keywords <code>today</code>, <code>tomorrow</code>, <code>yesterday</code>. When omitted, <code>min</code> defaults to <code>1900-01-01</code> and <code>max</code> defaults to December 31st of the year 10 years from now. Dates outside the range are shown disabled, and the year dropdown is scoped to the available years.</p>
90
+ <div class="row -mx">
91
+ <div class="col m-span-12 px">
92
+ <k-card label="HTML">
93
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-calendar</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;2026-04-15&quot;</span> <span class="hljs-attr">min</span>=<span class="hljs-string">&quot;2026-04-05&quot;</span> <span class="hljs-attr">max</span>=<span class="hljs-string">&quot;2026-04-25&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-calendar</span>&gt;</span></code></pre>
94
+ </k-card>
95
+ </div>
96
+ <div class="col m-span-12 px">
97
+ <k-card label="Output">
98
+ <k-calendar value="2026-04-15" min="2026-04-05" max="2026-04-25"></k-calendar>
99
+ </k-card>
100
+ </div>
101
+ </div>
102
+
103
+ <h4>Appointment Scheduler (no past dates)</h4>
104
+ <p>Use <code>min="today"</code> or <code>min="tomorrow"</code> to lock out past dates in scheduling flows.</p>
105
+ <div class="row -mx">
106
+ <div class="col m-span-12 px">
107
+ <k-card label="HTML">
108
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-calendar</span> <span class="hljs-attr">min</span>=<span class="hljs-string">&quot;tomorrow&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-calendar</span>&gt;</span></code></pre>
109
+ </k-card>
110
+ </div>
111
+ <div class="col m-span-12 px">
112
+ <k-card label="Output">
113
+ <k-calendar min="tomorrow"></k-calendar>
114
+ </k-card>
115
+ </div>
116
+ </div>
117
+
118
+ <h3 id="javascriptUsage"><a href="#javascriptUsage" class="no-link">JavaScript Usage</a></h3>
119
+ <p>Listen for the <code>change</code> event. The <code>detail.value</code> is the selected date (or comma-separated range).</p>
120
+ <div class="row -mx">
121
+ <div class="col m-span-12 px">
122
+ <k-card label="HTML">
123
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-calendar</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;jsCal&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-calendar</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Selected: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;jsCalOutput&quot;</span>&gt;</span>(none)<span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><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="language-javascript"><br> <span class="hljs-keyword">const</span> $cal = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;jsCal&#x27;</span>);<br> <span class="hljs-keyword">const</span> $out = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;jsCalOutput&#x27;</span>);<br> $cal.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;change&#x27;</span>, <span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> {<br> $out.<span class="hljs-property">textContent</span> = e.<span class="hljs-property">detail</span>.<span class="hljs-property">value</span> || <span class="hljs-string">&#x27;(none)&#x27;</span>;<br> });<br></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre>
124
+ </k-card>
125
+ </div>
126
+ <div class="col m-span-12 px">
127
+ <k-card label="Output">
128
+ <k-calendar id="jsCal" class="mb"></k-calendar>
129
+ <p>Selected: <span id="jsCalOutput">(none)</span></p>
130
+ <script>
131
+ const $cal = document.getElementById('jsCal');
132
+ const $out = document.getElementById('jsCalOutput');
133
+ $cal.addEventListener('change', (e) => {
134
+ $out.textContent = e.detail.value || '(none)';
135
+ });
136
+ </script>
137
+ </k-card>
138
+ </div>
139
+ </div>
140
+
141
+ <h3 id="formUsage"><a href="#formUsage" class="no-link">Form Usage</a></h3>
142
+ <p>The calendar is form-associated. Set a <code>name</code> so it participates in form submission. In range mode the submitted value is the comma-separated pair.</p>
143
+ <div class="row -mx">
144
+ <div class="col m-span-12 px">
145
+ <k-card label="HTML">
146
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">form</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;calForm&quot;</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">label</span>&gt;</span>Checkin / Checkout:<span class="hljs-tag">&lt;/<span class="hljs-name">label</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">k-calendar</span> <span class="hljs-attr">name</span>=<span class="hljs-string">&quot;stay&quot;</span> <span class="hljs-attr">mode</span>=<span class="hljs-string">&quot;range&quot;</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;2026-05-01,2026-05-07&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-calendar</span>&gt;</span><br> <span class="hljs-tag">&lt;<span class="hljs-name">button</span> <span class="hljs-attr">type</span>=<span class="hljs-string">&quot;submit&quot;</span>&gt;</span>Submit<span class="hljs-tag">&lt;/<span class="hljs-name">button</span>&gt;</span><br><span class="hljs-tag">&lt;/<span class="hljs-name">form</span>&gt;</span><br><span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Form Data: <span class="hljs-tag">&lt;<span class="hljs-name">span</span> <span class="hljs-attr">id</span>=<span class="hljs-string">&quot;calFormOutput&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">span</span>&gt;</span><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="language-javascript"><br> <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;calForm&#x27;</span>).<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;submit&#x27;</span>, <span class="hljs-function">(<span class="hljs-params">e</span>) =&gt;</span> {<br> e.<span class="hljs-title function_">preventDefault</span>();<br> <span class="hljs-keyword">const</span> fd = <span class="hljs-keyword">new</span> <span class="hljs-title class_">FormData</span>(e.<span class="hljs-property">target</span>);<br> <span class="hljs-keyword">const</span> entries = [...fd.<span class="hljs-title function_">entries</span>()].<span class="hljs-title function_">map</span>(<span class="hljs-function">(<span class="hljs-params">[k, v]</span>) =&gt;</span> k + <span class="hljs-string">&#x27;=&#x27;</span> + v);<br> <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">getElementById</span>(<span class="hljs-string">&#x27;calFormOutput&#x27;</span>).<span class="hljs-property">textContent</span> = entries.<span class="hljs-title function_">join</span>(<span class="hljs-string">&#x27;, &#x27;</span>);<br> });<br></span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span></code></pre>
147
+ </k-card>
148
+ </div>
149
+ <div class="col m-span-12 px">
150
+ <k-card label="Output">
151
+ <form id="calForm">
152
+ <label>Checkin / Checkout:</label>
153
+ <k-calendar name="stay" mode="range" value="2026-05-01,2026-05-07"></k-calendar>
154
+ <div class="mt">
155
+ <button type="submit">Submit</button>
156
+ </div>
157
+ </form>
158
+ <p>Form Data: <span id="calFormOutput"></span></p>
159
+ <script>
160
+ document.getElementById('calForm').addEventListener('submit', (e) => {
161
+ e.preventDefault();
162
+ const fd = new FormData(e.target);
163
+ const entries = [...fd.entries()].map(([k, v]) => k + '=' + v);
164
+ document.getElementById('calFormOutput').textContent = entries.join(', ');
165
+ });
166
+ </script>
167
+ </k-card>
168
+ </div>
169
+ </div>
170
+
171
+ <h3 id="disabled"><a href="#disabled" class="no-link">Disabled</a></h3>
172
+ <p>The <code>disabled</code> attribute prevents user interaction.</p>
173
+ <div class="row -mx">
174
+ <div class="col m-span-12 px">
175
+ <k-card label="HTML">
176
+ <pre><code class="hljs xml"><span class="hljs-tag">&lt;<span class="hljs-name">k-calendar</span> <span class="hljs-attr">disabled</span> <span class="hljs-attr">value</span>=<span class="hljs-string">&quot;2026-04-15&quot;</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">k-calendar</span>&gt;</span></code></pre>
177
+ </k-card>
178
+ </div>
179
+ <div class="col m-span-12 px">
180
+ <k-card label="Output">
181
+ <k-calendar disabled value="2026-04-15"></k-calendar>
182
+ </k-card>
183
+ </div>
184
+ </div>
185
+
186
+ <h2 id="jsRef"><a href="#jsRef" class="no-link">JavaScript Reference</a></h2>
187
+
188
+ <h3 id="constructor"><a href="#constructor" class="no-link">Constructor</a></h3>
189
+ <h6>Extends <a href="./shadow-component.html">ShadowComponent</a></h6>
190
+ <h5><code>new Calendar()</code></h5>
191
+
192
+ <h3 id="requirements"><a href="#requirements" class="no-link">Requirements</a></h3>
193
+ <ul>
194
+ <li><a href="./shadow-component.html">ShadowComponent</a></li>
195
+ </ul>
196
+
197
+ <h3 id="properties"><a href="#properties" class="no-link">Properties</a></h3>
198
+ <h5><code>value<i>: String</i></code></h5>
199
+ <p>In single mode, the selected date as <code>YYYY-MM-DD</code>. In range mode, two comma-separated ISO dates (e.g. <code>"2026-05-01,2026-05-07"</code>). Empty string when no selection. Syncs to <code>value</code> attribute.</p>
200
+
201
+ <h5><code>name<i>: String</i></code></h5>
202
+ <p>The form field name. When set inside a <code>&lt;form&gt;</code>, the component participates in form submission. Syncs to <code>name</code> attribute.</p>
203
+
204
+ <h5><code>mode<i>: String</i></code></h5>
205
+ <p>Either <code>"single"</code> (default) or <code>"range"</code>. Controls how clicks build the <code>value</code>. Syncs to <code>mode</code> attribute.</p>
206
+
207
+ <h5><code>min<i>: String</i></code></h5>
208
+ <p>Lower bound (inclusive) as <code>YYYY-MM-DD</code> or the keyword <code>today</code>, <code>tomorrow</code>, or <code>yesterday</code>. Dates before this are disabled and removed from the year dropdown. Default is <code>"1900-01-01"</code>. Syncs to <code>min</code> attribute.</p>
209
+
210
+ <h5><code>max<i>: String</i></code></h5>
211
+ <p>Upper bound (inclusive) as <code>YYYY-MM-DD</code> or the keyword <code>today</code>, <code>tomorrow</code>, or <code>yesterday</code>. Dates after this are disabled. Defaults to December 31st of the year 10 years from now. Syncs to <code>max</code> attribute.</p>
212
+
213
+ <h5><code>disabled<i>: Boolean</i></code></h5>
214
+ <p>When <code>true</code>, the calendar cannot be changed by user interaction. Syncs to <code>disabled</code> attribute.</p>
215
+
216
+ <h5><code>required<i>: Boolean</i></code></h5>
217
+ <p>When <code>true</code> and no date is set, the element reports a <code>valueMissing</code> validity error for form validation. Syncs to <code>required</code> attribute.</p>
218
+
219
+ <h3 id="methods"><a href="#methods" class="no-link">Methods</a></h3>
220
+ <h5><code>prevMonth()<i>: void</i></code></h5>
221
+ <p>Navigates the view to the previous month.</p>
222
+
223
+ <h5><code>nextMonth()<i>: void</i></code></h5>
224
+ <p>Navigates the view to the next month.</p>
225
+
226
+ <h5><code>goToMonth(year, month)<i>: void</i></code></h5>
227
+ <p>Navigates the view to the given year and zero-based month (e.g. <code>goToMonth(2026, 0)</code> for January 2026).</p>
228
+
229
+ <h5><code>goToToday()<i>: void</i></code></h5>
230
+ <p>Navigates the view back to the current month.</p>
231
+
232
+ <h3 id="cssVariables"><a href="#cssVariables" class="no-link">CSS Variables</a></h3>
233
+ <table class="b">
234
+ <thead><tr><th>Variable</th><th>Default</th><th>Description</th></tr></thead>
235
+ <tbody>
236
+ <tr><td><code>--day_size</code></td><td><code>2rem</code></td><td>Width/height of each day cell</td></tr>
237
+ <tr><td><code>--day_radius</code></td><td><code>var(--radius)</code></td><td>Border radius of day cells</td></tr>
238
+ <tr><td><code>--day_bg__selected</code></td><td><code>var(--c_primary)</code></td><td>Background color of the selected day (or range endpoints)</td></tr>
239
+ <tr><td><code>--day_tc__selected</code></td><td><code>white</code></td><td>Text color of the selected day</td></tr>
240
+ <tr><td><code>--day_bg__range</code></td><td><code>var(--c_bg__alt)</code></td><td>Background color of days inside a range</td></tr>
241
+ <tr><td><code>--day_bg__hover</code></td><td><code>var(--c_bg__alt)</code></td><td>Background color of days on hover</td></tr>
242
+ </tbody>
243
+ </table>
244
+
245
+ <h3 id="events"><a href="#events" class="no-link">Events</a></h3>
246
+ <h5><code>change</code></h5>
247
+ <p>Fired when the selected date (or range) changes. The event <code>detail</code> contains <code>{ value: String }</code> &mdash; an ISO date for single mode, a comma-separated pair for range mode, or an empty string when cleared.</p>
248
+ </content>
249
+ <content location="scripts">
250
+ <script type="module" src="{{pathToRoot}}src/components/Calendar.js"></script>
251
+ <script type="module" src="{{pathToRoot}}src/components/Accordion.js"></script>
252
+ <script type="module" src="{{pathToRoot}}src/components/Card.js"></script>
253
+ </content>
254
+ </page>