@sekiui/elements 0.0.56 → 0.0.59

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 (269) hide show
  1. package/dist/cdn/index.js +1053 -91
  2. package/dist/cdn/p-BJCq8m2o.js +138 -0
  3. package/dist/cdn/p-Cpa2leXN.js +111 -0
  4. package/dist/cdn/{p-bMBhrs0a.js → p-DxUZSKfL.js} +467 -9
  5. package/dist/cdn/seki-badge.d.ts +11 -0
  6. package/dist/cdn/seki-badge.js +109 -0
  7. package/dist/cdn/seki-button.js +1 -1
  8. package/dist/cdn/seki-card-action.js +1 -1
  9. package/dist/cdn/seki-card-content.js +1 -1
  10. package/dist/cdn/seki-card-description.js +1 -1
  11. package/dist/cdn/seki-card-footer.js +1 -1
  12. package/dist/cdn/seki-card-header.js +1 -1
  13. package/dist/cdn/seki-card-title.js +1 -1
  14. package/dist/cdn/seki-card.js +1 -1
  15. package/dist/cdn/seki-field-description.js +1 -1
  16. package/dist/cdn/seki-field-error.js +1 -1
  17. package/dist/cdn/seki-field-group.js +1 -1
  18. package/dist/cdn/seki-field-label.js +1 -1
  19. package/dist/cdn/seki-field-legend.js +1 -1
  20. package/dist/cdn/seki-field.js +1 -1
  21. package/dist/cdn/seki-fieldset.js +1 -1
  22. package/dist/cdn/seki-input.js +1 -1
  23. package/dist/cdn/seki-select-content.js +1 -1
  24. package/dist/cdn/seki-select-group.js +1 -1
  25. package/dist/cdn/seki-select-option.js +1 -1
  26. package/dist/cdn/seki-select-trigger.js +1 -1
  27. package/dist/cdn/seki-select.js +1 -1
  28. package/dist/cdn/seki-sidebar-content.d.ts +11 -0
  29. package/dist/cdn/seki-sidebar-content.js +38 -0
  30. package/dist/cdn/seki-sidebar-footer.d.ts +11 -0
  31. package/dist/cdn/seki-sidebar-footer.js +38 -0
  32. package/dist/cdn/seki-sidebar-group.d.ts +11 -0
  33. package/dist/cdn/seki-sidebar-group.js +131 -0
  34. package/dist/cdn/seki-sidebar-header.d.ts +11 -0
  35. package/dist/cdn/seki-sidebar-header.js +38 -0
  36. package/dist/cdn/seki-sidebar-menu-item.d.ts +11 -0
  37. package/dist/cdn/seki-sidebar-menu-item.js +200 -0
  38. package/dist/cdn/seki-sidebar-menu-sub.d.ts +11 -0
  39. package/dist/cdn/seki-sidebar-menu-sub.js +123 -0
  40. package/dist/cdn/seki-sidebar-menu.d.ts +11 -0
  41. package/dist/cdn/seki-sidebar-menu.js +38 -0
  42. package/dist/cdn/seki-sidebar-trigger.d.ts +11 -0
  43. package/dist/cdn/seki-sidebar-trigger.js +109 -0
  44. package/dist/cdn/seki-sidebar.d.ts +11 -0
  45. package/dist/cdn/seki-sidebar.js +380 -0
  46. package/dist/cdn/seki-skeleton.js +2 -2
  47. package/dist/cdn/seki-switch.js +1 -1
  48. package/dist/cdn/seki-tooltip.js +1 -1
  49. package/dist/cjs/{index-Dd6_-KaR.js → index-D4RM3EID.js} +466 -8
  50. package/dist/cjs/index.cjs.js +1115 -63
  51. package/dist/cjs/keyboard-Cjl5HYES.js +142 -0
  52. package/dist/cjs/loader.cjs.js +2 -2
  53. package/dist/cjs/seki-badge.cjs.entry.js +85 -0
  54. package/dist/cjs/seki-button.cjs.entry.js +1 -1
  55. package/dist/cjs/seki-card-action.cjs.entry.js +1 -1
  56. package/dist/cjs/seki-card-content.cjs.entry.js +1 -1
  57. package/dist/cjs/seki-card-description.cjs.entry.js +1 -1
  58. package/dist/cjs/seki-card-footer.cjs.entry.js +1 -1
  59. package/dist/cjs/seki-card-header.cjs.entry.js +1 -1
  60. package/dist/cjs/seki-card-title.cjs.entry.js +1 -1
  61. package/dist/cjs/seki-card.cjs.entry.js +1 -1
  62. package/dist/cjs/seki-field-description.cjs.entry.js +1 -1
  63. package/dist/cjs/seki-field-error.cjs.entry.js +1 -1
  64. package/dist/cjs/seki-field-group.cjs.entry.js +1 -1
  65. package/dist/cjs/seki-field-label.cjs.entry.js +1 -1
  66. package/dist/cjs/seki-field-legend.cjs.entry.js +1 -1
  67. package/dist/cjs/seki-field.cjs.entry.js +1 -1
  68. package/dist/cjs/seki-fieldset.cjs.entry.js +1 -1
  69. package/dist/cjs/seki-input.cjs.entry.js +1 -1
  70. package/dist/cjs/seki-select-content.cjs.entry.js +1 -1
  71. package/dist/cjs/seki-select-group.cjs.entry.js +1 -1
  72. package/dist/cjs/seki-select-option.cjs.entry.js +1 -1
  73. package/dist/cjs/seki-select-trigger.cjs.entry.js +1 -1
  74. package/dist/cjs/seki-select.cjs.entry.js +1 -1
  75. package/dist/cjs/seki-sidebar-content.cjs.entry.js +20 -0
  76. package/dist/cjs/seki-sidebar-footer.cjs.entry.js +20 -0
  77. package/dist/cjs/seki-sidebar-group.cjs.entry.js +105 -0
  78. package/dist/cjs/seki-sidebar-header.cjs.entry.js +20 -0
  79. package/dist/cjs/seki-sidebar-menu-item.cjs.entry.js +174 -0
  80. package/dist/cjs/seki-sidebar-menu-sub.cjs.entry.js +99 -0
  81. package/dist/cjs/seki-sidebar-menu.cjs.entry.js +20 -0
  82. package/dist/cjs/seki-sidebar-trigger.cjs.entry.js +86 -0
  83. package/dist/cjs/seki-sidebar.cjs.entry.js +342 -0
  84. package/dist/cjs/seki-skeleton.cjs.entry.js +2 -2
  85. package/dist/cjs/seki-switch.cjs.entry.js +81 -3
  86. package/dist/cjs/seki-tooltip.cjs.entry.js +1 -1
  87. package/dist/cjs/sekiui.cjs.js +3 -3
  88. package/dist/collection/collection-manifest.json +12 -2
  89. package/dist/collection/components/badge/seki-badge.css +140 -0
  90. package/dist/collection/components/badge/seki-badge.interface.js +1 -0
  91. package/dist/collection/components/badge/seki-badge.js +199 -0
  92. package/dist/collection/components/sidebar/seki-sidebar-content.css +82 -0
  93. package/dist/collection/components/sidebar/seki-sidebar-content.js +33 -0
  94. package/dist/collection/components/sidebar/seki-sidebar-footer.css +44 -0
  95. package/dist/collection/components/sidebar/seki-sidebar-footer.js +31 -0
  96. package/dist/collection/components/sidebar/seki-sidebar-group.css +158 -0
  97. package/dist/collection/components/sidebar/seki-sidebar-group.js +300 -0
  98. package/dist/collection/components/sidebar/seki-sidebar-header.css +44 -0
  99. package/dist/collection/components/sidebar/seki-sidebar-header.js +32 -0
  100. package/dist/collection/components/sidebar/seki-sidebar-menu-item.css +196 -0
  101. package/dist/collection/components/sidebar/seki-sidebar-menu-item.js +403 -0
  102. package/dist/collection/components/sidebar/seki-sidebar-menu-sub.css +357 -0
  103. package/dist/collection/components/sidebar/seki-sidebar-menu-sub.js +256 -0
  104. package/dist/collection/components/sidebar/seki-sidebar-menu.css +25 -0
  105. package/dist/collection/components/sidebar/seki-sidebar-menu.js +32 -0
  106. package/dist/collection/components/sidebar/seki-sidebar-trigger.css +68 -0
  107. package/dist/collection/components/sidebar/seki-sidebar-trigger.js +175 -0
  108. package/dist/collection/components/sidebar/seki-sidebar.css +352 -0
  109. package/dist/collection/components/sidebar/seki-sidebar.js +812 -0
  110. package/dist/collection/components/sidebar/types.js +18 -0
  111. package/dist/collection/components/skeleton/seki-skeleton.js +1 -1
  112. package/dist/collection/index.js +7 -0
  113. package/dist/collection/services/focus.js +192 -0
  114. package/dist/collection/services/index.js +7 -0
  115. package/dist/collection/services/keyboard.js +136 -0
  116. package/dist/collection/services/media-query.js +254 -0
  117. package/dist/collection/types.js +41 -0
  118. package/dist/collection/utils/a11y.js +291 -0
  119. package/dist/collection/utils/common.js +286 -0
  120. package/dist/components/index.js +1053 -91
  121. package/dist/components/p-BJCq8m2o.js +138 -0
  122. package/dist/components/{p-QhPshhKB.js → p-BU1kuAZS.js} +467 -9
  123. package/dist/components/p-wQy1sEm6.js +111 -0
  124. package/dist/components/seki-badge.d.ts +11 -0
  125. package/dist/components/seki-badge.js +109 -0
  126. package/dist/components/seki-button.js +1 -1
  127. package/dist/components/seki-card-action.js +1 -1
  128. package/dist/components/seki-card-content.js +1 -1
  129. package/dist/components/seki-card-description.js +1 -1
  130. package/dist/components/seki-card-footer.js +1 -1
  131. package/dist/components/seki-card-header.js +1 -1
  132. package/dist/components/seki-card-title.js +1 -1
  133. package/dist/components/seki-card.js +1 -1
  134. package/dist/components/seki-field-description.js +1 -1
  135. package/dist/components/seki-field-error.js +1 -1
  136. package/dist/components/seki-field-group.js +1 -1
  137. package/dist/components/seki-field-label.js +1 -1
  138. package/dist/components/seki-field-legend.js +1 -1
  139. package/dist/components/seki-field.js +1 -1
  140. package/dist/components/seki-fieldset.js +1 -1
  141. package/dist/components/seki-input.js +1 -1
  142. package/dist/components/seki-select-content.js +1 -1
  143. package/dist/components/seki-select-group.js +1 -1
  144. package/dist/components/seki-select-option.js +1 -1
  145. package/dist/components/seki-select-trigger.js +1 -1
  146. package/dist/components/seki-select.js +1 -1
  147. package/dist/components/seki-sidebar-content.d.ts +11 -0
  148. package/dist/components/seki-sidebar-content.js +38 -0
  149. package/dist/components/seki-sidebar-footer.d.ts +11 -0
  150. package/dist/components/seki-sidebar-footer.js +38 -0
  151. package/dist/components/seki-sidebar-group.d.ts +11 -0
  152. package/dist/components/seki-sidebar-group.js +131 -0
  153. package/dist/components/seki-sidebar-header.d.ts +11 -0
  154. package/dist/components/seki-sidebar-header.js +38 -0
  155. package/dist/components/seki-sidebar-menu-item.d.ts +11 -0
  156. package/dist/components/seki-sidebar-menu-item.js +200 -0
  157. package/dist/components/seki-sidebar-menu-sub.d.ts +11 -0
  158. package/dist/components/seki-sidebar-menu-sub.js +123 -0
  159. package/dist/components/seki-sidebar-menu.d.ts +11 -0
  160. package/dist/components/seki-sidebar-menu.js +38 -0
  161. package/dist/components/seki-sidebar-trigger.d.ts +11 -0
  162. package/dist/components/seki-sidebar-trigger.js +109 -0
  163. package/dist/components/seki-sidebar.d.ts +11 -0
  164. package/dist/components/seki-sidebar.js +380 -0
  165. package/dist/components/seki-skeleton.js +2 -2
  166. package/dist/components/seki-switch.js +1 -1
  167. package/dist/components/seki-tooltip.js +1 -1
  168. package/dist/esm/{index-CuXbV_yz.js → index-DI_YjzRi.js} +466 -8
  169. package/dist/esm/index.js +1053 -63
  170. package/dist/esm/keyboard-BJCq8m2o.js +138 -0
  171. package/dist/esm/loader.js +3 -3
  172. package/dist/esm/seki-badge.entry.js +83 -0
  173. package/dist/esm/seki-button.entry.js +1 -1
  174. package/dist/esm/seki-card-action.entry.js +1 -1
  175. package/dist/esm/seki-card-content.entry.js +1 -1
  176. package/dist/esm/seki-card-description.entry.js +1 -1
  177. package/dist/esm/seki-card-footer.entry.js +1 -1
  178. package/dist/esm/seki-card-header.entry.js +1 -1
  179. package/dist/esm/seki-card-title.entry.js +1 -1
  180. package/dist/esm/seki-card.entry.js +1 -1
  181. package/dist/esm/seki-field-description.entry.js +1 -1
  182. package/dist/esm/seki-field-error.entry.js +1 -1
  183. package/dist/esm/seki-field-group.entry.js +1 -1
  184. package/dist/esm/seki-field-label.entry.js +1 -1
  185. package/dist/esm/seki-field-legend.entry.js +1 -1
  186. package/dist/esm/seki-field.entry.js +1 -1
  187. package/dist/esm/seki-fieldset.entry.js +1 -1
  188. package/dist/esm/seki-input.entry.js +1 -1
  189. package/dist/esm/seki-select-content.entry.js +1 -1
  190. package/dist/esm/seki-select-group.entry.js +1 -1
  191. package/dist/esm/seki-select-option.entry.js +1 -1
  192. package/dist/esm/seki-select-trigger.entry.js +1 -1
  193. package/dist/esm/seki-select.entry.js +1 -1
  194. package/dist/esm/seki-sidebar-content.entry.js +18 -0
  195. package/dist/esm/seki-sidebar-footer.entry.js +18 -0
  196. package/dist/esm/seki-sidebar-group.entry.js +103 -0
  197. package/dist/esm/seki-sidebar-header.entry.js +18 -0
  198. package/dist/esm/seki-sidebar-menu-item.entry.js +172 -0
  199. package/dist/esm/seki-sidebar-menu-sub.entry.js +97 -0
  200. package/dist/esm/seki-sidebar-menu.entry.js +18 -0
  201. package/dist/esm/seki-sidebar-trigger.entry.js +84 -0
  202. package/dist/esm/seki-sidebar.entry.js +340 -0
  203. package/dist/esm/seki-skeleton.entry.js +2 -2
  204. package/dist/esm/seki-switch.entry.js +84 -2
  205. package/dist/esm/seki-tooltip.entry.js +1 -1
  206. package/dist/esm/sekiui.js +4 -4
  207. package/dist/sekiui/index.esm.js +1 -1
  208. package/dist/sekiui/p-0af1b81a.entry.js +1 -0
  209. package/dist/sekiui/p-0ca6b9f0.entry.js +1 -0
  210. package/dist/sekiui/{p-cf11115c.entry.js → p-1480b41a.entry.js} +1 -1
  211. package/dist/sekiui/{p-dd1e3e87.entry.js → p-161be4d4.entry.js} +1 -1
  212. package/dist/sekiui/{p-e71ad432.entry.js → p-1685e673.entry.js} +1 -1
  213. package/dist/sekiui/p-26b629bc.entry.js +1 -0
  214. package/dist/sekiui/{p-0544d787.entry.js → p-27deb555.entry.js} +1 -1
  215. package/dist/sekiui/p-37fa684c.entry.js +1 -0
  216. package/dist/sekiui/{p-1607dc4d.entry.js → p-402a5db6.entry.js} +1 -1
  217. package/dist/sekiui/{p-6bde807e.entry.js → p-40ba3ad6.entry.js} +1 -1
  218. package/dist/sekiui/{p-d4c92041.entry.js → p-4867d02d.entry.js} +1 -1
  219. package/dist/sekiui/p-4b29dbda.entry.js +1 -0
  220. package/dist/sekiui/{p-b10d81a6.entry.js → p-587fd313.entry.js} +1 -1
  221. package/dist/sekiui/{p-3e088b5a.entry.js → p-58ab95eb.entry.js} +1 -1
  222. package/dist/sekiui/p-60ff3543.entry.js +1 -0
  223. package/dist/sekiui/{p-9af5286b.entry.js → p-68b1fa1a.entry.js} +1 -1
  224. package/dist/sekiui/{p-43f7c542.entry.js → p-6a922121.entry.js} +1 -1
  225. package/dist/sekiui/{p-4d57c6ea.entry.js → p-6f5bf5af.entry.js} +1 -1
  226. package/dist/sekiui/{p-88f91658.entry.js → p-84d47cab.entry.js} +1 -1
  227. package/dist/sekiui/p-9dcd07b2.entry.js +1 -0
  228. package/dist/sekiui/p-BJCq8m2o.js +1 -0
  229. package/dist/sekiui/p-DI_YjzRi.js +2 -0
  230. package/dist/sekiui/p-ab9d1ba5.entry.js +1 -0
  231. package/dist/sekiui/p-b525d85a.entry.js +1 -0
  232. package/dist/sekiui/{p-ed440425.entry.js → p-b64e7007.entry.js} +1 -1
  233. package/dist/sekiui/{p-6e238adf.entry.js → p-b7f2b568.entry.js} +1 -1
  234. package/dist/sekiui/{p-009183ab.entry.js → p-c642ab55.entry.js} +1 -1
  235. package/dist/sekiui/{p-eefbc037.entry.js → p-c74bd925.entry.js} +1 -1
  236. package/dist/sekiui/p-c83d94c4.entry.js +1 -0
  237. package/dist/sekiui/p-ce1bbe04.entry.js +1 -0
  238. package/dist/sekiui/{p-b22df79e.entry.js → p-cf552ff9.entry.js} +1 -1
  239. package/dist/sekiui/{p-81709fc2.entry.js → p-d194caf1.entry.js} +1 -1
  240. package/dist/sekiui/{p-b479935d.entry.js → p-dfa2f8cd.entry.js} +1 -1
  241. package/dist/sekiui/{p-eedf44b5.entry.js → p-e6d5f56e.entry.js} +1 -1
  242. package/dist/sekiui/{p-97e6e5ce.entry.js → p-f1ffc3fa.entry.js} +1 -1
  243. package/dist/sekiui/{p-35f8f9c4.entry.js → p-f863f36b.entry.js} +1 -1
  244. package/dist/sekiui/sekiui.esm.js +1 -1
  245. package/dist/types/components/badge/seki-badge.d.ts +43 -0
  246. package/dist/types/components/badge/seki-badge.interface.d.ts +88 -0
  247. package/dist/types/components/sidebar/seki-sidebar-content.d.ts +18 -0
  248. package/dist/types/components/sidebar/seki-sidebar-footer.d.ts +16 -0
  249. package/dist/types/components/sidebar/seki-sidebar-group.d.ts +81 -0
  250. package/dist/types/components/sidebar/seki-sidebar-header.d.ts +17 -0
  251. package/dist/types/components/sidebar/seki-sidebar-menu-item.d.ts +104 -0
  252. package/dist/types/components/sidebar/seki-sidebar-menu-sub.d.ts +81 -0
  253. package/dist/types/components/sidebar/seki-sidebar-menu.d.ts +17 -0
  254. package/dist/types/components/sidebar/seki-sidebar-trigger.d.ts +53 -0
  255. package/dist/types/components/sidebar/seki-sidebar.d.ts +185 -0
  256. package/dist/types/components/sidebar/types.d.ts +245 -0
  257. package/dist/types/components.d.ts +599 -0
  258. package/dist/types/index.d.ts +4 -0
  259. package/dist/types/services/focus.d.ts +74 -0
  260. package/dist/types/services/index.d.ts +7 -0
  261. package/dist/types/services/keyboard.d.ts +74 -0
  262. package/dist/types/services/media-query.d.ts +121 -0
  263. package/dist/types/stencil-public-runtime.d.ts +19 -9
  264. package/dist/types/types.d.ts +105 -0
  265. package/dist/types/utils/a11y.d.ts +130 -0
  266. package/dist/types/utils/common.d.ts +142 -0
  267. package/package.json +10 -2
  268. package/dist/sekiui/p-9fe07f6e.entry.js +0 -1
  269. package/dist/sekiui/p-CuXbV_yz.js +0 -2
