@sekiui/elements 0.0.56 → 0.0.57

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 (256) hide show
  1. package/dist/cdn/index.js +1053 -91
  2. package/dist/cdn/p-BJCq8m2o.js +138 -0
  3. package/dist/cdn/p-BfRJQMIU.js +111 -0
  4. package/dist/cdn/{p-bMBhrs0a.js → p-Bp7tjKwQ.js} +427 -7
  5. package/dist/cdn/seki-button.js +1 -1
  6. package/dist/cdn/seki-card-action.js +1 -1
  7. package/dist/cdn/seki-card-content.js +1 -1
  8. package/dist/cdn/seki-card-description.js +1 -1
  9. package/dist/cdn/seki-card-footer.js +1 -1
  10. package/dist/cdn/seki-card-header.js +1 -1
  11. package/dist/cdn/seki-card-title.js +1 -1
  12. package/dist/cdn/seki-card.js +1 -1
  13. package/dist/cdn/seki-field-description.js +1 -1
  14. package/dist/cdn/seki-field-error.js +1 -1
  15. package/dist/cdn/seki-field-group.js +1 -1
  16. package/dist/cdn/seki-field-label.js +1 -1
  17. package/dist/cdn/seki-field-legend.js +1 -1
  18. package/dist/cdn/seki-field.js +1 -1
  19. package/dist/cdn/seki-fieldset.js +1 -1
  20. package/dist/cdn/seki-input.js +1 -1
  21. package/dist/cdn/seki-select-content.js +1 -1
  22. package/dist/cdn/seki-select-group.js +1 -1
  23. package/dist/cdn/seki-select-option.js +1 -1
  24. package/dist/cdn/seki-select-trigger.js +1 -1
  25. package/dist/cdn/seki-select.js +1 -1
  26. package/dist/cdn/seki-sidebar-content.d.ts +11 -0
  27. package/dist/cdn/seki-sidebar-content.js +38 -0
  28. package/dist/cdn/seki-sidebar-footer.d.ts +11 -0
  29. package/dist/cdn/seki-sidebar-footer.js +38 -0
  30. package/dist/cdn/seki-sidebar-group.d.ts +11 -0
  31. package/dist/cdn/seki-sidebar-group.js +131 -0
  32. package/dist/cdn/seki-sidebar-header.d.ts +11 -0
  33. package/dist/cdn/seki-sidebar-header.js +38 -0
  34. package/dist/cdn/seki-sidebar-menu-item.d.ts +11 -0
  35. package/dist/cdn/seki-sidebar-menu-item.js +200 -0
  36. package/dist/cdn/seki-sidebar-menu-sub.d.ts +11 -0
  37. package/dist/cdn/seki-sidebar-menu-sub.js +123 -0
  38. package/dist/cdn/seki-sidebar-menu.d.ts +11 -0
  39. package/dist/cdn/seki-sidebar-menu.js +38 -0
  40. package/dist/cdn/seki-sidebar-trigger.d.ts +11 -0
  41. package/dist/cdn/seki-sidebar-trigger.js +109 -0
  42. package/dist/cdn/seki-sidebar.d.ts +11 -0
  43. package/dist/cdn/seki-sidebar.js +380 -0
  44. package/dist/cdn/seki-skeleton.js +2 -2
  45. package/dist/cdn/seki-switch.js +1 -1
  46. package/dist/cdn/seki-tooltip.js +1 -1
  47. package/dist/cjs/{index-Dd6_-KaR.js → index-tQYksITZ.js} +426 -6
  48. package/dist/cjs/index.cjs.js +1115 -63
  49. package/dist/cjs/keyboard-Cjl5HYES.js +142 -0
  50. package/dist/cjs/loader.cjs.js +2 -2
  51. package/dist/cjs/seki-button.cjs.entry.js +1 -1
  52. package/dist/cjs/seki-card-action.cjs.entry.js +1 -1
  53. package/dist/cjs/seki-card-content.cjs.entry.js +1 -1
  54. package/dist/cjs/seki-card-description.cjs.entry.js +1 -1
  55. package/dist/cjs/seki-card-footer.cjs.entry.js +1 -1
  56. package/dist/cjs/seki-card-header.cjs.entry.js +1 -1
  57. package/dist/cjs/seki-card-title.cjs.entry.js +1 -1
  58. package/dist/cjs/seki-card.cjs.entry.js +1 -1
  59. package/dist/cjs/seki-field-description.cjs.entry.js +1 -1
  60. package/dist/cjs/seki-field-error.cjs.entry.js +1 -1
  61. package/dist/cjs/seki-field-group.cjs.entry.js +1 -1
  62. package/dist/cjs/seki-field-label.cjs.entry.js +1 -1
  63. package/dist/cjs/seki-field-legend.cjs.entry.js +1 -1
  64. package/dist/cjs/seki-field.cjs.entry.js +1 -1
  65. package/dist/cjs/seki-fieldset.cjs.entry.js +1 -1
  66. package/dist/cjs/seki-input.cjs.entry.js +1 -1
  67. package/dist/cjs/seki-select-content.cjs.entry.js +1 -1
  68. package/dist/cjs/seki-select-group.cjs.entry.js +1 -1
  69. package/dist/cjs/seki-select-option.cjs.entry.js +1 -1
  70. package/dist/cjs/seki-select-trigger.cjs.entry.js +1 -1
  71. package/dist/cjs/seki-select.cjs.entry.js +1 -1
  72. package/dist/cjs/seki-sidebar-content.cjs.entry.js +20 -0
  73. package/dist/cjs/seki-sidebar-footer.cjs.entry.js +20 -0
  74. package/dist/cjs/seki-sidebar-group.cjs.entry.js +105 -0
  75. package/dist/cjs/seki-sidebar-header.cjs.entry.js +20 -0
  76. package/dist/cjs/seki-sidebar-menu-item.cjs.entry.js +174 -0
  77. package/dist/cjs/seki-sidebar-menu-sub.cjs.entry.js +99 -0
  78. package/dist/cjs/seki-sidebar-menu.cjs.entry.js +20 -0
  79. package/dist/cjs/seki-sidebar-trigger.cjs.entry.js +86 -0
  80. package/dist/cjs/seki-sidebar.cjs.entry.js +342 -0
  81. package/dist/cjs/seki-skeleton.cjs.entry.js +2 -2
  82. package/dist/cjs/seki-switch.cjs.entry.js +81 -3
  83. package/dist/cjs/seki-tooltip.cjs.entry.js +1 -1
  84. package/dist/cjs/sekiui.cjs.js +2 -2
  85. package/dist/collection/collection-manifest.json +9 -0
  86. package/dist/collection/components/sidebar/seki-sidebar-content.css +82 -0
  87. package/dist/collection/components/sidebar/seki-sidebar-content.js +33 -0
  88. package/dist/collection/components/sidebar/seki-sidebar-footer.css +44 -0
  89. package/dist/collection/components/sidebar/seki-sidebar-footer.js +31 -0
  90. package/dist/collection/components/sidebar/seki-sidebar-group.css +158 -0
  91. package/dist/collection/components/sidebar/seki-sidebar-group.js +300 -0
  92. package/dist/collection/components/sidebar/seki-sidebar-header.css +44 -0
  93. package/dist/collection/components/sidebar/seki-sidebar-header.js +32 -0
  94. package/dist/collection/components/sidebar/seki-sidebar-menu-item.css +196 -0
  95. package/dist/collection/components/sidebar/seki-sidebar-menu-item.js +403 -0
  96. package/dist/collection/components/sidebar/seki-sidebar-menu-sub.css +357 -0
  97. package/dist/collection/components/sidebar/seki-sidebar-menu-sub.js +256 -0
  98. package/dist/collection/components/sidebar/seki-sidebar-menu.css +25 -0
  99. package/dist/collection/components/sidebar/seki-sidebar-menu.js +32 -0
  100. package/dist/collection/components/sidebar/seki-sidebar-trigger.css +68 -0
  101. package/dist/collection/components/sidebar/seki-sidebar-trigger.js +175 -0
  102. package/dist/collection/components/sidebar/seki-sidebar.css +352 -0
  103. package/dist/collection/components/sidebar/seki-sidebar.js +812 -0
  104. package/dist/collection/components/sidebar/types.js +18 -0
  105. package/dist/collection/components/skeleton/seki-skeleton.js +1 -1
  106. package/dist/collection/index.js +7 -0
  107. package/dist/collection/services/focus.js +192 -0
  108. package/dist/collection/services/index.js +7 -0
  109. package/dist/collection/services/keyboard.js +136 -0
  110. package/dist/collection/services/media-query.js +254 -0
  111. package/dist/collection/types.js +41 -0
  112. package/dist/collection/utils/a11y.js +291 -0
  113. package/dist/collection/utils/common.js +286 -0
  114. package/dist/components/index.js +1053 -91
  115. package/dist/components/p-BJCq8m2o.js +138 -0
  116. package/dist/components/{p-QhPshhKB.js → p-BzYKy7d3.js} +427 -7
  117. package/dist/components/p-DwTISp-i.js +111 -0
  118. package/dist/components/seki-button.js +1 -1
  119. package/dist/components/seki-card-action.js +1 -1
  120. package/dist/components/seki-card-content.js +1 -1
  121. package/dist/components/seki-card-description.js +1 -1
  122. package/dist/components/seki-card-footer.js +1 -1
  123. package/dist/components/seki-card-header.js +1 -1
  124. package/dist/components/seki-card-title.js +1 -1
  125. package/dist/components/seki-card.js +1 -1
  126. package/dist/components/seki-field-description.js +1 -1
  127. package/dist/components/seki-field-error.js +1 -1
  128. package/dist/components/seki-field-group.js +1 -1
  129. package/dist/components/seki-field-label.js +1 -1
  130. package/dist/components/seki-field-legend.js +1 -1
  131. package/dist/components/seki-field.js +1 -1
  132. package/dist/components/seki-fieldset.js +1 -1
  133. package/dist/components/seki-input.js +1 -1
  134. package/dist/components/seki-select-content.js +1 -1
  135. package/dist/components/seki-select-group.js +1 -1
  136. package/dist/components/seki-select-option.js +1 -1
  137. package/dist/components/seki-select-trigger.js +1 -1
  138. package/dist/components/seki-select.js +1 -1
  139. package/dist/components/seki-sidebar-content.d.ts +11 -0
  140. package/dist/components/seki-sidebar-content.js +38 -0
  141. package/dist/components/seki-sidebar-footer.d.ts +11 -0
  142. package/dist/components/seki-sidebar-footer.js +38 -0
  143. package/dist/components/seki-sidebar-group.d.ts +11 -0
  144. package/dist/components/seki-sidebar-group.js +131 -0
  145. package/dist/components/seki-sidebar-header.d.ts +11 -0
  146. package/dist/components/seki-sidebar-header.js +38 -0
  147. package/dist/components/seki-sidebar-menu-item.d.ts +11 -0
  148. package/dist/components/seki-sidebar-menu-item.js +200 -0
  149. package/dist/components/seki-sidebar-menu-sub.d.ts +11 -0
  150. package/dist/components/seki-sidebar-menu-sub.js +123 -0
  151. package/dist/components/seki-sidebar-menu.d.ts +11 -0
  152. package/dist/components/seki-sidebar-menu.js +38 -0
  153. package/dist/components/seki-sidebar-trigger.d.ts +11 -0
  154. package/dist/components/seki-sidebar-trigger.js +109 -0
  155. package/dist/components/seki-sidebar.d.ts +11 -0
  156. package/dist/components/seki-sidebar.js +380 -0
  157. package/dist/components/seki-skeleton.js +2 -2
  158. package/dist/components/seki-switch.js +1 -1
  159. package/dist/components/seki-tooltip.js +1 -1
  160. package/dist/esm/{index-CuXbV_yz.js → index-Dfzpqq0a.js} +426 -6
  161. package/dist/esm/index.js +1053 -63
  162. package/dist/esm/keyboard-BJCq8m2o.js +138 -0
  163. package/dist/esm/loader.js +3 -3
  164. package/dist/esm/seki-button.entry.js +1 -1
  165. package/dist/esm/seki-card-action.entry.js +1 -1
  166. package/dist/esm/seki-card-content.entry.js +1 -1
  167. package/dist/esm/seki-card-description.entry.js +1 -1
  168. package/dist/esm/seki-card-footer.entry.js +1 -1
  169. package/dist/esm/seki-card-header.entry.js +1 -1
  170. package/dist/esm/seki-card-title.entry.js +1 -1
  171. package/dist/esm/seki-card.entry.js +1 -1
  172. package/dist/esm/seki-field-description.entry.js +1 -1
  173. package/dist/esm/seki-field-error.entry.js +1 -1
  174. package/dist/esm/seki-field-group.entry.js +1 -1
  175. package/dist/esm/seki-field-label.entry.js +1 -1
  176. package/dist/esm/seki-field-legend.entry.js +1 -1
  177. package/dist/esm/seki-field.entry.js +1 -1
  178. package/dist/esm/seki-fieldset.entry.js +1 -1
  179. package/dist/esm/seki-input.entry.js +1 -1
  180. package/dist/esm/seki-select-content.entry.js +1 -1
  181. package/dist/esm/seki-select-group.entry.js +1 -1
  182. package/dist/esm/seki-select-option.entry.js +1 -1
  183. package/dist/esm/seki-select-trigger.entry.js +1 -1
  184. package/dist/esm/seki-select.entry.js +1 -1
  185. package/dist/esm/seki-sidebar-content.entry.js +18 -0
  186. package/dist/esm/seki-sidebar-footer.entry.js +18 -0
  187. package/dist/esm/seki-sidebar-group.entry.js +103 -0
  188. package/dist/esm/seki-sidebar-header.entry.js +18 -0
  189. package/dist/esm/seki-sidebar-menu-item.entry.js +172 -0
  190. package/dist/esm/seki-sidebar-menu-sub.entry.js +97 -0
  191. package/dist/esm/seki-sidebar-menu.entry.js +18 -0
  192. package/dist/esm/seki-sidebar-trigger.entry.js +84 -0
  193. package/dist/esm/seki-sidebar.entry.js +340 -0
  194. package/dist/esm/seki-skeleton.entry.js +2 -2
  195. package/dist/esm/seki-switch.entry.js +84 -2
  196. package/dist/esm/seki-tooltip.entry.js +1 -1
  197. package/dist/esm/sekiui.js +3 -3
  198. package/dist/sekiui/index.esm.js +1 -1
  199. package/dist/sekiui/p-01cfb4e7.entry.js +1 -0
  200. package/dist/sekiui/{p-97e6e5ce.entry.js → p-042ec460.entry.js} +1 -1
  201. package/dist/sekiui/{p-3e088b5a.entry.js → p-10c008fc.entry.js} +1 -1
  202. package/dist/sekiui/{p-ed440425.entry.js → p-352bd295.entry.js} +1 -1
  203. package/dist/sekiui/p-37c5f4d9.entry.js +1 -0
  204. package/dist/sekiui/p-40fb71d6.entry.js +1 -0
  205. package/dist/sekiui/{p-eefbc037.entry.js → p-44191aed.entry.js} +1 -1
  206. package/dist/sekiui/{p-81709fc2.entry.js → p-4423d621.entry.js} +1 -1
  207. package/dist/sekiui/{p-9af5286b.entry.js → p-4636588f.entry.js} +1 -1
  208. package/dist/sekiui/p-471b97a5.entry.js +1 -0
  209. package/dist/sekiui/{p-0544d787.entry.js → p-56f0d754.entry.js} +1 -1
  210. package/dist/sekiui/{p-43f7c542.entry.js → p-5bc0f5aa.entry.js} +1 -1
  211. package/dist/sekiui/{p-eedf44b5.entry.js → p-6164cd8a.entry.js} +1 -1
  212. package/dist/sekiui/{p-b479935d.entry.js → p-635f4098.entry.js} +1 -1
  213. package/dist/sekiui/{p-35f8f9c4.entry.js → p-743fc6d9.entry.js} +1 -1
  214. package/dist/sekiui/p-83e65cbe.entry.js +1 -0
  215. package/dist/sekiui/p-8b7bd061.entry.js +1 -0
  216. package/dist/sekiui/{p-009183ab.entry.js → p-8d9a4878.entry.js} +1 -1
  217. package/dist/sekiui/p-9cb9cdfe.entry.js +1 -0
  218. package/dist/sekiui/p-9f2d95d7.entry.js +1 -0
  219. package/dist/sekiui/p-BJCq8m2o.js +1 -0
  220. package/dist/sekiui/p-Dfzpqq0a.js +2 -0
  221. package/dist/sekiui/{p-b22df79e.entry.js → p-a1a71958.entry.js} +1 -1
  222. package/dist/sekiui/{p-dd1e3e87.entry.js → p-a71e0c55.entry.js} +1 -1
  223. package/dist/sekiui/{p-1607dc4d.entry.js → p-ae227955.entry.js} +1 -1
  224. package/dist/sekiui/{p-cf11115c.entry.js → p-b365f5fb.entry.js} +1 -1
  225. package/dist/sekiui/{p-6bde807e.entry.js → p-b387a2a5.entry.js} +1 -1
  226. package/dist/sekiui/p-b8590f4d.entry.js +1 -0
  227. package/dist/sekiui/{p-88f91658.entry.js → p-c98b6d6a.entry.js} +1 -1
  228. package/dist/sekiui/{p-e71ad432.entry.js → p-d73cdb9a.entry.js} +1 -1
  229. package/dist/sekiui/{p-b10d81a6.entry.js → p-d96e770e.entry.js} +1 -1
  230. package/dist/sekiui/p-e62dd89b.entry.js +1 -0
  231. package/dist/sekiui/{p-d4c92041.entry.js → p-e7bb140c.entry.js} +1 -1
  232. package/dist/sekiui/{p-6e238adf.entry.js → p-eecc18f3.entry.js} +1 -1
  233. package/dist/sekiui/{p-4d57c6ea.entry.js → p-ff636955.entry.js} +1 -1
  234. package/dist/sekiui/sekiui.esm.js +1 -1
  235. package/dist/types/components/sidebar/seki-sidebar-content.d.ts +18 -0
  236. package/dist/types/components/sidebar/seki-sidebar-footer.d.ts +16 -0
  237. package/dist/types/components/sidebar/seki-sidebar-group.d.ts +81 -0
  238. package/dist/types/components/sidebar/seki-sidebar-header.d.ts +17 -0
  239. package/dist/types/components/sidebar/seki-sidebar-menu-item.d.ts +104 -0
  240. package/dist/types/components/sidebar/seki-sidebar-menu-sub.d.ts +81 -0
  241. package/dist/types/components/sidebar/seki-sidebar-menu.d.ts +17 -0
  242. package/dist/types/components/sidebar/seki-sidebar-trigger.d.ts +53 -0
  243. package/dist/types/components/sidebar/seki-sidebar.d.ts +185 -0
  244. package/dist/types/components/sidebar/types.d.ts +245 -0
  245. package/dist/types/components.d.ts +508 -0
  246. package/dist/types/index.d.ts +4 -0
  247. package/dist/types/services/focus.d.ts +74 -0
  248. package/dist/types/services/index.d.ts +7 -0
  249. package/dist/types/services/keyboard.d.ts +74 -0
  250. package/dist/types/services/media-query.d.ts +121 -0
  251. package/dist/types/types.d.ts +105 -0
  252. package/dist/types/utils/a11y.d.ts +130 -0
  253. package/dist/types/utils/common.d.ts +142 -0
  254. package/package.json +2 -1
  255. package/dist/sekiui/p-9fe07f6e.entry.js +0 -1
  256. package/dist/sekiui/p-CuXbV_yz.js +0 -2
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Keyboard Service
3
+ * Provides normalized keyboard event handling and shortcut management
4
+ * Handles cross-platform shortcuts (Ctrl/Cmd combinations)
5
+ */
6
+ /**
7
+ * KeyboardService - Centralized keyboard event management
8
+ * Provides:
9
+ * - Normalized keyboard shortcuts (handles Ctrl vs Cmd on Mac)
10
+ * - Cross-platform shortcut registration
11
+ * - Event cleanup and teardown
12
+ */
13
+ class KeyboardService {
14
+ constructor() {
15
+ this.shortcuts = new Map();
16
+ this.listeners = new Map();
17
+ }
18
+ /**
19
+ * Register a keyboard shortcut
20
+ * @param id - Unique identifier for this shortcut
21
+ * @param options - Shortcut configuration
22
+ */
23
+ registerShortcut(id, options) {
24
+ if (typeof window === 'undefined')
25
+ return;
26
+ const { key, ctrl = false, shift = false, alt = false, meta = false, handler, preventDefault = true } = options;
27
+ const handleKeyDown = (event) => {
28
+ const keyboardEvent = event;
29
+ const keyMatches = keyboardEvent.key.toLowerCase() === key.toLowerCase();
30
+ const ctrlMatches = ctrl ? keyboardEvent.ctrlKey : true;
31
+ const shiftMatches = shift ? keyboardEvent.shiftKey : !keyboardEvent.shiftKey;
32
+ const altMatches = alt ? keyboardEvent.altKey : !keyboardEvent.altKey;
33
+ // metaKey matches both metaKey (Mac Cmd) and ctrlKey (Windows/Linux) for cross-platform support
34
+ const metaMatches = meta ? keyboardEvent.metaKey || keyboardEvent.ctrlKey : !keyboardEvent.metaKey && !keyboardEvent.ctrlKey;
35
+ if (keyMatches && ctrlMatches && shiftMatches && altMatches && metaMatches) {
36
+ if (preventDefault) {
37
+ keyboardEvent.preventDefault();
38
+ }
39
+ handler(keyboardEvent);
40
+ }
41
+ };
42
+ this.shortcuts.set(id, {
43
+ key,
44
+ ctrlKey: ctrl,
45
+ shiftKey: shift,
46
+ altKey: alt,
47
+ metaKey: meta,
48
+ handler: handleKeyDown,
49
+ });
50
+ this.listeners.set(id, handleKeyDown);
51
+ window.addEventListener('keydown', handleKeyDown);
52
+ }
53
+ /**
54
+ * Register a shortcut that works with Ctrl on Windows/Linux and Cmd on Mac
55
+ * @param id - Unique identifier for this shortcut
56
+ * @param key - The key to listen for
57
+ * @param handler - Callback when shortcut is triggered
58
+ * @param preventDefault - Whether to prevent default browser behavior
59
+ */
60
+ registerCtrlOrCmdShortcut(id, key, handler, preventDefault = true) {
61
+ if (typeof window === 'undefined')
62
+ return;
63
+ const handleKeyDown = (event) => {
64
+ const keyboardEvent = event;
65
+ const keyMatches = keyboardEvent.key.toLowerCase() === key.toLowerCase();
66
+ const modifierMatches = keyboardEvent.ctrlKey || keyboardEvent.metaKey;
67
+ if (keyMatches && modifierMatches && !keyboardEvent.shiftKey && !keyboardEvent.altKey) {
68
+ if (preventDefault) {
69
+ keyboardEvent.preventDefault();
70
+ }
71
+ handler(keyboardEvent);
72
+ }
73
+ };
74
+ this.listeners.set(id, handleKeyDown);
75
+ window.addEventListener('keydown', handleKeyDown);
76
+ }
77
+ /**
78
+ * Unregister a keyboard shortcut
79
+ * @param id - The identifier of the shortcut to remove
80
+ */
81
+ unregisterShortcut(id) {
82
+ if (typeof window === 'undefined')
83
+ return;
84
+ const listener = this.listeners.get(id);
85
+ if (listener) {
86
+ window.removeEventListener('keydown', listener);
87
+ this.listeners.delete(id);
88
+ }
89
+ this.shortcuts.delete(id);
90
+ }
91
+ /**
92
+ * Unregister all shortcuts and clean up
93
+ */
94
+ cleanup() {
95
+ if (typeof window === 'undefined')
96
+ return;
97
+ this.listeners.forEach((listener) => {
98
+ window.removeEventListener('keydown', listener);
99
+ });
100
+ this.listeners.clear();
101
+ this.shortcuts.clear();
102
+ }
103
+ /**
104
+ * Check if a keyboard event matches a specific key combination
105
+ * @param event - The keyboard event to check
106
+ * @param key - The key to match
107
+ * @param ctrl - Whether Ctrl/Cmd should be pressed
108
+ * @param shift - Whether Shift should be pressed
109
+ * @param alt - Whether Alt should be pressed
110
+ */
111
+ matchesShortcut(event, key, ctrl = false, shift = false, alt = false) {
112
+ const keyMatches = event.key.toLowerCase() === key.toLowerCase();
113
+ const ctrlMatches = ctrl ? event.ctrlKey || event.metaKey : !event.ctrlKey && !event.metaKey;
114
+ const shiftMatches = shift ? event.shiftKey : !event.shiftKey;
115
+ const altMatches = alt ? event.altKey : !event.altKey;
116
+ return keyMatches && ctrlMatches && shiftMatches && altMatches;
117
+ }
118
+ }
119
+ // Singleton instance
120
+ let keyboardServiceInstance = null;
121
+ /**
122
+ * Get the singleton KeyboardService instance
123
+ */
124
+ function getKeyboardService() {
125
+ if (!keyboardServiceInstance) {
126
+ keyboardServiceInstance = new KeyboardService();
127
+ }
128
+ return keyboardServiceInstance;
129
+ }
130
+ /**
131
+ * Create a new isolated KeyboardService instance
132
+ * Useful for testing or when you need independent event handling
133
+ */
134
+ function createKeyboardService() {
135
+ return new KeyboardService();
136
+ }
137
+
138
+ export { KeyboardService as K, createKeyboardService as c, getKeyboardService as g };