@@ -1,2 +1,6 @@
1
1
  export { Components, JSX } from './components';
2
2
  export { SekiSwitch } from './components/switch/seki-switch';
3
+ export * from './services';
4
+ export * from './utils/common';
5
+ export * from './utils/a11y';
6
+ export * from './types';
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Focus Management Service
3
+ * Provides utilities for focus management, focus traps, and focus restoration
4
+ */
5
+ export interface FocusTrapOptions {
6
+ initialFocus?: HTMLElement;
7
+ restoreFocus?: boolean;
8
+ allowOutsideClick?: boolean;
9
+ }
10
+ /**
11
+ * FocusService - Centralized focus management
12
+ * Provides:
13
+ * - Focus trap implementation
14
+ * - Focus restoration
15
+ * - Focusable element detection
16
+ * - Focus utilities for accessibility
17
+ */
18
+ export declare class FocusService {
19
+ private focusTrapStack;
20
+ private previouslyFocusedElement;
21
+ /**
22
+ * Get all focusable elements within a container
23
+ * Includes buttons, links, inputs, textareas, selects, and elements with tabindex
24
+ */
25
+ getFocusableElements(container?: HTMLElement | Document): HTMLElement[];
26
+ /**
27
+ * Check if an element is focusable
28
+ */
29
+ isFocusable(element: HTMLElement): boolean;
30
+ /**
31
+ * Set focus to an element with optional callbacks
32
+ */
33
+ setFocus(element: HTMLElement | null, options?: {
34
+ preventScroll?: boolean;
35
+ }): boolean;
36
+ /**
37
+ * Trap focus within a container (keyboard navigation stays within bounds)
38
+ * @param container - The element to trap focus within
39
+ * @param options - Focus trap options
40
+ */
41
+ createFocusTrap(container: HTMLElement, options?: FocusTrapOptions): void;
42
+ /**
43
+ * Release focus trap from a container
44
+ */
45
+ releaseFocusTrap(container: HTMLElement, restoreFocus?: boolean): void;
46
+ /**
47
+ * Get the first focusable element in a container
48
+ */
49
+ getFirstFocusable(container?: HTMLElement | Document): HTMLElement | null;
50
+ /**
51
+ * Get the last focusable element in a container
52
+ */
53
+ getLastFocusable(container?: HTMLElement | Document): HTMLElement | null;
54
+ /**
55
+ * Move focus to the next focusable element
56
+ */
57
+ focusNext(container?: HTMLElement | Document): boolean;
58
+ /**
59
+ * Move focus to the previous focusable element
60
+ */
61
+ focusPrevious(container?: HTMLElement | Document): boolean;
62
+ /**
63
+ * Clear all focus traps
64
+ */
65
+ clearFocusTraps(): void;
66
+ }
67
+ /**
68
+ * Get the singleton FocusService instance
69
+ */
70
+ export declare function getFocusService(): FocusService;
71
+ /**
72
+ * Create a new isolated FocusService instance
73
+ */
74
+ export declare function createFocusService(): FocusService;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Services Index
3
+ * Central export point for all application services
4
+ */
5
+ export * from './keyboard';
6
+ export * from './focus';
7
+ export * from './media-query';
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Keyboard Service
3
+ * Provides normalized keyboard event handling and shortcut management
4
+ * Handles cross-platform shortcuts (Ctrl/Cmd combinations)
5
+ */
6
+ export interface KeyboardShortcut {
7
+ key: string;
8
+ ctrlKey?: boolean;
9
+ shiftKey?: boolean;
10
+ altKey?: boolean;
11
+ metaKey?: boolean;
12
+ handler: (event: Event) => void;
13
+ }
14
+ export interface KeyboardShortcutOptions {
15
+ key: string;
16
+ ctrl?: boolean;
17
+ shift?: boolean;
18
+ alt?: boolean;
19
+ meta?: boolean;
20
+ handler: (event: KeyboardEvent) => void;
21
+ preventDefault?: boolean;
22
+ }
23
+ /**
24
+ * KeyboardService - Centralized keyboard event management
25
+ * Provides:
26
+ * - Normalized keyboard shortcuts (handles Ctrl vs Cmd on Mac)
27
+ * - Cross-platform shortcut registration
28
+ * - Event cleanup and teardown
29
+ */
30
+ export declare class KeyboardService {
31
+ private shortcuts;
32
+ private listeners;
33
+ /**
34
+ * Register a keyboard shortcut
35
+ * @param id - Unique identifier for this shortcut
36
+ * @param options - Shortcut configuration
37
+ */
38
+ registerShortcut(id: string, options: KeyboardShortcutOptions): void;
39
+ /**
40
+ * Register a shortcut that works with Ctrl on Windows/Linux and Cmd on Mac
41
+ * @param id - Unique identifier for this shortcut
42
+ * @param key - The key to listen for
43
+ * @param handler - Callback when shortcut is triggered
44
+ * @param preventDefault - Whether to prevent default browser behavior
45
+ */
46
+ registerCtrlOrCmdShortcut(id: string, key: string, handler: (event: KeyboardEvent) => void, preventDefault?: boolean): void;
47
+ /**
48
+ * Unregister a keyboard shortcut
49
+ * @param id - The identifier of the shortcut to remove
50
+ */
51
+ unregisterShortcut(id: string): void;
52
+ /**
53
+ * Unregister all shortcuts and clean up
54
+ */
55
+ cleanup(): void;
56
+ /**
57
+ * Check if a keyboard event matches a specific key combination
58
+ * @param event - The keyboard event to check
59
+ * @param key - The key to match
60
+ * @param ctrl - Whether Ctrl/Cmd should be pressed
61
+ * @param shift - Whether Shift should be pressed
62
+ * @param alt - Whether Alt should be pressed
63
+ */
64
+ matchesShortcut(event: KeyboardEvent, key: string, ctrl?: boolean, shift?: boolean, alt?: boolean): boolean;
65
+ }
66
+ /**
67
+ * Get the singleton KeyboardService instance
68
+ */
69
+ export declare function getKeyboardService(): KeyboardService;
70
+ /**
71
+ * Create a new isolated KeyboardService instance
72
+ * Useful for testing or when you need independent event handling
73
+ */
74
+ export declare function createKeyboardService(): KeyboardService;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Media Query Service
3
+ * Provides utilities for responsive design and media query management
4
+ */
5
+ export interface MediaQueryListener {
6
+ query: string;
7
+ handler: (match: boolean) => void;
8
+ matcher?: MediaQueryList;
9
+ }
10
+ export interface BreakpointConfig {
11
+ sm?: string;
12
+ md?: string;
13
+ lg?: string;
14
+ xl?: string;
15
+ '2xl'?: string;
16
+ }
17
+ /**
18
+ * Default breakpoints (Tailwind-inspired)
19
+ */
20
+ export declare const DEFAULT_BREAKPOINTS: BreakpointConfig;
21
+ /**
22
+ * MediaQueryService - Centralized media query management
23
+ * Provides:
24
+ * - Media query listener registration
25
+ * - Breakpoint detection
26
+ * - Window resize handling
27
+ * - Current viewport information
28
+ */
29
+ export declare class MediaQueryService {
30
+ private listeners;
31
+ private breakpoints;
32
+ private resizeObserver;
33
+ private resizeListeners;
34
+ constructor(breakpoints?: BreakpointConfig);
35
+ /**
36
+ * Register a media query listener
37
+ * @param id - Unique identifier for this listener
38
+ * @param query - CSS media query string
39
+ * @param handler - Callback when media query matches/unmatches
40
+ */
41
+ registerMediaQuery(id: string, query: string, handler: (match: boolean) => void): void;
42
+ /**
43
+ * Register a breakpoint listener (easier than raw media queries)
44
+ * @param id - Unique identifier
45
+ * @param breakpoint - Breakpoint name (sm, md, lg, xl, 2xl)
46
+ * @param type - Type of match: 'min' (mobile-first) or 'max' (desktop-first)
47
+ * @param handler - Callback when breakpoint matches
48
+ */
49
+ registerBreakpoint(id: string, breakpoint: keyof BreakpointConfig, type: "min" | "max" | undefined, handler: (match: boolean) => void): void;
50
+ /**
51
+ * Unregister a media query listener
52
+ */
53
+ unregisterMediaQuery(id: string): void;
54
+ /**
55
+ * Check if a media query currently matches
56
+ */
57
+ isMatching(query: string): boolean;
58
+ /**
59
+ * Check if a breakpoint is currently active
60
+ */
61
+ isBreakpointActive(breakpoint: keyof BreakpointConfig, type?: 'min' | 'max'): boolean;
62
+ /**
63
+ * Get the current viewport width
64
+ */
65
+ getViewportWidth(): number;
66
+ /**
67
+ * Get the current viewport height
68
+ */
69
+ getViewportHeight(): number;
70
+ /**
71
+ * Check if viewport is mobile-sized (< 768px)
72
+ */
73
+ isMobile(): boolean;
74
+ /**
75
+ * Check if viewport is tablet-sized (768px - 1024px)
76
+ */
77
+ isTablet(): boolean;
78
+ /**
79
+ * Check if viewport is desktop-sized (>= 1024px)
80
+ */
81
+ isDesktop(): boolean;
82
+ /**
83
+ * Check if prefers-reduced-motion is enabled
84
+ */
85
+ prefersReducedMotion(): boolean;
86
+ /**
87
+ * Check if dark mode is preferred
88
+ */
89
+ prefersDarkMode(): boolean;
90
+ /**
91
+ * Get the current device orientation
92
+ */
93
+ getOrientation(): 'portrait' | 'landscape';
94
+ /**
95
+ * Register a window resize listener
96
+ * @param id - Unique identifier
97
+ * @param handler - Callback with (width, height)
98
+ * @param debounceMs - Debounce delay in milliseconds
99
+ */
100
+ registerResizeListener(id: string, handler: (width: number, height: number) => void, debounceMs?: number): void;
101
+ /**
102
+ * Unregister a resize listener
103
+ */
104
+ unregisterResizeListener(id: string): void;
105
+ /**
106
+ * Clean up all listeners
107
+ */
108
+ cleanup(): void;
109
+ /**
110
+ * Update breakpoint configuration
111
+ */
112
+ setBreakpoints(breakpoints: BreakpointConfig): void;
113
+ }
114
+ /**
115
+ * Get the singleton MediaQueryService instance
116
+ */
117
+ export declare function getMediaQueryService(breakpoints?: BreakpointConfig): MediaQueryService;
118
+ /**
119
+ * Create a new isolated MediaQueryService instance
120
+ */
121
+ export declare function createMediaQueryService(breakpoints?: BreakpointConfig): MediaQueryService;
@@ -1,5 +1,6 @@
1
1
  type CustomMethodDecorator<T> = (target: object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<T>) => TypedPropertyDescriptor<T> | void;
2
- type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
2
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
3
+ type MixinInstance<F> = F extends (base: MixedInCtor) => MixedInCtor<infer I> ? I : never;
3
4
  export interface ComponentDecorator {
4
5
  (opts?: ComponentOptions): ClassDecorator;
5
6
  }
@@ -364,18 +365,27 @@ export declare function readTask(task: RafCallback): void;
364
365
  * Unhandled exception raised while rendering, during event handling, or lifecycles will trigger the custom event handler.
365
366
  */
366
367
  export declare const setErrorHandler: (handler: ErrorHandler) => void;
367
- export type MixinFactory = <TBase extends new (...args: any[]) => any>(base: TBase) => abstract new (...args: ConstructorParameters<TBase>) => any;
368
+ /**
369
+ * @deprecated - Use `MixedInCtor` instead:
370
+ * ```ts
371
+ * import { MixedInCtor } from '@stencil/core';
372
+ *
373
+ * const AFactoryFn = <B extends MixedInCtor>(Base: B) => {class A extends Base { propA = A }; return A;}
374
+ * ```
375
+ */
376
+ export type MixinFactory = (base: MixedInCtor) => MixedInCtor;
377
+ export type MixedInCtor<T = {}> = new (...args: any[]) => T;
368
378
  /**
369
379
  * Compose multiple mixin classes into a single constructor.
370
380
  * The resulting class has the combined instance types of all mixed-in classes.
371
381
  *
372
382
  * Example:
373
- * ```
374
- * import { Mixin, MixinFactory } from '@stencil/core';
383
+ * ```ts
384
+ * import { Mixin, MixedInCtor } from '@stencil/core';
375
385
  *
376
- * const AWrap: MixinFactory = (Base) => {class A extends Base { propA = A }; return A;}
377
- * const BWrap: MixinFactory = (Base) => {class B extends Base { propB = B }; return B;}
378
- * const CWrap: MixinFactory = (Base) => {class C extends Base { propC = C }; return C;}
386
+ * const AWrap = <B extends MixedInCtor>(Base: B) => {class A extends Base { propA = A }; return A;}
387
+ * const BWrap = <B extends MixedInCtor>(Base: B) => {class B extends Base { propB = B }; return B;}
388
+ * const CWrap = <B extends MixedInCtor>(Base: B) => {class C extends Base { propC = C }; return C;}
379
389
  *
380
390
  * class X extends Mixin(AWrap, BWrap, CWrap) {
381
391
  * render() { return <div>{this.propA} {this.propB} {this.propC}</div>; }
@@ -383,9 +393,9 @@ export type MixinFactory = <TBase extends new (...args: any[]) => any>(base: TBa
383
393
  * ```
384
394
  *
385
395
  * @param mixinFactories mixin factory functions that return a class which extends from the provided class.
386
- * @returns a class that that is composed from extending each of the provided classes in the order they were provided.
396
+ * @returns a class that is composed from extending each of the provided classes in the order they were provided.
387
397
  */
388
- export declare function Mixin<TMixins extends readonly MixinFactory[]>(...mixinFactories: TMixins): abstract new (...args: any[]) => UnionToIntersection<InstanceType<ReturnType<TMixins[number]>>>;
398
+ export declare function Mixin<const TMixins extends readonly MixinFactory[]>(...mixinFactories: TMixins): abstract new (...args: any[]) => UnionToIntersection<MixinInstance<TMixins[number]>>;
389
399
  /**
390
400
  * This file gets copied to all distributions of stencil component collections.
391
401
  * - no imports
@@ -0,0 +1,105 @@
1
+ /**
2
+ * SekiUI Type Definitions
3
+ * Central export point for all type definitions across components and services
4
+ */
5
+ export interface SekiButtonProps {
6
+ disabled?: boolean;
7
+ size?: 'sm' | 'md' | 'lg' | 'icon-sm' | 'icon' | 'icon-lg';
8
+ type?: 'button' | 'submit' | 'reset';
9
+ variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'destructive' | 'link';
10
+ ariaLabel?: string;
11
+ }
12
+ export interface SekiFieldProps {
13
+ invalid?: boolean;
14
+ orientation?: 'vertical' | 'horizontal' | 'responsive';
15
+ }
16
+ export interface SekiInputProps {
17
+ type?: 'text' | 'password' | 'email' | 'number' | 'tel' | 'url' | 'search' | 'date';
18
+ placeholder?: string;
19
+ value?: string;
20
+ disabled?: boolean;
21
+ readonly?: boolean;
22
+ required?: boolean;
23
+ minLength?: number;
24
+ maxLength?: number;
25
+ pattern?: string;
26
+ ariaLabel?: string;
27
+ ariaDescribedBy?: string;
28
+ }
29
+ export interface SekiSkeletonProps {
30
+ count?: number;
31
+ width?: string | number;
32
+ height?: string | number;
33
+ circle?: boolean;
34
+ }
35
+ export interface SekiSwitchProps {
36
+ checked?: boolean;
37
+ disabled?: boolean;
38
+ name?: string;
39
+ value?: string;
40
+ ariaLabel?: string;
41
+ ariaDescribedBy?: string;
42
+ }
43
+ export type TooltipSide = 'top' | 'right' | 'bottom' | 'left';
44
+ export interface TooltipShowDetail {
45
+ side: TooltipSide;
46
+ }
47
+ export interface TooltipHideDetail {
48
+ side: TooltipSide;
49
+ }
50
+ export interface TooltipPositionedDetail {
51
+ x: number;
52
+ y: number;
53
+ side: TooltipSide;
54
+ }
55
+ export interface CustomEventDetail {
56
+ [key: string]: any;
57
+ }
58
+ export type ClassValue = string | undefined | null | false | {
59
+ [key: string]: boolean;
60
+ };
61
+ export type DataAttributeValue = string | number | boolean | null | undefined;
62
+ /**
63
+ * Type guard to check if a value is a valid sidebar variant
64
+ */
65
+ export declare function isSidebarVariant(value: any): value is 'sidebar' | 'floating' | 'inset';
66
+ /**
67
+ * Type guard to check if a value is a valid collapse mode
68
+ */
69
+ export declare function isCollapseMode(value: any): value is 'offcanvas' | 'icon' | 'none';
70
+ /**
71
+ * Type guard to check if a value is a valid button size
72
+ */
73
+ export declare function isButtonSize(value: any): value is 'sm' | 'md' | 'lg' | 'icon-sm' | 'icon' | 'icon-lg';
74
+ /**
75
+ * Type guard to check if a value is a valid button variant
76
+ */
77
+ export declare function isButtonVariant(value: any): value is 'primary' | 'secondary' | 'outline' | 'ghost' | 'destructive' | 'link';
78
+ /**
79
+ * Type guard to check if a value is a valid tooltip side
80
+ */
81
+ export declare function isTooltipSide(value: any): value is TooltipSide;
82
+ /**
83
+ * Create a partial type (all properties optional)
84
+ */
85
+ export type Partial<T> = {
86
+ [P in keyof T]?: T[P];
87
+ };
88
+ /**
89
+ * Create a readonly type
90
+ */
91
+ export type Readonly<T> = {
92
+ readonly [P in keyof T]: T[P];
93
+ };
94
+ /**
95
+ * Create a required type (all properties required)
96
+ */
97
+ export type Required<T> = {
98
+ [P in keyof T]-?: T[P];
99
+ };
100
+ /**
101
+ * Create a record type
102
+ */
103
+ export type Record<K extends string | number | symbol, T> = {
104
+ [P in K]: T;
105
+ };
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Accessibility Utilities
3
+ * Provides helpers for ARIA attributes, keyboard navigation, and accessibility features
4
+ */
5
+ /**
6
+ * Generate a unique ID for ARIA relationships
7
+ * @param prefix - Optional prefix for the ID
8
+ * @param suffix - Optional suffix for the ID
9
+ */
10
+ export declare function generateAriaId(prefix?: string, suffix?: string): string;
11
+ /**
12
+ * Set ARIA attributes on an element
13
+ * @param element - The element to set attributes on
14
+ * @param attributes - Object with attribute names and values
15
+ */
16
+ export declare function setAriaAttributes(element: HTMLElement, attributes: Record<string, string | boolean | null>): void;
17
+ /**
18
+ * Add accessible label to an element
19
+ * @param element - The element to label
20
+ * @param label - The label text or element ID
21
+ * @param useAriaLabel - If true, uses aria-label; if false, uses aria-labelledby
22
+ */
23
+ export declare function addAriaLabel(element: HTMLElement, label: string, useAriaLabel?: boolean): void;
24
+ /**
25
+ * Add accessible description to an element
26
+ * @param element - The element to describe
27
+ * @param description - The description text or element ID
28
+ * @param useAriaDescription - If true, uses aria-description; if false, uses aria-describedby
29
+ */
30
+ export declare function addAriaDescription(element: HTMLElement, description: string, useAriaDescription?: boolean): void;
31
+ /**
32
+ * Set ARIA live region announcement
33
+ * @param element - The element to make a live region
34
+ * @param message - The message to announce
35
+ * @param politeness - 'polite' (default), 'assertive', or 'off'
36
+ * @param atomic - Whether to announce the entire region
37
+ */
38
+ export declare function announceAriaLive(element: HTMLElement, message: string, politeness?: 'polite' | 'assertive' | 'off', atomic?: boolean): void;
39
+ /**
40
+ * Mark an element as disabled with ARIA attributes
41
+ * @param element - The element to mark as disabled
42
+ * @param disabled - Whether the element is disabled
43
+ */
44
+ export declare function setAriaDisabled(element: HTMLElement, disabled: boolean): void;
45
+ /**
46
+ * Mark an element as expanded/collapsed (for collapsible sections)
47
+ * @param element - The element to mark
48
+ * @param expanded - Whether the element is expanded
49
+ * @param targetId - ID of the element being controlled (optional)
50
+ */
51
+ export declare function setAriaExpanded(element: HTMLElement, expanded: boolean, targetId?: string): void;
52
+ /**
53
+ * Mark an element as selected
54
+ * @param element - The element to mark
55
+ * @param selected - Whether the element is selected
56
+ */
57
+ export declare function setAriaSelected(element: HTMLElement, selected: boolean): void;
58
+ /**
59
+ * Mark an element as checked (for checkboxes and radio buttons)
60
+ * @param element - The element to mark
61
+ * @param checked - The checked state ('true', 'false', or 'mixed')
62
+ */
63
+ export declare function setAriaChecked(element: HTMLElement, checked: 'true' | 'false' | 'mixed'): void;
64
+ /**
65
+ * Set the current value of an element (for sliders, spinbuttons, etc.)
66
+ * @param element - The element
67
+ * @param current - Current value
68
+ * @param min - Minimum value
69
+ * @param max - Maximum value
70
+ * @param text - Optional text description of the value
71
+ */
72
+ export declare function setAriaValueNow(element: HTMLElement, current: number, min?: number, max?: number, text?: string): void;
73
+ /**
74
+ * Mark an element as having a popup (for menus, popovers, etc.)
75
+ * @param element - The element with the popup trigger
76
+ * @param type - Type of popup: 'menu', 'listbox', 'tree', 'grid', 'dialog'
77
+ * @param popupId - ID of the popup element
78
+ */
79
+ export declare function setAriaPopup(element: HTMLElement, type?: 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog', popupId?: string): void;
80
+ /**
81
+ * Set role for an element
82
+ * @param element - The element
83
+ * @param role - The role (button, menu, menuitem, etc.)
84
+ */
85
+ export declare function setRole(element: HTMLElement, role: string): void;
86
+ /**
87
+ * Get the accessible name of an element
88
+ * Follows ARIA naming convention: aria-labelledby > aria-label > title > textContent
89
+ */
90
+ export declare function getAccessibleName(element: HTMLElement): string;
91
+ /**
92
+ * Create a skip link for keyboard navigation
93
+ * @param text - Link text
94
+ * @param targetId - ID of element to skip to
95
+ */
96
+ export declare function createSkipLink(text: string, targetId: string): HTMLElement;
97
+ /**
98
+ * Check if element should be hidden from screen readers
99
+ */
100
+ export declare function isAriaHidden(element: HTMLElement): boolean;
101
+ /**
102
+ * Hide element from screen readers but keep visually visible
103
+ */
104
+ export declare function setAriaHidden(element: HTMLElement, hidden: boolean): void;
105
+ /**
106
+ * Announce a message to screen readers immediately (without ARIA live regions)
107
+ * @param message - The message to announce
108
+ * @param politeness - 'polite' (default) or 'assertive'
109
+ */
110
+ export declare function announceToScreenReader(message: string, politeness?: 'polite' | 'assertive'): void;
111
+ /**
112
+ * Set proper heading hierarchy
113
+ * @param element - The heading element
114
+ * @param level - Heading level (1-6)
115
+ */
116
+ export declare function setHeadingLevel(element: HTMLElement, level: 1 | 2 | 3 | 4 | 5 | 6): void;
117
+ /**
118
+ * Enable keyboard navigation for a custom component
119
+ * @param element - The element that should handle keyboard
120
+ * @param keys - Map of key to handler function
121
+ */
122
+ export declare function enableKeyboardNavigation(element: HTMLElement, keys: Record<string, (event: KeyboardEvent) => void>): (() => void);
123
+ /**
124
+ * Check if element has accessible focus styling
125
+ */
126
+ export declare function hasAccessibleFocus(element: HTMLElement): boolean;
127
+ /**
128
+ * Ensure focus visible styling (for focus-visible pseudo-class)
129
+ */
130
+ export declare function ensureFocusVisible(element: HTMLElement): void;